rensanny 发表于 2016-9-29 11:43:06

#include<reg51.h>

sbit LED_R=P3^4;//定义红灯
sbit LED_G=P3^3;//定义绿灯
sbit LED_B=P3^2;//定义蓝灯

sbit Key1=P3^0;//定义按键1
sbit Key2=P3^1;//定义按键2


unsigned char Key1_old;    //定义一个数据,记录Key1过去出现低电平
unsigned char Key1_action; //定义一个数据,传递Key1是否动作的消息
unsigned char Key2_old;    //定义一个数据,记录Key2过去出现低电平
unsigned char Key2_action; //定义一个数据,传递Key2是否动作的消息

unsigned char mode;      //定义一个数据,代表不同模式
unsigned char light;       //定义一个数据,代表亮度等级

unsigned int time;       //定义一个数据,记录时间

unsigned int delay_time;   //定义一个数据,记录时间
unsigned char count;       //定义一个数据,PWM循环次数
unsigned char duty_R;      //定义一个数据,传递红色亮度占空比
unsigned char duty_G;      //定义一个数据,传递绿色亮度占空比
unsigned char duty_B;      //定义一个数据,传递蓝色亮度占空比



void Delay1ms()                //@12.000MHz
{
      unsigned char i, j;

      i = 12;
      j = 169;
      do
      {
                while (--j);
      } while (--i);
}

void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
{
      while(n)         
      {
                Delay1ms();
                n=n-1;//每循环一次n减小1
      }   
}


