LED程序改错哪错了,怎么改

查看: 427|回复: 8
单片机LED调光程序问题
现在用一个按键可以实现开灯、关灯,长按可以调光,但是调光要在关灯后,按一次按键开灯,在1秒内接着长按就可以调光,如果大于1秒再按按键就成关灯了;请大神帮忙看一下,怎么写才能做到,短按开关灯,在开灯的时候,随时长按都能进入调光状态。
/*led1用高色温, led2用低色温,key_S2按键短按开关灯,长按调光调色温 ,led1和led2的状态相反
无级调光 ,亮到暗,暗到亮& && &
#include &reg52.h&
unsigned char pwm_led_val = 0;//LED占空比值&&0最亮
unsigned char pwm_t;// 周期
sbit led1 = P1^0;& && &&&//定义LED端口
sbit led2 = P1^7;
sbit key_s2 = P3^0;& && && &//定义按键端口
void delay(unsigned int z)//毫秒级延时
& && &&&unsigned int x,y;
& && &&&for(x = x & 0; x--)
& && && && && & for(y = 114; y & 0 ; y--);
//定时器0中断
void timer0() interrupt 1
& && &&&pwm_t++;
& && &&&if(pwm_t == 40)
& && && && && & pwm_t = 0; led1 = 1;& && &&&led2 = !led1;
& && &&&if(pwm_led_val == pwm_t)
& && && && && & led1 = 0; led2 = !led1;& && && && && && && && && && && && && &&&
void main()
& && &&&& && && & //亮度标志位
& && &&&TMOD |= 0x02;//8位自动重装模块
& && &&&TH0 = 240;
& && &&&TL0 = 240;//
& && &&&TR0 = 1;//启动定时器0
& && &&&ET0 = 1;//允许定时器0中断
& && &&&EA& && &&&= 1;//总中断允许
& && &&&while(1)
& && && && && && &if(key_s2 == 0)
& && && && && && & {
& && && && && && &&&delay(10);
& && && && && && &&&if(key_s2 == 0)& && && &//确认按下
& && && && && && && &{
& && && && && && && && && &TR0 = !TR0;
& && && && && && && && && &P1 = 0& && && &//开关灯
& && && && && && && && && &delay(100);& && && & //延时长一点
& && && && && && && && && &&&while(!key_s2) //如果按键还处于按下状态,就进入调光
& && && && && && && && && &{
& && && && && && && && && && &delay(10);
& && && && && && && && && && &&&
& && && && && && && && && && && && && & if(flag==0)
& && && && && && && && && && && && && & {
& && && && && && && && && && && && && && && && && &if(pwm_led_val & 40)
& && && && && && && && && && && && && && && && &{
& && && && && && && && && && && && && && && && && && &&&pwm_led_val++;& && && && && && && && &//变暗
& && && && && && && && && && && && && && && && && && &&&if(pwm_led_val &= 40)
& && && && && && && && && && && && && && && && && && && && && & flag=1;
& && && && && && && && && && && && && && && && &}
& && && && && && && && && && && && && && &}
& && && && && && && && && && && &
& && && && && && && && && && && & if(flag==1)
& && && && && && && && && && && & {
& && && && && && && && && && && && && && & if(pwm_led_val & 0)
& && && && && && && && && && && && && && &pwm_led_val--;& && && & //变亮
& && && && && && && && && && && && && && &if(pwm_led_val &=0)
& && && && && && && && && && && && && && &&&flag=0;
& && && && && && && && && && && & }& && && &
& && && && && && && && && && && &}
& && && && && && && && && && && &
& && && && && && && && && && && &
& && && && && && && && && && &&&}
& && && && && && && && &&&}
& && && && && && &&&
& && && && && &&&}
& && && && && &&&
&&}& && && &
写的还是挺好的
还有别的代码源程序吗
写的挺好的
应该没有问题的
怎么没有高手来看一下呢?这个问题困扰我好长时间了
用状态机的编程思路,终于把这个功能实现了
/* ********************************************************************************************* */
// 处理器& &: STC89C52RC
// 编译环境 : Keil4 C51
// 系统时钟 : 11.0592MHZ
// 简单描述 : 1个独立按键,短按开关灯,长按调光
/* ********************************************************************************************* */
#include&reg52.h&
typedef unsigned char uChar8;
typedef unsigned int&&uInt16;
& & & & & & & & & & & & & & & & & & & &&&/*初始状态&&确认状态& &单击状态& & 连发状态 */
typedef enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};//键值状态值
uChar8 pwm_led_val = 0; & & & & //LED占空比值 0-20 0最亮
uChar8 pwm_t; & & & & & & & & & & & & & & & & //周期
sbit KEY1 = P3^0;& & & & & & & & & & & & //定义按键端口
sbit LED = P1^0;& & & & & & & & & & & & //定义LED灯端口
void Timer0Init(void)
& & & & TMOD |= 0x02;& & & & & & & & & & & & //设置定时器0工作模式2,8位自动重装
& & & & TH0 = 240;& & & & & & & & & & & & & & & & //定时器装初值
& & & & TL0 = 240;& & & & & & & & & & & & & & & & //11.0592M晶振下占空比最大比值是20,输出2880HZ
& & & & EA = 1;& & & & & & & & & & & & & & & & & & & & //开总中断
& & & & ET0 = 1;& & & & & & & & & & & & & & & & //开定时器0中断
& & & & TR0 = 1;& & & & & & & & & & & & & & & & //启动定时器0
void Timer1Init(void)
& & & & TMOD |= 0x10;& & & & & & & & & & & & // 设置定时器1工作模式1,16位计数器
& & & & TH1 = 0xDC;& & & & & & & & & & & & & & & & // 赋初始值
& & & & TL1 = 0x00;& & & & & & & & & & & & & & & & // 11.0592M晶振下,定时10ms
& & & & TR1 = 1;& & & & & & & & & & & & & & & & // 启动定时器1
/* ***************************************************** */
// 函数名称:& & & & Init()
// 函数功能:& &初始化
// 入口参数:& & & & 无
// 出口参数: & & & & 无
/* ***************************************************** */
void Init()& & & & & & & & & & & & & & & & & & & & //初始化
& & & & Timer0Init();
& & & & Timer1Init();
& & & & & & & &
//定时器0中断
void timer0() interrupt 1
& & & & pwm_t++;
& & & & if(pwm_t == 20)
& & & & & & & & pwm_t = 0; LED = 1;
& & & & if(pwm_led_val == pwm_t)
& & & & & & & & LED = 0;& & & & & & & & & & & & & & & & & & & &&&
/* ***************************************************** */
// 函数名称:KeyScan(void)
// 函数功能:扫描按键
// 入口参数:无
// 出口参数:键值(num)
/* ***************************************************** */
void KeyScan(void)
& & & & static uChar8 KeyStateTemp1 = 0;& & & & & & & & & & & & //按键状态临时存储值1
& & & & static uChar8 KeyTime = 0;& & & & & & & & & & & & & & & & & & & & //按键延时时间
& & & & bit KeyPressTemp1;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //按键是否按下存储值1
& & & && & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //亮度标志
& & & & KeyPressTemp1 = KEY1;& & & & & & & & & & & & & & & & & & & & & & & & //读取I/O口的键值
& & & & switch(KeyStateTemp1)
& & & & {& & & &
& & & & & & & & case StateInit:& & & & & & & & & & & & & & & & & & & & & & & & & & & & //按键初始状态
& & & & & & & & & & & & if(!KeyPressTemp1)& & & & & & & & & & & & & & & & & & & & //当按键按下,状态切换到确认态
& & & & & & & & & & & & & & & & KeyStateTemp1 = StateA
& & & & & & & & & & & &
& & & & & & & &
& & & & & & & & case StateAffirm:& & & & & & & & & & & & & & & & & & & & & & & & //按键确认态
& & & & & & & & & & & & if(!KeyPressTemp1)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & KeyTime = 0;
& & & & & & & & & & & & & & & & KeyStateTemp1 = StateS& & & & //切换到单次触发态& & & &
& & & & & & & & & & & & }
& & & & & & & & & & & & else KeyStateTemp1 = StateI & & & & //按键已抬起,切换到初始态
& & & & & & & & & & & &
& & & & & & & & case StateSingle:& & & & & & & & & & & & & & & & & & & & & & & & //按键单发态
& & & & & & & & & & & & if(KeyPressTemp1)& & & & & & & & & & & & & & & & & & & & //按下时间小于1s
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & KeyStateTemp1 = StateI&&& & & & //按键释放,则回到初始态
& & & & & & & & & & & & & & & & & & & & & & & & TR0 = !TR0;
& & & & & & & & & & & & & & & & & & & & & & & & LED = 1;& & & & & & & & & & & & & & & & //关闭LED
& & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & & & & & else if(++KeyTime & 100)& & & & & & & & & & & & //按下时间大于1s(100*10ms)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & KeyStateTemp1 = StateR& & & & //状态切换到连发态
& & & & & & & & & & & & & & & & KeyTime = 0;& & & &
& & & & & & & & & & & & }
& & & & & & & & & & & &
& & & & & & & &
& & & & & & & & case StateRepeat:& & & & & & & & & & & & & & & & & & & & & & & & //按键连发态& & & & & & & &
& & & & & & & & & & & & if(KeyPressTemp1)
& & & & & & & & & & & & & & & & KeyStateTemp1 = StateI& & & & & & & & //按键释放,则进初始态
& & & & & & & & & & & & else& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //按键未释放
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & if(++KeyTime & 10)& & & & & & & & & & & & & & & & //按键计时值大于100ms(10*10ms)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & KeyTime = 0;& & & &
& & & & & & & & & & & & & & & & & & & & & & & & if(falg == 0)
& & & & & & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & & & & & if(pwm_led_val & 20)
& & & & & & & & & & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & pwm_led_val++;& & & & //亮度变暗
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & if(pwm_led_val==20)
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & falg = 1;
& & & & & & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & & & & & if( falg ==1 )
& & & & & & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & & & & & if(pwm_led_val & 0)
& & & & & & & & & & & & & & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & pwm_led_val--;& & & & //亮度变亮
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & if(pwm_led_val==0)
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & falg = 0;
& & & & & & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & & & & &
& & & & & & & &
& & & & & & & & default: KeyStateTemp1 = KeyStateTemp1 = StateI
/* ***************************************************** */
// 函数名称:ExecuteKeyNum(void)
// 函数功能:按键值来执行相应的动作
// 入口参数:无
// 出口参数:无
/* ***************************************************** */
void ExecuteKeyNum(void)
& & & & if(TF1)& & & & & & & & & & & & & & & & & & & & //定时器1溢出
& & & & & & & & TF1 = 0;
& & & & & & & & TH1 = 0xDC;
& & & & & & & & TL1 = 0x00;
& & & & & & & & KeyScan();
void main()
& & & & Init();& & & & & & & & & & & & & & & & & & & & //首先初始化各数据
& & & & while(1)& & & & & & & & & & & & & & & & //进入主程序大循环
& & & & & & & & ExecuteKeyNum();& & & & //不停的检测按键是否被按下
真厉害,一个键这么多功能
Powered by跪求大神,51定时器控制一个led灯,1秒亮,1秒灭的程序,哪里出错啦,坐等回复 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
跪求大神,51定时器控制一个led灯,1秒亮,1秒灭的程序,哪里出错啦,坐等回复
14:08:54  
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1)
& & & &&&{
& & & && &if(tt==20)
& & & && & {& & & &
& & & & & & & & tt=0;
& & & && &&&D1=1;
& & & && & }
& & & &&&& & & & D1=0;
& & & && &}
& & & & & & & & & & & & & & & &
void InitTimer()
& & TMOD = 0x01;
& & TH0 = 0x3c;
& & TL0 = 0xb0;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& & & & tt++;
unsigned char&&
sbit D1=P2^0;
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1)
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=~D1;
& && && &&&}
& && && && && &
& && && & }
& && && && && && && && && && &&&
void InitTimer()
& & TMOD = 0x01;
& & TH0 = 0x3c;
& & TL0 = 0xb0;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& && &&&tt++;
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=1;
& && && &&&}
& && && && && &&&D1=0;
& && && & }中D1=~D1;
试想一下程序中只有当tt=20时候才有高电平,那么tt=0~19的时间段D1为低电平,灭亮比为19:1,根本就看不见;
另外这样写代码,效率不高!
14:08:55  
unsigned char&&
sbit D1=P2^0;
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1)
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=~D1;
& && && &&&}
& && && && && &
& && && & }
& && && && && && && && && && &&&
void InitTimer()
& & TMOD = 0x01;
& & TH0 = 0x3c;
& & TL0 = 0xb0;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& && &&&tt++;
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=1;
& && && &&&}
& && && && && &&&D1=0;
& && && & }中D1=~D1;
试想一下程序中只有当tt=20时候才有高电平,那么tt=0~19的时间段D1为低电平,灭亮比为19:1,根本就看不见;
另外这样写代码,效率不高!
14:11:49  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
弄了几天啦,一直没有发现问题吖
14:23:51  
#include &reg51.h&
unsigned char&&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1);& && && &&&
void display()
&&if(tt=20)
&&D1=~D1;
void InitTimer()
& & TMOD = 0x01;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& & TL0 = 0xb0;
& & display();
等待验证会员
14:25:39  
我想问下tt的初始值是多少
14:42:43  
#include &reg51.h&
sbit D1=P2^0;
void InitTimer();
void main()
& &&&InitTimer();
& &&&while(1);& && && &&&
void display()
&&if(tt==20)
void InitTimer()
& & TMOD = 0x01;
& & EA = 1;
& & ET0 = 1;
& & TR0 = 1;
void Timer() interrupt 1
& &TH0 = 0x3c;
& &TL0 = 0xb0;
& &display();
调试通过了!你那个
& && && &{
& && && & if(tt==20)
& && && &&&{& && &&&
& && && && && & tt=0;
& && && && &D1=1;
& && && &&&}
& && && && && &&&D1=0;
& && && & }
程序在中间一直循环,跳不出来的,
16:30:54  
while 有问题,还有你的晶振是多少初值给对了吗?while就是存在楼上说的问题,你的程序不是1s 亮1s灭……嘿嘿,没事初学都易犯这个错,多想想怎么编吧
17:30:03  
问题应该是D1=~D1,这样就行了,你那样,低电平时间和高电平时间同吗?
08:37:52  
我想问下tt的初始值是多少
tt=0& && &
08:40:32  
unsigned char&&
sbit D1=P2^0;
我 下载去看看然后再想想,大神阿,跪谢吖
08:53:39  
while 有问题,还有你的晶振是多少初值给对了吗?while就是存在楼上说的问题,你的程序不是1s 亮1s灭……嘿嘿,没事初学都易犯这个错,多想想怎么编吧
晶振是11.0592Mhz,对阿,当时忘记考虑机器周期啦,谢谢提醒
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
下载发烧友APP
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 二级c语言程序改错 的文章

 

随机推荐