http_icmp 2021-02-03 16:57 采纳率: 0%
浏览 42

AVR单片机ATmega88串口USART的使用

#define fosc 8000000
#define baud 9600
void usart_init(void)
{   
  UCSR0B = 0x00; //发送接收都不使能 开始时候不设置
  UCSR0A = 0x00; //不使用倍速发送 UX2为1时设置加倍
  UCSR0C = 0x06;  // 异步 禁止校验位 1位停止位 8位数据帧 TX上升沿 RX下降沿
  
  UBRR0H =  (fosc/16/baud - 1) / 256; 
  UBRR0L = (fosc/16/baud - 1) % 256; 
  
  UCSR0B = 0x98;   //接收结束中断使能 接收使能 发送使能
//  UCSR0B = 0x18;   //接收使能 发送使能
}
void putchar(unsigned char c)
{
  while(!(UCSR0A&(1 << UDRE0)));
  UDR0 = c;
}
void main()
{
    unsigned char temp = 9;
    while(1) 
    {
    putchar(temp);
    }
}

软件用的是ICC AVR

芯片是ATmega88

将代码烧进去之后连接串口工具。运行后下面的80是点击十六进制显示的结果,上面是未点击。

问题:为什么不是显示的9?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 13:05
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在给定的代码中,usart_init() 函数用于初始化串行通信接口,并通过 UCCS0B 寄存器配置了波特率、校验位和数据位等参数。然而,在 main() 函数中并没有调用 usart_init() 函数。

    在 C 语言中,函数调用通常发生在函数定义后的语句块内,而不是在函数体内。因此,当你尝试调用 putchar() 函数时,没有对串行通信接口进行初始化,所以输出的字符不会出现在终端上。

    为了正确工作,你需要先初始化串行通信接口,然后才能使用它来输出字符。你可以参考以下示例:

    #include <avr/io.h>
    #include <util/delay.h>
    
    void usart_init(void) {
      // 初始化串行通信接口
      UCSR0A |= 0b00000001; // 设置波特率
      UCSR0B |= 0b00000001; // 设置奇偶校验位
      UCSR0C |= 0b00000001; // 设置数据位
    }
    
    void main() {
      // 初始化串行通信接口
      usart_init();
    
      unsigned char temp = 9;
    
      while (1) {
        while (!(UCSR0A & (1 << UDRE0))) { /* wait for data ready */ }
    
        UDR0 = temp; // send character to serial port
        temp++; // increment character sent
      }
    }
    

    这段代码首先初始化了串行通信接口,然后在 main() 函数中循环发送数字 9 到串口。注意,当发送到串口时,实际发送的字节包含 9 的二进制表示,即 01100001,但 UDRE0 指令等待数据准备好时才触发,因此直到数据准备好前不会有任何字符被发送。

    评论

报告相同问题?