找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9676|回复: 8
收起左侧

用电位器通过STC12C2052AD单片机片内AD和PWM控制电机无极变速

  [复制链接]
ID:79544 发表于 2015-12-4 12:43 | 显示全部楼层 |阅读模式
  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
复制代码



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:18570 发表于 2015-12-6 22:13 | 显示全部楼层
刚好我有这个项目,谢谢,分享
回复

使用道具 举报

ID:59827 发表于 2015-12-7 13:08 | 显示全部楼层
有很高的参考价值,谢谢!
回复

使用道具 举报

ID:183120 发表于 2017-6-21 09:38 | 显示全部楼层
请问有原理图参考一下么
回复

使用道具 举报

ID:281054 发表于 2018-1-31 09:59 | 显示全部楼层
请问有相关原理图可以参考一下吗?
回复

使用道具 举报

ID:76408 发表于 2018-2-13 09:28 | 显示全部楼层
谢谢楼主,要是把原理图也贴出来就更好了。
回复

使用道具 举报

ID:76408 发表于 2018-3-8 16:53 | 显示全部楼层
看看我现在能不能下载了,我正需要。
回复

使用道具 举报

ID:66287 发表于 2018-3-11 16:48 | 显示全部楼层
也就是一个电子电位器的应用,顶一个
回复

使用道具 举报

ID:687125 发表于 2020-2-7 14:48 | 显示全部楼层
有原理图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表