找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4224|回复: 4
收起左侧

51单片机的直流电机PWM调速系统源码(加速、减速、正反转)

[复制链接]
ID:316731 发表于 2018-4-25 23:29 | 显示全部楼层 |阅读模式
基于STC89C51单片机的直流电机PWM调速,通过按键实现电机的加速、减速、正反转等功能。

单片机源程序如下:
  1. #include <reg51.h>

  2. static char pwmdir,pwmdirold;

  3. sbit P1_0=P1^0;
  4. sbit P1_1=P1^1;
  5. sbit P1_2=P1^2;
  6. sbit P1_3=P1^3;

  7. //sbit P0_4=P0^4;
  8. //sbit P0_6=P0^6;

  9. sbit P2_0=P2^0;
  10. sbit P2_1=P2^1;
  11. sbit P2_2=P2^2;
  12. sbit P2_3=P2^3;
  13. sbit P2_4=P2^4;
  14. sbit P2_5=P2^5;
  15. sbit P2_6=P2^6;
  16. sbit P2_7=P2^7;        

  17. static unsigned char pwm_f;
  18. static unsigned char H_MAX;
  19. static unsigned char keyval,keyold,pwm_pulse;

  20. void Delay(unsigned char ms);
  21. unsigned char GetKey();
  22. void LedShow(unsigned char value);
  23. void Timer0_init();
  24. void main()
  25. {         
  26.         keyval=keyold=0;
  27.         pwmdir=pwmdirold=2;
  28.         H_MAX=150;
  29.         pwm_pulse=0;
  30.         pwm_f=0;
  31.         P1=0x80;
  32.         
  33.         Timer0_init();
  34.         
  35.         while(1)
  36.         {
  37.                 keyval=GetKey();
  38.                 LedShow(keyval);
  39.                 if(0==keyval)
  40.                 {
  41.                         continue;
  42.                 }
  43.                 else
  44.                 {
  45.                         if(5==keyval)
  46.                         {
  47.                                 pwmdir=pwmdirold=2;
  48.                                 P1=0x80;
  49.                                 break;
  50.                         }
  51.                         else if(1==keyval)
  52.                         {
  53.                                 pwmdir=1;
  54.                         }
  55.                         else if(2==keyval)
  56.                         {
  57.                                 pwmdir=0;
  58.                         }
  59.                         else if(3==keyval)
  60.                         {
  61.                                 H_MAX=150;
  62.                         }
  63.                         else if(4==keyval)
  64.                         {        
  65.                                 H_MAX=80;
  66.                         }
  67.                  }
  68.         }        
  69. }

  70. void Timer0_init()
  71. {
  72.         TMOD=0x02;
  73.         TH0=0x48;
  74.         TL0=TH0;

  75.         ET0=1;
  76.         TR0=1;
  77.         EA=1;
  78. }
  79. void Timer0_inter() interrupt 1
  80. {
  81.         pwm_f++;
  82.         pwm_f%=200;
  83.         if(2!=pwmdir)
  84.         {
  85.                 if(pwmdirold!=pwmdir)
  86.                 {
  87.                         pwmdirold=pwmdir;
  88.                         P1_2=0;
  89.                         P1_3=0;
  90.                         Delay(100);//
  91.                         if(1==pwmdir)
  92.                         {
  93.                                 P1_2=0;               
  94.                                 
  95.                                 if(0==pwm_f)
  96.                                 {
  97.                                         P1_3=1;
  98.                                 }               
  99.                                 else if(H_MAX==pwm_f)
  100.                                 {
  101.                                         P1_3=0;
  102.                                 }
  103.                         }
  104.                         else
  105.                         {
  106.                                 P1_3=0;
  107.                
  108.                                 if(0==pwm_f)
  109.                                 {
  110.                                         P1_2=1;
  111.                                 }               
  112.                                 else if(H_MAX==pwm_f)
  113.                                 {
  114.                                         P1_2=0;
  115.                                 }
  116.                         }
  117.                 }
  118.                 else
  119.                 {
  120.                         if(1==pwmdir)
  121.                         {
  122.                                 P1_2=0;               
  123.                                 
  124.                                 if(0==pwm_f)
  125.                                 {
  126.                                         P1_3=1;
  127.                                 }               
  128.                                 else if(H_MAX==pwm_f)
  129.                                 {
  130.                                         P1_3=0;
  131.                                 }
  132.                         }
  133.                         else
  134.                         {
  135.                                 P1_3=0;
  136.                
  137.                                 if(0==pwm_f)
  138.                                 {
  139.                                         P1_2=1;
  140.                                 }               
  141.                                 else if(H_MAX==pwm_f)
  142.                                 {
  143.                                         P1_2=0;
  144.                                 }
  145.                         }
  146.                 }
  147.         }
  148. }

  149. unsigned char GetKey()
  150. {         
  151.         P2_0=0;
  152.         if(0==P2_4)
  153.         {
  154.                 P2_0=1;
  155.                 return 7;
  156.         }
  157.         else if(0==P2_5)
  158.         {
  159.                 P2_0=1;
  160.                 return 8;
  161.         }

  162.         P2_0=1;
  163.         P2_1=0;
  164.         if(0==P2_4)
  165.         {
  166.                 P2_1=1;
  167.                 return 5;
  168.         }
  169.         else if(0==P2_5)
  170.         {
  171.                 P2_1=1;
  172.                 return 6;
  173.         }

  174.         P2_1=1;
  175.         P2_2=0;
  176.         if(0==P2_4)
  177.         {
  178.                 P2_2=1;
  179.                 return 3;
  180.         }
  181.         else if(0==P2_5)
  182.         {
  183.                 P2_2=1;
  184.                 return 4;
  185.         }

  186.         P2_2=1;
  187.         P2_3=0;
  188.         if(0==P2_4)
  189.         {
  190.                 P2_3=1;
  191.                 return 1;
  192.         }
  193.         else if(0==P2_5)
  194.         {
  195.                 P2_3=1;
  196.                 return 2;
  197.         }
  198.         else
  199.         {
  200.                 P2_3=1;
  201.                 return 0;
  202.         }
  203. }

  204. void LedShow(unsigned char value)
  205. {
  206.         switch(value)
  207.         {        
  208.                 case 1:
  209.                         P0=0xF9;
  210.                         P1_0=0;
  211.                         break;
  212.                 case 2:
  213.                         P0=0xA4;
  214.                         P1_0=0;
  215.                         break;
  216.                 case 3:
  217.                         P0=0xB0;
  218.                         P1_0=0;
  219.                         break;
  220.                 case 4:
  221.                         P0=0x99;
  222.                         P1_0=0;
  223.                         break;
  224.                 case 5:
  225.                         P0=0x92;
  226.                         P1_0=0;
  227.                         break;
  228.                 case 6:
  229.                         P0=0x82;
  230.                         P1_0=0;
  231.                         break;
  232.                 case 7:
  233.                         P0=0xF8;
  234.                 P1_0=0;
  235.                         break;
  236.                         case 8:
  237.                         P0=0x80;
  238.                         P1=0xFE;
  239.                         break;
  240.                 default:
  241.                         break;
  242.         }
  243. }

  244. void Delay(unsigned char ms)
  245. {
  246.         unsigned int i=100*ms;
  247.         while(i--) ;
  248. }
复制代码

所有资料51hei提供下载:
基于STC89C51单片机的直流电机PWM调速,通过按键实现电机的加速、减速、正反转等功能。.rar (18.69 KB, 下载次数: 83)

评分

参与人数 2黑币 +10 收起 理由
supermcu8 + 5 赞一个!
DIY电子 + 5 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:100826 发表于 2018-4-26 09:31 | 显示全部楼层
学习了  谢谢分享...
回复

使用道具 举报

ID:316877 发表于 2018-4-26 11:34 | 显示全部楼层

学习了  谢谢分享...
回复

使用道具 举报

ID:330009 发表于 2018-5-14 22:44 | 显示全部楼层
按键是怎么设置的,没看懂
回复

使用道具 举报

ID:1099698 发表于 2024-4-8 16:51 | 显示全部楼层
你好,请问有仿真电路图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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