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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15318|回復: 11
打印 上一主題 下一主題
收起左側

請大師們幫幫忙寫一個C語言的STC15W408AS單片機pwm輸出程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:92553 發表于 2017-6-17 17:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大師們幫幫忙寫一個C語言的程序
STC15W408AS單片機。
: P1.1CCP0 p1.0 (CCP1)pwm輸出端口輸出兩路頻率20khz相位相反,死區時間1.5us

:  p3.6  p3.7 端口輸出兩路頻率可調10hz-130hz
   p3.6脈寬可調0.1ms-2msP3.7脈寬固定
   P1.3  頻率調節電位器AD輸入端口
   P1.4  脈寬調節電位器AD輸入端口
: P1.2工作指示燈端口
: P3.2  外部中斷輸入口(低電位有效)
五:P1.5保護報警輸出(蜂鳴器)端口 (中斷時報警)
六:P1.6散熱風扇輸出端口(低電位有效)。受開關控制,開關斷開后延時2分鐘關閉風扇。
七:P1.7開關控制。
按鍵長按為開機,放開為關機。
    頻率輸出端口的工作順序20khz先輸出;100msP3.6輸出0.1-2ms0.1-2msP3.7輸出
在一個定時中斷中完成。


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

使用道具 舉報

來自 2#
ID:155507 發表于 2018-7-21 07:25 | 只看該作者

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU Programme Demo ----------------------------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/

  7. /*      本程序經過測試完全正常, 不提供電話技術支持, 如不能理解, 請自行補充相關基礎.  */

  8. /*
  9. 功能: 使用STC內帶的PCA做9~16位的PWM。在PWMn.h中選擇是STC12C5201AD系列還是STC12C5A60S2系列。
  10.                  原理說明:
  11. 本示例程序介紹在一些應用中所需要的高于8位分辨率的9~16位PWM,而8位的PWM可以直接使用STC的硬件PWM,請參考有關的的(Datasheet)。
  12. 本應用所需要資源:PCA可編程計數器陣列,捕獲寄存器,匹配中斷向量。
  13. 程序用到兩個16位變量:
  14. PWM_high  保存PWM輸出高電平的PCA時鐘數。
  15. PWM_low   保存PWM輸出低電平的PCA時鐘數。
  16. PWM的周期 = PWM_HIGH + PWM_LOW。
  17. PCA時鐘源有8種選擇。
  18. PCA模塊被配置為16位高速輸出方式,當PCA計數值與捕獲寄存器數值匹配時,將CCP0輸出取反,同時發生比較匹配中斷。
  19. 比較匹配中斷里判斷高速輸出的電平,如果是高電平,則向捕獲寄存器裝入高電平的PCA時鐘數。如果是低電平,則裝入低電平的PCA時鐘數。
  20. 由于中斷處理需要一點時間,所以輸出的占空比不能到0%或100%,所以對PWM_high有最小和最大值,中斷處理絕對時間大約為100個SYSCLK。

  21. 本示例程序的測試是基于如下假設:
  22. PCA時基信號為系統時鐘Fosc,PCA中斷優先級為最高。
  23. 提示:其它中斷服務開銷很長時間時,有可能會影響本程序的正常運行。

  24. 本示例程序用戶可以在"用戶配置宏"中選擇以下參數:
  25. PCA_IDLE_DISABLE    在IDLE模式是否禁止PCA工作,選擇1: MCU在IDLE模式時禁止PCA工作,  選擇0:  MCU在IDLE模式時允許PCA工作。
  26. PCA_SOURCE_SELECT   選擇PCA的基準時鐘源,本示例使用系統時鐘Fosc做PCA時鐘源。
  27. PWM_DUTY            定義PWM的周期,數值為PCA所選擇的時鐘脈沖個數,用戶只需要裝載PWM_high,PWM_low是根據這個周期計算出來的。
  28. PWM_HIGH_MAX        限制PWM輸出的最大占空比,原因如前所述。如果裝載PWM_high大于此數值,將返回錯誤。
  29. PWM_HIGH_MIN        限制PWM輸出的最小占空比,原因如前所述。如果裝載PWM_high小于此數值,將返回錯誤。
  30. */

  31. #include "reg51.h"

  32. #define     MAIN_Fosc   24576000L   //定義時鐘

  33. #define     PCA_IDLE_DISABLE    0           //1: MCU在IDLE模式時禁止PCA工作。   0:  MCU在IDLE模式時允許PCA工作。
  34. #define     PCA_SOURCE_SELECT   4           //選擇PCA的基準時鐘源。
  35.                                             //0:系統時鐘Fosc/12。
  36.                                             //1:系統時鐘Fosc/2。
  37.                                             //2:定時器0的溢出。
  38.                                             //3:ECI/P3.4腳的外部時鐘輸入(最大=Fosc/2)。
  39.                                             //4:系統時鐘Fosc。
  40.                                             //5:系統時鐘Fosc/4。
  41.                                             //6:系統時鐘Fosc/6。
  42.                                             //7:系統時鐘Fosc/8。
  43. #define     PWM_DUTY        4096            //定義PWM的周期,數值為PCA所選擇的時鐘脈沖個數。


  44. /**********************************************************************************************************/


  45. sfr P_SW1       = 0xA2;                     //外設功能切換寄存器1

  46. #define CCP_S0 0x10                         //P_SW1.4
  47. #define CCP_S1 0x20                         //P_SW1.5

  48. sfr CCON        =   0xD8;                   //PCA控制寄存器
  49. sbit CCF0       =   CCON^0;                 //PCA模塊0中斷標志
  50. sbit CCF1       =   CCON^1;                 //PCA模塊1中斷標志
  51. sbit CR         =   CCON^6;                 //PCA定時器運行控制位
  52. sbit CF         =   CCON^7;                 //PCA定時器溢出標志
  53. sfr CMOD        =   0xD9;                   //PCA模式寄存器
  54. sfr CL          =   0xE9;                   //PCA定時器低字節
  55. sfr CH          =   0xF9;                   //PCA定時器高字節
  56. sfr CCAPM0      =   0xDA;                   //PCA模塊0模式寄存器
  57. sfr CCAP0L      =   0xEA;                   //PCA模塊0捕獲寄存器 LOW
  58. sfr CCAP0H      =   0xFA;                   //PCA模塊0捕獲寄存器 HIGH
  59. sfr CCAPM1      =   0xDB;                   //PCA模塊1模式寄存器
  60. sfr CCAP1L      =   0xEB;                   //PCA模塊1捕獲寄存器 LOW
  61. sfr CCAP1H      =   0xFB;                   //PCA模塊1捕獲寄存器 HIGH
  62. sfr CCAPM2      =   0xDC;                   //PCA模塊2模式寄存器
  63. sfr CCAP2L      =   0xEC;                   //PCA模塊2捕獲寄存器 LOW
  64. sfr CCAP2H      =   0xFC;                   //PCA模塊2捕獲寄存器 HIGH
  65. sfr PCA_PWM0    =   0xf2;                   //PCA模塊0的PWM寄存器
  66. sfr PCA_PWM1    =   0xf3;                   //PCA模塊1的PWM寄存器
  67. sfr PCA_PWM2    =   0xf4;                   //PCA模塊2的PWM寄存器

  68. sfr P1M0        =   0x92;
  69. sfr P1M1        =   0x91;

  70. sbit  CCP0      =   P1^1;
  71. sbit  CCP1      =   P1^0;

  72. #define     PWM_HIGH_MAX    PWM_DUTY-32     //限制PWM輸出的最大占空比。
  73. #define     PWM_HIGH_MIN        32          //限制PWM輸出的最小占空比。

  74. /*************  本地變量聲明    **************/
  75. unsigned int    pwm;        //定義用戶操作的PWM變量

  76. /*************  本地函數聲明    **************/
  77. void  delay_ms(unsigned char ms);



  78. /****************  外部函數聲明和外部變量聲明 *****************/
  79. extern unsigned int PWM_high;               //PWM空比寄存器,即PWM輸出高電平的PCA時鐘脈沖個數(占空比寫入變量)。
  80. void PWMn_SetHighReg(unsigned int high);
  81. void PWMn_init(unsigned int high);


  82. /******************** 主函數 **************************/
  83. //========================================================================
  84. // 函數: void main(void)
  85. // 描述: 不斷更新PWM值,用示波器觀察占空比變化。
  86. // 參數: 無。
  87. // 返回: 無。
  88. // 版本: VER1.0
  89. // 日期: 2011-4-11
  90. // 備注:
  91. //========================================================================
  92. void main(void)
  93. {
  94.     pwm = 1000;                             //pwm初值
  95.     pwm = PWM_HIGH_MIN;                     //pwm初值
  96.     PWMn_init(pwm); //初始化pwm

  97.     while (1)
  98.     {
  99.         delay_ms(10);   //延時
  100.         pwm += 10;
  101.         if(pwm >= PWM_HIGH_MAX) pwm = PWM_HIGH_MIN;
  102.         PWMn_SetHighReg(pwm);               //更新PWM的占空比
  103.     }
  104. }
  105. /**********************************************/


  106. //========================================================================
  107. // 函數: void  delay_ms(unsigned char ms)
  108. // 描述: 延時函數。
  109. // 參數: ms,要延時的ms數.
  110. // 返回: none.
  111. // 版本: VER1.0
  112. // 日期: 2010-12-15
  113. // 備注:
  114. //========================================================================
  115. void  delay_ms(unsigned char ms)
  116. {
  117.      unsigned int i;
  118.      do
  119.      {
  120.         i = MAIN_Fosc / 14000L; //1T
  121.         while(--i)  ;
  122.      }while(--ms);
  123. }

  124. unsigned int    PWM_high;                   //定義PWM占空比寄存器,即PWM輸出高電平的PCA時鐘脈沖個數(占空比寫入變量)。
  125. unsigned int    PWM_low;                    //定義PWM輸出低電平的PCA時鐘脈沖個數。
  126. unsigned int    CCAP0_tmp;                  //定義CCAP0重裝載影射寄存器。

  127. //========================================================================
  128. // 函數: void PWMn_SetHighReg(unsigned int high)
  129. // 描述: 寫入占空比數據。
  130. // 參數: high:  占空比數據,即PWM輸出高電平的PCA時鐘脈沖個數。
  131. // 返回: 無
  132. // 版本: VER1.0
  133. // 日期: 2009-12-30
  134. // 備注:
  135. //========================================================================
  136. void PWMn_SetHighReg(unsigned int high)
  137. {
  138.     if(high > PWM_HIGH_MAX)     high = PWM_HIGH_MAX;    //如果寫入大于最大占空比數據,強制為最大占空比。
  139.     if(high < PWM_HIGH_MIN)     high = PWM_HIGH_MIN;    //如果寫入小于最小占空比數據,則返回錯誤代碼2。
  140.     CR = 0;                     //停止PCA。
  141.     PWM_high = high;                        //數據在正確范圍,則裝入占空比寄存器。
  142.     PWM_low = PWM_DUTY - high;              //計算并保存PWM輸出低電平的PCA時鐘脈沖個數。
  143.     CR = 1;                     //啟動PCA。
  144. }

  145. //========================================================================
  146. // 函數: void PWMn_init(unsigned int high)
  147. // 描述: 初始化程序。
  148. // 參數: high:  初始化占空比數據,即PWM輸出高電平的PCA時鐘脈沖個數。
  149. // 返回: 無
  150. // 版本: VER1.0
  151. // 日期: 2009-12-30
  152. // 備注:
  153. //========================================================================
  154. void PWMn_init(unsigned int high)
  155. {
  156.     ACC = P_SW1;
  157.     ACC &= ~(CCP_S0 | CCP_S1);              //CCP_S0=0 CCP_S1=0
  158.     P_SW1 = ACC;                            //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)

  159. //  ACC = P_SW1;
  160. //  ACC &= ~(CCP_S0 | CCP_S1);              //CCP_S0=1 CCP_S1=0
  161. //  ACC |= CCP_S0;                          //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
  162. //  P_SW1 = ACC;
  163. //
  164. //  ACC = P_SW1;
  165. //  ACC &= ~(CCP_S0 | CCP_S1);              //CCP_S0=0 CCP_S1=1
  166. //  ACC |= CCP_S1;                          //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
  167. //  P_SW1 = ACC;

  168.     P1M1 &= ~0x02,  P1M0 |=  0x02;          //CCAP0使用PUSH-PULL輸出模式
  169.     CCON = 0;                               //清除CF、CR、CCF0、CCF1
  170.     CMOD = (PCA_IDLE_DISABLE << 7) | (PCA_SOURCE_SELECT << 1);  //初始化PCA模式寄存器,這兩項在PWMn.h中選擇。
  171.     CCAPM0 = 0x4D;                          //高速輸出模式,允許比較匹配中斷(ECCF0=1)。
  172.     CL = 0;                                 //清空PCA基本計數器。
  173.     CH = 0;
  174.     CCAP0_tmp = 0;                          //清空CCAP0重裝載影射寄存器。
  175.     PWMn_SetHighReg(high);                  //初始化占空比數據。
  176.     CR = 1;                                 //啟動PCA。
  177.     EA = 1;                                 //允許總中斷
  178. }

  179. //========================================================================
  180. // 函數: void PCA_interrupt (void) interrupt 7
  181. // 描述: PCA中斷服務程序。
  182. // 參數: 無。
  183. // 返回: 無。
  184. // 版本: VER1.0
  185. // 日期: 2009-12-30
  186. // 備注:
  187. //========================================================================
  188. void PCA_interrupt (void) interrupt 7
  189. {
  190.     if(CCF0 == 1)       //PCA模塊0中斷
  191.     {
  192.         CCF0 = 0;       //清PCA模塊0中斷標志

  193.         if(CCP0 == 1)   CCAP0_tmp += PWM_high;      //輸出為高電平,則給影射寄存器裝載高電平時間長度
  194.         else            CCAP0_tmp += PWM_low;       //輸出為低電平,則給影射寄存器裝載低電平時間長度
  195.         CCAP0L = (unsigned char)CCAP0_tmp;          //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
  196.         CCAP0H = (unsigned char)(CCAP0_tmp >> 8);   //后寫CCAP0H
  197.     }
  198. /*
  199.     else if(CCF1 == 1)                         //PCA模塊1中斷
  200.     {
  201.         CCF1 = 0;                              //清PCA模塊1中斷標志
  202.     }
  203.     else if(CF == 1)                           //PCA溢出中斷
  204.     {
  205.         CF = 0;                                //清PCA溢出中斷標志
  206.     }
  207. */
  208. }

