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
迟到的我刚刚上完课,还没做作业!老师辛苦,谢谢老师!