[AVR单片机] atmega16的串口程序串口调试助手收到的数据是0x00

[复制链接]
4619|2
 楼主| kohillyang 发表于 2014-7-7 19:29 | 显示全部楼层 |阅读模式
  1. /**
  2. *本文件头仅用于ATmega16,其他单片机需要进行适当修改
  3. */
  4. #include <iom16v.h>
  5. #include <macros.h>
  6. //中断函数定义,接收中断
  7. #pragma interrupt_handler UART_RX_Interrupt:12
  8. #pragma interrupt_handler UART_TX_Interrupt:14
  9. #define FOSC 11059200
  10. #define BAUD 9600
  11. /*
  12. 定义数据缓存大小
  13. */
  14. #define UART_BUFFER_SIZE 64
  15. #define UART_BUFFER_MASK (UART_BUFFER_SIZE-1)
  16. /*计算寄存器数值
  17. *异步正常模式
  18. *UBRR UBRRH 与UBRRL 的数值 (0-4095)
  19. */
  20. #define B_UBRR  (FOSC/(16*BAUD)-1)
  21. /**
  22. *定义缓存数组
  23. **/
  24. static volatile unsigned char UART_BUFFER[UART_BUFFER_SIZE];
  25. static volatile unsigned char RX_NUM=0;
  26. static volatile unsigned char TX_NUM=0;
  27. //设置寄存器,打开中断
  28. void UART_INIT(void){
  29.     UCSRB = 0x00;
  30.         UCSRA = 0x00;
  31.    /*设置数据位为8,1位停止位
  32.         */
  33.         UCSRC = (1<<UCSZ1)|(1<<UCSZ0);
  34.     DDRD|=(1<<PD1);//端口初始化,不知道有没有必要
  35.         UBRRH = B_UBRR/256;
  36.         UBRRL = B_UBRR%256;
  37.    /*
  38.         *接收使能,发送使能,接收中断使能
  39.         *全局中断使能
  40.         */
  41.         UCSRB |= (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
  42.         /*
  43.         打开全局中断
  44.         */
  45.         SREG = 0x80;
  46. }
  47. void delay(unsigned int time){
  48.     while (time--);
  49. }

  50. //发送数据
  51. void sendData(){
  52.         TX_NUM = 0 ;
  53.         SREG = 0; //禁止中断
  54.         /*
  55.         以上禁止中断的方法是否可行?*/
  56.         while (TX_NUM < UART_BUFFER_SIZE){
  57.                 while (!(UCSRA&(1<<UDRE)));
  58.                 UDR = UART_BUFFER [TX_NUM];
  59.                 TX_NUM++;
  60.         }
  61.         TX_NUM = 0 ;
  62.         if (TX_NUM > UART_BUFFER_SIZE){
  63.          TX_NUM = 0;
  64.         }
  65.         SREG = 0x80;  //打开全局中断
  66.        

  67. }
  68. //接收中断函数
  69. void UART_RX_Interrupt(void){
  70.         if (RX_NUM < UART_BUFFER_SIZE){
  71.         UART_BUFFER[RX_NUM] = UDR;
  72.         RX_NUM++;
  73.         sendData();
  74.         }
  75.         if (RX_NUM = UART_BUFFER_SIZE){
  76.         RX_NUM = 0 ;
  77.         }
  78.         if (RX_NUM > UART_BUFFER_SIZE){
  79.         /*
  80.         *程序运行出错
  81.         */
  82.         RX_NUM = 0;
  83.         }       
  84. }
  85. void UART_TX_Interrupt(void){


  86. }

主程序很简单
  1. #include "kohill_UART_INIT.h"
  2. void main(){
  3. UART_INIT();
  4. while (1){
  5.         while (!(UCSRA&(1<<UDRE)));
  6.         UDR = 5;
  7. }
  8. }

程序功能说明:
利用中断方式将收到的数据保存在大小为64的数组中,待数组存满之后将数据发出
波特率:9600bps,晶振:11.0592MHZ
为了测试串口配置的正确性,主程序不间断地发送数字5,用串口调试助手检查收到的数据,但是串口调试助手收到的数据为一堆0x00
觉得应该是波特率没有设置对,但是又不知道哪儿不对







 楼主| kohillyang 发表于 2014-7-7 22:02 | 显示全部楼层
纠结之后i发现不是程序的问题,是晶振的问题啊
airwill 发表于 2014-7-8 07:57 | 显示全部楼层
0x35, 用串口调试助手检查收到的数据,但是串口调试助手收到的数据为一堆0x00

通常是实际波特率太低才这样.

评分

参与人数 1威望 +1 收起 理由
kohillyang + 1 很给力!

查看全部评分

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

本版积分规则

3

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部