用電位器通過STC12C2052AD單片機片內AD和PWM控制電機無極變速

51CTO提醒您,請勿濫發廣告!


用電位器通過STC12C2052AD單片機片內AD和PWM控制電機無極變速

http://51CTO提醒您,請勿濫發廣告!/bbs/forum.php?mod=viewthread&tid=40873&fromuid=59827

(出處: 單片機論壇)


  1. /********************************************************

  2.         功能  :用電位器通過STC12C2052AD片內AD和PWM控制電機轉速

  3.         單片機;STC12C2052AD

  4.         晶振  :12M

  5.         作者  :蘇義江

  6.         時間  :2015-12-4

  7. ********************************************************/

  8. #include<STC12C2052AD.H> //頭文件

  9. #include <intrins.h>    //51基本運算(包括_nop_空函數) 

  10. #define uchar unsigned char

  11. #define uint unsigned int

  12. uint M;


  13. /****************************************************

  14. 函數名:PWM初始化函數

  15. 調  用:PWM_init();

  16. 參  數:無

  17. 返回值:無

  18. 結  果:將PCA初始化爲PWM模式,初始佔空比爲0

  19. 備  注:需要更多路PWM輸出直接插入CCAPnH和CCAPnL即可

  20. /********************************************************/

  21. void PWM_init (void)

  22. {

  23.         CMOD=0x02; //設置PCA定時器

  24.           CL=0x00; 

  25.           CH=0x00;

  26.         CCAPM0=0x42; //PWM0設置PCA工作方式爲PWM方式(0100 0010)

  27.         CCAP0L=0x00; //設置PWM0初始值與CCAP0H相同

  28.           CCAP0H=0x00; // PWM0初始時爲0

  29.         CCAPM1=0x42; //PWM1設置PCA工作方式爲PWM方式(使用時刪除//)

  30.         CCAP1L=0x00; //設置PWM1初始值與CCAP0H相同

  31.           CCAP1H=0x00; // PWM1初始時爲0

  32.         //CCAPM2=0x42; //PWM2設置PCA工作方式爲PWM方式

  33.         //CCAP2L=0x00; //設置PWM2初始值與CCAP0H相同

  34.           //CCAP2H=0x00; // PWM2初始時爲0

  35.         //CCAPM3=0x42; //PWM3設置PCA工作方式爲PWM方式

  36.         //CCAP3L=0x00; //設置PWM3初始值與CCAP0H相同

  37.           //CCAP3H=0x00; // PWM3初始時爲0

  38.           CR=1; //啓動PCA定時器

  39. }

  40. /**********************************************************/

  41. void delay(uint z)

  42. {

  43.         uint x,y;

  44.         for(x=z;x>0;x--)

  45.         for(y=420;y>0;y--);

  46. }

  47. /******************************************************

  48. 函數名:PWM0佔空比設置函數

  49. 調  用:PWM0_set();

  50. 參  數:0x00~0xFF(亦可用0~255)

  51. 返回值:無

  52. 結  果:設置PWM模式佔空比,爲0時全部高電平,爲1時全部低電平

  53. 備  注:如果需要PWM1的設置函數,只要把CCAP0L和CCAP0H中的0改爲1即可

  54. /***********************************************/

  55. void PWM0_set (uchar a)//p3^7輸出PWM

  56. {

  57.         CCAP0L= a; //設置值直接寫入CCAP0L

  58.           CCAP0H= a; //設置值直接寫入CCAP0H

  59. }

  60. /***********************************************/

  61. void PWM1_set (uchar a)//P3^5輸出PWM

  62. {

  63.         CCAP1L= a; //設置值直接寫入CCAP0L

  64.           CCAP1H= a; //設置值直接寫入CCAP0H

  65. }

  66. /************************AD轉換***************************/

  67. uchar Read (uchar CHA)

  68. {  

  69.         uchar AD_FIN=0;   //存儲A/D轉換標誌  

  70. /******以下爲ADC初始化程序****************************/      

  71.         CHA &= 0x07;   //選擇ADC的8個接口中的一個

  72. //(0000 0111 清0高5位)     

  73.         ADC_CONTR = 0x40; //ADC轉換的速度設定     

  74.         _nop_(); _nop_(); _nop_(); _nop_();     

  75.         ADC_CONTR |= CHA;   //選擇A/D當前通道     

  76.         _nop_();_nop_(); _nop_(); _nop_();      

  77.         ADC_CONTR |= 0x80;  //啓動A/D電源      

  78.         delay(2);        //使輸入電壓達到穩定(1ms即可?  

  79. /******以下爲ADC執行程序****************************/

  80.         ADC_CONTR |= 0x08; //啓動A/D轉換(0000 1000 令ADCS = 1)     

  81.         _nop_();_nop_(); _nop_(); _nop_();    

  82.         while (AD_FIN ==0)

  83.         {    //等待A/D轉換結束      

  84.                 AD_FIN=(ADC_CONTR & 0x10); //0001 0000測試A/D轉換結束否     

  85.         }      

  86.                 ADC_CONTR &=0xE7; //1111 0111 清ADC_FLAG位, 關閉A/D轉換, 

  87.                 return (ADC_DATA);//返回A/D轉換結果(8位) 

  88. }

  89. void main (void)

  90. {


  91.         PWM_init(); //PWM初始化

  92.         P1M0 = 0x01;  //P1.0/P1.1:0000 0011(高阻)  

  93.         P1M1 = 0x00;  //P1.0/P1.1:0000 0000 ON=1;

  94. //        PWM0_set(80); //設置PWM初始佔空比

  95. //        PWM1_set (80);

  96.         while(1)

  97.         {         

  98.                 M=Read(0);  //P1.0口模擬量轉換  

  99.                 PWM0_set(M); //轉換結果爲PWM0賦值 P3^7輸出佔空比 

  100.                 M=Read(1);  //P1.1口模擬量轉換  

  101.                 PWM1_set(M); //轉換結果爲PWM0賦值 P3^5輸出佔空比  

  102.         }

  103. }

