打印
[AVR单片机]

使用USART0通信一直通信失败,用仿真器看UDR0的值一直为零

[复制链接]
3081|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
icome321|  楼主 | 2013-11-27 17:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
程序是挺大众的USART0的通信程序,片子是128。串口线是好用的。通信的时候用串口调试助手给板子发数据,用仿真器看UDR0的值一直为0,奇怪的是temp还会显示一个数(错误的),最后在1602上显示错误。程序如下:

#define uchar unsigned char
#define uint unsigned int
#define UDRE 5
#define RXC 7

//+++++++++1602_LCD功能引脚宏定义+++++++++++++++
#define LCD_DATA PORTB
#define LCD_RS PORTA_Bit4
#define LCD_RW PORTA_Bit5
#define LCD_EN PORTA_Bit6

//+++++++++++++++++通讯引脚宏定义++++++++++++++++++
#define TXDIN        DDRD=DDRD|0x02                          // TXD 设置为输出
#define RXDIN        DDRD=DDRD&0xFE;PORTD=PORTD|0x01        // RXD 设置为输入,且内部上拉有效

void LCD_init();
void write_com(uchar com);
void write_data(uchar data);
void delay(uint z);
/***************************************/
void port_init(void)//I/O口初始化
{
    PORTA = 0xFF;
    DDRA  = 0xff;
    PORTB = 0xFF;
    DDRB  = 0xFF;
   
    TXDIN;    // TXD 设置为输出
    RXDIN;   // RXD 设置为输入,且内部上拉有效
    //PORTD = 0xFF;
    //DDRD  = 0x02;
}
/**************************************/
void uart0_init(void) //uart 初始化
{
    UCSR0B = 0x00;
   
    UCSR0A = 0x00;
   
    UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//异步模式(默认) 无校验位 一位停止位 接收数据长度为8
    //UCSR0C = 0x06;//异步模式(默认) 无校验位 一位停止位 接收数据长度为8
   
    UBRR0L = 51; //波特率为 9600
    UBRR0H = 0x00;
   
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);//接收允许 发送允许
    //UCSR0B = 0x18;
}

void init_devices(void)
{
    __disable_interrupt();
    port_init();
    uart0_init();
}

/********************************/
void uart0_send(unsigned char i)//数据发送
{
    while(!(UCSR0A&(1<<UDRE0)));
    UDR0=i;
}

/************************************************/
unsigned char uart0_receive(void) //数据接收
{
    while(!(UCSR0A&(1<<RXC0)));
    return UDR0;
}
/******************************************/
void main(void)
{
    unsigned char temp=0;
    delay(50);
    init_devices();
    LCD_init();
    while(1)
    {
        temp=uart0_receive(); //接收数据
        
        write_com(0x80+0x06);
      
        write_data(temp); //1602液晶显示
        
        uart0_send(temp);//数据发送
    }
}
void LCD_init()
{
    LCD_RW=0;
    LCD_EN=0;
    write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口
    write_com(0x0c);//设置开显示,不显示光标
    write_com(0x06);//写一个字符后地址指针加1
    write_com(0x01);//显示清零,数据指针清零
    write_com(0x80);
}
void write_com(uchar com)
{
    LCD_RS=0;        //选择写命令模式
    LCD_DATA=com;     //将要写的命令送到数据总线上
    delay(5);           //稍作延时以待数据稳定
    LCD_EN=1;     //时能端给以高脉冲,因为初始化函数中已经将lcden置0
    delay(5);         //稍作延时
    LCD_EN=0;      //将使能端置0已完成高脉冲
    LCD_RS=1;  
}
void write_data(uchar data)
{
    LCD_RS=1;
    LCD_DATA=data;
    delay(5);
    LCD_EN=1;
    delay(5);
    LCD_EN=0;
    LCD_RS=0;
}
void delay(uint z)     //晶振8M
{
    uint x,y;
    for(x=0;x<z;x++)
       for(y=0;y<1141;y++);
}
用串口调试助手往里发数字“1”,变量和寄存器如图:

实在不知道是怎么回事。。球问各位大师呀。。


相关帖子

沙发
mcuzone_mcu4| | 2013-11-28 10:00 | 只看该作者
#define BAUD 38400

void Usart_Init(void)
{
        PORTD = 0X00;          //USART的发送接收端口分别为PD0和PD1
        DDRD |= (1 << PD1);   //PD0为接收端口,置为输入口;PD1为发送端口,置为输出口

        UCSRA = 0X00;       
        UCSRC |= (1<<URSEL) | (1 << UCSZ1) | (1 << UCSZ0);  //异步,数据格式8,N,1
             //UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写 UCSRC 时, URSEL 应设置为 1。
        UBRRL = (F_CPU / BAUD / 16 - 1) % 256;    //波特率设置
        UBRRH = (F_CPU / BAUD / 16 - 1) / 256;
        UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);    //发送使能
        sei();
}
void Usart_PutChar(unsigned char TXData)
{
        while( !(UCSRA & (1 << UDRE)) );  //只有数据寄存器为空时才能发送数据
        UDR = TXData;       
}
int main(void)
{
    Usart_Init();
    while(1);
}
ISR(USART_RXC_vect)
{
    unsigned char RxData;
        RxData = UDR;
        Usart_PutChar( RxData );              
}


一段mega16的串口代码,希望对你有用

使用特权

评论回复
板凳
liaowencong| | 2014-3-2 14:59 | 只看该作者
应该是仿真软件的问题。看不到UDR寄存器的值,但是实际不是0

使用特权

评论回复
地板
airwill| | 2014-3-4 16:14 | 只看该作者
估计仿真器不能访问 UDR0, 因为随意造访会导致程序的异常, UDR0 一旦读过, 数据就没有了.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

8

帖子

3

粉丝