⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usart.c

📁 使用AVR单片机实现的万年历功能,其中使用了ds1302和1602
💻 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 + -