找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2181|回復(fù): 6
收起左側(cè)

關(guān)于單片機(jī)PWM呼吸燈程序的幾個(gè)問(wèn)題,求解答

[復(fù)制鏈接]
ID:903260 發(fā)表于 2021-4-9 23:51 | 顯示全部樓層 |閱讀模式
  這是我編寫(xiě)的PWM呼吸燈程序,但是只有在中斷里面加上while(1)循環(huán)他才能呼吸。沒(méi)有這個(gè)while直接就不亮了,但我看別人的呼吸燈函數(shù)中斷內(nèi)沒(méi)有while循環(huán)也能呼吸,這是為什么?
  還有一個(gè)問(wèn)題,加上while循環(huán)后的呼吸燈在逐漸變暗的時(shí)候“燈亮滅的抖動(dòng)”明顯,怎么能讓他看起來(lái)流暢一點(diǎn)。

單片機(jī)源程序如下:
  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. }
復(fù)制代碼

回復(fù)

使用道具 舉報(bào)

ID:89515 發(fā)表于 2021-4-10 08:41 來(lái)自手機(jī) | 顯示全部樓層
51是溢出中斷還是匹配中斷?如果是溢出中斷的話,你的初值不合適,雖然邏輯沒(méi)錯(cuò)但是定時(shí)器溢出太頻繁了,根本無(wú)法正常運(yùn)行。就模擬占空比控制LED而言,1ms時(shí)基絕對(duì)沒(méi)問(wèn)題。雖然寫(xiě)的很復(fù)雜,邏輯好像沒(méi)錯(cuò),修改定時(shí)器溢出時(shí)間后如果led顯示不平滑可更改你的count。
回復(fù)

使用道具 舉報(bào)

ID:89515 發(fā)表于 2021-4-10 09:05 來(lái)自手機(jī) | 顯示全部樓層
溢出時(shí)間重設(shè),不然無(wú)法正常中斷。減小count
回復(fù)

使用道具 舉報(bào)

ID:894154 發(fā)表于 2021-4-10 10:32 | 顯示全部樓層
你在定時(shí)中斷里面加while(1)的結(jié)果就是程序就在定時(shí)中斷里面跑不出來(lái)了
將執(zhí)行LED代碼放到主函數(shù)里面,定時(shí)中斷函數(shù)只負(fù)責(zé)計(jì)算時(shí)間 重置標(biāo)志位
回復(fù)

使用道具 舉報(bào)

ID:390416 發(fā)表于 2021-4-10 11:33 | 顯示全部樓層
PWM程序 STC89單片機(jī) 定時(shí)器做 http://www.torrancerestoration.com/bbs/dpj-200820-1.html
回復(fù)

使用道具 舉報(bào)

ID:903260 發(fā)表于 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. }
復(fù)制代碼


我重新排了一下,這直接不亮了。。。
回復(fù)

使用道具 舉報(bào)

ID:903260 發(fā)表于 2021-4-12 17:27 | 顯示全部樓層
時(shí)間我不知道怎么設(shè)置好了。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表