如何用51程序改变占空比

如何用51程序改变占空比,第1张

*介绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。程序中使用定时器0产生2.5ms周期脉冲,使用占空比控制变量scale控制占空比,在低电平期间使LED灯亮,在高电平期间使LED灯灭,改变scale就改变了高电平与低电平的时间,因此也就控制了LED灯的亮度。*/#include "AT89X51.H" //模拟PWM输出控制灯的10个亮度级 unsigned int scale //占空比控制变量 void main(void) // 主程序 { unsigned int n //延时循环变量 TMOD=0x02 //定时器0,工作模式2(0000,0010),8位定时模式 TH0=0x06 //写入预置初值6到定时器0,使250微秒溢出一次(12MHz) TL0=0x06 //写入预置值 TR0=1 //启动定时器 ET0=1 //允许定时器0中断 EA=1//允许总中断 while(1) //无限循环,实际应用中,这里是做主要工作 { for(n=0n<50000n++) //每过一段时间,就自动加一个档次的亮度 scale++ //占空比控制变量scale加1 if(scale==10) scale=0 //如果scale=10,使scale为0 } } timer0() interrupt 1//定时器0中断服务程序 {unsigned int tt //tt用来保存当前时间在一秒中的比例位置 tt++ //每250微秒增加1 if(tt==10) //2.5毫秒的时钟周期 { tt=0 //使tt=0,开始新的PWM周期 P2_0=0 //使LED灯亮 } if(scale==tt) //按照当前占空比切换输出为高电平 P2_0=1 //使LED灯灭 } /*程序中从tt=0开始到scale为低电平,从scale开始到tt=10为高电平,由于scale是变量,所以改变scale就可以改变占空比。*/

用定时器产生程序如下:

unsigned

int

a=0

,b=10

void

main()

{

tmod=0x01

th0=(65536-50000)/256

tl0=(65536-50000)%256

ea=1

et0=1

tr0=1

}

void

pwm()

interrupt

1

{

th0=(65536-50000)/256

tl0=(65536-50000)%256

a++

p1^1=0

if(a=20)

{

a=0

}

if(a=b)

{

p1^1=1

}

}

调节a

,b的值即可调节占空比,程序框架就是这样,具体自己改吧

首先选择一个I/O设置为输出模式,这个就是用于输出

方波

的硬件接口。

频率可调,可以根据你要想要的频率,换算成中断周期,实质上是一个计数器。建议弄一个300K的中断服务。那么可以这样整:如果要30K的频率,那么每10次中断视为一次完整的周期,执行一次你要的处理。

占空比

问题,比如30%的占空比,那么你前三次中断都把状态设置为1,后面七次都设置为0状态。照这个思路就实现你的占空比了。当然这些中断次数的依据需要你自己对占空比的要求进行换算得到。在中断服务程序中去 *** 作I/O口状态,当然你还可以在该程序结束的时候或者开始的时候,再次修改中断时间从而调整输出频率。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存