復制代碼
回復

使用道具 舉報

來自 3#
ID:416501 發表于 2018-11-19 22:16 | 只看該作者
我需要的是一: 從P1.1(CCP0) p1.0 (CCP1)pwm輸出端口輸出兩路頻率20khz相位相反,死區時間1.5us功能 寫了一周都沒成功 用PAC
回復

使用道具 舉報

地板
ID:123289 發表于 2017-6-18 23:41 | 只看該作者
是來布置作業的,哪位學生來做啊。
回復

使用道具 舉報

5#
ID:47286 發表于 2017-6-19 00:14 | 只看該作者

這東西某一個寶上300都沒人愿意接 我也想看看誰來做
回復

使用道具 舉報

6#
ID:154074 發表于 2017-6-19 10:02 | 只看該作者

這里喜歡布置作業的太多了
回復

使用道具 舉報

7#
ID:417948 發表于 2018-12-19 11:22 | 只看該作者
bifxv 發表于 2018-11-19 22:16
我需要的是一: 從P1.1(CCP0) p1.0 (CCP1)pwm輸出端口輸出兩路頻率20khz相位相反,死區時間1.5us功能 寫 ...

lz弄得怎么樣了?
回復

使用道具 舉報

8#
ID:408539 發表于 2020-12-24 13:37 | 只看該作者
我看這程序要求有點像逆變器
回復

