关于用单片机模拟PWM输出控制灯的亮度的运行问题

2019-07-16 03:04发布

下面是所用的程序:
#include "reg51.h" //模拟PWM输出控制灯的10个亮度级
sbit P2_0=P2^0 ;
sbit P2_1=P2^1        ;
unsigned int scale=0; //占空比控制变量
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=0;n<50000;n++); //每过一段时间,就自动加一个档次的亮度
scale++; //占空比控制变量scale加1
if(scale==10) scale=0; //如果scale=10,使scale为0
} }
timer0() interrupt 1 //定时器0中断服务程序
{ static 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就可以改变占空比。*/


我想问的是程序的运行的顺序是怎么情况,里面time0()运行时,void main()里的程序运不运行?还有就是倒数第二句if(scale=tt)没看懂,我单步运行的时候观察scale一直为0,很是抓狂.望高手指点迷津!谢谢。。。非常非常感谢!!!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
夏天的黄昏
1楼-- · 2019-07-16 08:17
 精彩回答 2  元偷偷看……
zkjdz2012
2楼-- · 2019-07-16 11:47
看不懂。。。
wkxboot
3楼-- · 2019-07-16 13:13
这个程序使用定时器中断。单片机任何时候只同时执行一条指令,中断时也就是执行time0()时,main函数被中断,不执行。这个程序是:无论如何每隔2.5毫秒就点亮LED一次,而关闭LED的时间长则由scal和tt决定。因为有个for循环,而且值很大,单步运行至少需要50000*n 次才能看到scal 值增加一
夏天的黄昏
4楼-- · 2019-07-16 16:16
zkjdz2012 发表于 2012-12-21 15:48
看不懂。。。

嘿嘿。。。,以后会看的懂的。加油。。
夏天的黄昏
5楼-- · 2019-07-16 20:21
wkxboot 发表于 2012-12-21 16:08
这个程序使用定时器中断。单片机任何时候只同时执行一条指令,中断时也就是执行time0()时,m ...

嗯,谢谢。中午又琢磨了一会,算是搞明白了。不过用protues仿真不明显,在实验板上,效果挺好的。
yatoo
6楼-- · 2019-07-16 21:41
 精彩回答 2  元偷偷看……

一周热门 更多>