AD 控制LED灯亮度 C语言程序怎么编写
发布网友
发布时间:2022-04-29 22:26
我来回答
共1个回答
热心网友
时间:2022-06-24 13:28
/**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
ty_time=0;
//定义静态变量,作为
占空比
输出时间的参考值(1ms)
TL0=tl0;
TH0=th0;
//重赋定时器初值,1ms
ty_time=++ty_time%DutyDeno;
//该句等效于:ty_time++;ty_time%=DutyDeno;
if(ty_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();
//调用
按键响应
函数
}
}
方波输出接口接灯;