main()
{

      Key1_old=1;   //进入循环前,先初始化标志位。按键还没按下,old是高电平
      Key2_old=1;
      
      while(1)   
      {
                delay_n_ms(1);   //系统周期,每循环一次1ms
               
                time=time+1;//1ms计数
                if(time>9)    //time加到10ms,从0开始,每10ms检测一次按键
                {
                        time=0;   
                        
                        if(Key1==1)
                        {
                              if(Key1_old==0) //如果本次是高电平,上次是低电平,检测到按键
                              {
                                        Key1_action=1;                                                                        
                              }
                        }
                        
                        Key1_old=Key1;   //保存高低电平


                        if(Key2==1)
                        {
                              if(Key2_old==0) //如果本次是高电平,上次是低电平,检测到按键
                              {
                                        Key2_action=1;                                                                        
                              }
                        }
                        
                        Key2_old=Key2;   //保存高低电平
                }
                              
                //上面是完全模块化的按键检测程序,只传递出两个action消息
                ////////////////////////////////////////////
               
                if(Key1_action==1)//有按键消息,处理按键功能
                {
                        Key1_action=0;   //处理过按键后要清0
                        
                        mode++;
                        if(mode>8)      //按键1调节七种色彩
                        {
                              mode=0;
                        }
                }
               
                if(Key2_action==1)//有按键消息,处理按键功能
                {
                        Key2_action=0;   //处理过按键后要清0
                        
                        light++;
                        if(light>10)      //按键2控制10级亮度
                        {
                              light=0;
                        }
                }
               
                //上面是模块化的按键执行程序,只传递出mode模式、light亮度两个消息
                ////////////////////////////////////////////
               
                if(mode==0)       //模式0红色
                {
                        duty_R=light;   //红色占空比=亮度
                        duty_G=0;       //绿色、蓝色占空比为0,熄灭,只有红色亮
                        duty_B=0;
                }
                if(mode==1)   //模式1橙色
                {
                        duty_R=light;
                        duty_G=light;
                        duty_B=0;
                }
                if(mode==2)   //模式2绿色
                {
                        duty_R=0;
                        duty_G=light;
                        duty_B=0;
                }
                if(mode==3)   //模式3青色
                {
                        duty_R=0;
                        duty_G=light;
                        duty_B=light;
                }
                if(mode==4)   //模式4蓝色
                {
                        duty_R=0;
                        duty_G=0;
                        duty_B=light;
                }
                if(mode==5)   //模式5紫色
                {
                        duty_R=light;
                        duty_G=0;
                        duty_B=light;
                }
                if(mode==6)   //模式6白色
                {
                        duty_R=light;
                        duty_G=light;
                        duty_B=light;
                }
                          if(mode==7)   //模式7 爆闪
                                   {
                                                  delay_time=delay_time+1;
                            if(delay_time>2000)//爆闪周期1000ms
                            {
                                    delay_time=0;
                            }
                           
                            if(delay_time<1000)   //前1秒全亮
                            {
                              duty_R=10;
                              duty_G=10;
                              duty_B=10;
                            }
                            else               //后1秒熄灭
                            {
                              duty_R=0;
                              duty_G=0;
                              duty_B=0;
                            }
                           }
    count=count+1;   //每过1ms计数+1
                  if(count>9)      
                  {
                            count=0;       //计数大于9后又变成0!,0~9十毫秒PWM周期
                  }

                  if(duty_R>count)   //在count 0~9变化中,duty大于count的次数就是占空比
                  {
                            LED_R=1;       //改变duty改变高电平时间,亮度变化
                  }
                  else
                  {
                            LED_R=0;
                  }
                  
                  if(duty_G>count)   //绿色LED PWM
                  {
                            LED_G=1;      
                  }
                  else
                  {
                            LED_G=0;
                  }
                  
                  if(duty_B>count)   //蓝色LED PWM
                  {
                            LED_B=1;      
                  }
                  else
                  {
                            LED_B=0;
                  }
       编译时提示
Build target '目标 1'
compiling 七彩灯.c...
七彩灯.c(211): error C141: syntax error near ''
目标未创建,麻烦看一下哪点有错?

我爱萝丽爱萝丽 发表于 2016-9-29 18:14:27

rensanny 发表于 2016-9-29 11:43
#include

sbit LED_R=P3^4;//定义红灯


七彩灯.c(211): error C141: syntax error near ''
第211行有错误,可能你打了中文字符

我爱萝丽爱萝丽 发表于 2016-9-29 18:18:48

LIHUA 发表于 2016-9-29 09:13
time变量有什么用呢?      没看懂,

time后面有注释,10ms检测一次按键

blackcake 发表于 2016-9-29 19:01:06

终于更新了

楼下的小黑 发表于 2016-9-29 19:44:12

当年看到萝莉的遥控器就中毒了,发现单片机真是个神气的东西. 于是一步步的做起,图书馆找资料,请教别人,啃程序,学硬件。从一个电子盲到现在能很溜的玩51单片机了,经常帮模友做点电子设备,感觉好有成就感。

我是天才 发表于 2016-9-29 23:01:21

本帖最后由 我是天才 于 2016-9-29 23:05 编辑

我爱萝丽爱萝丽 发表于 2016-9-29 03:27
恩,会慢慢有的。这样会的人多了以后简单DIY你们可以自己搞定了
以前好像群主求过电子开关的程序呢,结果群主在论坛发教程了,哈哈,群主尽快推出ppm检测和ppm写法吧,到时候就可以自己写程序了

rensanny 发表于 2016-9-30 10:24:11

我爱萝丽爱萝丽 发表于 2016-9-29 18:14
七彩灯.c(211): error C141: syntax error near ''
第211行有错误,可能你打了中文字符 ...

第211行就是程序最后一行。没有打中文字符。程序基本是复制第七课上的,只是调整了几个时间数据。

LIHUA 发表于 2016-9-30 12:44:45

我爱萝丽爱萝丽 发表于 2016-9-29 18:18 static/image/common/back.gif
time后面有注释,10ms检测一次按键

time=time+1; //1ms计数
if(time>9) //time加到10ms,从0开始,每10ms检测一次按键
{
time=0;

if(Key1==1)
{
if(Key1_old==0) //如果本次是高电平,上次是低电平,检测到按键
{
Key1_action=1;
}
}
time没和延时函数没联系啊?

我是天才 发表于 2016-10-1 12:18:14

LIHUA 发表于 2016-9-30 12:44
time=time+1; //1ms计数
if(time>9) //time加到10ms,从0开始,每10ms检测一次按键
{

系统周期是1ms,LED每亮10次,检测一次按键

机甲老顽童 发表于 2016-10-1 22:18:27

rensanny 发表于 2016-9-29 11:43
#include

sbit LED_R=P3^4;//定义红灯


最后面少了两个}}

lpbzj 发表于 2016-10-3 22:32:26

#include<reg51.h>


sbit LED_R=P3^4;//定义红灯
sbit LED_G=P3^3;//定义绿灯
sbit LED_B=P3^2;//定义蓝灯
sbit Key1=P3^0;

   unsigned char Key1_old;
unsigned char time;
unsigned char Key1_action;
unsigned char mode;

void Delay1ms()                //@12.000MHz
{
      unsigned char i, j;

      i = 12;
      j = 169;
      do
      {
                while (--j);
      } while (--i);
}

void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
{
      while(n)         
      {
                Delay1ms();
                n=n-1;//每循环一次n减小1
      }   
}


main()
{          
      Key1_old=1;   //进入循环前,先初始化标志位。按键还没按下,old是高电平
      
   
       while(1)
      {
                      delay_n_ms(1);   //系统周期,每循环一次1ms
               
               time=time+1;//1ms计数
               if(time>9)
                   {
                            time=0;   
                        
                  if(Key1==1)
                           {
                                if(Key1_old==0)
                                {
                               Key1_action=1;
                                }
                                        }
                                       Key1_old=Key1;
                                               }
                                  
                                   if(Key1_action==1)                //模式0,熄灭
                {

               Key1_action=0;
                               
                               mode++;
                  if(mode>2)
                                {
                                   mode=0;                       
                                                        }
                          if(mode==0)
                                {
                                               LED_R=0;
                               LED_G=0;
                               LED_B=0;
                }
                               if(mode==1)
                               
                                {
                               
                               {
                               

                               LED_R=1;                               
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);//红色亮0.08秒
                                                                        
                LED_R=0;
                LED_G=0;                                                          
                LED_B=0;
                delay_n_ms(80);//灭0.08秒
               
                LED_R=1;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);//红色亮0.08秒
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);//灭0.08秒
               
                LED_R=1;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);//红色亮0.08秒
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);//灭0.08秒
               
                          LED_R=1;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);//红色亮0.08秒
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(200);//灭0.2秒
                LED_R=0;
                LED_G=0;
                LED_B=1;
                delay_n_ms(80);//蓝色亮灭0.08秒
                                                                        
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);
               
                LED_R=0;
                LED_G=0;
                LED_B=1;
                delay_n_ms(80);
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);
               
                LED_R=0;
                LED_G=0;
                LED_B=1;
                delay_n_ms(80);
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);
               
                          LED_R=0;
                LED_G=0;
                LED_B=1;
                delay_n_ms(80);
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(280);

                          LED_R=1;
                LED_G=1;
                LED_B=1;
                delay_n_ms(80);
                                                                        
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);
               
                LED_R=1;
                LED_G=1;
                LED_B=1;
                delay_n_ms(80);//全亮灭0.08秒
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);
               
                LED_R=1;
                LED_G=1;
                LED_B=1;
                delay_n_ms(80);
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);
               
                          LED_R=1;
                LED_G=1;
                LED_B=1;
                delay_n_ms(80);
               
                LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(80);
               
                          LED_R=0;
                LED_G=0;
                LED_B=0;
                delay_n_ms(500);          
      }
                }

                      if(mode==2)            、、

                                {   LED_R=1;、//全亮
                LED_G=1;                               、
                LED_B=1;
                                }
      
                delay_n_ms(100);//延时0.1秒 程序每秒检测10次按键                  
                               }
}       
        }

