久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23307|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)入門經(jīng)驗(yàn)分享9-定時器模擬實(shí)現(xiàn)PWM呼吸燈效果(代碼+詳解)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:74187 發(fā)表于 2018-10-12 09:04 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
本帖最后由 dabing89 于 2018-10-14 19:04 編輯

用定時器來模擬實(shí)現(xiàn)PWM實(shí)現(xiàn)呼吸燈的效果--20181012
      眾所周知,PWM的應(yīng)用是及其廣泛的,現(xiàn)在很多高速的單片機(jī)內(nèi)部都集成了硬件PWM,使用起來也很簡單,配置好頻率和裝入計數(shù)值就可以工作了,但是在一些低成本的場合,我們選擇的單片機(jī)沒有硬件PWM功能模塊,但是我們還存在這個需求怎么辦呢?這個時候,我們需要用PWM來模擬實(shí)現(xiàn)他,但實(shí)現(xiàn)PWM必須要了解PWM的原理,這里我們先了解下。
      PWM全稱是脈沖寬度調(diào)制解調(diào),比如1個小燈,按照500MS亮一次,500MS滅一次,周期是1S,頻率是1HZ,在這里,1個周期說明白了就是2個方波,有高電平和低電平組成,在周期固定的情況下,我們通過不斷的調(diào)整高電平所占的整個周期比例,即所謂的占空比,就可以實(shí)現(xiàn)小燈”不是那么亮“的效果,如果連續(xù)起來,就可以實(shí)現(xiàn)呼吸燈的效果了,先來用定時器0實(shí)現(xiàn)小燈500MS閃爍的效果,通過DEBUG來看下波形。我們把下面的代碼拷貝進(jìn)去,看下現(xiàn)象

