关于51单片机输出PWM方波问题!

2019-07-14 20:15发布

这是一个PWM输出占空比一直变化的方波,控制一个发光二极管实现呼吸灯的效果。
我的问题是:为啥定时器判定if(highv>100)不能改成if(highv==100),改后就没有呼吸灯的效果了,原因是什么?
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit PWM=P2^1;
  5. uchar num;
  6. uint highv,lowv,duan;
  7. void init();
  8. void main()
  9. {
  10.         init();
  11.         //duan=1;
  12. //PWM=0;
  13.         while(1)
  14.         {
  15.                 if(highv>100)
  16.                 {
  17.                         highv=0;
  18.                         if(num==0)
  19.                         {
  20.                                 duan--;
  21.                         }
  22.                         if(num==1)
  23.                         {
  24.                                 duan++;          
  25.                         }
  26.                 }
  27.                         if(duan==1000)
  28.                         {
  29.                            num=0;
  30.                         }
  31.                                 if(duan==0)
  32.                                 {
  33.                                         num=1;
  34.                                 }
  35.                                         if(lowv>1000)
  36.                                         {
  37.                                                 lowv=0;
  38.                                         }       
  39.                                                 if(duan>=lowv)
  40.                                                 {
  41.                                                         PWM=1;
  42.                                                 }
  43.                                                         else
  44.                                                         {
  45.                                                                 PWM=0;
  46.                                                         }
  47.         }

  48. }
  49. void init()
  50. {
  51.         TMOD=0X11;
  52.         TH0=(65536-1)/256;
  53.         TL0=(65536-1)%256;
  54.         EA=1;
  55.         ET0=1;
  56.         TR0=1;       
  57. }
  58. void time() interrupt 1
  59. {
  60.         TH0=(65536-1)/256;
  61.         TL0=(65536-1)%256;
  62.         highv++;
  63.         lowv++;
  64. }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
he07413
1楼-- · 2019-07-15 04:51
有没有地方执行时间过长,导致 进中断继续++超过100了,但是主程序里还没有执行到那个if语句。导致以后没法清零了
fashaoyou01
2楼-- · 2019-07-15 06:37
he07413 发表于 2016-10-27 10:25
有没有地方执行时间过长,导致 进中断继续++超过100了,但是主程序里还没有执行到那个if语句。导致以后没法清零了

说的有点道理,但是,不是应该单片机定时时间大于语句执行时间或者延时时间就行了吗?我定时100us,一个语句执行需要1us,应该符合要求的!
@曲终人散@
3楼-- · 2019-07-15 09:37
 精彩回答 2  元偷偷看……
fashaoyou01
4楼-- · 2019-07-15 14:47
@曲终人散@ 发表于 2016-10-27 12:56
占空比要维持一定的时间再改变,不然不太明显有呼吸效果

你好,这个程序是可以实现呼吸灯的但是不明白为啥定时器判定if(highv>100)不能改成if(highv==100),改后就没有呼吸灯的效果了,原因是什么?
shuchao007
5楼-- · 2019-07-15 16:34
可以试下是不是没有赋初值的原因
fashaoyou01
6楼-- · 2019-07-15 19:09
shuchao007 发表于 2016-10-27 18:13
可以试下是不是没有赋初值的原因

你是说duan 这个吗?没赋初值 默认值为0,我赋了初值也是一样

一周热门 更多>