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 //头文件

  9. #include     //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