單片機(jī)源碼:
  1. /********************************************************
  2. *描述:工程模板,點(diǎn)亮led        500MS閃爍 12MHZ
  3. ********************************************************/
  4. #include "stc15w.h"


  5. /*******************************************************************************
  6. * 文件名:位定義
  7. * 描  述:
  8. * 功  能:
  9. * 作  者:大核桃
  10. * 版本號:1.0.1(2017.05.23)
  11. *******************************************************************************/
  12. bit flag500ms = 0;//500ms標(biāo)志位
  13. sbit LED0 = P1^0;//
  14. sbit DATA0 = P2^0;//

  15. /*******************************************************************************
  16. * 文件名:數(shù)據(jù)類型定義
  17. * 描  述:
  18. * 功  能:
  19. * 作  者:大核桃
  20. * 版本號:1.0.1(2017.05.23)
  21. *******************************************************************************/
  22. typedef unsigned char uint8;
  23. typedef unsigned int  uint16;
  24. typedef unsigned long uint32;

  25. /*******************************************************************************
  26. * 文件名:函數(shù)前置聲明
  27. * 描  述:
  28. * 功  能:
  29. * 作  者:大核桃
  30. * 版本號:1.0.1(2017.05.23)
  31. *******************************************************************************/

  32. void Bsp_Power_Init(void);
  33. void Timer0Init(void);

  34. /*******************************************************************************
  35. * 文件名:主循環(huán)入口
  36. * 描  述:
  37. * 功  能:
  38. * 作  者:大核桃
  39. * 版本號:1.0.1(2017.05.23)
  40. *******************************************************************************/
  41. void main(void)
  42. {
  43.         Bsp_Power_Init();//LED端口初始化
  44.         Timer0Init();
  45.         LED0 = 1;

  46.         while(1)
  47.         {

  48.                 if(flag500ms)
  49.                 {
  50.                         flag500ms = 0;

  51.                         DATA0 = ~DATA0;//
  52.                 }
  53.                         
  54.         }
  55. }

  56. /*******************************************************************************
  57. * 文件名:void Bsp_Power_Init()
  58. * 描  述: 數(shù)碼管上電顯示
  59. * 功  能:編程模塊化
  60. * 作  者:大核桃
  61. * 版本號:1.0.1(2017.05.23)
  62. *******************************************************************************/
  63. void Bsp_Power_Init(void)
  64. {
  65.         P0M1 = 0xFC;
  66.         P0M0 = 0X03;
  67.         P0 = 0X00;

  68.         P1M1 = 0xE0;
  69.         P1M0 = 0X1F;
  70.         P1 = 0X00;


  71.         //P2口開漏輸出
  72.         P2M1 = 0XFF;
  73.         P2M0 = 0XFF;
  74.         P2 = 0Xff;
  75. //        //P54,P55口為推挽輸出
  76.         P5M1 = 0X00;
  77.         P5M0 = 0X00;
  78.         P5 = 0xFF;

  79.         //P37,P36,3.2,P3.3 P3.4口為推挽輸出
  80.         P3M1 = 0X00;
  81.         P3M0 = 0XFC;
  82.         P3 = 0X23;

  83. }

  84. /*******************************************************************************
  85. * 文件名:void Bsp_Power_Init()
  86. * 描  述: 數(shù)碼管上電顯示
  87. * 功  能:編程模塊化
  88. * 作  者:大核桃
  89. * 版本號:1.0.1(2017.05.23)
  90. *******************************************************************************/
  91. void Timer0Init(void)                //1毫秒@12MHZ
  92. {
  93.         AUXR &= 0x7f;                    //定時器時鐘12T模式
  94.         TMOD &= 0xF0;                    //設(shè)置定時器模式
  95.         TMOD |= 0x01;                    //設(shè)置定時器模式
  96.         TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值
  97.         TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值
  98.         ET0 = 1;
  99.         TR0 = 1;                //定時器0開始計時
  100.         EA = 1;
  101. }

  102. /*******************************************************************************
  103. * 文件名:void TIME0_INTER(void) interrupt 1
  104. * 描  述:
  105. * 功  能:
  106. * 作  者:大核桃
  107. * 版本號:1.0.1(2017.05.23)
  108. *******************************************************************************/
  109. void TIME0_INTER(void) interrupt 1
  110. {
  111.         static uint16 tmr500ms = 0;

  112.         TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值1ms
  113.     TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值

  114.         tmr500ms++;

  115.         if(tmr500ms >= 500)
  116.         {
  117.                 tmr500ms = 0;

  118.                 flag500ms  = 1;
  119.         }
  120.                                        
  121. }

復(fù)制代碼

