打印
[AVR单片机]

atmega16串口通信

[复制链接]
1107|9
手机看帖
扫描二维码
随时随地手机跟帖
沙发
ddllxxrr| | 2014-10-5 19:45 | 只看该作者
是不是两根线连一起去了。

使用特权

评论回复
板凳
qin552011373| | 2014-10-7 13:36 | 只看该作者
楼主怎么做的程序?

使用特权

评论回复
地板
叶丷| | 2014-10-9 09:52 | 只看该作者
看看网页就知道咯

使用特权

评论回复
5
sing146|  楼主 | 2014-10-10 16:46 | 只看该作者
ddllxxrr 发表于 2014-10-5 19:45
是不是两根线连一起去了。

没有,一根接PD0,一根接PD1

使用特权

评论回复
6
sing146|  楼主 | 2014-10-10 16:48 | 只看该作者
qin552011373 发表于 2014-10-7 13:36
楼主怎么做的程序?

/*************************************************************
                               初始化程序
************************************************************/
void uart_init()
{   
    uint a;
    DDRB=0XFF;                        
    DDRD|=BIT(PD4)|BIT(PD5)|BIT(PD6)|BIT(PD1);
    PORTD&=~BIT(6);
        PORTD&=~BIT(WR);        
    UCSRA = 0x00;
    UCSRB = 0x00;
    UCSRC|= BIT(URSEL)|BIT(UCSZ0)|BIT(UCSZ1);   //选择UCSRC寄存器,异步模式,                        
        UBRR  = 0X47;                               //设置波特率为9600               
    UCSRB = BIT(TXEN)|BIT(RXEN)|BIT(RXCIE);    //接收、发送使能,接收中断使能
        SREG  |= BIT(7);                                 //全局中断开放
}
这是设置的程序
接收采用中断方式
****************************************************************/
#pragma interrupt_handler USART_Received_Ir:12
void USART_Received_Ir()
{
        UCSRB&=~BIT(RXCIE);        //关串口中断,防止中断嵌套
        while(!(UCSRA&(1<<RXC)));//等待接受数据
        rec_data[num]=UDR;
        num++;
        if(num>=200)
           {
             num=0;
           }
        else;
        //LCD_SHOW(0,0,rec_data);
        //delay_ms(1000);
    UCSRA|=1<<RXC;          //标志位写1就能清零 接收中断信号 表示将继续接收
        //LCD_COM(0X01);
    //delay_ms(5);
        UCSRB|=BIT(RXCIE);                //接收完毕中断使能

这是接收中断,但是接收到的数据是发出去的,是不是UDR没清空啊,但是其他程序也没看见清的

使用特权

评论回复
7
mcuzone_mcu4| | 2014-10-14 09:51 | 只看该作者
/*********串口寄存器配置子函数************/
void Usart_Init()
{
        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);    //发送使能
       
}

/*************字节发送函数************/
void Usart_PutChar(unsigned char cTXData)
{
        while( !(UCSRA & (1 << UDRE)) );  //只有数据寄存器为空时才能发送数据
        UDR = cTXData;                         //发送数据送USART I/O数据寄存器-UDR
}


/*****接收中断函数****/
ISR(USART_RXC_vect )
{
        unsigned char Rev;
        Rev = UDR;              //从USART I/O数据寄存器-UDR中读出数据
        Usart_PutChar(Rev);    //将接收到的数据发送
}

使用特权

评论回复
8
mcuzone_mcu4| | 2014-10-14 09:53 | 只看该作者
找了个mega16的程序,抽了一点串口的,可以看看

使用特权

评论回复
9
sing146|  楼主 | 2014-10-14 11:20 | 只看该作者
mcuzone_mcu4 发表于 2014-10-14 09:53
找了个mega16的程序,抽了一点串口的,可以看看

谢谢你啊,已经可以了,我的错误好像是出在了,把显示函数夹杂在中断了

使用特权

评论回复
10
SD10A| | 2014-10-15 19:14 | 只看该作者
mcuzone_mcu4 发表于 2014-10-14 09:51
/*********串口寄存器配置子函数************/
void Usart_Init()
{

至少要加个全局中断使能才好

使用特权

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

本版积分规则

5

主题

16

帖子

0

粉丝