#include<iom8v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 1000000
#pragma interrupt_handler uart_rx:12
#pragma interrupt_handler deng:9
void uart_init(uint baud);
void uart_sendB(uchar data);
void uart_rx(void);
uchar flag,r;
void ConfigTimer0(unsigned int ms);
unsigned long tmp;
void delay(uint MS)
{
uint m,n;
for( m=0;m<MS;m++)
for(n=0;n<500;n++);
}
void main()
{
DDRC|=BIT(4);
DDRD|=BIT(2);
PORTD&=~BIT(2);//设为接收
ConfigTimer0(500);
uart_init(4800);
while (1)
{
if(flag)
{
flag=0;
uart_sendB(r); //调用串口驱动
}
}
}
uchar flag=0;
uchar r;
void uart_init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,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为输出(很重要)
}
void uart_sendB(uchar buf)
{
PORTD|=BIT(2);//PD2 RS485方向控制端,1为发送;0为接收;
while(!(UCSRA&(BIT(UDRE)))) ;//判断UDR是否为空,UDRE为1时为空
UDR=buf;//发送一个字节数据
while(!(UCSRA&(BIT(TXC))));//发送结束时置位
UCSRA|=BIT(TXC);//通过写1清除
PORTD&=~BIT(2);
}
void uart_rx()
{
UCSRB&=~BIT(RXCIE);//关闭接收结束终中断使能
r=UDR;
flag=1;
UCSRB|=BIT(RXCIE);//打开接收结束终中断使能
}
void ConfigTimer0(unsigned int ms)
{
TCCR1B=0x03;
tmp=15625;//定时器计数频率
tmp=(tmp*ms)/1000;//计算所需的计数值
tmp=65536-tmp;//计算定时器重载值
TCNT1H=(unsigned char)(tmp>>8);
TCNT1L=(unsigned char)tmp;
TIMSK|=BIT(2);
SREG|=BIT(7);
}
void deng()
{
PORTC=~PORTC;
TCNT1H=(unsigned char)(tmp>>8);
TCNT1L=(unsigned char)tmp;
//UartRxMonitor(1);
}
|