#define Crystal 8000000
#define Baud 4800
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
uchar Flag0=0;
uchar Flag1=0;
volatile uchar R_dat1;
volatile uchar R_dat0;
/*串口0的初始化*/
void Uart0_init(void)
{
UCSR0B = 0x00; //禁止发送和接收
UCSR0A = 0x02; //倍速异步模式USX0=1
UBRR0L=(Crystal/16/Baud-1)%256; //根据数据手册的计算法
UBRR0H=(Crystal/16/Baud-1)/256; //如果不是倍速则(Crystal/16/Baud0-1)
UCSR0B=(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);//发送接收使能,接收中断使能
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//8位数据,UCSZ02,01,00共同确定
DDRE|=BIT(1); //设置发送口为输出
}
/*串口0单字符发送,查询方式*/
void Uart0_sendbyte(uchar i)
{
while (!(UCSR0A & (1<<UDRE0))); /* 等待发送缓冲器为空*/
UDR0 = i; /* 要发送的数据*/
}
/*串口0字符串发送*/
void Uart0_sendstring(uchar *p)
{
while(*p)
{
Uart0_sendbyte(*p);
p++;
}
}
/*串口0接收中断*/
#pragma interrupt_handler Uart0_rx:19
void Uart0_rx(void)
{
UCSR0B&=~BIT(RXCIE0);//先关接收中断
R_dat0=UDR0; //用变量接收串口1收到的数据
Flag0=1;
UCSR0B|=BIT(RXCIE0);//重开接收中断
}
/***************************这是串口1******************************/
/*串口1的初始化*/
void Uart1_init(void)
{
UCSR1B = 0x00; //禁止发送和接收
UCSR1A = 0x02; //倍速异步模式USX0=1
UBRR1L=(Crystal/8/Baud-1)%256; //根据数据手册的计算法
UBRR1H=(Crystal/8/Baud-1)/256; //如果不是倍速则(Crystal/16/Baud1-1)
UCSR1B=(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);//发送接收使能,接收中断使能
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据,UCSZ12,11,10共同确定
DDRD|=BIT(3); //设置发送口为输出
}
/*串口0单字符发送,查询方式*/
void Uart1_sendbyte(uchar i)
{
while (!(UCSR1A & (1<<UDRE1))); /* 等待发送缓冲器为空*/
UDR1 = i; /* 要发送的数据*/
}
/*串口1字符串发送*/
void Uart1_sendstring(uchar *p)
{
while(*p)
{
Uart1_sendbyte(*p);
p++;
}
}
/*串口1接收中断*/
#pragma interrupt_handler Uart1_rx:31
void Uart1_rx(void)
{
UCSR1B&=~BIT(RXCIE1);//先关接收中断
R_dat1=UDR1; //用变量接收串口1收到的数据
Flag1=1;
UCSR1B|=BIT(RXCIE1);//重开接收中断
}
void main(void)
{
CLI();
SEI();
Uart1_init();
while(1)
{
if(Flag1==1)
Uart0_init();
Uart0_sendbyte(R_dat1);
}
}
<rxen0)|(1<<txen0)|(1<<rxcie0); 发送接收使能,接收中断使能="" ucsr0c="(1<<ucsz01)|(1<<ucsz00);" 8位数据,ucsz02,01,00共同确定="" ddre|="BIT(1);" 设置发送口为输出="" }="" *串口0单字符发送,查询方式*="" void="" uart0_sendbyte(uchar="" i)="" {="" while="" (!(ucsr0a="" &="" (1<<udre0)));="" *="" 等待发送缓冲器为空*="" udr0="i;" 要发送的数据*="" *串口0字符串发送*="" uart0_sendstring(uchar="" *p)="" while(*p)="" uart0_sendbyte(*p);="" p++;="" *串口0接收中断*="" #pragma="" interrupt_handler="" uart0_rx:19="" uart0_rx(void)="" ucsr0b&="~BIT(RXCIE0);//先关接收中断" r_dat0="UDR0;" 用变量接收串口1收到的数据="" flag0="1;" ucsr0b|="BIT(RXCIE0);//重开接收中断" ***************************这是串口1******************************="" *串口1的初始化*="" uart1_init(void)="" ucsr1b="0x00;" 禁止发送和接收="" ucsr1a="0x02;" 倍速异步模式usx0="1" ubrr1l="(Crystal/8/Baud-1)%256;" 根据数据手册的计算法="" ubrr1h="(Crystal/8/Baud-1)/256;" 如果不是倍速则(crystal="" 16="" baud1-1)="" ucsr1c="(1<<ucsz11)|(1<<ucsz10);" 8位数据,ucsz12,11,10共同确定="" ddrd|="BIT(3);" uart1_sendbyte(uchar="" (!(ucsr1a="" (1<<udre1)));="" udr1="i;" *串口1字符串发送*="" uart1_sendstring(uchar="" uart1_sendbyte(*p);="" *串口1接收中断*="" uart1_rx:31="" uart1_rx(void)="" ucsr1b&="~BIT(RXCIE1);//先关接收中断" r_dat1="UDR1;" flag1="1;" ucsr1b|="BIT(RXCIE1);//重开接收中断" main(void)="" cli();="" sei();="" uart1_init();="" while(1)="" if(flag1="=1)" uart0_init();="" uart0_sendbyte(r_dat1);="" }<="" ucsz11)|(1<<="" rxen1)|(1<<txen1)|(1<<="" ucsz01)|(1<<="" rxen0)|(1<<txen0)|(1<</rxen0)|(1<<txen0)|(1<
此帖出自
小平头技术问答
一周热门 更多>