标题: 基于单片机AT89C51的直流电机PWM调速控制系统 [打印本页]

作者: 51黑er    时间: 2015-11-2 14:09
标题: 基于单片机AT89C51的直流电机PWM调速控制系统
仿真整体图如下:


这是我用洞洞板与腐蚀板制作的样品,仅供参考





元件
数量(个)
元件
数量(个)
光电耦合器:TLP521-2
1
三极管8550
4
按键
5
三极管8050
5
自锁按键
1
1N4007
4
At89s52
1
四位一体数码管
1
12M晶振
1
电容104
1
Led
1
直流电机
1
电阻1K
3
电容22P
2
电阻10K
1
电解电容47P/16V
2
74LS04
1
下载口
1



以下是Keil 4 编写的源程序


  1. /************头文件*********/

  2. #include<reg51.h>                  

  3. #include<absacc.h>               

  4. #include <intrins.h>  

  5. /********自定义变量********/

  6. #define uint unsigned int      //自定义变量

  7. #define uchar unsigned char   

  8. char gw,sw,bw,qw;

  9. uchar j;  //定时次数,每次20ms

  10. uchar f=5; //计数的次数

  11. sbit  P10=P1^0;    //PWM输出波形1

  12. sbit  P11=P1^1;    //PWM输出波形2

  13. sbit  P12=P1^2;   //正反转

  14. sbit  P13=P1^3;   //加速

  15. sbit  P14=P1^4;  //减速

  16. sbit  P15=P1^5;  //停止

  17. sbit  P16=P1^6;   //启动

  18. uchar k;

  19. uchar t;   //脉冲加减

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

  21. /*********控制位定义********************/

  22. uchar code smg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};//程序存储区定义字型码表

  23. char data led[4]={0x08,0x04,0x02,0x01};      //位码

  24. uint x;     //数码管显示的数值

  25. display();   //数码管显示   

  26. delays();    //延时函数

  27. key();

  28. displays();

  29. /*****************************************/



  30. /***************主函数********************/

  31. main (void)

  32. {

  33. TMOD=0x51;   //T0方式1  定时计数T1方式1计数

  34. TH0=0xb1;   //装入初值  20MS

  35. TL0=0xe0;

  36. TH1=0x00;    //   计数567

  37. TL1=0x00;

  38. TR0=1;       //启动  t0

  39. TR1=1;       //启动t1

  40. gw=sw=bw=qw=0; //数码管初始化

  41. P0=0xc0;

  42. P2=1;

  43. while(1)        //无限循环

  44. {

  45. display(); //数码管显示

  46. key();

  47.    

  48. }

  49. }

  50. /*****************************************/



  51. /***************数码管显示****************/

  52. display()

  53. {

  54. uchar i;   

  55. gw=x%10;          //求速度个位值,送到个位显示缓冲区

  56. sw=(x/10)%10;     //求速度十位值,送到十位显示缓冲区

  57. bw=(x/100)%10;   //求速度百位值,送到百位显示缓冲区

  58. qw=x/1000;        //求速度千位值,送到千位显示缓冲区

  59. for(i=0;i<4;)

  60. {

  61. P2=led[i];

  62. if(i==0)                  //显示个位

  63. {

  64. P0=smg[gw];

  65. delays();

  66. }

  67. else if(i==1)     //显示十位

  68. {

  69. P0=smg[sw];

  70. delays();

  71. }

  72. else if(i==2)  //显示百位

  73. {

  74. P0=smg[bw];

  75. delays();

  76. }

  77.    else if(i==3)   //显示千位

  78.   {

  79. if(k==0)//正转时显示"三"

  80. {

  81. P0=0x49;

  82. delays();

  83. }

  84. else

  85. {

  86. P0=0x71; //反转时显示"F"

  87. }

  88. }

  89. i++;

  90. }

  91. }

  92. /*******************************************************/



  93. /*****************延时函数*************************/

  94. delays()

  95. {

  96. uchar i;

  97. for(i=5000;i>0;i--);

  98. }

  99. /************************************************/



  100. /*********t0定时*中断函数*************/

  101. void t0() interrupt 1 using 2

  102. {

  103. TH0=0xb1;  //重装t0

  104. TL0=0xe0;

  105. f--;

  106. if(k==0)

  107. {

  108.   if(f<t)

  109.   P10=1;

  110.   else  

  111.   P10=0;

  112.   P11=0;

  113. }

  114. else  

  115. {

  116. if(f<t)

  117. P11=1;

  118. else

  119. P11=0;

  120. P10=0;

  121. }

  122. if(f==0)

  123. {

  124. f=5;

  125. }  

  126. j++;

  127. if(j==50)

  128. {

  129. j=0;

  130. x=TH1*256+TL1; //t1方式1计数,读入计数值

  131. TH1=0x00;

  132. TL1=0x00;

  133. x++;

  134. display();

  135. }

  136. }

  137. /****************按键扫描**************/

  138. key()

  139. {

  140. if(P12==0)        //如果按下,

  141. {

  142. while(!P12)    //去抖动

  143. display();

  144. k=~k;

  145. }  

  146. if(P16==0)     //启动

  147. {

  148. while(P16==0);

  149. IE=0x8a;

  150. }   

  151. if(P13==0)         //加速

  152. {

  153. while (P13==0);

  154. t++;

  155. }

  156. if(t>=5)

  157. t=5;

  158. if(P14==0)  //减速

  159. {

  160. while(P14==0);

  161. t--;

  162. }

  163. if(t<1)

  164. t=1;

  165. if(P15==0)             //停止

  166. {

  167. while(P15==0);



  168. EA=0;

  169. P10=0;

  170. P11=0;

  171. }

  172. }

  173. /******************************************************/
