×
单片机 > 单片机程序设计 > 详情

ATmega128单片机与舵机控制板通信

发布时间:2020-08-24 发布时间:
|

ATmega128单片机通过舵机控制板,控制多路舵机动作。舵机控制板与单片机之间数据通信的方式,采用了常见的串行通信(USART)。舵机控制板具有自动识别波特率(9600,19200,38400,57600,115200,128000自动识别)的功能。

 

舵机移动指令:

指令格式:#P.... T

=舵机号,范围1-32(十进制数)

=脉冲宽度(舵机位置),范围500–2500。单位us(微秒)

\r\n = 十六进制数0x0d,0x0a(回车符),指令结束符。

例如: #8P600T1000\r\n

移动8号舵机到脉宽600us,使用时间为1000毫秒

#11P2000#30P2500T1500\r\n

移动11号舵机到脉宽2000us,移动30号舵机到脉宽2500us,使用的时间为1500毫秒,舵机移动的速度依赖于前一时刻舵机的位置决定,11号舵机和30号舵机同时到达指定位置。

下面是代码:


  1. /**************************************************** 

  2.  

  3. ----------------------------------------main.c----------------------------------- 

  4.  

  5. ****************************************************/  

  6.   

  7. #include  

  8. #include  

  9. #include"128_USART0.h"  

  10.   

  11.    

  12.   

  13. /******************************************* 

  14. 函数名称: void delay_nms(uint ms) 

  15. 功    能: 延时指定毫秒(8M晶振) 

  16. 参    数: ms--延时的毫秒数 

  17. 返 回 值: 无 

  18. /********************************************/  

  19. void delay_nms(uint ms)      

  20. {  

  21.  uint i,j;  

  22.  for( i=0;i

  23.   for(j=0;j<1141;j++);//1141是在8MHz晶振下,仿真得到的数值  

  24. }  

  25.   

  26.   

  27. /******************************************* 

  28. 函数名称: main 

  29. 功    能: 主函数 

  30. 参    数: 无 

  31. 返 回 值: 无 

  32. /********************************************/  

  33. void main(void)  

  34. {  

  35.  USART0_init();  

  36.  while(1)  

  37.  {  

  38.   USAT0_send_string("#1P1056#2P2056T2500\r\n");  

  39.   delay_nms(3000);  

  40.   USAT0_send_string("#1P1722#2P1433T2500\r\n");  

  41.   delay_nms(3000);  

  42.  }  

  43. }  

  44.   

  45. /************************************************ 

  46.  

  47. ************************END********************* 

  48.  

  49. ************************************************/  

  50.   

  51.    

  52.   

  53. /*********************************************** 

  54.  

  55. --------------------------------128_USART0.h------------------------- 

  56.  

  57. ***********************************************/  

  58.   

  59. #ifndef _128_USART0_H_  

  60. #define _128_USART0_H_  

  61. /******************数据类型宏定义******************/  

  62. #define uchar  unsigned char  

  63. #define uint   unsigned int  

  64.   

  65. #define fosc   8000000  //系统晶振  

  66. #define baud   9600     //波特率  

  67. /******************串口函数**********************/  

  68. void USART0_init(void);  

  69. void USART0_send_byte(uchar data);  

  70. uchar USART0_receive_byte(void);  

  71. void USAT0_send_string(char *str);  

  72.   

  73. #endif  

  74.   

  75.    

  76.   

  77. /************************************************ 

  78.  

  79. ************************END********************* 

  80.  

  81. ************************************************/  

  82.   

  83.    

  84.   

  85. /*********************************************** 

  86.  

  87. --------------------------------128_USART0.c------------------------- 

  88.  

  89. ***********************************************/  

  90.   

  91. #include  

  92. #include"128_USART0.h"  

  93.   

  94. /******************************************* 

  95. 函数名称: uart0_init 

  96. 功    能: 串口0的初始化 

  97. 参    数: com 

  98. 返 回 值: 无 

  99. /********************************************/  

  100. void USART0_init(void)  

  101. {  

  102.  UCSR0B=0X00;  

  103.  UCSR0A=0X00;  

  104.  UCSR0C=(1<

  105.  UBRR0L=(fosc/16/(baud+1))%256;   //波特率寄存器设定  

  106.  UBRR0H=(fosc/16/(baud+1))/256;  

  107.  UCSR0B=(1<

  108. }  

  109.   

  110. /******************************************* 

  111. 函数名称: USART0_send_byte 

  112. 功    能: 串口0发送单字节 

  113. 参    数: data--发送字符元素 

  114. 返 回 值: 无 

  115. /********************************************/  

  116. void USART0_send_byte(uchar data)  

  117. {  

  118.  while(!(UCSR0A & (1<

  119.  UDR0=data;  

  120. }  

  121.   

  122. /******************************************* 

  123. 函数名称: USART0_receive_byte 

  124. 功    能: 串口0接收单字节 

  125. 参    数: 无 

  126. 返 回 值: UDR0--接收字符元素 

  127. /********************************************/  

  128. uchar USART0_receive_byte(void)  

  129. {  

  130.  while(!(UCSR0A & (1<

  131.  return (UDR0);  

  132. }  

  133.   

  134. /******************************************* 

  135. 函数名称: USAT0_send_string 

  136. 功    能: 串口0发送字符串 

  137. 参    数: str--字符串数据 

  138. 返 回 值: 无 

  139. /********************************************/  

  140. void USAT0_send_string(char *str)  

  141. {  

  142.  while(*str)  

  143.  {  

  144.   USART0_send_byte(*str);  

  145.   str++;  

  146.  }  

  147.  USART0_send_byte(0X0A);//换行  

  148.  USART0_send_byte(0X0D);//回车  

  149. }  

  150.   

  151.    

  152.   

  153. /************************************************ 

  154.  

  155. ************************END********************* 

  156.  

  157. ************************************************/  



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式