lpbzj 发表于 2016-10-3 22:34:35

罗丽大哥,麻烦帮看看,为什么爆闪模式只亮一遍就不亮了,?

rensanny 发表于 2016-10-8 11:19:06

yrj 发表于 2016-10-1 22:18
最后面少了两个}}

谢谢,问题已经解决了,感谢指出。

acunss 发表于 2016-10-8 15:24:54

假如我把RGB换成三个 单独红 绿 白的LED也是一样可行的对吧?    一圈看下来。。。我要准备开始动手了。。。哈哈

15843024950 发表于 2016-10-8 17:43:56

在哪里看视频

Myth 发表于 2016-10-9 20:25:38

老师辛苦了!

我爱萝丽爱萝丽 发表于 2016-10-10 12:19:19

lpbzj 发表于 2016-10-3 22:34
罗丽大哥,麻烦帮看看,为什么爆闪模式只亮一遍就不亮了,?

程序周期本来是1ms,你看你现在的程序走一遍要多少ms……你看例子的爆闪怎么延时的

路漫漫其修远兮 发表于 2016-10-13 21:58:36

先顶再学!!!!!!!!!!!!

for水坎兄 发表于 2016-10-14 12:03:49

这条评论证明我存在

独行者 发表于 2016-10-17 11:07:15

迟到的我刚刚上完课,还没做作业!老师辛苦,谢谢老师!
页: 1 2 3 [4] 5 6 7
查看完整版本: 第七课:扩展课!用掉你的单片机