📄 uart.c
字号:
/*****************************************************
** 文件:uart.c
** 功能:串口操作
** 作者:韦坚
** 修改:韦坚
** 开始日期:2008-1-2
** 完成日期:2008-1-2
/***************************************************/
/**********************************************************************
** 函 数 名: void initial(void)
** 功 能: 串口初始化
** 入口参数: 无
** 返 回 值: 无
** 日 期: 2007-11-22
** 说 明: 晶振12MHz
***********************************************************************/
void initial(void)
{
TMOD = 0x20; /*设定定时器/计数器1为方式2*/
PCON = 0x80; /*SMOD=0,波特率=定时器1溢出率/16*/
SCON = 0x50; /*串行接口工作于方式1*/
TH1 = 0xF3; /*设置波特率为4800的定时器1的初始值*/
TL1 = 0xF3; /*设置波特率为4800的定时器1的加载值*/
EA = 1; /*开总中断*/
ES = 1; /*允许串口中断*/
TR1 = 1; /*启动定时器/计数器1*/
}
/*************************************************************************
** 函 数 名: uart_send()
** 功 能: 串口送数
** 入口参数: 无
** 返 回 值: 无
** 日 期: 2007-12-22
***************************************************************************/
void uart_send(void)
{
ES = 0; //先关闭串口中断
SBUF=0xFF; /*发送温度命令,供上位机识别用*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(uchar)(temp/10000);
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(uchar)(temp%10000/100);
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
/******************************************************************
** 因为需要同上位机同步,需将BCD码转换成10进制数
******************************************************************/
//SBUF=0x20; /*发送年*/
//while(TI==0); /*等待发送完*/
//TI=0; /*清除TI标志*/
SBUF=0xFE; /*发送时间命令,供上位机识别用*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(year&0x0F)+((year&0xF0)>>4)*10; /*发送年*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(mon&0x0F)+((mon&0xF0)>>4)*10; /*发送月*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(day&0x0F)+((day&0xF0)>>4)*10; /*发送日*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(hou&0x0F)+((hou&0xF0)>>4)*10; /*发送小时*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(min&0x0F)+((min&0xF0)>>4)*10; /*发送分钟*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=(sec&0x0F)+((sec&0xF0)>>4)*10; /*发送秒*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=0xFC; /*发送星期命令,供上位机识别用*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
SBUF=week; /*发送星期*/
while(TI==0); /*等待发送完*/
TI=0; /*清除TI标志*/
ES = 1; //打开串口中断
}
/*************************************************************************
** 函 数 名: void uart_change_8563(void)
** 功 能: 串口接收需修改的8563数据
** 入口参数: 无
** 返 回 值: 无
** 日 期: 2007-12-22
***************************************************************************/
void uart_change_8563(void)
{
uchar i;
for ( i=0;i<7;i++)
{
while(RI==0);
RI=0;
Ini_8563[i] = SBUF ;
}
set_8563();
}
/*************************************************************************
** 函 数 名: void uart_receive(void)
** 功 能: 串口接收
** 入口参数: 无
** 返 回 值: 无
** 日 期: 2007-12-22
***************************************************************************/
void uart_receive(void) interrupt 4
{
RI = 0;
ES = 0; //先关闭串口中断
if ( 0xFF == SBUF ) //如果接收到修改时间的命令,则把接下来的7个数据作为所要改的时间
{
uart_change_8563();
}
else //否则显示数据
{
dis_uart_receive( SBUF );
}
ES = 1; //打开串口中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -