登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看4919|回0|收藏
楼主 ID:80436 只看他
2015-5-21 17:01
每过一天,我就会发现学习的难度越来越大,越来越蒙,可能是没基础学起来会很吃力。。。资料越来越来有限,像AVR吧,本来就不会,加上关于内部PWM的资料又找不到。。。。。哎-。-怎么搞的。。。。今天没进展啊。不过还是要打起精神,别逼我下载整套AVR来看   -。

代码:

  1. /**A/D转换测试程序(ADC查询方式)**/

  2. #include <reg51.h>

  3. #include <intrins.h>

  4. typedef   unsigned   char   BYTE;

  5. typedef   unsigned   int   WORD;

  6. /*Declare SFR associated with the ADC */

  7. sfr   ADC_CONTR     =   0xBC;              //ADC control register

  8. //ADC控制寄存器

  9. sfr   ADC_RES       =   0xBD;              //ADC high 8-bit result register

  10. //ADC的高8位结果寄存器

  11. sfr   ADC_LOW2      =   0xBE;              //ADC low 2-bit result register

  12. //ADC的低2位结果寄存器

  13. sfr   P1ASF         =   0x9D;              //P1 secondary function control register

  14. //P1的辅助功能控制寄存器

  15. /*Define ADC operation const for ADC_CONTR*/        //定义常量ADC_CONTR ADC操作

  16. #define   ADC_POWER     0x80               //ADC power control bit

  17. //ADC的功率控制位

  18. #define   ADC_FLAG      0x10               //ADC complete flag

  19. //ADC的完成标志

  20. #define   ADC_START    0x08               //ADC start control bit

  21. //ADC启动控制位

  22. #define   ADC_SPEEDLL   0x00               //540 clocks        //540时钟

  23. #define   ADC_SPEEDL    0x20               //360 clocks        //360时钟

  24. #define   ADC_SPEEDH   0x40               //180 clocks        //180时钟

  25. #define   ADC_SPEEDHH   0x60               //90 clocks        //90时钟

  26. /*Declare SFR associated with the PCA */        //SFR与PCA的相关声明

  27. sfr CCON = 0xD8; //PCA control register //PCA的控制寄存器

  28. sbit CCF0 = CCON^0; //PCA module-0 interrupt flag //PCA模块0中断标志位

  29. sbit CCF1 = CCON^1; //PCA module-1 interrupt flag        //PCA模块1中断标志

  30. sbit CR = CCON^6; //PCA timer run control bit        //PCA定时器的运行控制位

  31. sbit CF = CCON^7; //PCA timer overflow flag        //PCA定时器溢出标志

  32. sfr CMOD = 0xD9;        //PCA mode register        //PCA的模式寄存器

  33. sfr CL = 0xE9; //PCA base timer LOW        //PCA的基础定时器的低位

  34. sfr CH = 0xF9; //PCA base timer HIGH        //PCA的基础定时器的高位

  35. sfr CCAPM0 = 0xDA; //PCA module-0 mode register        //PCA模块- 0模式寄存器

  36. sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW        //PCA模块0捕获寄存器低

  37. sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH        //PCA模块0捕获高字节

  38. sfr CCAPM1 = 0xDB; //PCA module-  mode register        //PCA模块模式寄存器

  39. sfr CCAP1L = 0xEB; //PCA module-  capture register LOW        //PCA模块捕获寄存器的低

  40. sfr CCAP1H = 0xFB; //PCA module-  capture register HIGH        //PCA模块捕获寄存器高字节

  41. sfr PCAPWM0 = 0xf2;

  42. sfr PCAPWM1 = 0xf3;


  43. void PWMInit(void);

  44. void InitADC(void);

  45. void allinit(void);

  46. void AD_get(void);

  47. void control(void);

  48. void yk(void);

  49. void Delay(WORD n);

  50. BYTE GetADCResult(BYTE ch);

  51. sbit p25=P2^5;

  52. sbit p26=P2^6;

  53. sbit a1=P2^0;  //电机a,b的方向控制

  54. sbit a2=P2^1;

  55. sbit b1=P2^2;

  56. sbit b2=P2^3;

  57. sbit p30=P3^0;

  58. sbit p33=P3^1;

  59. sbit p32=P3^2;

  60. sbit p31=P3^3;

  61. sbit beep=P2^7;

  62. WORD AD_hei=0x7f;        //AD比较值

  63. WORD AD_value[5];   //AD采集值存储数组

  64. BYTE pwma=0x00;        //电机a,pwm控制

  65. BYTE pwmb=0x00;        //电机b,pwm控制

  66. void main()

  67. {

  68.       allinit();

  69. P3=0xff;                  

  70.       while (1)

  71.       {

  72.         AD_get();

  73.         control();

  74. yk();

  75. }

  76. }


  77. /*********************************************/

  78. void yk(void)

  79. {

  80.         if(p30==1||p32==1||p33==1)

  81.     {        BYTE i=1;

  82. beep=0;

  83. Delay(10);

  84. beep=1;

  85. while(i)

  86. {

  87. if(p30==1) //前进

  88. {

  89.         if(p30==1)

  90. {

  91. a1=1;

  92. a2=0;

  93. b1=1;

  94. b2=0;

  95. pwma=0x00,pwmb=0x00;

  96. CCAP0H = CCAP0L =pwma;

  97. CCAP1H = CCAP1L =pwmb;



  98. }

  99.         }

  100. if(p30==1) //前进

  101. {

  102.         if(p30==1)

  103. {

  104. a1=1;

  105. a2=0;

  106. b1=1;

  107. b2=0;

  108. pwma=0x00,pwmb=0x00;

  109. CCAP0H = CCAP0L =pwma;

  110. CCAP1H = CCAP1L =pwmb;



  111. }

  112.         }

  113. if(p31==1)        //后退

  114. {

  115.         if(p31==1)

  116. {

  117.         a1=0;

  118. a2=1;

  119. b1=0;

  120. b2=1;

  121. pwma=0x00,pwmb=0x00;

  122. CCAP0H = CCAP0L =pwma;

  123. CCAP1H = CCAP1L =pwmb;

  124.          

  125. }

  126.         }

  127. if(p32==1)        //前左转

  128. {

  129.         if(p32==1)

  130. {

  131. pwma=0x80,pwmb=0x00;

  132. CCAP0H = CCAP0L =pwma;

  133. CCAP1H = CCAP1L =pwmb;         

  134. }

  135. }

  136. if(p33==1)        //前右转

  137. {

  138. if(p33==1)

  139. {

  140. pwma=0x00,pwmb=0x80;

  141. CCAP0H = CCAP0L =pwma;

  142. CCAP1H = CCAP1L =pwmb;         

  143. }

  144.         }

  145. if(p31==1)        //推出按键控制模式

  146. {        Delay(250);

  147. if(p31==1)

  148. i=0;

  149. }

  150. if(p30==1) //停止

  151. {

  152. Delay(230);

  153. if(p30==1)

  154. pwma=0xff,pwmb=0xff;

  155. CCAP0H = CCAP0L =pwma;

  156. CCAP1H = CCAP1L =pwmb;

  157. }while(p30==1);



  158. }

  159. pwma=0xff,pwmb=0xff;

  160. CCAP0H = CCAP0L =pwma;

  161. CCAP1H = CCAP1L =pwmb;

  162. beep=0;

  163. Delay(10);

  164. beep=1;

  165. Delay(190);

  166. a1=1;

  167. a2=0;

  168. b1=1;

  169. b2=0;       



  170. }

  171. }


  172. /********************AD采集**********************/

  173. void AD_get(void)

  174. {

  175. AD_value[0]=GetADCResult(0xc8);                 //Show Channel0        //显示通道0

  176. AD_value[1]=GetADCResult(0xc9);                 //Show Channel1        //显示通道1

  177. AD_value[2]=GetADCResult(0xca);                 //Show Channel2        //显示通道2

  178. AD_value[3]=GetADCResult(0xcd);                 //Show Channel3        //显示通道3

  179. AD_value[4]=GetADCResult(0xce);                 //Show Channel4        //显示通道4

  180. }



  181. /*----------------------------

  182. Get ADC result        //获取ADC结果

  183. ----------------------------*/

  184. BYTE GetADCResult(BYTE ch)

  185. {

  186.       ADC_CONTR =ch;

  187.       _nop_();                            //Must wait before inquiry

  188. //必须等待调查

  189.       _nop_();

  190.       _nop_();

  191.       _nop_();

  192.       while (!(ADC_CONTR & ADC_FLAG));  //Wait complete flag

  193. //等待完成标志

  194.       ADC_CONTR &= ~ADC_FLAG;           //Close ADC

  195. //关闭的ADC

  196.       return ADC_RES;                     //Return ADC result

  197. //返回ADC结果

  198. }

  199. /***************电机控制***********************/

  200. void control(void)

  201. {

  202. unsigned char turn_flag[5];


  203.     if( AD_value[0]>=AD_hei)     //通道0采集值与预置数比较

  204. turn_flag[0]=1;    //产生标志位,LED做指示

  205.    else turn_flag[0]=0;  

  206.    

  207.     if( AD_value[1]>=AD_hei)    //通道1采集值与预置数比较

  208. turn_flag[1]=1;

  209.    else {turn_flag[1]=0;

  210.    

  211.     if( AD_value[2]>=AD_hei)     //通道2采集值与预置数比较

  212. turn_flag[2]=1;

  213.    else turn_flag[2]=0;

  214.    

  215.     if(AD_value[3]>=AD_hei)     //通道5采集值与预置数比较

  216.      turn_flag[3]=1;

  217.    else turn_flag[3]=0;

  218.    

  219.     if(AD_value[4]>=AD_hei)     //通道6采集值与预置数比较

  220.      turn_flag[4]=1;

  221.    else turn_flag[4]=0;}


  222.         if(turn_flag[4]==1)

  223. if(turn_flag[0]==0)

  224. if(turn_flag[1]==0)

  225. if(turn_flag[2]==0)

  226. if(turn_flag[3]==0)

  227. pwma=0x00,pwmb=0x00;

  228. if(turn_flag[0]==0)

  229. if(turn_flag[1]==0)

  230. if(turn_flag[2]==0)

  231. if(turn_flag[3]==0)

  232. if(turn_flag[4]==0)

  233. pwma=0x00,pwmb=0x00;


  234.      if(turn_flag[0]==1) pwma=0x00,pwmb=0xff;  

  235. if(turn_flag[1]==1) pwma=0x00,pwmb=0xff;  

  236. if(turn_flag[2]==1) pwma=0xff,pwmb=0x00;

  237. if(turn_flag[3]==1) pwma=0xff,pwmb=0x00;


  238.     if(turn_flag[0]==1)

  239. if(turn_flag[4]==1)

  240. pwma=0x00,pwmb=0x80;

  241.     if(turn_flag[2]==1)

  242. if(turn_flag[4]==1)

  243. pwma=0x80,pwmb=0x00;


  244. if(turn_flag[1]==1)

  245.         if(turn_flag[3]==1)

  246.         pwma=0xff,pwmb=0xff;

  247. CCAP0H = CCAP0L =pwma;

  248. CCAP1H = CCAP1L =pwmb;

  249. }

  250. /****************所有的初始化**************/

  251. void allinit()

  252. {

  253. p26=1;

  254. P0=0x00;

  255. p26=0;

  256. p25=1;

  257. a1=1;

  258. a2=0;

  259. b1=1;

  260. b2=0;

  261. beep=1;

  262.     PWMInit();

  263. InitADC();        //Init ADC sfr        //初始化的ADC的SFR

  264. }

  265. /*****************pwm口初始化***********************/

  266. void PWMInit(void)

  267. {

  268. CCON=0;        //Initial PCA control register        //初始PCA的控制寄存器

  269. //PCA timer stop running        //PCA定时器停止运行

  270. //Clear CF flag        //清除CF标志

  271. //Clear all module interrupt flag        //清除所有模块的中断标志

  272. CL=0;        //Reset PCA base timer        //复位PCA的基定时器

  273. CH = 0;

  274. CMOD = 0x02; //Set PCA timer clock source as Fosc/2 //设置为fosc的PCA定时器/ 2的时钟源

  275. //Disable PCA timer overflow interrupt        //禁止PCA定时器溢出中断

  276. CCAP0H = CCAP0L =pwma; //PWM0 port output 50% duty cycle square wave//PWM0的端口输出50%占空比的方波

  277. CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode //PCA模块0的工作在8位PWM模式

  278. //and no PCA interrupt        //并没有PCA中断


  279. CCAP1H = CCAP1L =pwmb; //PWM1 port output 0% duty cycle square wave//PWM1的端口输出0%占空比的方波

  280. //        PCAPWM1 = 0x03;

  281. CCAPM1 = 0x42; //PCA module-  work in 8-bit PWM mode        //PCA模块,工作在8位PWM模式

  282. //and no PCA interrupt        //并没有PCA中断


  283. CR =1; //PCA timer start run        //PCA定时器开始运行


  284. }

  285. /*----------------------------

  286. Initial ADC sfr        //初步的ADC的SFR

  287. ----------------------------*/

  288. void InitADC()

  289. {

  290.       P1ASF = 0x67;                       //Open 8 channels ADC function

  291. //打开8通道ADC功能

  292.       ADC_RES = 0;                        //Clear previous result

  293. //清除以前的结果

  294.       ADC_CONTR = 0xc0;

  295.       Delay(2);                           //ADC power-on and delay

  296. //ADC的功耗和延迟

  297. }



  298. /*----------------------------

  299. Software delay function        //软件延时功能

  300. ----------------------------*/

  301. void Delay(WORD n)

  302. {

  303.       WORD x;

  304.       while (n--)

  305.       {

  306.            x = 5000;

  307.            while (x--);

  308.       }

  309. }      



51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版