找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5920|回复: 8
收起左侧

51单片机 直流电控制机程序(智能小车用)

[复制链接]
ID:76127 发表于 2015-4-18 04:16 | 显示全部楼层 |阅读模式
  1. sbit  RIGHT_IN1 = P1^3;   //右边电机
  2. sbit RIGHT_EN  = P1^4;
  3. sbit RIGHT_IN2 = P1^5;
  4.         
  5. sbit  LEFT_IN1 = P1^2;    //左边电机
  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产生周期 100*100us
  19. uchar LEFT_PWM_DUTY  = 50;  //左边电机占空比
  20. uchar RIGHT_PWM_DUTY = 50;  //右边电机占空比
  21. //---------- 时钟 ------------//
  22. uchar SecondL = 0;         //时间秒低位
  23. uchar SecondH = 0;         //时间秒高位
  24. uchar MinuteL = 0;         //时间分低位
  25. uchar MinuteH = 0;         //时间分高位
  26. /*********************************************
  27. 函数名称: Delay_10Us
  28. 函数功能: us延时函数
  29. 函数输入: us-延时时间控制变量
  30. 函数输出: 无
  31. **********************************************/
  32. void Delay_10Us(uint us)
  33. {
  34. while( us-- );
  35. }
  36. /*********************************************
  37. 函数名称: DelayMs
  38. 函数功能: ms级延时函数,延时时间:ms*ms
  39. 函数输入: ms-延时时间控制变量
  40. 函数输出: 无
  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. 函数名称: Init
  50. 函数功能: 初始化单片机的定时0(用于产生PWM)、定时器1(用于产生时钟)
  51. 函数输入: 无
  52. 函数输出: 无
  53. **********************************************/
  54. void Init_Timer(void)
  55. {
  56.    TMOD = 0x12;             //设定T0的工作模式为2,设定T0的工作模式为1
  57.    //----装入定时器初值 -----//
  58.    TH0 = 0x95;              //100us定时
  59.    TL0 = 0x95;
  60.    TH1 = (65536-50000)/256; //50ms定时            
  61.    TL1 = (65536-50000)%256;
  62.    IT0 = 1;
  63.    IP  = 0x03;
  64.    EA  = 1;                 // 开总中断
  65.    ET0 = 1;                 // 定时器0允许中断
  66.    ET1 = 1;                 // 定时器1允许中断
  67.    TR1 = 1;                 // 启动定时器1
  68.    TR0 = 1;                 // 启动定时器0
  69. }
  70. /*********************************************
  71. 函数名称: Timer0_ISR
  72. 函数功能: 定时器0中断服务函数,用于输出PWM波
  73. 函数输入: 无
  74. 函数输出: 无
  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. 函数名称: Timer1_ISR
  93. 函数功能: 定时器1中断服务函数,用于产生时钟
  94. 函数输入: 无
  95. 函数输出: 无
  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. 函数名称: Stop
  126. 函数功能: 停车函数
  127. 函数输入: speed_left -左轮占空比
  128.            speed_right-右轮占空比
  129. 函数输出: 无
  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. 函数名称: GoHead
  142. 函数功能: 前进函数:控制小车以一定速度直线前进,也可以
  143.            控制小车转弯
  144. 函数输入: speed_left -左轮占空比
  145.            speed_right-右轮占空比
  146. 函数输出: 无
  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. 函数名称: GoBack
  159. 函数功能: 后退函数:控制小车以一定速度直线后退,也可以
  160.            小车后退转弯
  161. 函数输入: speed_left -左轮占空比
  162.            speed_right-右轮占空比
  163. 函数输出: 无
  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. 函数名称: Goright
  176. 函数功能: 右转90度函数:控制小车以一定速度旋转90度
  177. 函数输入: speed_left -左轮占空比
  178.            speed_right-右轮占空比
  179. 函数输出: 无
  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. }
复制代码


回复

使用道具 举报

ID:79098 发表于 2015-5-6 17:45 | 显示全部楼层
直发程序,没有电路图无用啊
回复

使用道具 举报

ID:78749 发表于 2015-5-7 21:40 | 显示全部楼层
这个90度,转的精确吗?
回复

使用道具 举报

ID:74784 发表于 2015-5-8 19:12 | 显示全部楼层
有pwm调速吗???
回复

使用道具 举报

ID:142658 发表于 2016-10-13 23:00 | 显示全部楼层
有上位机软件吗
回复

使用道具 举报

ID:142658 发表于 2016-10-13 23:00 | 显示全部楼层
楼主帮忙
回复

使用道具 举报

ID:142658 发表于 2016-10-13 23:00 | 显示全部楼层
大神
回复

使用道具 举报

ID:213258 发表于 2017-6-22 15:24 | 显示全部楼层
有程序所属文件么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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