從DEBUG可以看到,是500MS變化一次,說明我們的設(shè)置是對的,但是在這里還是說明一點(diǎn),我們用的而是STC15W系列的芯片,但是定時器我配置成了12T模式,和STC89C52是一樣使用的。既然我們實(shí)現(xiàn)了這個500MS高電平,500MS低電平的效果,我們再來實(shí)現(xiàn)下200MS亮,800MS滅的效果吧,程序代碼如下:

  1. /********************************************************
  2. *描述:工程模板,點(diǎn)亮led        500MS閃爍 12MHZ
  3. ********************************************************/
  4. #include "stc15w.h"


  5. /*******************************************************************************
  6. * 文件名:位定義
  7. * 描  述:
  8. * 功  能:
  9. * 作  者:大核桃
  10. * 版本號:1.0.1(2017.05.23)
  11. *******************************************************************************/
  12. sbit LED0 = P1^0;//
  13. sbit DATA0 = P2^0;//

  14. /*******************************************************************************
  15. * 文件名:數(shù)據(jù)類型定義
  16. * 描  述:
  17. * 功  能:
  18. * 作  者:大核桃
  19. * 版本號:1.0.1(2017.05.23)
  20. *******************************************************************************/
  21. typedef unsigned char uint8;
  22. typedef unsigned int  uint16;
  23. typedef unsigned long uint32;

  24. /*******************************************************************************
  25. * 文件名:函數(shù)前置聲明
  26. * 描  述:
  27. * 功  能:
  28. * 作  者:大核桃
  29. * 版本號:1.0.1(2017.05.23)
  30. *******************************************************************************/

  31. void Bsp_Power_Init(void);
  32. void Timer0Init(void);

  33. /*******************************************************************************
  34. * 文件名:主循環(huán)入口
  35. * 描  述:
  36. * 功  能:
  37. * 作  者:大核桃
  38. * 版本號:1.0.1(2017.05.23)
  39. *******************************************************************************/
  40. void main(void)
  41. {
  42.         Bsp_Power_Init();//LED端口初始化
  43.         Timer0Init();
  44.         LED0 = 1;

  45.         while(1);

  46. }

  47. /*******************************************************************************
  48. * 文件名:void Bsp_Power_Init()
  49. * 描  述: 數(shù)碼管上電顯示
  50. * 功  能:編程模塊化
  51. * 作  者:大核桃
  52. * 版本號:1.0.1(2017.05.23)
  53. *******************************************************************************/
  54. void Bsp_Power_Init(void)
  55. {
  56.         P0M1 = 0xFC;
  57.         P0M0 = 0X03;
  58.         P0 = 0X00;

  59.         P1M1 = 0xE0;
  60.         P1M0 = 0X1F;
  61.         P1 = 0X00;


  62.         //P2口開漏輸出
  63.         P2M1 = 0XFF;
  64.         P2M0 = 0XFF;
  65.         P2 = 0Xff;
  66. //        //P54,P55口為推挽輸出
  67.         P5M1 = 0X00;
  68.         P5M0 = 0X00;
  69.         P5 = 0xFF;

  70.         //P37,P36,3.2,P3.3 P3.4口為推挽輸出
  71.         P3M1 = 0X00;
  72.         P3M0 = 0XFC;
  73.         P3 = 0X23;

  74. }

  75. /*******************************************************************************
  76. * 文件名:void Bsp_Power_Init()
  77. * 描  述: 數(shù)碼管上電顯示
  78. * 功  能:編程模塊化
  79. * 作  者:大核桃
  80. * 版本號:1.0.1(2017.05.23)
  81. *******************************************************************************/
  82. void Timer0Init(void)                //1毫秒@12MHZ
  83. {
  84.         AUXR &= 0x7f;                    //定時器時鐘12T模式
  85.         TMOD &= 0xF0;                    //設(shè)置定時器模式
  86.         TMOD |= 0x01;                    //設(shè)置定時器模式
  87.         TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值
  88.         TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值
  89.         ET0 = 1;
  90.         TR0 = 1;                //定時器0開始計時
  91.         EA = 1;
  92. }

  93. /*******************************************************************************
  94. * 文件名:void TIME0_INTER(void) interrupt 1
  95. * 描  述:
  96. * 功  能:
  97. * 作  者:大核桃
  98. * 版本號:1.0.1(2017.05.23)
  99. *******************************************************************************/
  100. void TIME0_INTER(void) interrupt 1
  101. {
  102.         static uint16 tmr200ms = 0;
  103.         static bit a = 0;//翻轉(zhuǎn)狀態(tài)變量


  104.         if(a)
  105.         {
  106.                 TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值1ms
  107.         TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值

  108.                 DATA0 = 0;//小燈亮

  109.                 tmr200ms++;        
  110.                 if(tmr200ms >= 200)
  111.                 {
  112.                         tmr200ms = 0;
  113.                         a = 0;
  114.                 }
  115.         }
  116.         else
  117.         {
  118.                 TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值1ms
  119.         TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值
  120.                 DATA0 = 1;//小燈滅

  121.                 tmr200ms++;        
  122.                 if(tmr200ms >= 800)
  123.                 {
  124.                         tmr200ms = 0;
  125.                         a = 1;
  126.                 }        
  127.         }
  128.                                        
  129. }
復(fù)制代碼


