找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6829|回復(fù): 8
收起左側(cè)

51單片機(jī) 直流電控制機(jī)程序(智能小車用)

[復(fù)制鏈接]
ID:76127 發(fā)表于 2015-4-18 04:16 | 顯示全部樓層 |閱讀模式
  1. sbit  RIGHT_IN1 = P1^3;   //右邊電機(jī)
  2. sbit RIGHT_EN  = P1^4;
  3. sbit RIGHT_IN2 = P1^5;
  4.         
  5. sbit  LEFT_IN1 = P1^2;    //左邊電機(jī)
  6. sbit LEFT_EN  = P1^1;
  7. sbit LEFT_IN2 = P1^0;
  8. /*********************************************
  9.                   宏定義
  10. **********************************************/
  11. #define PWM_PERIOD  100     //PWM周期PWM_PERIOD*100us
  12. #define uchar unsigned char
  13. #define uint unsigned int
  14. /*********************************************
  15.                 變量定義
  16. **********************************************/
  17. //---------- PWM ------------//
  18. uchar PWM_COUNTER = 0;      //pwm產(chǎn)生周期 100*100us
  19. uchar LEFT_PWM_DUTY  = 50;  //左邊電機(jī)占空比
  20. uchar RIGHT_PWM_DUTY = 50;  //右邊電機(jī)占空比
  21. //---------- 時(shí)鐘 ------------//
  22. uchar SecondL = 0;         //時(shí)間秒低位
  23. uchar SecondH = 0;         //時(shí)間秒高位
  24. uchar MinuteL = 0;         //時(shí)間分低位
  25. uchar MinuteH = 0;         //時(shí)間分高位
  26. /*********************************************
  27. 函數(shù)名稱: Delay_10Us
  28. 函數(shù)功能: us延時(shí)函數(shù)
  29. 函數(shù)輸入: us-延時(shí)時(shí)間控制變量
  30. 函數(shù)輸出: 無(wú)
  31. **********************************************/
  32. void Delay_10Us(uint us)
  33. {
  34. while( us-- );
  35. }
  36. /*********************************************
  37. 函數(shù)名稱: DelayMs
  38. 函數(shù)功能: ms級(jí)延時(shí)函數(shù),延時(shí)時(shí)間:ms*ms
  39. 函數(shù)輸入: ms-延時(shí)時(shí)間控制變量
  40. 函數(shù)輸出: 無(wú)
  41. **********************************************/
  42. void DelayMs(uint ms)
  43. {
  44. unsigned int i,j;
  45. for( i = 0; i < ms; i ++ )
  46.   for( j = 115; j > 0; j --);
  47. }
  48. /*********************************************
  49. 函數(shù)名稱: Init
  50. 函數(shù)功能: 初始化單片機(jī)的定時(shí)0(用于產(chǎn)生PWM)、定時(shí)器1(用于產(chǎn)生時(shí)鐘)
  51. 函數(shù)輸入: 無(wú)
  52. 函數(shù)輸出: 無(wú)
  53. **********************************************/
  54. void Init_Timer(void)
  55. {
  56.    TMOD = 0x12;             //設(shè)定T0的工作模式為2,設(shè)定T0的工作模式為1
  57.    //----裝入定時(shí)器初值 -----//
  58.    TH0 = 0x95;              //100us定時(shí)
  59.    TL0 = 0x95;
  60.    TH1 = (65536-50000)/256; //50ms定時(shí)            
  61.    TL1 = (65536-50000)%256;
  62.    IT0 = 1;
  63.    IP  = 0x03;
  64.    EA  = 1;                 // 開(kāi)總中斷
  65.    ET0 = 1;                 // 定時(shí)器0允許中斷
  66.    ET1 = 1;                 // 定時(shí)器1允許中斷
  67.    TR1 = 1;                 // 啟動(dòng)定時(shí)器1
  68.    TR0 = 1;                 // 啟動(dòng)定時(shí)器0
  69. }
  70. /*********************************************
  71. 函數(shù)名稱: Timer0_ISR
  72. 函數(shù)功能: 定時(shí)器0中斷服務(wù)函數(shù),用于輸出PWM波
  73. 函數(shù)輸入: 無(wú)
  74. 函數(shù)輸出: 無(wú)
  75. **********************************************/
  76. void Timer0_ISR(void) interrupt 1 using 1
  77. {
  78. PWM_COUNTER ++;
  79. if(PWM_COUNTER < PWM_PERIOD)
  80. {
  81.   if(PWM_COUNTER > LEFT_PWM_DUTY)  LEFT_EN  = 0;
  82.   if(PWM_COUNTER > RIGHT_PWM_DUTY) RIGHT_EN = 0;
  83. }
  84. else
  85. {
  86.   PWM_COUNTER = 0;
  87.   LEFT_EN  = 1;
  88.   RIGHT_EN = 1;
  89. }
  90. }
  91. /*********************************************
  92. 函數(shù)名稱: Timer1_ISR
  93. 函數(shù)功能: 定時(shí)器1中斷服務(wù)函數(shù),用于產(chǎn)生時(shí)鐘
  94. 函數(shù)輸入: 無(wú)
  95. 函數(shù)輸出: 無(wú)
  96. **********************************************/
  97. void Timer1_ISR() interrupt 3      
  98. {
  99. uchar cnt;
  100. TH1 = (65536-50000)/256;            
  101. TL1 = (65536-50000)%256;
  102. cnt++;
  103. if(cnt >= 20)
  104. {
  105.     cnt = 0;
  106.     ++SecondL;
  107.     if(SecondL == 10)
  108.     {
  109.     SecondL = 0;
  110.     ++SecondH;
  111.     if(SecondH == 6)
  112.     {
  113.     SecondH = 0;
  114.     ++MinuteL;
  115.     if(MinuteL == 10)
  116.     {
  117.     MinuteL = 0;
  118.     ++MinuteH;
  119.      }
  120.      }
  121.    }
  122.   }
  123. }
  124. /*********************************************
  125. 函數(shù)名稱: Stop
  126. 函數(shù)功能: 停車函數(shù)
  127. 函數(shù)輸入: speed_left -左輪占空比
  128.            speed_right-右輪占空比
  129. 函數(shù)輸出: 無(wú)
  130. **********************************************/
  131. void Stop(uchar speed_left,uchar speed_right)
  132. {
  133. LEFT_IN1  = 0;
  134. LEFT_IN2  = 0;
  135. RIGHT_IN1 = 0;
  136. RIGHT_IN2 = 0;
  137. LEFT_PWM_DUTY  = speed_left;
  138. RIGHT_PWM_DUTY = speed_right;
  139. }
  140. /*********************************************
  141. 函數(shù)名稱: GoHead
  142. 函數(shù)功能: 前進(jìn)函數(shù):控制小車以一定速度直線前進(jìn),也可以
  143.            控制小車轉(zhuǎn)彎
  144. 函數(shù)輸入: speed_left -左輪占空比
  145.            speed_right-右輪占空比
  146. 函數(shù)輸出: 無(wú)
  147. **********************************************/
  148. void GoHead(uchar speed_left,uchar speed_right)
  149. {
  150. LEFT_IN1  = 1;
  151. LEFT_IN2  = 0;
  152. RIGHT_IN1 = 1;
  153. RIGHT_IN2 = 0;
  154. LEFT_PWM_DUTY  = speed_left;
  155. RIGHT_PWM_DUTY = speed_right*5/4;  //走直線占空比校正
  156. }
  157. /*********************************************
  158. 函數(shù)名稱: GoBack
  159. 函數(shù)功能: 后退函數(shù):控制小車以一定速度直線后退,也可以
  160.            小車后退轉(zhuǎn)彎
  161. 函數(shù)輸入: speed_left -左輪占空比
  162.            speed_right-右輪占空比
  163. 函數(shù)輸出: 無(wú)
  164. **********************************************/
  165. void GoBack(uchar speed_left,uchar speed_right)
  166. {
  167. LEFT_IN1  = 0;
  168. LEFT_IN2  = 1;
  169. RIGHT_IN1 = 0;
  170. RIGHT_IN2 = 1;
  171. LEFT_PWM_DUTY  = speed_left;
  172. RIGHT_PWM_DUTY = speed_right+2; //走直線占空比校正
  173. }
  174. /*********************************************
  175. 函數(shù)名稱: Goright
  176. 函數(shù)功能: 右轉(zhuǎn)90度函數(shù):控制小車以一定速度旋轉(zhuǎn)90度
  177. 函數(shù)輸入: speed_left -左輪占空比
  178.            speed_right-右輪占空比
  179. 函數(shù)輸出: 無(wú)
  180. **********************************************/
  181. void Goright_90(void)
  182. {
  183. LEFT_IN1  = 1;
  184. LEFT_IN2  = 0;
  185. RIGHT_IN1 = 0;
  186. RIGHT_IN2 = 1;
  187. LEFT_PWM_DUTY  = 20;
  188. RIGHT_PWM_DUTY = 20;
  189. DelayMs(1135);
  190. }
復(fù)制代碼


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:79098 發(fā)表于 2015-5-6 17:45 | 顯示全部樓層
直發(fā)程序,沒(méi)有電路圖無(wú)用啊
回復(fù)

使用道具 舉報(bào)

ID:78749 發(fā)表于 2015-5-7 21:40 | 顯示全部樓層
這個(gè)90度,轉(zhuǎn)的精確嗎?
回復(fù)

使用道具 舉報(bào)

ID:74784 發(fā)表于 2015-5-8 19:12 | 顯示全部樓層
有pwm調(diào)速嗎???
回復(fù)

使用道具 舉報(bào)

ID:142658 發(fā)表于 2016-10-13 23:00 | 顯示全部樓層
有上位機(jī)軟件嗎
回復(fù)

使用道具 舉報(bào)

ID:142658 發(fā)表于 2016-10-13 23:00 | 顯示全部樓層
樓主幫忙
回復(fù)

使用道具 舉報(bào)

ID:142658 發(fā)表于 2016-10-13 23:00 | 顯示全部樓層
大神
回復(fù)

使用道具 舉報(bào)

ID:213258 發(fā)表于 2017-6-22 15:24 | 顯示全部樓層
有程序所屬文件么
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表