关于51单片机输出PWM方波问题!
我的问题是:为啥定时器判定if(highv>100)不能改成if(highv==100),改后就没有呼吸灯的效果了,原因是什么?
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit PWM=P2^1;
- uchar num;
- uint highv,lowv,duan;
- void init();
- void main()
- {
- init();
- //duan=1;
- //PWM=0;
- while(1)
- {
- if(highv>100)
- {
- highv=0;
- if(num==0)
- {
- duan--;
- }
- if(num==1)
- {
- duan++;
- }
- }
- if(duan==1000)
- {
- num=0;
- }
- if(duan==0)
- {
- num=1;
- }
- if(lowv>1000)
- {
- lowv=0;
- }
- if(duan>=lowv)
- {
- PWM=1;
- }
- else
- {
- PWM=0;
- }
- }
- }
- void init()
- {
- TMOD=0X11;
- TH0=(65536-1)/256;
- TL0=(65536-1)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- void time() interrupt 1
- {
- TH0=(65536-1)/256;
- TL0=(65536-1)%256;
- highv++;
- lowv++;
- }
这个我知道,我遇到过,最后解决了,原因就是因为定时器是在不停地工作计时的,也就是highv在一直加加,但当加到100时并不能立刻被主程序检测到,所以造成了已经加到了100多了,而你的程序才开始检测highv,此时highv已经大于100,所以if语句就不执行了,就是这原因,望采纳。
自己顶下!有没有大神支持下!
有没有地方执行时间过长,导致 进中断继续++超过100了,但是主程序里还没有执行到那个if语句。导致以后没法清零了
说的有点道理,但是,不是应该单片机定时时间大于语句执行时间或者延时时间就行了吗?我定时100us,一个语句执行需要1us,应该符合要求的!
占空比要维持一定的时间再改变,不然不太明显有呼吸效果
你好,这个程序是可以实现呼吸灯的但是不明白为啥定时器判定if(highv>100)不能改成if(highv==100),改后就没有呼吸灯的效果了,原因是什么?
可以试下是不是没有赋初值的原因
你是说duan 这个吗?没赋初值 默认值为0,我赋了初值也是一样
自己顶下,能有人给出详细的解释吗?
TH0=(65536-1)/256;
TL0=(65536-1)%256;
这是定时多久的?怎么计算的?
一般进入定时器中断,我会关掉定时器,重设值之后再打开计时器。
刚算了下,你的while循环比定时器溢出中断快多了,会导致已经跑过规定值了还没有判断到
这个是定时1us,定时时间比较短!
你的意思是不是说我定时1us进入一次中断时间太短,我应该定时几百US或者更长时间进入中断,是不是这样的意思?
改长,主程序的逻辑很乱,建议简化一下
无回帖,不论坛
你可以写highv>=100,你就写==100,会造成++超了,根本就没法再玩下去了
你这个是定时1us进入一次中断,而判断命令的执行时间是大于1us(一个时钟周期)的,这就导致判断的时候不一定能够刚好是等于100.把定时时间延长一点试试,50us为(65535-50+1)