仿真效果如下圖所示:
我們可以看到高電平占到了80,低電平占到了20,但是把代碼下載進(jìn)單片機(jī),怎么不是我們想要的那種狀態(tài)呢?這里普及一個知識點(diǎn),前面帖子說過的,人類的眼睛不能分辨這種刷新速度低于10MS的物體,如果物體的刷新速度高于10MS,我們的眼睛就會感覺到明顯的閃爍了,所以我們看到了下載進(jìn)開發(fā)板的現(xiàn)象就是亮200MS,滅800MS的效果,但是我們想實(shí)現(xiàn)我們想要的那種不是太亮的效果怎么辦呢?其實(shí)只要把刷新頻率高于100HZ就OK了,也就是周期要控制在10MS之內(nèi),改變高低電平所占的比例即可實(shí)現(xiàn)這樣的效果,我們寫一個讓小燈2MS亮8MS滅的程序,看看啥效果,程序如下:
  1. /********************************************************
  2. *描述:工程模板,點(diǎn)亮led        500MS閃爍 12MHZ
  3. ********************************************************/
  4. #include "stc15w.h"


  5. /*******************************************************************************
  6. * 文件名:位定義
  7. * 描  述:
  8. * 功  能:
  9. * 作  者:大核桃
  10. * 版本號:1.0.1(2017.05.23)
  11. *******************************************************************************/
  12. sbit LED0 = P1^0;//
  13. sbit DATA0 = P2^0;//

  14. /*******************************************************************************
  15. * 文件名:數(shù)據(jù)類型定義
  16. * 描  述:
  17. * 功  能:
  18. * 作  者:大核桃
  19. * 版本號:1.0.1(2017.05.23)
  20. *******************************************************************************/
  21. typedef unsigned char uint8;
  22. typedef unsigned int  uint16;
  23. typedef unsigned long uint32;

  24. /*******************************************************************************
  25. * 文件名:函數(shù)前置聲明
  26. * 描  述:
  27. * 功  能:
  28. * 作  者:大核桃
  29. * 版本號:1.0.1(2017.05.23)
  30. *******************************************************************************/

  31. void Bsp_Power_Init(void);
  32. void Timer0Init(void);

  33. /*******************************************************************************
  34. * 文件名:主循環(huán)入口
  35. * 描  述:
  36. * 功  能:
  37. * 作  者:大核桃
  38. * 版本號:1.0.1(2017.05.23)
  39. *******************************************************************************/
  40. void main(void)
  41. {
  42.         Bsp_Power_Init();//LED端口初始化
  43.         Timer0Init();
  44.         LED0 = 1;

  45.         while(1);

  46. }

  47. /*******************************************************************************
  48. * 文件名:void Bsp_Power_Init()
  49. * 描  述: 數(shù)碼管上電顯示
  50. * 功  能:編程模塊化
  51. * 作  者:大核桃
  52. * 版本號:1.0.1(2017.05.23)
  53. *******************************************************************************/
  54. void Bsp_Power_Init(void)
  55. {
  56.         P0M1 = 0xFC;
  57.         P0M0 = 0X03;
  58.         P0 = 0X00;

  59.         P1M1 = 0xE0;
  60.         P1M0 = 0X1F;
  61.         P1 = 0X00;


  62.         //P2口開漏輸出
  63.         P2M1 = 0XFF;
  64.         P2M0 = 0XFF;
  65.         P2 = 0Xff;
  66. //        //P54,P55口為推挽輸出
  67.         P5M1 = 0X00;
  68.         P5M0 = 0X00;
  69.         P5 = 0xFF;

  70.         //P37,P36,3.2,P3.3 P3.4口為推挽輸出
  71.         P3M1 = 0X00;
  72.         P3M0 = 0XFC;
  73.         P3 = 0X23;

  74. }

  75. /*******************************************************************************
  76. * 文件名:void Bsp_Power_Init()
  77. * 描  述: 數(shù)碼管上電顯示
  78. * 功  能:編程模塊化
  79. * 作  者:大核桃
  80. * 版本號:1.0.1(2017.05.23)
  81. *******************************************************************************/
  82. void Timer0Init(void)                //1毫秒@12MHZ
  83. {
  84.         AUXR &= 0x7f;                    //定時器時鐘12T模式
  85.         TMOD &= 0xF0;                    //設(shè)置定時器模式
  86.         TMOD |= 0x01;                    //設(shè)置定時器模式
  87.         TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值
  88.         TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值
  89.         ET0 = 1;
  90.         TR0 = 1;                //定時器0開始計時
  91.         EA = 1;
  92. }

  93. /*******************************************************************************
  94. * 文件名:void TIME0_INTER(void) interrupt 1
  95. * 描  述:
  96. * 功  能:
  97. * 作  者:大核桃
  98. * 版本號:1.0.1(2017.05.23)
  99. *******************************************************************************/
  100. void TIME0_INTER(void) interrupt 1
  101. {
  102.         static uint16 tmr200ms = 0;
  103.         static bit a = 0;//翻轉(zhuǎn)狀態(tài)變量


  104.         if(a)
  105.         {
  106.                 TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值1ms
  107.         TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值

  108.                 DATA0 = 0;//小燈亮

  109.                 tmr200ms++;        
  110.                 if(tmr200ms >= 2)
  111.                 {
  112.                         tmr200ms = 0;
  113.                         a = 0;
  114.                 }
  115.         }
  116.         else
  117.         {
  118.                 TL0 = (65535 - 1000) % 256;                //設(shè)置定時初值1ms
  119.         TH0 = (65535 - 1000) / 256;                //設(shè)置定時初值
  120.                 DATA0 = 1;//小燈滅

  121.                 tmr200ms++;        
  122.                 if(tmr200ms >= 8)
  123.                 {
  124.                         tmr200ms = 0;
  125.                         a = 1;
  126.                 }        
  127.         }
  128.                                        
  129. }
