📄 serio.c
字号:
//串口子程序
/*******************************************************************/
#include <reg52.h>
#include "serio.h"
#include "ds1302.h"
uchar count=0;
struct time clock1;
struct time *tm1;
/*******************************************************************/
//initial uart 串口初始化
void UART0_Init()
{
SCON = 0x50; //串行方1(波特率可变10位异步通信方式),串行接收允许
//SCON: serail mode 1, 8-bit UART, REN=1,Buard=(2^SMOD)(Timer1 溢出率 )/32
TMOD |= 0x20; //TMOD:timer1 mode 2,8 位reload //定时器1,模式2,8位自动装入计数初值方式,高8位为初值,只由低8位计数
PCON |= 0x80; //SMOD=1; //波特率增加一倍
TH1 = 0xFd; //fosc=11.0592MHz,smod=0, Baud:4.8k--TH:F4,9.6K--TH:FD;
TL1 = 0xFd; //fosc=11.0592MHz,smod=1, Baud:19.2K--TH:FD; 由公式可求得其为波特率为19200
IE |= 0x90; //ea=1,es=1,Enable Serial Interrupt 开启串行口中断
TR1 = 1; // timer 1 run 启动T1
}
/*******************************************************************/
//send one byte to pc发送一字节到PC
void UART0_SendByte(uchar da)
{
EA = 0; //关闭中断
SBUF = da; //数据缓冲寄存器的数据为DA
while(TI==0); //如果发送中断无,则进入死循环
TI=0; //如果发送中断有,则装发送中断置为0(无)
EA = 1; //开启总中断
}
/******************************************************************/
//send one string to pc发送一串字符到PC
void UART0_SendStr(uchar *str)
{
uchar i;
i=0;
while((*(str+i))!='\0') //如果字符串内容不为0,则往下执行
{
UART0_SendByte(*(str+i));
i=i+1;
}
}
//******************************************************************//
void receive(void) interrupt 4
{
uchar temp;
EA=0;
if(RI)
{
temp=SBUF;
switch(count)
{
case 0:if(temp==0x30)count=1;else count=0;break;
case 1:if(temp==0x30)count=2;else count=0;break;
case 2:if(temp==0x30)count=3;else count=0;break;
case 3:clock1.year=(temp&0x0f)<<4;count=4;break;
case 4:clock1.year=(temp&0x0f)+clock1.year;count=5;break;
case 5:clock1.month=(temp&0x0f)<<4;count=6;break;
case 6:clock1.month=(temp&0x0f)+clock1.month;count=7;break;
case 7:clock1.date=(temp&0x0f)<<4;count=8;break;
case 8:clock1.date=(temp&0x0f)+clock1.date;count=9;break;
case 9:clock1.hour=(temp&0x0f)<<4;count=10;break;
case 10:clock1.hour=(temp&0x0f)+clock1.hour;count=11;break;
case 11:clock1.minute=(temp&0x0f)<<4;count=12;break;
case 12:clock1.minute=(temp&0x0f)+clock1.minute;count=13;break;
case 13:clock1.sec=(temp&0x0f)<<4;count=14;break;
case 14:clock1.sec=(temp&0x0f)+clock1.sec;count=15;break;
case 15:clock1.week=(temp&0x0f);tm1=&clock1;SetTime(tm1);count=0;break;
}
RI=0;
}
else
TI=0;
EA=1;
}
/*******************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -