关于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条回答
HARRY007
1楼-- · 2019-07-16 17:19
 精彩回答 2  元偷偷看……
idianze
2楼-- · 2019-07-16 18:16
无回帖,不论坛
花不语怪风
3楼-- · 2019-07-16 18:45
你可以写highv>=100,你就写==100,会造成++超了,根本就没法再玩下去了
默默的人品
4楼-- · 2019-07-16 23:17
你这个是定时1us进入一次中断,而判断命令的执行时间是大于1us(一个时钟周期)的,这就导致判断的时候不一定能够刚好是等于100.把定时时间延长一点试试,50us为(65535-50+1)

一周热门 更多>