中易网

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

答案:1  悬赏:0  
解决时间 2021-10-17 21:48
  • 提问者网友:容嬷嬷拿针来
  • 2021-10-17 16:00
需要一个用按键控制一个LED灯亮度的C语言程序
最佳答案
  • 二级知识专家网友:梦中风几里
  • 2021-10-17 16: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(); //调用 按键响应 函数
}
}
方波输出接口接灯;
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息