百度知道 - 信息提示

日期:2025-01-12 18:48:30 人气:1

百度知道 - 信息提示

    A+
热门评论

单片机C语言按键控制LED灯

其实是一样的,也没什么哪个规范这一说,这个看个人习惯了 首先if(SW13==0)是判断此引脚是否为0 (按键按下) 然后一个delay用于按键防抖动 没被注释的那部分是靠if在次判断是否为0按下按下后执行LED_ON函数使LED亮 然后通过while判断按键是否松开,如果松开的话就继续执行LED_OFF将LED关闭 而注释掉的那段是依靠while函数直接判断按键是否处于按下状态 是的话就循环执行LED_ON函数直至判断按键松开(SW13=1)后在继续执行到LED_OFF函数使LED 关闭 不过这两种写法的有个共同缺点就是按键判断是while死循环,如果你这个按键按下后,单片机就只是在判断这个条件成立与否,期间不在进行其他工作

阅读全文

需要一个用按键控制一个LED灯亮度的C语言程序

/**52系列单片机,晶振12MHz,P1.0输出100Hz方波(即周期10ms),方波由T0定时器产生 P1.3接按键 K1,每按一次按键,方波占空比改变一次,依次为:1/10→2/10→……→9/10→1/10,如此循环**/ #include"reg52.h" //包含52系列头文件 #define uchar unsigned char //定义 无符号字符型 #define uint unsigned int //定义 无符号整型 #define TRUE 1 //定义 逻辑真 #define FALSE 0 //定义 逻辑假 #define th0 0xfc //100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为 1ms #define tl0 0x18 //1ms at 12HMz Fosc #define DutyDeno 10 //定义 占空比分母 为:10 sbit WaveOut=P1^0; //定义 方波输出 接口 sbit Key1=P1^3; //定义 按键Key1 接口 uchar DutyNume=1; //定义 占空比分子 变量,并初始化为 1(即 占空比 为:1/10) void Timer0() interrupt 1 //定时器T0 中断 函数 { static uchar duty_time=0; //定义静态变量,作为 占空比 输出时间的参考值(1ms) TL0=tl0; TH0=th0; //重赋定时器初值,1ms duty_time=++duty_time%DutyDeno; //该句等效于:duty_time++;duty_time%=DutyDeno; if(duty_time<DutyDeno) WaveOut=1; //若计时时间小于 占空比分子,则输出应为 高电平 else WaveOut=0; //若计时时间大于 占空比分子,则输出应为 低电平 } void TimerInit() //定时器初始化 函数 { TMOD=0x01; //T0 16位定时器 EA=1; //允许系统中断 ET0=1; //允许T0中断 TH0=th0; TL0=tl0; //1ms 初值 TR0=1; //T0开始计时 } void KeyResp() //按键响应 函数 { static bit KeyDownFlag,KeyReadyFlag; //定义 静态标志位,KeyDownFlag 按键按下标志,KeyReadyFlag 按键准备(响应)标志 if(!Key1) //若按键Key1 被按下 { KeyDownFlag=TRUE; //按键按下标志 置位 KeyReadyFlag=TRUE; //按键准备标志 置位 } else KeyDownFlag=FALSE; //若按键Key1 无按下,则清空 按键按下标志 if(!KeyDownFlag && KeyReadyFlag) //若 按键已准备,且按键无按下(即 松手状态) { DutyNume++; //占空比分子 加1 if(DutyNume==DutyDeno) DutyNume=1; //若 占空比分子=分母,则返回 1 KeyReadyFlag=FALSE; //按键处理完毕,清 按键准备标志 } } void main() //主函数 { TimerInit(); //调用 定时器初始化 函数 while(1) //循环系统 { KeyResp(); //调用 按键响应 函数 } } 方波输出接口接灯;

阅读全文