#include <iom16v.h>
#include <macros.h>
//起始字为0XAA,结束字为0XFF,系统接收的命令字为0XBB
#define U_BEGIN 0xAA
#define U_END 0xFF
#define JIAOYAN 0xF0
#define R_NUM 0x00
#define E_NUM 0x01
unsigned long baud=9600;
unsigned long crystal=8000000;
unsigned int baud_set=0;
void delay_us(unsigned int time)
{
do{
time--;
}
while(time>1);
}
void delay_ms(unsigned int time)
{
while(time!=0)
{
delay_us(500);
time--;
}
}
void display(unsigned char pin)
{PORTC=pin;
delay_ms(4000);
}
#define TX_BUFSIZE 4
unsigned char tx_buf[TX_BUFSIZE];
unsigned char tx_wrindex=0,tx_rdindex=0,tx_counter=0;
#pragma interrupt_handler usart_tx_isr:14
void usart_tx_isr()
{
if(tx_counter)
{--tx_counter;
UDR=tx_buf[tx_rdindex];
if(++tx_rdindex==TX_BUFSIZE)
tx_rdindex=0;
}
}
void putchar(unsigned char c)
{while(tx_counter==TX_BUFSIZE) ;
CLI();
if(tx_counter||(UCSRA&(1<<UDRE)==0))//发送缓冲器是否为空,不为空,先放在缓存中
{tx_buf[tx_wrindex]=c;
if(++tx_wrindex==TX_BUFSIZE) tx_wrindex=0;
++tx_counter;}
else UDR=c;
SEI();
}
#define RX_BUFSZIE 4
unsigned char rx_buf[RX_BUFSZIE];
unsigned char rx_counter;
int u_rflag=0;
#pragma interrupt_handler usart_rx_isr:12
void usart_rx_isr()
{unsigned char status,data;
status=UCSRA;
data=UDR;
if(!u_rflag)
{
if((status&((1<<FE)|(1<<DOR)|(1<<PE)))==0)
{rx_buf[rx_counter]=data;
rx_counter++;
switch(rx_counter)
{case 1:
if(data!=U_BEGIN) rx_counter=0;
break;
case 3:
if(data!=(rx_buf[1]&JIAOYAN)) rx_counter=0;
break;
case 4:
rx_counter=0;
if(data==U_END) u_rflag=1;
break;}
}
}
}
/*端口初始化*/
void port_init()
{baud_set=(crystal/baud*16)-1;
SREG=0x00;
DDRC=0xFF;
PORTC=0xFF;
DDRA=0xFF;
PORTA=0x00;
}
void usart_init()
{
UCSRA=0x00;
UBRRH=(unsigned char)(baud_set>>8);
UBRRL=(unsigned char)baud_set;
UCSRB=((1<<RXEN)|(1<<TXEN)|(1<<TXCIE)|(1<<RXCIE));
UCSRC=((1<<URSEL)|(3<<UCSZ0));
}
void main()
{
unsigned char tx1,tx2;
port_init();
usart_init();
SREG = 0x80; //使能全局中断
while(1)
{if(u_rflag)
{tx1=R_NUM;
if(rx_buf[1]!=0xBB) tx1=E_NUM;
tx2=tx1&JIAOYAN;
putchar(U_BEGIN);
putchar(tx1);
putchar(tx2);
putchar(U_END);
display(rx_buf[1]);
u_rflag=0;}
}
}