📄 usart.c
字号:
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 7372800 //晶振 7.3728 M
#pragma interrupt_handler uart_rx:12 //中断向量12,表示USART 的RX结束
uchar rdata,flag=0;
void uart_init(uint baud);
void uart_sendB(uchar data);
void uart_rx(void);
void delay(uint ms);
void main()
{
uart_init(9600);
while(1)
{
if(flag) //flag为1证明进入中断,接收到数据
{
uart_sendB(rdata); //发送接收到的数据
flag=0; //将flag清零
}
}
}
void uart_init(uint baud)//传输寄存器控制子函数
{
UCSRA=0x00; //控制寄存器清零
UCSRB=(1<<RXCIE)|(0<<UCSZ2); //接受中断结束使能,8位字符,写UCSRC寄存器
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
baud=mclk/16/baud-1; //数据手册自带,波特率计算
UBRRL=baud;
UBRRH=baud>>8;
SREG=BIT(7); //全局中断使能
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接受结束中断使能,接受使能,发送使能
DDRD|=0X02; //很重要的一行,PD1口为输出,PD0口为输入
}
void uart_sendB(uchar data)//发送子函数
{
while(!(UCSRA&(BIT(UDRE)))) ; //判断数据寄存器,为空时跳出循环
UDR=data; //将发送数值传给UDR
while(!(UCSRA&(BIT(TXC)))); //判断发送是否结束,结束则跳出循环
UCSRA|=BIT(TXC); //清楚发送结束使能位(总是用UDR决定发送使能位)
}
void uart_rx(void)//接受子函数
{
UCSRB&=~BIT(RXCIE); //接受结束中断使能关断
rdata=UDR; //赋值将UDR寄存器得值传给变量rdata
flag=1; //自定义标志,表示接收终端已进入
UCSRB|=BIT(RXCIE); //开启接受结束中断使能
}
void delay(uint ms)//延时子函数
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<11411;j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -