📄 usart.c
字号:
#include "usart.h"
/******************************************************
函数void UsartInit(void)用于初始化USART
******************************************************/
void UsartInit(void)
{
UBRRH = (unsigned char)(((unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)) >> 8); //计算波特率寄存器应该赋的值
UBRRL = (unsigned char)((unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1));
UCSRC = 0xA6; //设置偶校验,1位停止位,8位数据位
UCSRA = 0x00; //不设置倍速,波特率分频器分频系数为16
UCSRB = 0x98; //使能接收中断,使能接收和发送
usartCounter = 0;
DDRD.0 = 0;
DDRD.1 = 1;
}
interrupt [USART_RXC] void UsartReceive (void)
{
unsigned char status; //status用于存储接收数据的状态
unsigned char data; //data用于存储接收的数据
unsigned char iCycle; //循环变量
status = UCSRA; //读取状态量
data = UDR; //读取数据
if((status & 0x1C) == 0x00) //判断所读取的数据是否正确
{
if (data == 0xBB) //判断是否为报文的起始字节
{
dataReceiveOK = 1; //置位可以接收时钟数据的标志位
usartCounter = 0; //清0缓冲区计数器
}
else if (data == 0xEE) //判断是否报文为结束字节
{
dataReceiveOK = 0; //是的话清0可以接收时钟数据的标志位
if (usartCounter == 8) //如果连续8个字节都是没有错误
{
UDR = 0x01; //向上位机返回1,否则返回0
for (iCycle = 0; iCycle < 8; iCycle++)
{
DS1302Data[iCycle] = reBuffer[iCycle]; //把接收到的数据赋值给时钟变量
}
DS1302CheckDataOve(); //数据有效性判断
FindDataOfWeek(); //计算星期
DS1302WriteTimeData(); //写入DS1302
}
else
{
UDR = 0x00; //接收不成功,向上位机返回0
}
}
else
{
if (dataReceiveOK)
{
reBuffer[7-usartCounter] = data; //把接收到的数据写入缓冲区
++usartCounter;
}
}
}
}
//interrupt [USART_TXC] void UsartTransmit (void)
//{
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -