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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2281|回復: 0
收起左側

單片機使用兩個定時器實現PWM(脈寬調制)呼吸燈源程序

[復制鏈接]
ID:832215 發表于 2020-10-24 18:56 | 顯示全部樓層 |閱讀模式
PWM(脈寬調制)大家可以上網查查,其原理講解很多。為了更好的學習PWM,我特意參照別人寫的文章,自己也寫了一份代碼來實現PWM。單片機代碼如下:
  1. #include <stc12c5a60s2.h>

  2. unsigned long cnt;
  3. unsigned int cnt_T1;
  4. unsigned int high;
  5. unsigned int low;
  6. unsigned char TH0_high;
  7. unsigned char TL0_high;
  8. unsigned char TH0_low;
  9. unsigned char TL0_low;
  10. unsigned char T1H1;
  11. unsigned char T1L1;
  12. unsigned char flag=0;

  13. unsigned char duty[19] = {5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95};
  14. unsigned char index=0;

  15. void config_Fy_and_dy(unsigned char fy, unsigned char dy);
  16. void config_Timer1(unsigned char ms);
  17. void modify_duty(unsigned char dy);

  18. sbit PWM_OUT = P2^5;

  19. void main()
  20. {
  21.     TMOD = 0X11;    //  定時器0/1都工作在方式1,是2^16計數
  22.     EA=1;
  23.     config_Fy_and_dy(100, 20);
  24.     config_Timer1(50);
  25.     while(1);
  26. }

  27. void config_Fy_and_dy(unsigned char fy, unsigned char dy) // 輸入頻率fy,占空比dy
  28. {
  29.     cnt =  (11059200/fy)/12;    //  要產生頻率為fy,定時器0所要計的數值
  30.     high = (cnt*dy)/100;        //  計算出高電平所要計的數值
  31.     low = cnt - high;   //  計算出低電平所要計的數值
  32.     high = 65536 - high;  //  確定定時器0,從哪個初值開始計時,記錄的是高電平
  33.     low = 65536 - low;  //  確定定時器0,從哪個初值開始計時,記錄的是低電平
  34.     TH0_high = (unsigned char)(high>>8);    //  高電平,給TH0預備重裝初值
  35.     TL0_high = (unsigned char)high;         //  高電平,給TL0預備重裝初值
  36.     TH0_low = (unsigned char)(low>>8);      //  低電平,給TH0預備重裝初值
  37.     TL0_low = (unsigned char)low;           //  低電平,給TL0預備重裝初值
  38.     TH0 = TH0_high;
  39.     TL0 = TL0_high;
  40.     PWM_OUT = 1;               
  41.     ET0 = 1;
  42.     TR0 = 1;
  43. }

  44. void config_Timer1(unsigned char ms)
  45. {
  46.     unsigned long temp;
  47.     temp =  11059200/1000;
  48.     temp = (temp*ms)/12;
  49.     cnt_T1 = 65536 - temp;
  50.     T1H1 = (unsigned char)(cnt_T1>>8);
  51.     T1L1 = (unsigned char)cnt_T1;
  52.     TH1 = T1H1;
  53.     TL1 = T1L1;
  54.     ET1=1;
  55.     TR1=1;
  56. }

  57. void modify_duty(unsigned char dy)
  58. {
  59.     high = (cnt*dy)/100;
  60.     low = cnt - high;
  61.     high = 65536 - high;
  62.     low  = 65536 - low;
  63.     TH0_high = (unsigned char)(high>>8);    //  高電平,給TH0預備重裝初值
  64.     TL0_high = (unsigned char)high;         //  高電平,給TL0預備重裝初值
  65.     TH0_low = (unsigned char)(low>>8);      //  低電平,給TH0預備重裝初值
  66.     TL0_low = (unsigned char)low;           //  低電平,給TL0預備重裝初值
  67. }

  68. void T0_Timer0() interrupt 1
  69. {
  70.     if(PWM_OUT==0)  //  準備產生高電平
  71.     {
  72.         TH0 = TH0_high;         //  高電平產生  初值重裝
  73.         TL0 = TL0_high;
  74.         PWM_OUT = 1;
  75.     }
  76.     else
  77.     {
  78.         TH0 = TH0_low;         //  低電平產生  初值重裝
  79.         TL0 = TL0_low;
  80.         PWM_OUT = 0;
  81.     }
  82. }

  83. void T1_Timer1() interrupt 3
  84. {
  85.     TH1 = T1H1;
  86.     TL1 = T1L1;
  87.     modify_duty(duty[index]);
  88.     if(0 == flag)   //  flag=0時,表示呼吸燈由暗變亮
  89.     {
  90.         index++;
  91.         if(index >=18)
  92.         {
  93.             flag = 1;
  94.         }
  95.     }
  96.     else
  97.     {
  98.         index--;
  99.         if(index <=0)
  100.         {
  101.             flag=0;
  102.         }
  103.     }
  104. }
復制代碼

其實,PWM這種實現方法并不適合編程,因為它占用了兩個定時器中斷口,會影響程序的執行效率。

我是通過兩個定時器來更好的掌握PWM的調制原理。


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 麻豆久久久 | 99热99 | 精品一区二区视频 | 亚洲国产视频一区二区 | 亚洲精品一区中文字幕 | 正在播放亚洲 | 欧美日韩在线一区 | 久久久性| hitomi一区二区三区精品 | 欧美aaa一级片 | 日本亚洲一区 | 中文字幕视频在线 | 亚洲综合在线视频 | www.日本三级| 一区二区三区四区在线视频 | 日韩视频在线播放 | av色噜噜 | 91精品久久久 | 成年人网站免费视频 | 中文字幕亚洲视频 | 欧美精品一区在线 | 一区二区三区电影网 | 天天躁日日躁aaaa视频 | 久久国产精品久久久久 | 久久偷人 | 99re| 午夜视频一区二区三区 | 成人精品国产免费网站 | 国产草草视频 | 国产伦精品一区二区 | 亚洲精品久久久久国产 | 日韩www| 国产精品欧美一区二区 | 99在线免费观看视频 | 99精品国产一区二区三区 | 欧美午夜视频 | 国产专区在线 | 成人精品 | 日韩综合在线 | 中文字幕一区二区三区精彩视频 | 日日操av |