端口配置:
CPU RS485
RXD RO
TXD DI
PD6 DE,/RE
**********************************************/
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 8000000
uchar rdata,flag=0;
void uart_sendB(uchar Data) //发送
{
while( !(UCSRA & (1<<UDRE)) );
UDR=Data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x40;
DDRD = 0x40;
}
void uart0_init(uint baud)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(1<<USBS)|(0<<UPM0)|(3<<UCSZ0); //选择UCSRC,异步模式,禁止
// 校验,2位停止位,8位数据位
baud=mclk/16/baud-1 ; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE); //接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=0X02; //配置TX为输出(很重要)
}
#pragma interrupt_handler uart0_rx:12
void uart0_rx(void)
{
UCSRB&=~BIT(RXCIE);
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);
}
void main(void)
{
port_init();
uart0_init(19200);
while(1)
{
if(flag)
{
PORTD = 0x40;
uart_sendB(rdata);
PORTD = ~0x40;
flag=0;
}
}
}
|