#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 |