复制代码





作者: lxa0    时间: 2015-11-2 20:35
好似H桥有点~~~~~~~~~
作者: 一见你就笑123    时间: 2016-5-2 12:14
谢谢分享
作者: 一见你就笑123    时间: 2016-5-3 11:09
请问大神,H桥左边的那一部分是什么
作者: 哈哈嘻嘻    时间: 2016-6-30 11:21
有没有 仿真程序啊  我需要
作者: qiyezao    时间: 2016-7-1 13:37
请问STC89C52RC可用直接代用吗?
作者: G流星雨    时间: 2016-8-16 16:56
楼主的头文件有吗?新手借鉴,非常感谢
作者: 松山虎    时间: 2016-11-2 19:20
有没有排列好的程序图
作者: wenwen520    时间: 2016-12-26 15:39
有个仿真图就好了

作者: sjg119110    时间: 2016-12-28 13:44
电路感觉有点问题
作者: 大大29    时间: 2017-1-11 04:33
顶一下  谢谢分享
作者: mslong    时间: 2017-2-14 14:21
c43和141有错误编译不了
作者: li3    时间: 2017-3-24 10:48
非常给力
作者: ca2008    时间: 2017-5-4 17:56
厉害,大神
作者: 凤凰123    时间: 2017-5-8 20:19
谢谢楼主,非常有用
作者: 馆长    时间: 2017-5-12 14:16
不知道怎么下载下来
作者: 1191562740    时间: 2017-6-23 10:13
没有仿真文件么
作者: 51黑电子会员    时间: 2017-9-20 11:25
程序错那么多,还敢放出来,真是丢人啊。
作者: 51黑电子会员    时间: 2017-9-20 11:28
程序错那么多,还敢放出来,哎,还是高级工程师,还不如业余的。
作者: 小小弟弟    时间: 2017-9-23 15:44
可以啊

作者: GUOXUAN    时间: 2017-11-26 21:46
这个H桥驱动与MCU供电是分开的,还用上了光耦隔离,比较靠普!
作者: GUOXUAN    时间: 2017-11-26 21:49
正反转转,启动,停止,加速,减速.功能算是比较完善啦,还可以在H桥下端接一个电流取样电阻,产生压降电压给到MCU,输出过流保护功能.
作者: mlo    时间: 2018-4-12 11:22
很好 谢谢
作者: lijun1025    时间: 2018-5-20 22:39
顶一下  谢谢分享
作者: 139584    时间: 2018-11-30 19:57
弱弱问一句P2=0;是什么意思?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1