找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 11271|回復: 10
打印 上一主題 下一主題
收起左側(cè)

51單片機pwm按鍵控制直流電機加減速源程序

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:210611 發(fā)表于 2017-6-13 13:20 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式



單片機源程序如下:
  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,反轉(zhuǎn)脈沖
  8. sbit PWM2=P2^7;//PWM 通道2,正轉(zhuǎn)脈沖
  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;//電機正反轉(zhuǎn)標志位,1正轉(zhuǎn),0反轉(zhuǎn)



  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;//設置定時器初值期間,關(guān)閉定時器
  99. TL0 = TH0_TL0 % 256;

  100. TH0 = TH0_TL0 / 256; //定時器裝初值
  101. TR0 = 1;
  102. if(Time_delay != 0)//延時函數(shù)用
  103. {

  104. Time_delay--;
  105. }

  106. if(Flag == 1)//電機正轉(zhuǎn)
  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 //電機反轉(zhuǎn)
  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)/* 簡易延時函數(shù) */
  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) /* 簡易延時函數(shù) */
  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)//寫數(shù)據(jù)到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)//清屏函數(shù)
  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, 下載次數(shù): 217)


評分

參與人數(shù) 2黑幣 +55 收起 理由
HYF111 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:211258 發(fā)表于 2017-6-15 17:45 | 只看該作者
非常好
回復

使用道具 舉報

板凳
ID:191299 發(fā)表于 2018-1-6 10:10 | 只看該作者
很好,謝謝。
回復

使用道具 舉報

地板
ID:191299 發(fā)表于 2018-1-6 16:53 | 只看該作者
請問為什么電機基本不轉(zhuǎn)呢?
回復

使用道具 舉報

5#
ID:272625 發(fā)表于 2018-1-7 13:45 | 只看該作者
HYF111 發(fā)表于 2018-1-6 16:53
請問為什么電機基本不轉(zhuǎn)呢?

要步進電機吧
回復

使用道具 舉報

6#
ID:248394 發(fā)表于 2018-1-13 16:57 | 只看該作者
mark 留著以后仔細看看
回復

使用道具 舉報

7#
ID:308395 發(fā)表于 2018-5-3 16:20 | 只看該作者
樓主的壓縮包里只有一張截圖(就是樓主上面發(fā)的),和一個程序
回復

使用道具 舉報

8#
ID:324655 發(fā)表于 2018-5-12 23:52 來自觸屏版 | 只看該作者
宮商角徵羽smile 發(fā)表于 2018-5-3 16:20
樓主的壓縮包里只有一張截圖(就是樓主上面發(fā)的),和一個程序

能不能發(fā)給我一下,我需要,謝謝了
回復

使用道具 舉報

9#
ID:317900 發(fā)表于 2018-5-15 08:35 | 只看該作者
謝謝分享
回復

使用道具 舉報

10#
ID:334144 發(fā)表于 2018-5-20 13:05 | 只看該作者
宮商角徵羽smile 發(fā)表于 2018-5-3 16:20
樓主的壓縮包里只有一張截圖(就是樓主上面發(fā)的),和一個程序

能發(fā)給我看一下嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表