復(fù)制代碼

將程序下載進(jìn)板子上,可以很明顯的看到小燈變的不是那么亮了,用邏輯分析儀看下,我們的周期是10MS,實(shí)現(xiàn)了我們想要的變的不是那么亮的效果,可是距離我們想要的呼吸燈還是沒有實(shí)現(xiàn)。吭趺崔k呢?答案很簡單,只要在在定時器中裝入不同的初值即可實(shí)現(xiàn)這樣的效果,不過要實(shí)現(xiàn)呼吸燈的效果,一個定時器是不夠的,還要再用一個定時器1才可以,寫好的程序如下:
  1. /********************************************************
  2. *描述:工程模板 PWM呼吸燈代碼
  3. ********************************************************/
  4. #include "stc15w.h"


  5. /*******************************************************************************
  6. * 文件名:位定義
  7. * 描  述:
  8. * 功  能:
  9. * 作  者:大核桃
  10. * 版本號:1.0.1(2017.05.23)
  11. *******************************************************************************/
  12. bit flag200ms = 0;
  13. bit flag800ms = 0;
  14. sbit LED0 = P1^0;//
  15. sbit DATA0 = P2^0;//
  16. void Bsp_Power_Init(void);
  17. void TIM0_Init(void);
  18. void TIM1_Init(void);

  19. /*******************************************************************************
  20. * 文件名:數(shù)據(jù)類型定義
  21. * 描  述:
  22. * 功  能:
  23. * 作  者:大核桃
  24. * 版本號:1.0.1(2017.05.23)
  25. *******************************************************************************/
  26. typedef unsigned char uint8;
  27. typedef unsigned int  uint16;
  28. typedef unsigned long uint32;

  29. uint8 i = 0;
  30. code uint16 PWM_H[] = {
  31.         100,300,500,700,1000,1300,1500,1700,2000,2300,2500,2700,
  32.         3000,3300,3500,3700,4000,4300,4500,4700,5000,5300,5500,
  33.         5700,6000,6300,6500,6700,7000,7300,7500,7700,8000,8300,
  34.         8500,8700,9000,9300,9500,9700,9900 //高電平重裝值
  35. };

  36. code uint16 PWM_L[] = {

  37.         9900,9700,9500,9300,9000,8700,8500,8300,8000,7700,7500,
  38.         7300,7000,6700,6500,6300,6000,5700,5500,5300,5000,4700,
  39.         4500,4300,4000,3700,3500,3300,3000,2700,2500,2300,2000,
  40.         1700,1500,1300,1000,700,500,300,100//低電平重裝值
  41. };


  42. /*******************************************************************************
  43. * 文件名:主循環(huán)入口
  44. * 描  述:
  45. * 功  能:
  46. * 作  者:大核桃
  47. * 版本號:1.0.1(2017.05.23)
  48. *******************************************************************************/
  49. void main(void)
  50. {
  51.         Bsp_Power_Init();//LED端口初始化
  52.         TIM0_Init();
  53.         TIM1_Init();
  54.         LED0 = 1;

  55.         while(1)
  56.         {
  57.                 if(flag200ms)
  58.                 {
  59.                         flag200ms = 0;

  60.                         DATA0 = 0;
  61.                 }

  62.                 if(flag800ms)
  63.                 {
  64.                         flag800ms = 0;

  65.                         DATA0 = 1;
  66.                 }

  67.         }
  68. }

  69. /*******************************************************************************
  70. * 文件名:void Bsp_Power_Init()
  71. * 描  述: 數(shù)碼管上電顯示
  72. * 功  能:編程模塊化
  73. * 作  者:大核桃
  74. * 版本號:1.0.1(2017.05.23)
  75. *******************************************************************************/
  76. void Bsp_Power_Init(void)
  77. {
  78.         P0M1 = 0xFC;
  79.         P0M0 = 0X03;
  80.         P0 = 0X00;

  81.         P1M1 = 0xE0;
  82.         P1M0 = 0X1F;
  83.         P1 = 0X00;


  84.         //P2口開漏輸出
  85.         P2M1 = 0XFF;
  86.         P2M0 = 0XFF;
  87.         P2 = 0Xff;
  88. //        //P54,P55口為推挽輸出
  89.         P5M1 = 0X00;
  90.         P5M0 = 0X00;
  91.         P5 = 0xFF;

  92.         //P37,P36,3.2,P3.3 P3.4口為推挽輸出
  93.         P3M1 = 0X00;
  94.         P3M0 = 0XFC;
  95.         P3 = 0X23;

  96. }

  97. /*******************************************************************************
  98. * 文件名:void Timer0Init(void)
  99. * 描  述: 數(shù)定時器0初始化
  100. * 功  能:編程模塊化
  101. * 作  者:大核桃
  102. * 版本號:1.0.1(2017.05.23)
  103. *******************************************************************************/
  104. void TIM0_Init(void)
  105. {
  106.         AUXR &= 0x7F;//定時器時鐘12T模式
  107.         TMOD &= 0XF0;//配置定時器0為工作模式1
  108.         TMOD |= 0X01;
  109.         TH0 = (65535 - 1000) / 256;//高八位重載值溢出1000次定時1ms
  110.         TL0 = (65535 - 1000) % 256;//低八位重載值
  111.         ET0 = 1;//打開定時器0中斷使能位
  112.         TR0 = 1;//打開定時器,使之工作
  113.         EA = 1;//打開總中斷        
  114. }

  115. /*******************************************************************************
  116. * 文件名:void TIM1_Init(void)
  117. * 描  述:定時器1初始化配置
  118. * 功  能:初始化
  119. * 作  者:大核桃
  120. * 版本號:1.0.1(2016.07.23)
  121. *******************************************************************************/
  122. void TIM1_Init(void)
  123. {
  124.         AUXR &= 0xBF;//定時器時鐘12T模式
  125.         TMOD &= 0X0F;//配置定時器1為工作模式1
  126.         TMOD |= 0X10;
  127.         TH1 = (65535 - 10000) / 256;//高八位重載值溢出1000次定時1ms
  128.         TL1 = (65535 - 10000) % 256;//低八位重載值
  129.         ET1 = 1;//打開定時器1中斷使能位
  130.         TR1 = 1;//打開定時器,使之工作
  131.         EA = 1;//打開總中斷        
  132. }

  133. /*******************************************************************************
  134. * 文件名:中斷服務(wù)函數(shù)
  135. * 描  述:定時器1中斷服務(wù)函數(shù)
  136. * 功  能:        中斷標(biāo)號對應(yīng)   參考數(shù)據(jù)手冊560頁        
  137. *                        中斷名稱         
  138. * 作  者:大核桃
  139. * 版本號:1.0.1(2016.11.15)
  140. *******************************************************************************/
  141. void TIM1_IRQ_Handler(void)        interrupt 3
  142. {
  143.         static uint16 tmr50ms = 0;
  144.         static bit a = 0;

  145.         TH1 = (65535 - 10000) / 256;
  146.         TL1 = (65535 - 10000) % 256;//10ms溢出一次

  147.         tmr50ms++;
  148.         if(tmr50ms >= 5)//50ms改變一次PWM重裝值
  149.         {
  150.                 tmr50ms = 0;

  151.                 if(a)
  152.                 {
  153.                    i--;
  154.                    if(i == 0)
  155.                    {
  156.                             a = 0;
  157.                    }
  158.         
  159.                 }
  160.                 else
  161.                 {
  162.                         i++;
  163.                         if(i >= 40)
  164.                         {
  165.                                 a = 1;
  166.                         }
  167.         
  168.                 }
  169.         }
  170.                
  171. }

  172. /*******************************************************************************
  173. * 文件名:void TIMER0_INTER(void) interrupt 1
  174. * 描  述: 中斷處理程序
  175. * 功  能:
  176. * 作  者:大核桃
  177. * 版本號:1.0.1(2017.05.23)
  178. *******************************************************************************/
  179. void TIM0_IRQ_Handler(void)        interrupt 1
  180. {
  181.         static bit index = 0;

  182.         if(index)
  183.         {
  184.                 TH0 = (65536 - PWM_H[i]) / 256;
  185.                 TL0 = (65536 - PWM_H[i]) % 256;//12MHZ下溢出1000次定時1ms

  186.                 flag200ms = 1;
  187.                 index = 0;
  188.         }
  189.         else
  190.         {
  191.                 TH0 = (65536 - PWM_L[i]) / 256;
  192.                 TL0 = (65536 - PWM_L[i]) % 256;//12MHZ下溢出1000次定時1ms
  193.                 flag800ms = 1;

  194.                 index = 1;        
  195.         }        
  196.                         
  197. }
