打印
[AVR单片机]

Atmega162 串口通信

[复制链接]
2103|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yutao0907|  楼主 | 2014-9-18 09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "main.h"

void port_init()  //端口初始化
{
        DDRA=0;
        PORTA=0xFF;
        DDRB=0;
        PORTB=0xFF;
        DDRC=0;
        PORTC=0xFF;
        DDRD=0;
        PORTD=0xFF;
       
        DDRB|=_BV(TXD1);
        PORTB|=_BV(TXD1)|_BV(RXD1);
       
        DDRD|=_BV(TXD1);
        PORTD|=_BV(TXD1)|_BV(RXD1);
       
        _delay_ms(50);
}

int main(void)
{       
       
        port_init();                                        //I/O端口初始化
        cli();                                                        //关闭全局中断
        usart0_init();                                // T0/R0 串口 COM1 COM2 初始化
        usart1_init();                            // T1/R1 串口 COM1 COM2 初始化
        spi_master_init();                        //SPI-主机 通信初始化
        Timer0_init();                             // T0/C0初始化
       
        _delay_ms(50);
       
        sei();                                                        //打开全局中断
       
        while (1)                                                        //主程序
        {
            Deal_SendData0();
                Deal_SendData1();
                if(m_nSendflag_a==1)
                {
                        Deal_RecData0();       
                }
                if(m_nSendflag_b==1)
                {
                        Deal_RecData1();
                }
        }
        return 0;
}

void Deal_SendData0()
{       
        uchar i=0;
        for(i=0;i<13;i++)
        {
                g_aSendBuf[i]=g_aRecvBuf[i];
        }
}

void Deal_SendData1()
{       
        uchar i=0;
        for(i=0;i<13;i++)
        {
                g_bSendBuf[i]=g_bRecvBuf[i];
        }
}




#include "usart.h"

ISR (USART0_RXC_vect)
{
        uchar c=UDR0;
        if (g_aRxdLen>0)
        {
                g_aRecvBuf[g_aRxdPos++]=c;
                g_aRxdLen--;
        }
        if(g_aRxdLen==0)
        {
                m_nSendflag_a=1;
                g_aRxdLen=13;
                g_aRxdPos=0;
        }
}

ISR (USART1_RXC_vect)
{
        uchar d=UDR1;
        if (g_bRxdLen>0)
        {
                g_bRecvBuf[g_bRxdPos++]=d;
                g_bRxdLen--;
        }
        if(g_bRxdLen==0)
        {
                m_nSendflag_b=1;
                g_bRxdLen=9;
                g_bRxdPos=0;
        }
}

ISR (TIMER0_OVF_vect) //SIG_OVERFLOW0
{
        TIMSK&=~_BV(TOIE0);
        if( g_aCount == 0 )
        {
                SendToUart0(13);
        };
        g_aCount++;
        if( g_aCount == 56)
        {
                SendToUart1(13);
        };
        if( g_aCount == 112)
        {
                g_aCount == 0;
        }
        TIMSK|=_BV(TOIE0);
} */

void delay_ms(int t)//延时函数
{
        int i;
        for (i=0;i<t;i++)
        {
                _delay_loop_2(250*4);
        }
}

/**********************
函数:串口初始化,波特率9600  外部晶振8.0000000M
**********************/
void usart0_init()  //T0 R0
{
        UCSR0B=0;
        UCSR0A=0;//控制和状态寄存器A
        UCSR0C=_BV(URSEL0)|(3<<UCSZ00);
       
        UBRR0L=0x33;
        //设置波特率  设置 USART 波特率为: 9600 时波特率寄存器 UBRR 的值
        UBRR0H=0;
        UCSR0B=0XD8;
        g_aRxdLen=13;
        g_aTxdPos=0;
        g_aTxdLen=13;
        g_aRxdPos=0;
        g_aCount=0;
        m_nSendflag_a=0;

}

void usart1_init()  //T1 R1
{
        UCSR1B=0;
        UCSR1A=0;
        UCSR1C=_BV(URSEL1)|(3<<UCSZ10);
        UBRR1L=0x33;
        UBRR1H=0;
        UCSR1B=_BV(RXCIE1)|_BV(TXCIE1)|_BV(RXEN1)|_BV(TXEN1);//0XD8

        g_bRxdLen=9;
        g_bTxdPos=0;
        g_bTxdLen=13;
        g_bRxdPos=0;
        g_bCount=0;
        m_nSendflag_b=0;
}

void Timer0_init()
{
        TCNT0=0;
        TCCR0=_BV(CS02)|_BV(CS00);////计数允许 1024预分频
        TIMSK=_BV(TOIE0);//T/C0中断允许
}

void SendToUart0(uchar size)                                //从发送缓冲区发送指定长度数据 T0 R0
{
        g_aTxdPos=0;
        g_aTxdLen=size;
        UDR0=g_aSendBuf[0];
       
        while (--g_aTxdLen>0)/*等待发送完成*/
                UDR0=g_aSendBuf[++g_aTxdPos];
       
        g_aTxdLen=13;
        g_aTxdPos=0;
}

void SendToUart1(uchar size)                                //从发送缓冲区发送指定长度数据 T1 R1
{
        g_bTxdPos=0;
        g_bTxdLen=size;
        UDR1=g_bSendBuf[0];
       
        while (--g_bTxdLen>0)/*等待发送完成*/
                UDR1=g_bSendBuf[++g_bTxdPos];

        g_bTxdLen=13;
        g_bTxdPos=0;
}

无论发什么,最后串口发出来的都是00

相关帖子

沙发
wangch_sh| | 2014-9-18 17:10 | 只看该作者
波特率对不对?数据个数对不对?

使用特权

评论回复
板凳
qazplm3218| | 2014-9-18 18:40 | 只看该作者
发送的引脚方向要设置成输出

使用特权

评论回复
地板
yutao0907|  楼主 | 2014-9-18 19:14 | 只看该作者
qazplm3218 发表于 2014-9-18 18:40
发送的引脚方向要设置成输出

不好意思,发帖的时候代码粘错了,发送引脚方向都是输出       DDRD|=_BV(TXD0);PORTD|=_BV(TXD0)|_BV(RXD0);
还是存在问题,我是用Proteus仿真的

使用特权

评论回复
5
yutao0907|  楼主 | 2014-9-18 19:15 | 只看该作者
wangch_sh 发表于 2014-9-18 17:10
波特率对不对?数据个数对不对?

数据个数不对,感觉像是波特率不对,用Proteus7.8仿真的,改了好几次,还是乱码!

使用特权

评论回复
6
wangch_sh| | 2014-9-18 19:53 | 只看该作者
看162手册,波特率怎么算的?

使用特权

评论回复
7
yutao0907|  楼主 | 2014-9-18 20:05 | 只看该作者
wangch_sh 发表于 2014-9-18 19:53
看162手册,波特率怎么算的?

按162手册算, UBRR0L=0x33

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