複製代碼

  1. #ifndef __STC12C2052AD_H_

  2. #define __STC12C2052AD_H_


  3. /////////////////////////////////////////////////


  4. /* The following is STC additional SFR or change */


  5. /* sfr  AUXR  = 0x8e; */

  6. /* sfr  IPH   = 0xb7; */


  7. /* Watchdog Timer Register */

  8. sfr  WDT_CONTR = 0xe1;    


  9. /* ISP_IAP_EEPROM Register */

  10. sfr ISP_DATA  = 0xe2;

  11. sfr ISP_ADDRH = 0xe3;

  12. sfr ISP_ADDRL = 0xe4;

  13. sfr ISP_CMD   = 0xe5;

  14. sfr ISP_TRIG  = 0xe6;

  15. sfr ISP_CONTR = 0xe7;


  16. /* IDLE, Clock Divider */

  17. sfr IDLE_CLK  = 0xc7;


  18. /* I_O Port Mode Set Register */

  19. sfr P0M0  = 0x93;

  20. sfr P0M1  = 0x94;

  21. sfr P1M0  = 0x91;

  22. sfr P1M1  = 0x92;

  23. sfr P2M0  = 0x95;

  24. sfr P2M1  = 0x96;

  25. sfr P3M0  = 0xb1;

  26. sfr P3M1  = 0xb2;


  27. /* SPI Register */

  28. sfr SPSTAT  = 0x84;

  29. sfr SPCTL   = 0x85;

  30. sfr SPDAT   = 0x86;


  31. /* ADC Register */

  32. sfr ADC_CONTR  = 0xc5;

  33. sfr ADC_DATA   = 0xc6;

  34. sfr ADC_LOW2   = 0xbe;

  35. sfr P1ASF=0x9d;

  36. sfr ADC_RES  =0xbd;

  37. sfr ADC_RESL   =0XBE;

  38. //zhuanhuan sulv

  39. #define ADC_SPEEDLL 0X00

  40. #define ADC_SPEEDL  0X20

  41. #define ADC_SPEEDH  0X40//

  42. #define ADC_SPEEDHH 0X60//90


  43. /* PCA SFR */

  44. sfr CCON   = 0xD8;

  45. sfr CMOD   = 0xD9;

  46. sfr CCAPM0 = 0xDA;

  47. sfr CCAPM1 = 0xDB;

  48. sfr CCAPM2 = 0xDC;

  49. sfr CCAPM3 = 0xDD;

  50. sfr CCAPM4 = 0xDE;

  51. sfr CCAPM5 = 0xDF;


  52. sfr CL     = 0xE9;

  53. sfr CCAP0L = 0xEA;

  54. sfr CCAP1L = 0xEB;

  55. sfr CCAP2L = 0xEC;

  56. sfr CCAP3L = 0xED;

  57. sfr CCAP4L = 0xEE;

  58. sfr CCAP5L = 0xEF;


  59. sfr CH     = 0xF9;

  60. sfr CCAP0H = 0xFA;

  61. sfr CCAP1H = 0xFB;

  62. sfr CCAP2H = 0xFC;

  63. sfr CCAP3H = 0xFD;

  64. sfr CCAP4H = 0xFE;

  65. sfr CCAP5H = 0xFF;


  66. sfr PCA_PWM0 = 0xF2;

  67. sfr PCA_PWM1 = 0xF3;

  68. sfr PCA_PWM2 = 0xF4;

  69. sfr PCA_PWM3 = 0xF5;

  70. sfr PCA_PWM4 = 0xF6;

  71. sfr PCA_PWM5 = 0xF7;


  72. /*  CCON  */

  73. sbit CF    = CCON^7;

  74. sbit CR    = CCON^6;

  75. sbit CCF5  = CCON^5;

  76. sbit CCF4  = CCON^4;

  77. sbit CCF3  = CCON^3;

  78. sbit CCF2  = CCON^2;

  79. sbit CCF1  = CCON^1;

  80. sbit CCF0  = CCON^0;


  81. /* Above is STC additional SFR or change */


  82. /*--------------------------------------------------------------------------

  83. REG51F.H


  84. Header file for 8xC31/51, 80C51Fx, 80C51Rx+

  85. Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.

  86. All rights reserved.


  87. Modification according to DataSheet from April 1999

  88. - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives

  89. --------------------------------------------------------------------------*/


  90. /*  BYTE Registers  */

  91. sfr P0   = 0x80;

  92. sfr P1   = 0x90;

  93. sfr P2   = 0xA0;

  94. sfr P3   = 0xB0;

  95. sfr PSW  = 0xD0;

  96. sfr ACC  = 0xE0;

  97. sfr B    = 0xF0;

  98. sfr SP   = 0x81;

  99. sfr DPL  = 0x82;

  100. sfr DPH  = 0x83;

  101. sfr PCON = 0x87;

  102. sfr TCON = 0x88;

  103. sfr TMOD = 0x89;

  104. sfr TL0  = 0x8A;

  105. sfr TL1  = 0x8B;

  106. sfr TH0  = 0x8C;

  107. sfr TH1  = 0x8D;

  108. sfr IE   = 0xA8;

  109. sfr IP   = 0xB8;

  110. sfr SCON = 0x98;

  111. sfr SBUF = 0x99;


  112. /*  80C51Fx/Rx Extensions  */

  113. sfr AUXR   = 0x8E;

  114. /* sfr AUXR1  = 0xA2; */

  115. sfr SADDR  = 0xA9;

  116. sfr IPH    = 0xB7;

  117. sfr SADEN  = 0xB9;

  118. sfr T2CON  = 0xC8;

  119. sfr T2MOD  = 0xC9;

  120. sfr RCAP2L = 0xCA;

  121. sfr RCAP2H = 0xCB;

  122. sfr TL2    = 0xCC;

  123. sfr TH2    = 0xCD;



  124. /*  BIT Registers  */

  125. /*  PSW   */

  126. sbit CY   = PSW^7;

  127. sbit AC   = PSW^6;

  128. sbit F0   = PSW^5;

  129. sbit RS1  = PSW^4;

  130. sbit RS0  = PSW^3;

  131. sbit OV   = PSW^2;

  132. sbit P    = PSW^0;


  133. /*  TCON  */

  134. sbit TF1  = TCON^7;

  135. sbit TR1  = TCON^6;

  136. sbit TF0  = TCON^5;

  137. sbit TR0  = TCON^4;

  138. sbit IE1  = TCON^3;

  139. sbit IT1  = TCON^2;

  140. sbit IE0  = TCON^1;

  141. sbit IT0  = TCON^0;


  142. /*  P3  */

  143. sbit RD   = P3^7;

  144. sbit WR   = P3^6;

  145. sbit T1   = P3^5;

  146. sbit T0   = P3^4;

  147. sbit INT1 = P3^3;

  148. sbit INT0 = P3^2;

  149. sbit TXD  = P3^1;

  150. sbit RXD  = P3^0;


  151. /*  SCON  */

  152. sbit SM0  = SCON^7; // alternatively "FE"

  153. sbit FE   = SCON^7;

  154. sbit SM1  = SCON^6;

  155. sbit SM2  = SCON^5;

  156. sbit REN  = SCON^4;

  157. sbit TB8  = SCON^3;

  158. sbit RB8  = SCON^2;

  159. sbit TI   = SCON^1;

  160. sbit RI   = SCON^0;

  161.              


  162. sbit T2EX = P1^1;

  163. sbit T2   = P1^0;


  164. /*  T2CON  */

  165. sbit TF2   = T2CON^7;

  166. sbit EXF2  = T2CON^6;

  167. sbit RCLK  = T2CON^5;

  168. sbit TCLK  = T2CON^4;

  169. sbit EXEN2 = T2CON^3;

  170. sbit TR2   = T2CON^2;

  171. sbit C_T2  = T2CON^1;

  172. sbit CP_RL2= T2CON^0;


  173. /* PCA Pin */


  174. sbit CEX3 = P2^4;

  175. sbit CEX2 = P2^0;

  176. sbit CEX1 = P3^5;

  177. sbit CEX0 = P3^7;

  178. sbit ECI  = P3^4;


  179. /*  IE   */

  180. sbit EA   = IE^7;

  181. sbit EPCA_LVD  = IE^6;

  182. sbit EADC_SPI  = IE^5;

  183. sbit ES   = IE^4;

  184. sbit ET1  = IE^3;

  185. sbit EX1  = IE^2;

  186. sbit ET0  = IE^1;

  187. sbit EX0  = IE^0;


  188. /*  IP   */ 

  189. sbit PPCA_LVD  = IP^6;

  190. sbit PADC_SPI  = IP^5; 

  191. sbit PS   = IP^4;

  192. sbit PT1  = IP^3;

  193. sbit PX1  = IP^2;

  194. sbit PT0  = IP^1;

  195. sbit PX0  = IP^0;


  196. /////////////////////////////////////////////////


  197. #endif


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章