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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于stc12c5a60s2單片機(jī)的呼吸燈設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:264029 發(fā)表于 2018-6-25 13:31 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
我在用stc12c5a60s2做呼吸燈設(shè)計(jì)時(shí)遇到的問題,我想設(shè)計(jì)出幾路頻率變化不一樣的pwm波形,我第一個(gè)是利用了C51里面的兩個(gè)計(jì)數(shù)器實(shí)現(xiàn)了呼吸燈設(shè)計(jì),可以使三個(gè)燈做相同頻率的呼吸,代碼如下://實(shí)現(xiàn)三個(gè)燈的呼吸

  1. #include <reg52.h>

  2. sbit PWMOUT0 = P0^0;
  3. sbit PWMOUT1 = P0^1;
  4. sbit PWMOUT2 = P0^2;

  5. unsigned char HighRH = 0;  //高電平重載值的高字節(jié)
  6. unsigned char HighRL = 0;  //高電平重載值的低字節(jié)
  7. unsigned char LowRH  = 0;  //低電平重載值的高字節(jié)
  8. unsigned char LowRL  = 0;  //低電平重載值的低字節(jié)
  9. unsigned char T1RH = 0;
  10. unsigned char T1RL = 0;
  11. unsigned long PeriodCnt = 0;

  12. void ConfigTimer1(unsigned int ms);
  13. void ConfigPWM(unsigned int fr, unsigned char dc);

  14. void main()
  15. {
  16.     EA = 1;     //開定時(shí)器總中斷

  17.     ConfigPWM(100, 10);  //配置并啟動PWM
  18.     ConfigTimer1(50);    //用T1定時(shí)調(diào)整占空比
  19.     while (1);
  20. }
  21. void ConfigTimer1(unsigned int ms)
  22. {
  23.     unsigned long tmp;  //臨時(shí)變量

  24.     tmp = 11059200 / 12;      //定時(shí)器計(jì)數(shù)頻率
  25.     tmp = (tmp * ms) / 1000;  //計(jì)算所需的計(jì)數(shù)值
  26.     tmp = 65536 - tmp;        //計(jì)算定時(shí)器重載值
  27.     tmp = tmp + 12;           //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
  28.     T1RH = (unsigned char)(tmp>>8);  //定時(shí)器重載值拆分為高低字節(jié)
  29.     T1RL = (unsigned char)tmp;
  30.     TMOD &= 0x0F;   //清零T1的控制位
  31.     TMOD |= 0x10;   //配置T1為模式1
  32.     TH1 = T1RH;     //加載T1重載值
  33.     TL1 = T1RL;
  34.     ET1 = 1;        //使能T1中斷
  35.     TR1 = 1;        //啟動T1
  36. }
  37. void ConfigPWM(unsigned int fr, unsigned char dc)
  38. {
  39.     unsigned int high, low;

  40.     PeriodCnt = (11059200/12) / fr; //計(jì)算一個(gè)周期所需的計(jì)數(shù)值
  41.     high = (PeriodCnt*dc) / 100;    //計(jì)算高電平所需的計(jì)數(shù)值
  42.     low  = PeriodCnt - high;        //計(jì)算低電平所需的計(jì)數(shù)值
  43.     high = 65536 - high + 12;       //計(jì)算高電平的定時(shí)器重載值并補(bǔ)償中斷延時(shí)
  44.     low  = 65536 - low  + 12;       //計(jì)算低電平的定時(shí)器重載值并補(bǔ)償中斷延時(shí)
  45.     HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
  46.     HighRL = (unsigned char)high;
  47.     LowRH  = (unsigned char)(low>>8);  //低電平重載值拆分為高低字節(jié)
  48.     LowRL  = (unsigned char)low;
  49.     TMOD &= 0xF0;   //清零T0的控制位
  50.     TMOD |= 0x01;   //配置T0為模式1
  51.     TH0 = HighRH;   //加載T0重載值
  52.     TL0 = HighRL;
  53.     ET0 = 1;        //使能T0中斷
  54.     TR0 = 1;        //啟動T0
  55.     PWMOUT0 = 1;     //輸出高電平
  56.         PWMOUT1 = 1;     //輸出高電平
  57.         PWMOUT2 = 1;     //輸出高電平
  58. }
  59. void AdjustDutyCycle(unsigned char dc)          //調(diào)整占空比
  60. {
  61.         unsigned int high, low;

  62.         high = (PeriodCnt*dc)/100;
  63.         low = PeriodCnt - high;
  64.         high = 65536 - high + 12;
  65.         low = 65536 - low + 12;
  66.         HighRH = (unsigned char)(high >> 8);
  67.         HighRL = (unsigned char)high;
  68.         LowRH = (unsigned char)(low >> 8);
  69.         LowRL = (unsigned char)low;
  70. }
  71. void InterruptTimer0() interrupt 1                        //用定時(shí)器0,實(shí)現(xiàn)了燈的亮滅連續(xù)變化,實(shí)現(xiàn)電平的反轉(zhuǎn)
  72. {
  73.     if (PWMOUT0 == 1)  //當(dāng)前輸出為高電平時(shí),裝載低電平值并輸出低電平
  74.     {
  75.         TH0 = LowRH;
  76.         TL0 = LowRL;
  77.         PWMOUT0 = 0;
  78.                 PWMOUT1 = 0;     
  79.             PWMOUT2 = 0;     
  80.     }
  81.     else              //當(dāng)前輸出為低電平時(shí),裝載高電平值并輸出高電平
  82.     {
  83.         TH0 = HighRH;
  84.         TL0 = HighRL;
  85.         PWMOUT0 = 1;
  86.         PWMOUT1 = 1;     
  87.         PWMOUT2 = 1;
  88.     }
  89. }

  90. void InterruptTimer1() interrupt 3
  91. {
  92.         unsigned char code table[13] = {
  93.         5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95
  94.         };
  95.         static bit dir = 0;
  96.         static unsigned char index = 0;

  97.         TH1 = T1RH;
  98.         TL1 = T1RL;

  99.         AdjustDutyCycle(table[index]);
  100.         if(dir == 0)
  101.         {
  102.                 index++;
  103.                 if(index >= 12)
  104.                 {
  105.                         dir = 1;
  106.                 }
  107.         }
  108.         else
  109.         {
  110.                 index--;
  111.                 if(index == 0)
  112.                 {
  113.                         dir = 0;
  114.                 }
  115.         }
  116. }
  117. 可是,我并不想看到一樣的頻率變化,我希望三個(gè)燈變化的頻率不一樣,可是上述代碼實(shí)現(xiàn)呼吸燈的效果是基于計(jì)數(shù)器的個(gè)數(shù)的,C51的計(jì)數(shù)器已經(jīng)用完了,我只好把目光投向了stc12c5a60s,這里面不僅有四個(gè)計(jì)數(shù)器,而且有兩路PWM輸出,
  118. 我通過設(shè)置PCA,實(shí)現(xiàn)了通過按鍵可以實(shí)時(shí)改變輸出波形,
  119. 代碼如下:
  120. //利用按鍵s1對led燈的亮度調(diào)節(jié)
  121. #include"STC12C5A60S2.h"

  122. void delay(unsigned int cnt)
  123. {
  124. unsigned char i;
  125. for(;cnt>0;cnt--)
  126. for(i=0;i<250;i++);
  127. }

  128. void main()
  129. {
  130. EA = 1;     //開定時(shí)器總中斷

  131. CCON=0;                 //禁止寄存器CCON中CF位的中斷
  132. CL=0;                 //PCA的16位計(jì)數(shù)器低8位
  133. CH=0;                 //PCA的16位計(jì)數(shù)器高8位
  134. CMOD=0x00;         //選擇系統(tǒng)時(shí)鐘/12為計(jì)數(shù)脈沖,則PWM的頻率f=sysclk/256/12

  135. //PCA模塊0
  136. CCAP0H=0x80; //占空比控制,此時(shí)的占空比為50%,一路輸出
  137. CCAP0L=0x80;
  138. PCA_PWM0=0x00; //控制占空比的第九位為0
  139. CCAPM0=0x42;   //允許P13作為PWM輸出

  140. //PCA模塊1
  141. CCAP1H=0xcc;  //占空比控制,此時(shí)的占空比為20%,一路輸出
  142. CCAP1L=0xcc;
  143. PCA_PWM1=0x00;
  144. CCAPM1=0x42;  //允許P13作為PWM輸出

  145. CR=1;                   //啟動PCA計(jì)數(shù)器

  146. while(1)
  147. {

  148. if(P10==0)
  149. {
  150. delay(200);
  151. while(P10==0);
  152. CCAP0H+=10;           //占空比調(diào)節(jié)
  153. CCAP0L+=10;

  154. CCAP1H+=25;           //占空比調(diào)節(jié)
  155. CCAP1L+=25;
  156. }
  157. }
  158. }

  159. 可是就在我想結(jié)合兩者的特點(diǎn)一起實(shí)現(xiàn)三個(gè)燈做呼吸燈,另外兩個(gè)燈通過按鍵做使其的波形不斷變化,因?yàn)檫@在設(shè)計(jì)上我覺得是行得通的,因?yàn)槲易龊粑鼰魰r(shí),只涉及到51的定時(shí)器,而stc12c5a60s2很好的兼容了51的兩個(gè)定時(shí)器,這樣的話,應(yīng)該是可以同時(shí)出現(xiàn)三個(gè)燈是呼吸燈,最后兩個(gè)燈通過按鍵調(diào)節(jié)亮度,所以我就把兩個(gè)函數(shù)粘貼在一起了,可是卻沒有出現(xiàn)應(yīng)有的現(xiàn)象。
  160. 問題如下:只能通過按鍵對最后兩個(gè)燈實(shí)現(xiàn)亮度調(diào)節(jié),而呼吸燈的現(xiàn)象出不來。
  161. 有問題的程序如下,不知道怎樣修改,還請大神解惑。
  162. //利用按鍵s1對led燈的亮度調(diào)節(jié)
  163. #include"STC12C5A60S2.h"

  164. sbit PWMOUT0 = P0^0;
  165. sbit PWMOUT1 = P0^1;
  166. sbit PWMOUT2 = P0^2;

  167. unsigned char HighRH = 0;  //高電平重載值的高字節(jié)
  168. unsigned char HighRL = 0;  //高電平重載值的低字節(jié)
  169. unsigned char LowRH  = 0;  //低電平重載值的高字節(jié)
  170. unsigned char LowRL  = 0;  //低電平重載值的低字節(jié)
  171. unsigned char T1RH = 0;
  172. unsigned char T1RL = 0;
  173. unsigned long PeriodCnt = 0;

  174. void ConfigTimer1(unsigned int ms);
  175. void ConfigPWM(unsigned int fr, unsigned char dc);

  176. void delay(unsigned int cnt)
  177. {
  178. unsigned char i;
  179. for(;cnt>0;cnt--)
  180. for(i=0;i<250;i++);
  181. }

  182. void main()
  183. {
  184. EA = 1;     //開定時(shí)器總中斷

  185. CCON=0;                 //禁止寄存器CCON中CF位的中斷
  186. CL=0;                 //PCA的16位計(jì)數(shù)器低8位
  187. CH=0;                 //PCA的16位計(jì)數(shù)器高8位
  188. CMOD=0x00;         //選擇系統(tǒng)時(shí)鐘/12為計(jì)數(shù)脈沖,則PWM的頻率f=sysclk/256/12

  189. //PCA模塊0
  190. CCAP0H=0x80; //占空比控制,此時(shí)的占空比為50%,一路輸出
  191. CCAP0L=0x80;
  192. PCA_PWM0=0x00; //控制占空比的第九位為0
  193. CCAPM0=0x42;   //允許P13作為PWM輸出

  194. //PCA模塊1
  195. CCAP1H=0xcc;  //占空比控制,此時(shí)的占空比為80%,一路輸出
  196. CCAP1L=0xcc;
  197. PCA_PWM1=0x00;
  198. CCAPM1=0x42;  //允許P13作為PWM輸出

  199. CR=1;                   //啟動PCA計(jì)數(shù)器

  200. while(1)
  201. {
  202.     ConfigPWM(100, 10);  //配置并啟動PWM
  203.     ConfigTimer1(50);    //用T1定時(shí)調(diào)整占空比
  204. if(P10==0)
  205. {
  206. delay(200);
  207. while(P10==0);
  208. CCAP0H+=10;           //占空比調(diào)節(jié)
  209. CCAP0L+=10;

  210. CCAP1H+=25;           //占空比調(diào)節(jié)
  211. CCAP1L+=25;
  212. }
  213. }
  214. }

  215. void ConfigTimer1(unsigned int ms)
  216. {
  217.     unsigned long tmp;  //臨時(shí)變量

  218.     tmp = 11059200 / 12;      //定時(shí)器計(jì)數(shù)頻率
  219.     tmp = (tmp * ms) / 1000;  //計(jì)算所需的計(jì)數(shù)值
  220.     tmp = 65536 - tmp;        //計(jì)算定時(shí)器重載值
  221.     tmp = tmp + 12;           //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差
  222.     T1RH = (unsigned char)(tmp>>8);  //定時(shí)器重載值拆分為高低字節(jié)
  223.     T1RL = (unsigned char)tmp;
  224.     TMOD &= 0x0F;   //清零T1的控制位
  225.     TMOD |= 0x10;   //配置T1為模式1
  226.     TH1 = T1RH;     //加載T1重載值
  227.     TL1 = T1RL;
  228.     ET1 = 1;        //使能T1中斷
  229.     TR1 = 1;        //啟動T1
  230. }
  231. void ConfigPWM(unsigned int fr, unsigned char dc)
  232. {
  233.     unsigned int high, low;

  234.     PeriodCnt = (11059200/12) / fr; //計(jì)算一個(gè)周期所需的計(jì)數(shù)值
  235.     high = (PeriodCnt*dc) / 100;    //計(jì)算高電平所需的計(jì)數(shù)值
  236.     low  = PeriodCnt - high;        //計(jì)算低電平所需的計(jì)數(shù)值
  237.     high = 65536 - high + 12;       //計(jì)算高電平的定時(shí)器重載值并補(bǔ)償中斷延時(shí)
  238.     low  = 65536 - low  + 12;       //計(jì)算低電平的定時(shí)器重載值并補(bǔ)償中斷延時(shí)
  239.     HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
  240.     HighRL = (unsigned char)high;
  241.     LowRH  = (unsigned char)(low>>8);  //低電平重載值拆分為高低字節(jié)
  242.     LowRL  = (unsigned char)low;
  243.     TMOD &= 0xF0;   //清零T0的控制位
  244.     TMOD |= 0x01;   //配置T0為模式1
  245.     TH0 = HighRH;   //加載T0重載值
  246.     TL0 = HighRL;
  247.     ET0 = 1;        //使能T0中斷
  248.     TR0 = 1;        //啟動T0
  249.     PWMOUT0 = 1;     //輸出高電平
  250.         PWMOUT1 = 1;     //輸出高電平
  251.         PWMOUT2 = 1;     //輸出高電平
  252. }
  253. void AdjustDutyCycle(unsigned char dc)          //調(diào)整占空比
  254. {
  255.         unsigned int high, low;

  256.         high = (PeriodCnt*dc)/100;
  257.         low = PeriodCnt - high;
  258.         high = 65536 - high + 12;
  259.         low = 65536 - low + 12;
  260.         HighRH = (unsigned char)(high >> 8);
  261.         HighRL = (unsigned char)high;
  262.         LowRH = (unsigned char)(low >> 8);
  263.         LowRL = (unsigned char)low;
  264. }
  265. void InterruptTimer0() interrupt 1                        //用定時(shí)器0,實(shí)現(xiàn)了燈的亮滅連續(xù)變化,實(shí)現(xiàn)電平的反轉(zhuǎn)
  266. {
  267.     if (PWMOUT0 == 1)  //當(dāng)前輸出為高電平時(shí),裝載低電平值并輸出低電平
  268.     {
  269.         TH0 = LowRH;
  270.         TL0 = LowRL;
  271.         PWMOUT0 = 0;
  272.                 PWMOUT1 = 0;     
  273.             PWMOUT2 = 0;     
  274.     }
  275.     else              //當(dāng)前輸出為低電平時(shí),裝載高電平值并輸出高電平
  276.     {
  277.         TH0 = HighRH;
  278.         TL0 = HighRL;
  279.         PWMOUT0 = 1;
  280.         PWMOUT1 = 1;     
  281.             PWMOUT2 = 1;
  282.     }
  283. }

  284. void InterruptTimer1() interrupt 3
  285. {
  286.         unsigned char code table[13] = {
  287.         5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95
  288.         };
  289.         static bit dir = 0;
  290.         static unsigned char index = 0;

  291.         TH1 = T1RH;
  292.         TL1 = T1RL;

  293.         AdjustDutyCycle(table[index]);
  294.         if(dir == 0)
  295.         {
  296.                 index++;
  297.                 if(index >= 12)
  298.                 {
  299.                         dir = 1;
  300.                 }
  301.         }
  302.         else
  303.         {
  304.                 index--;
  305.                 if(index == 0)
  306.                 {
  307.                         dir = 0;
  308.                 }
  309.         }
  310. }
復(fù)制代碼



評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线中文字幕视频 | 成人精品国产一区二区4080 | 国产激情网 | h视频在线免费 | 国产成人精品一区 | 国产精品视频在线观看 | 成人av观看 | 久久99精品久久久久久国产越南 | 精品美女久久久 | 四虎最新地址 | 手机av在线 | 欧美精品一区二区三区在线播放 | 日日操天天射 | 国产一区二区在线观看视频 | 欧美一级二级三级视频 | 欧美一级高潮片免费的 | 91视频a| av播播 | 亚洲欧美日韩电影 | 81精品国产乱码久久久久久 | 国产色片 | 视频在线日韩 | 精久久久| 欧美在线观看一区 | 中日韩欧美一级片 | 色吧色综合 | 欧美日产国产成人免费图片 | 国产区在线免费观看 | 国产精品网址 | 国产精品3区 | 91视频18| 欧美日韩一 | 99re超碰 | 欧美成人久久 | 免费99精品国产自在在线 | 亚洲国产成人精品久久久国产成人一区 | 亚洲天堂av一区 | 久久久久久免费毛片精品 | 国产精品亚洲一区 | 久久夜视频 | 欧美视频在线看 |