当前位置:   article > 正文

【附源码】AVR单片机ATMEGA16串口收发文本数据包_atmega2560串口收发程序

atmega2560串口收发程序

一、ATmega16的串口

          ATmega16包含通用同步和异步串行接收器和转发器USART),分别和端口DPD01、端口BPB0的管脚复用,如下图所示。

二、串口通信原理

异步通讯,双方必须事先约定好通信参数,一般有:比特率、数据位、校验位、停止位。

异步正常操作、8位数据格式、无校验、1位停止位、双机通信模式、允许发送器和接收器、允许USART接收完成中断、波特率9600波特,总线时钟为8MHz。

1、设定USART波特率寄存器UBRR中分频因子。写UBRRH,再写UBRRL。

2、更新USART控制和状态寄存器A(UCSRA).

3、更新USART控制和状态寄存器B(UCSRB)来允许发送器、接收器,以及是否允许发送中断和接收中断等。

4、更新USART控制和状态寄存器C(UCSRC),选择异步工作模式、无校验、1位停止位长度、与UCSRnB共同确定数据位数。

三、接线原理图

四、源代码

帧头B   文字1  文字2    帧尾Z

  1. #include <iom16v.h>
  2. #include<macros.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define Get_Bit(val, bitn) (val &(1<<(bitn)) )
  6. uint rev_buff[2];
  7. uint Serial_RxFlag;
  8. void delay(unsigned int a)//延迟函数
  9. {
  10. unsigned int j;
  11. while(--a!=0)
  12. {
  13. for(j=0;j<120;j++);
  14. }
  15. }
  16. void uart_init(void)
  17. {
  18. UCSRB=0x00; //禁止发送器和接收器,禁止串口中断
  19. UCSRA=0b00100000; //各标志位清零,双机通信模式,无加速波特率
  20. UCSRC=0b10000110; //异步模式,无奇偶校验,1位停止位,8位数据位
  21. UBRRH=0x00;
  22. UBRRL=0x33;
  23. UCSRB=0x98; //使能发送完成中断,使能发送器和接收器
  24. }
  25. void uart_send_1byte(uchar send_char)
  26. {
  27. while(!(UCSRA&(1<<UDRE)));//等待发送缓冲器为空
  28. UDR=send_char; //向发送缓冲器写入1byte数据,启动发送
  29. }
  30. void main(void)
  31. {
  32. DDRC|=BIT(0); //PD0为输出
  33. DDRB&=~BIT(0); //PB0为输入
  34. CLI(); //关总断
  35. uart_init(); //串口初始化
  36. SEI(); //开总中断
  37. while(1)
  38. {
  39. if(Serial_GetRxFlag() == 1)
  40. {
  41. uart_send_1byte(rev_buff[0]);
  42. uart_send_1byte(rev_buff[1]);
  43. }
  44. }
  45. }
  46. #pragma interrupt_handler uart_rx_isr:12
  47. void uart_rx_isr(void)
  48. {
  49. uchar rx_data;
  50. static uint RxState = 0;
  51. static uint pRxPacket = 0;
  52. rx_data=UDR; //读接收缓冲器
  53. if (RxState == 0)
  54. {
  55. if ( rx_data == 'B')
  56. {
  57. RxState = 1;
  58. pRxPacket = 0;
  59. }
  60. }
  61. else if (RxState == 1)
  62. {
  63. rev_buff[pRxPacket] = rx_data;
  64. pRxPacket ++;
  65. if (pRxPacket >= 4)
  66. {
  67. RxState = 2;
  68. }
  69. }
  70. else if (RxState == 2)
  71. {
  72. if (rx_data == 'Z')
  73. {
  74. RxState = 0;
  75. Serial_RxFlag = 1;
  76. }
  77. }
  78. }
  79. uint Serial_GetRxFlag(void)
  80. {
  81. if (Serial_RxFlag == 1)
  82. {
  83. Serial_RxFlag = 0;
  84. return 1;
  85. }
  86. return 0;
  87. }

五、实现发送两个文字

注意:打开虚拟串口仿真软件,定义两个串口进行互连,在仿真时选择一个串口号,打开串口助手选择另外一个串口号,注意波特率一致防止传输出现乱码现象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/635812
推荐阅读
相关标签
  

闽ICP备14008679号