復(fù)制代碼


我們用了定時器1每隔50MS改變1次定時器的初值,做了2個數(shù)組,分別存放PWM的高電平計數(shù)初值和低電平計數(shù)初值,在12MHZ下計數(shù)10000個,恰好是10MS,這樣我們就實(shí)現(xiàn)了呼吸燈的效果,如果你想讓呼吸燈變的更平滑更均勻,可以將定時器的初值更加細(xì)化就可以了,如果你對這個程序有啥疑問,可以留言,好了,就介紹到這里吧,代碼奉獻(xiàn)上。

全部資料51hei下載地址:
009 實(shí)用PWM的使用.rar (35.08 KB, 下載次數(shù): 213)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏28 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:328014 發(fā)表于 2018-10-12 13:40 | 只看該作者
太棒了,介紹的非常詳細(xì),語言通俗易懂,非常適合單片機(jī)初學(xué)者學(xué)習(xí)PWM控制,樓主用心了
回復(fù)

使用道具 舉報

板凳
ID:1 發(fā)表于 2018-10-12 13:40 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

地板
ID:398515 發(fā)表于 2018-10-12 13:41 | 只看該作者
一個不錯的呼吸燈教程
回復(fù)

使用道具 舉報

5#
ID:258164 發(fā)表于 2018-12-18 09:51 | 只看該作者
樓主你好,我正在研究模擬呼吸燈的教程,請問如果只用一個定時中斷能實(shí)現(xiàn)嗎?或者說有沒有別的效率更高的辦法
回復(fù)

