关于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条回答
fashaoyou01
1楼-- · 2019-07-15 23:42
自己顶下,能有人给出详细的解释吗?
HARRY007
2楼-- · 2019-07-15 23:51
 精彩回答 2  元偷偷看……
上官梦舞
3楼-- · 2019-07-16 03:36
一般进入定时器中断,我会关掉定时器,重设值之后再打开计时器。
shuchao007
4楼-- · 2019-07-16 05:37
fashaoyou01 发表于 2016-10-27 19:23
你是说duan 这个吗?没赋初值 默认值为0,我赋了初值也是一样

刚算了下,你的while循环比定时器溢出中断快多了,会导致已经跑过规定值了还没有判断到
fashaoyou01
5楼-- · 2019-07-16 10:27
HARRY007 发表于 2016-10-28 08:22
TH0=(65536-1)/256;
TL0=(65536-1)%256;
这是定时多久的?怎么计算的?

这个是定时1us,定时时间比较短!
fashaoyou01
6楼-- · 2019-07-16 15:12
shuchao007 发表于 2016-10-28 16:41
刚算了下,你的while循环比定时器溢出中断快多了,会导致已经跑过规定值了还没有判断到

你的意思是不是说我定时1us进入一次中断时间太短,我应该定时几百US或者更长时间进入中断,是不是这样的意思?

一周热门 更多>