模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

[单片机课堂] 第七课:扩展课!用掉你的单片机

  [复制链接]
发表于 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 ''
目标未创建,麻烦看一下哪点有错?

点评

七彩灯.c(211): error C141: syntax error near '' 第211行有错误,可能你打了中文字符  详情 回复 发表于 2016-9-29 18:14
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 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行有错误,可能你打了中文字符
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-29 18:18:48 | 显示全部楼层
LIHUA 发表于 2016-9-29 09:13
time变量有什么用呢?        没看懂,

time后面有注释,10ms检测一次按键
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-29 19:01:06 | 显示全部楼层
终于更新了
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-29 19:44:12 | 显示全部楼层
当年看到萝莉的遥控器就中毒了,发现单片机真是个神气的东西. 于是一步步的做起,图书馆找资料,请教别人,啃程序,学硬件。从一个电子盲到现在能很溜的玩51单片机了,经常帮模友做点电子设备,感觉好有成就感。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-29 23:01:21 | 显示全部楼层
本帖最后由 我是天才 于 2016-9-29 23:05 编辑
我爱萝丽爱萝丽 发表于 2016-9-29 03:27
恩,会慢慢有的。这样会的人多了以后简单DIY你们可以自己搞定了

以前好像群主求过电子开关的程序呢,结果群主在论坛发教程了,哈哈,群主尽快推出ppm检测和ppm写法吧,到时候就可以自己写程序了
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-30 10:24:11 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-29 18:14
七彩灯.c(211): error C141: syntax error near ''
第211行有错误,可能你打了中文字符 ...

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

使用道具 举报

发表于 2016-9-30 12:44:45 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-29 18:18 第七课:扩展课!用掉你的单片机  作者:LIHUA 6610
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没和延时函数没联系啊?
回复 支持 1 反对 0

使用道具 举报

发表于 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次,检测一次按键
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-1 22:18:27 | 显示全部楼层
rensanny 发表于 2016-9-29 11:43
#include

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

最后面少了两个}}
回复 支持 1 反对 0

使用道具 举报

发表于 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次按键                  
                                 }
}       
        }
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-3 22:34:35 | 显示全部楼层
罗丽大哥,麻烦帮看看,为什么爆闪模式只亮一遍就不亮了,?

点评

程序周期本来是1ms,你看你现在的程序走一遍要多少ms……你看例子的爆闪怎么延时的  详情 回复 发表于 2016-10-10 12:19
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-8 11:19:06 | 显示全部楼层
yrj 发表于 2016-10-1 22:18
最后面少了两个}}

谢谢,问题已经解决了,感谢指出。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-8 15:24:54 | 显示全部楼层
假如我把RGB  换成三个 单独  红 绿 白  的LED  也是一样可行的对吧?    一圈看下来。。。我要准备开始动手了。。。哈哈
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-8 17:43:56 | 显示全部楼层
在哪里看视频
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-9 20:25:38 | 显示全部楼层
老师辛苦了!
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-10-10 12:19:19 | 显示全部楼层
lpbzj 发表于 2016-10-3 22:34
罗丽大哥,麻烦帮看看,为什么爆闪模式只亮一遍就不亮了,?

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

使用道具 举报

发表于 2016-10-14 12:03:49 | 显示全部楼层
这条评论  证明我存在
回复 支持 0 反对 1

使用道具 举报

发表于 2016-10-17 11:07:15 | 显示全部楼层
迟到的我刚刚上完课,还没做作业!老师辛苦,谢谢老师!
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!