找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1590|回复: 6
收起左侧

关于单片机PWM呼吸灯程序的几个问题,求解答

[复制链接]
ID:903260 发表于 2021-4-9 23:51 | 显示全部楼层 |阅读模式
  这是我编写的PWM呼吸灯程序,但是只有在中断里面加上while(1)循环他才能呼吸。没有这个while直接就不亮了,但我看别人的呼吸灯函数中断内没有while循环也能呼吸,这是为什么?
  还有一个问题,加上while循环后的呼吸灯在逐渐变暗的时候“灯亮灭的抖动”明显,怎么能让他看起来流畅一点。

单片机源程序如下:
  1. #include "reg52.h"

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit LED = P2^0;

  5. u16 timer1, count, value;
  6. bit flag;

  7. void TimeInit()//¶¨ê±1us
  8. {
  9.         TMOD |= 0x10;
  10.         TH1 = 0xFF;
  11.         TL1 = 0xFF;
  12.         TR1 = 1;
  13.         EA = 1;
  14.         ET1 = 1;
  15. }

  16. void main()
  17. {
  18.                 LED = 1;
  19.                 timer1 = 0;
  20.                 count = 0;
  21.                 value = 0;
  22.                 flag = 0;
  23.                 TimeInit();
  24.                 while(1);
  25. }

  26. void Time() interrupt 2
  27. {
  28.         TH1 = 0xFF;
  29.         TL1 = 0xFF;
  30.         //while(1)
  31. //        {
  32.                 timer1++;
  33.                 count++;
  34.                         if(timer1 == 1000)
  35.                         {
  36.                                 timer1 = 0;
  37.                                 LED = 1;
  38.                         }
  39.                         if(count == 100)
  40.                         {
  41.                                 count = 0;
  42.                                 if(flag == 0)
  43.                                 {
  44.                                         value++;
  45.                                 }
  46.                                 if(flag == 1)
  47.                                 {
  48.                                         value--;
  49.                                 }
  50.                         }
  51.                         if(value == 1000)
  52.                         {
  53.                                 flag = 1;
  54.                         }
  55.                         if(value == 0)
  56.                         {
  57.                                 flag = 0;
  58.                         }
  59.                         if(value > timer1)
  60.                         {
  61.                                 LED = 0;
  62.                         }
  63.                         else
  64.                         {
  65.                                 LED = 1;
  66.                         }
  67.         //        }
  68. }
复制代码

回复

使用道具 举报

ID:89515 发表于 2021-4-10 08:41 来自手机 | 显示全部楼层
51是溢出中断还是匹配中断?如果是溢出中断的话,你的初值不合适,虽然逻辑没错但是定时器溢出太频繁了,根本无法正常运行。就模拟占空比控制LED而言,1ms时基绝对没问题。虽然写的很复杂,逻辑好像没错,修改定时器溢出时间后如果led显示不平滑可更改你的count。
回复

使用道具 举报

ID:89515 发表于 2021-4-10 09:05 来自手机 | 显示全部楼层
溢出时间重设,不然无法正常中断。减小count
回复

使用道具 举报

ID:894154 发表于 2021-4-10 10:32 | 显示全部楼层
你在定时中断里面加while(1)的结果就是程序就在定时中断里面跑不出来了
将执行LED代码放到主函数里面,定时中断函数只负责计算时间 重置标志位
回复

使用道具 举报

ID:390416 发表于 2021-4-10 11:33 | 显示全部楼层
PWM程序 STC89单片机 定时器做 http://www.51hei.com/bbs/dpj-200820-1.html
回复

使用道具 举报

ID:903260 发表于 2021-4-12 17:07 | 显示全部楼层
  1. #include "reg52.h"

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit LED = P2^0;

  5. u16 timer1, count, value;
  6. bit flag;

  7. void TimeInit()//¶¨ê±1us
  8. {
  9.         TMOD |= 0x01;
  10.         TH0 = 0xFF;
  11.         TL0 = 0xFF;
  12.        
  13.         //TR0 = 1;
  14.         EA = 1;
  15.         ET0 = 1;
  16. }

  17. void main()
  18. {
  19.                 LED = 1;
  20.                 timer1 = 0;
  21.                 count = 0;
  22.                 value = 0;
  23.                 flag = 0;
  24.                 TimeInit();
  25.         while(1)
  26.         {
  27.                 TR0 = 1;
  28.                 if(timer1 == 1000)
  29.                         {
  30.                                 timer1 = 0;
  31.                                 LED = 1;
  32.                         }
  33.                         if(count == 100)
  34.                         {
  35.                                 count = 0;
  36.                                 if(flag == 0)
  37.                                 {
  38.                                         value++;
  39.                                 }
  40.                                 if(flag == 1)
  41.                                 {
  42.                                         value--;
  43.                                 }
  44.                         }
  45.                         if(value == 1000)
  46.                         {
  47.                                 flag = 1;
  48.                         }
  49.                         if(value == 0)
  50.                         {
  51.                                 flag = 0;
  52.                         }
  53.                         if(value > timer1)
  54.                         {
  55.                                 LED = 0;
  56.                         }
  57.                         else
  58.                         {
  59.                                 LED = 1;
  60.                         }
  61.                 }
  62. }

  63. void Time() interrupt 1
  64. {
  65.         TH0 = 0xFF;
  66.         TL0 = 0xFF;
  67.         timer1++;
  68.         count++;
  69. }
复制代码


我重新排了一下,这直接不亮了。。。
回复

使用道具 举报

ID:903260 发表于 2021-4-12 17:27 | 显示全部楼层
时间我不知道怎么设置好了。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表