使用道具 舉報

6#
ID:407089 發(fā)表于 2018-12-27 00:44 | 只看該作者
HelloPan111 發(fā)表于 2018-12-18 09:51
樓主你好,我正在研究模擬呼吸燈的教程,請問如果只用一個定時中斷能實(shí)現(xiàn)嗎?或者說有沒有別的效率更高的辦 ...

http://www.zg4o1577.cn/bbs/dpj-147511-1.html
回復(fù)

使用道具 舉報

7#
ID:578183 發(fā)表于 2019-7-4 23:28 來自手機(jī) | 只看該作者
最近剛剛接觸pwm的我來學(xué)習(xí)一下
回復(fù)

使用道具 舉報

8#
ID:511328 發(fā)表于 2019-7-7 20:11 | 只看該作者
謝謝樓主的分享
回復(fù)

使用道具 舉報

9#
ID:612010 發(fā)表于 2019-9-17 10:18 | 只看該作者
收藏學(xué)習(xí)一下
回復(fù)

使用道具 舉報

10#
ID:245820 發(fā)表于 2020-1-9 21:49 | 只看該作者
學(xué)習(xí)了,謝謝
回復(fù)

使用道具 舉報

11#
ID:690363 發(fā)表于 2020-3-3 02:06 | 只看該作者
我沒看懂,得慢慢消化
回復(fù)

