找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

自学AVR单片机十八(通用异步串行通信的程序实现)

[复制链接]
慧龙 发表于 2010-5-6 17:16:30 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
串行中断0的程序设计:采用查询发送,中断接收的方式

  1. #include <AVR/io.h>        
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>   //中断函数头文件
  4. //常量声明
  5. #define BAUD 9600
  6. //全局变量声明
  7. unsigned char Transmit;
  8. //函数声明
  9. void Port_Init(void);   //端口初始化配置
  10. void Usart_Init(void);  //USART寄存器设置
  11. void Usart_PutChar(unsigned char cTXData);  //字节发送函数
  12. void Usart_PutString(unsigned char *pcString);
  13. int main(void)            
  14. {
  15. Port_Init();
  16. Usart_Init();

  17. Usart_PutString("恭喜你!马伟力");
  18. Usart_PutString("你的串口程序调试成功了!");

  19. sei();          //使能全局中断  
  20. PORTB = 0xff;
  21. DDRB = 0xff;
  22. while(1)
  23. {
  24.   
  25. }
  26. }
  27. //端口状态初始化设置函数
  28. void Port_Init()
  29. {
  30. PORTE = 0X00;          //USART0的发送接收端口分别为PE0和PE1
  31. DDRE |= (1 << PE1);   //PE0为接收端口,置为输入口;PE1为发送端口,置为输出口
  32. }
  33. //USART0寄存器配置函数
  34. void Usart_Init()
  35. {
  36. UCSR0A = 0X00;
  37. UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00);  //异步,数据格式8,N,1
  38.       
  39. UBRR0L = (F_CPU / BAUD / 16 - 1) % 256;    //波特率设置
  40. UBRR0H = (F_CPU / BAUD / 16 - 1) / 256;  
  41. UCSR0B |= (1 << RXCIE0) | (1 << RXEN0) | (1 << TXEN0);    //发送使能

  42. }
  43. //字节发送函数
  44. void Usart_PutChar(unsigned char cTXData)
  45. {
  46. while( !(UCSR0A & (1 << UDRE0)) );  //只有数据寄存器为空时才能发送数据
  47. UDR0 = cTXData;                  //发送数据送USART I/O数据寄存器-UDR
  48. PORTB = 0x00;
  49. }
  50. //接收中断函数
  51. ISR(USART0_RX_vect)
  52. {
  53. unsigned char Rev;
  54. Rev = UDR0;              //从USART I/O数据寄存器-UDR中读出数据
  55. Usart_PutChar(Rev);    //将接收到的数据发送
  56. }

  57. void Usart_PutString(unsigned char *pcString)
  58. {
  59. while (*pcString)
  60. {
  61.   Usart_PutChar(*pcString++);
  62. }
  63. Usart_PutChar(0x0D);
  64. Usart_PutChar(0x0A);  //结尾发送回车换行
  65. }
复制代码


串行中断1的程序设计:采用查询发送,中断接收的方式

  1. #include <avr/io.h>        
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>   //中断函数头文件
  4. //常量声明
  5. #define BAUD 9600
  6. //函数声明
  7. void Port_Init(void);   //端口初始化配置
  8. void Usart_Init(void);  //USART寄存器设置
  9. void Usart_PutChar(unsigned char cTXData);  //字节发送函数
  10. void Usart_PutString(unsigned char *pcString);
  11. int main(void)            
  12. {
  13. Port_Init();
  14. Usart_Init();

  15. Usart_PutString("恭喜你!马伟力");
  16. Usart_PutString("你的串口程序调试成功了!");

  17. sei();          //使能全局中断  
  18. //PORTB = 0xff;
  19. //DDRB = 0xff;
  20. while(1)
  21. {
  22.   
  23. }
  24. }
  25. //端口状态初始化设置函数
  26. void Port_Init()
  27. {
  28. PORTD = 0X00;          //USART0的发送接收端口分别为PD2和PD3
  29. DDRD |= (1 << PD3);   //PD2为接收端口,置为输入口;PD3为发送端口,置为输出口
  30. }
  31. //USART0寄存器配置函数
  32. void Usart_Init()
  33. {
  34. UCSR1A = 0X00;
  35. UCSR1C |= (1 << UCSZ11) | (1 << UCSZ10);  //异步,数据格式8,N,1
  36.       
  37. UBRR1L = (F_CPU / BAUD / 16 - 1) % 256;    //波特率设置
  38. UBRR1H = (F_CPU / BAUD / 16 - 1) / 256;  
  39. UCSR1B |= (1 << RXCIE1) | (1 << RXEN1) | (1 << TXEN1);    //发送使能

  40. }
  41. //字节发送函数
  42. void Usart_PutChar(unsigned char cTXData)
  43. {
  44. while( !(UCSR1A & (1 << UDRE1)) );  //只有数据寄存器为空时才能发送数据
  45. UDR1 = cTXData;                  //发送数据送USART I/O数据寄存器-UDR
  46. //PORTB = 0x00;
  47. }
  48. //接收中断函数
  49. ISR(USART1_RX_vect)
  50. {
  51. unsigned char Rev;
  52. Rev = UDR1;              //从USART I/O数据寄存器-UDR中读出数据
  53. Usart_PutChar(Rev);    //将接收到的数据发送
  54. }

  55. void Usart_PutString(unsigned char *pcString)
  56. {
  57. while (*pcString)
  58. {
  59.   Usart_PutChar(*pcString++);
  60. }
  61. Usart_PutChar(0x0D);
  62. Usart_PutChar(0x0A);  //结尾发送回车换行
  63. }
复制代码
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 06:17 , Processed in 0.053572 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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