找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10546|回复: 10
收起左侧

51单片机pwm按键控制直流电机加减速源程序

  [复制链接]
ID:210611 发表于 2017-6-13 13:20 | 显示全部楼层 |阅读模式

{R[7ZYF[6Z7B2CL_IDK$[NB.png

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

  3. #define TH0_TL0 (65536-1000)//设定中断的间隔时长



  4. sbit Key_add=P1 ^ 0; //电机减速
  5. sbit Key_dec=P1 ^ 2; //电机加速
  6. sbit Key_turn=P1 ^ 1; //电机换向
  7. sbit PWM1=P2^6;//PWM 通道1,反转脉冲
  8. sbit PWM2=P2^7;//PWM 通道2,正转脉冲
  9. void LCD_write_char(unsigned char x,unsigned char y,char ch );

  10. sbit rs=P2^0;
  11. sbit rw=P2^1;  
  12. sbit e=P2^2;


  13. void LCD_Writecmd(unsigned char cmd);
  14. void LCD_Writedata(unsigned char dat);
  15. void LCD_write_str(unsigned char x,unsigned char y,char str[]);
  16. void LCD_clear(void);
  17. void LCD_Init(void);



  18. void delay_us(unsigned char y);
  19. void delay_ms(unsigned char z);
  20. void Delay(unsigned char x);
  21. void Motor_speed_high(void);
  22. void Motor_speed_low(void);
  23. void Motor_turn(void);
  24. void Timer0_init(void);

  25. unsigned char count0 = 50;//低电平的占空比

  26. unsigned char Time_delay;
  27. unsigned char count1 = 0;//高电平的占空比

  28. bit Flag = 1;//电机正反转标志位,1正转,0反转



  29. void Delay(unsigned char x)
  30. {

  31. Time_delay = x;  

  32. while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔
  33. }




  34. void Motor_speed_high(void)//
  35. {
  36. if(Key_add==0)
  37. {
  38.   
  39. Delay(10);  
  40. if(Key_add==0)  
  41. {
  42.   
  43.   count0 += 10;  
  44.   
  45.    
  46. if(count0 >= 100)  
  47.    {

  48.    count0 = 100;
  49.     }
  50.    }

  51. while(!Key_add);//等待键松开
  52. }
  53. }





  54. void Motor_speed_low(void)
  55. {

  56. if(Key_dec==0)
  57. {

  58. Delay(10);  
  59. if(Key_dec==0)
  60.   {
  61.   
  62.   count0 -= 10;  
  63.   
  64.     if(count0 <= 0)  
  65.    {
  66.   
  67.   count0 = 0;   
  68.   }  
  69.   }
  70.   
  71. while(!Key_dec );
  72. }
  73. }





  74. void Motor_turn(void)
  75. {

  76. if(Key_turn == 0)
  77. {

  78.   Delay(10);
  79.    if(Key_turn == 0)
  80.   {
  81.   
  82.   Flag = ~Flag;
  83.   }

  84.   while(!Key_turn);
  85. }
  86. }





  87. void Timer0_init(void)
  88. {

  89. TMOD=0x01; //定时器0工作于方式1
  90. TH0=TH0_TL0/256;
  91. TL0=TH0_TL0%256;
  92. TR0=1;
  93. ET0=1;
  94. EA=1;
  95. }











  96. void Timer0_int(void) interrupt 1 using 1
  97. {

  98. TR0 = 0;//设置定时器初值期间,关闭定时器
  99. TL0 = TH0_TL0 % 256;

  100. TH0 = TH0_TL0 / 256; //定时器装初值
  101. TR0 = 1;
  102. if(Time_delay != 0)//延时函数用
  103. {

  104. Time_delay--;
  105. }

  106. if(Flag == 1)//电机正转
  107. {
  108. PWM1 = 0;

  109.    
  110.   if(++count1 < count0)
  111.   {

  112.    PWM2 = 1;

  113.    }   
  114. else   
  115.    PWM2 = 0;  

  116.     if(count1 >= 100)  
  117.    {   
  118.   count1=0;
  119.     }
  120. }

  121. else //电机反转
  122.    {
  123.    
  124. PWM2 = 0;
  125.    

  126.     if(++count1 < count0)  
  127.    {   
  128.   PWM1 = 1;  
  129.    }   
  130.   else   
  131.    PWM1 = 0;   
  132.   
  133.     if(count1 >= 100)  
  134.    {
  135.    
  136.    count1=0;  
  137.    }  
  138. }
  139. }





  140. void delay_us(unsigned char j)/* 简易延时函数 */
  141. {
  142. unsigned char k,i;
  143. for(k=j;j>0;j--)
  144. for(i=100;i>0;i--);

  145. }




  146. void delay_ms(unsigned char j) /* 简易延时函数 */
  147. {
  148. unsigned char k,i;
  149. for(k=j;j>0;j--)
  150. for(i=256;i>0;i--);

  151. }


  152. void LCD_Writecmd(unsigned char cmd)//写指令到LCD1602
  153. {
  154.         rs=0;
  155.         delay_us(1);
  156.         rw=0;
  157.         delay_us(1);
  158.        
  159.         e=1;
  160.         DATAOUT=cmd;
  161.         delay_us(300);
  162.         e=0;
  163. }


  164. void LCD_Writedata(unsigned char dat)//写数据到LCD1602
  165. {
  166.         rs=1;
  167.         delay_us(1);
  168.         rw=0;
  169.         delay_us(1);
  170.         e=1;
  171.         DATAOUT=dat;
  172.         delay_us(300);
  173.         e=0;
  174.        
  175. }


  176. void LCD_write_char(unsigned char x,unsigned char y,char ch )//在指定位置显示一个字符
  177. {
  178.         if(y==0)
  179.                 LCD_Writecmd(0x80+x);
  180.         else
  181.                 LCD_Writecmd(0xc0+x);
  182.         LCD_Writedata(ch);

  183. }

  184. void LCD_write_str(unsigned char x,unsigned char y,char str[])//使LCD1602显示一个字符串
  185. {
  186.         unsigned char i=0;
  187.         if(y==0)
  188.                 LCD_Writecmd(0x80+x);
  189.         else
  190.                 LCD_Writecmd(0xc0+x);
  191.         while(str[i]!='\0')
  192.         {
  193.                 LCD_Writedata(str[i]);
  194.                 ++i;
  195.         }
  196.        
  197. }

  198. void LCD_clear(void)//清屏函数
  199. {
  200.         LCD_Writecmd(0x01);
  201.         delay_ms(5);

  202. }

  203. void LCD_Init(void)//LCD初始化
  204. {
  205.         delay_ms(100);                  
  206.         LCD_Writecmd(0x38);  
  207.         delay_ms(10);  
  208.         LCD_Writecmd(0x38);   
  209.         delay_ms(10);  
  210.         LCD_Writecmd(0x38);   
  211.         delay_ms(10);   
  212.         LCD_Writecmd(0x38);  
  213. ……………………

  214. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
直流电机.zip (13.13 KB, 下载次数: 217)

评分

参与人数 2黑币 +55 收起 理由
HYF111 + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:211258 发表于 2017-6-15 17:45 | 显示全部楼层
非常好
回复

使用道具 举报

ID:191299 发表于 2018-1-6 10:10 | 显示全部楼层
很好,谢谢。
回复

使用道具 举报

ID:191299 发表于 2018-1-6 16:53 | 显示全部楼层
请问为什么电机基本不转呢?
回复

使用道具 举报

ID:272625 发表于 2018-1-7 13:45 | 显示全部楼层
HYF111 发表于 2018-1-6 16:53
请问为什么电机基本不转呢?

要步进电机吧
回复

使用道具 举报

ID:248394 发表于 2018-1-13 16:57 | 显示全部楼层
mark 留着以后仔细看看
回复

使用道具 举报

ID:308395 发表于 2018-5-3 16:20 | 显示全部楼层
楼主的压缩包里只有一张截图(就是楼主上面发的),和一个程序
回复

使用道具 举报

ID:324655 发表于 2018-5-12 23:52 来自手机 | 显示全部楼层
宫商角徵羽smile 发表于 2018-5-3 16:20
楼主的压缩包里只有一张截图(就是楼主上面发的),和一个程序

能不能发给我一下,我需要,谢谢了
回复

使用道具 举报

ID:317900 发表于 2018-5-15 08:35 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:334144 发表于 2018-5-20 13:05 | 显示全部楼层
宫商角徵羽smile 发表于 2018-5-3 16:20
楼主的压缩包里只有一张截图(就是楼主上面发的),和一个程序

能发给我看一下吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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