使用道具 舉報

9#
ID:310993 發表于 2021-4-29 02:57 | 只看該作者
STC提供的標準程序,不修改是不能夠對應的。
回復

使用道具 舉報

10#
ID:92553 發表于 2022-12-7 12:26 | 只看該作者
huangguanhua 發表于 2022-11-27 05:45
你會做這款驅動器嗎?

你可以試試,說明非常清楚了。功能對應單片機端口就可以了
回復

使用道具 舉報

11#
ID:77589 發表于 2022-12-9 15:18 | 只看該作者
課代表,趕快出來!!!
回復

使用道具 舉報

12#
ID:1034262 發表于 2022-12-9 16:08 | 只看該作者
STC15W408AS做不到互補帶死區的PWM,使用STC8H1K08吧,輕松實現,官方例程即可。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩国产精品一区二区三区 | 夜夜摸夜夜操 | 蜜桃官网 | 国产成人一区二区三区电影 | 中文字幕在线视频精品 | 日日干干夜夜 | av乱码| 国产第1页 | 黄网站免费观看 | 国产一级在线 | 国产成都精品91一区二区三 | 欧美精品久久 | 国产成人精品一区 | 日韩欧美在线免费观看 | 四虎最新地址 | 99精品视频免费观看 | 中文字幕三区 | 精品不卡 | 国产一级片一区二区 | 国产精品123区| 国产精品高潮呻吟久久久久 | 在线久草| www.久久 | 国产做a爱免费视频 | 国产精品18毛片一区二区 | 欧美精品在线视频 | 久久精品小短片 | 中文字幕精品一区二区三区精品 | 欧美在线观看一区 | 国产精品久久久久久久岛一牛影视 | 久久男人天堂 | 久久国产精品99久久久大便 | 91精品国产综合久久精品 | 亚洲精品黄色 | 精品视频在线观看 | 亚洲美女在线一区 | 污片在线免费观看 | 久久99精品视频 | 日韩在线视频免费观看 | 日韩精品一区二区三区中文在线 | 精品视频免费 |