使用道具 舉報

12#
ID:428114 發(fā)表于 2021-3-25 19:32 | 只看該作者
樓主花不少精力啊
回復(fù)

使用道具 舉報

13#
ID:64253 發(fā)表于 2022-4-5 16:17 | 只看該作者
這份資料圖文并茂,相當(dāng)詳細(xì)
回復(fù)

使用道具 舉報

14#
ID:1032507 發(fā)表于 2022-10-26 15:35 | 只看該作者
寫的非常詳細(xì),又配了圖,謝謝樓主分享
回復(fù)

使用道具 舉報

15#
ID:1049825 發(fā)表于 2022-10-31 20:30 | 只看該作者
剛剛發(fā)現(xiàn)樓主的講解精彩易懂,管理員的頭像也很帥。看來要在這個論壇里泡好久了。。。
回復(fù)

使用道具 舉報

16#
ID:1033105 發(fā)表于 2023-2-7 11:48 | 只看該作者
樓主把PWM解說的通俗易懂,感謝樓主
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久国产亚洲 | 91影库| 欧美一区二区视频 | 中文字幕在线观看 | 国产精品久久久久久久久久三级 | 精品成人 | 欧美精品一区三区 | 福利av在线 | 久久精品国产99国产 | 999免费网站 | 国产精品久久久久久吹潮日韩动画 | 丁香婷婷久久久综合精品国产 | 免费黄色a视频 | 欧美日韩国产精品一区二区 | 亚洲人成免费 | 国产yw851.c免费观看网站 | 日本不卡一区二区 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 精品国产区 | 亚洲欧美激情精品一区二区 | 日韩一区二区视频 | 午夜寂寞影院在线观看 | 日韩在线国产 | 国产免费xxx | 亚洲欧美中文日韩在线v日本 | 午夜精品在线观看 | 精品视频一区在线 | 91精品国产综合久久久久久丝袜 | 亚洲一区网站 | 国产精品视频偷伦精品视频 | 欧美日韩国产三级 | 亚洲视频在线一区 | 日本三级电影免费 | 日本成人片在线观看 | 色欧美日韩 | 精品国产一区二区三区久久久久久 | 99爱国产| 九色www| 亚洲区中文字幕 | 色播久久久 | 久久久久久国产精品久久 |