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

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

QQ登錄

只需一步,快速開始

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

STC15w408as可以用寄存器來控制P5^5輸出PWM嗎?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:166841 發(fā)表于 2019-7-23 15:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
如題
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:155507 發(fā)表于 2019-7-23 23:28 | 只看該作者
可以的
我給你來個(gè)范例程序試試

  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU Programme Demo ----------------------------*/
  4. /* --- Fax: 86-755-82944243 ----------------------------------------*/
  5. /* --- Tel: 86-0513-55012928,55012929,55012966----------------------*/
  6. /* If you want to use the program or the program referenced in the  */
  7. /* article, please specify in which data and procedures from STC    */
  8. /*------------------------------------------------------------------*/

  9. /*      本程序經(jīng)過測(cè)試完全正常, 不提供電話技術(shù)支持, 如不能理解, 請(qǐng)自行補(bǔ)充相關(guān)基礎(chǔ).  */

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

  23. 本示例程序的測(cè)試是基于如下假設(shè):
  24. PCA時(shí)基信號(hào)為系統(tǒng)時(shí)鐘Fosc,PCA中斷優(yōu)先級(jí)為最高。
  25. 提示:其它中斷服務(wù)開銷很長時(shí)間時(shí),有可能會(huì)影響本程序的正常運(yùn)行。

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

  33. #include "reg51.h"

  34. #define     MAIN_Fosc   24576000L   //定義時(shí)鐘

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


  46. /**********************************************************************************************************/


  47. sfr P_SW1       = 0xA2;                     //外設(shè)功能切換寄存器1

  48. #define CCP_S0 0x10                         //P_SW1.4
  49. #define CCP_S1 0x20                         //P_SW1.5

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

  70. sfr P1M0        =   0x92;
  71. sfr P1M1        =   0x91;

  72. sbit  CCP0      =   P1^1;
  73. sbit  CCP1      =   P1^0;

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

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

  78. /*************  本地函數(shù)聲明    **************/
  79. void  delay_ms(unsigned char ms);



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


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

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


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

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

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

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

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

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

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

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

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:480680 發(fā)表于 2019-7-25 19:33 | 只看該作者
15芯片中的P5^5口正常io口,不能輸出pwm
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91不卡 | 日韩一区二区在线视频 | 日韩精品网站 | 久久www免费视频 | 中文字幕在线观看国产 | 日本a∨精品中文字幕在线 亚洲91视频 | 91视频在线观看 | 欧美色成人 | 日韩欧美中文字幕在线观看 | 亚洲成人av在线播放 | 超碰成人免费观看 | 久久婷婷色 | 亚洲精品一区二区另类图片 | 亚洲大片在线观看 | 精品一区二区免费视频 | 无人区国产成人久久三区 | 亚洲一区二区av | 欧美在线日韩 | 久久精品成人 | 欧美精品久久久久久久久久 | 精品一区精品二区 | 国产成人精品久久二区二区91 | 在线成人免费视频 | 免费看国产精品视频 | 91av入口| 婷婷久久久久 | 亚洲免费高清 | 精品欧美乱码久久久久久1区2区 | 日韩有码一区 | av网站在线免费观看 | 日韩欧美国产电影 | 精品视频一区二区三区 | 亚洲精久久久 | 久草免费视 | 久久久一区二区三区 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 视频在线亚洲 | 欧美精品一区二区三区四区 在线 | 成人欧美一区二区三区1314 | 国产福利观看 | 在线一级片 |