AD 控制LED灯亮度 C语言程序怎么编写

AD 控制LED灯亮度 C语言程序怎么编写,第1张

/**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()

//调用

按键响应

函数

}

}

方波输出接口接灯;

/**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()

//调用

按键响应

函数

}

}

方波输出接口接灯;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12261747.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存