调节小灯亮度的c语言程序,需要一个用按键控制一个LED灯亮度的C语言程序

匿名用户

1级

2012-02-21 回答

/**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 TRUE1//定义 逻辑真

#define FALSE0//定义 逻辑假

#define th00xfc//100Hz(10ms),占空比分母10,则其最小时间单位应该为10ms/10=1ms,故定时器T0定时时间为 1ms

#define tl00x18//1ms at 12HMz Fosc

#define DutyDeno10//定义 占空比分母 为: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

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();//调用 按键响应 函数

}

}

方波输出接口接灯;

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值