main.c
来自「3、LCD12864不能显示或不能清楚显示: 1)重新按住复位键和KEY A 2」· C语言 代码 · 共 153 行
C
153 行
/*****************************************************************/
/* */
/*名称: 串口对ds1302读写程序 */
/*功能: 读写DS1302,通过串口返回给电脑 */
/*难度等级: 中 */
/* 作者: zengrenliang */
/* 版权: http://www.51kaifa.com */
/*编写日期: 2006.05.21 */
/*****************************************************************/
#include <reg52.h>
#include "ds1302.h"
#define uchar unsigned char
bit receive;//接收标志
bit re_finish;//接收一串字符完成标志
sbit LED = P1^3;//LED指示灯
uchar i,buffer[8],str[8];//串口缓冲区
uchar sbuffer,number;//发送字符个数
uchar sendFINS ;//发送完成标志
uchar copyOK , cmd_numb ;//发送缓冲区填充完成
/*********************************系统初始化*****************************/
void initial()
{ unsigned char j;
SCON=0x50; //串口工作方式1,允许接收
PCON=0x80; //波特率翻倍
TCON=0;
TMOD=0x26; //T1用于串口波特率控制
TL1=0xfa; //初始化T1,波特率为9600(晶振11.0592M)
TH1=0xfa;
TR1=1; //开定时器
EA=1; //开总中断
ES=1; //开串口中断
copyOK = 0; //缓冲区准备好标志清零
receive = 0; //接收标志清零
re_finish = 0; //接受完成标志清零
cmd_numb = 0; //接受计数器清零
for(j=0; j<8; j++){ //串口缓冲区清空
buffer[i] = 0xff; //table[18]为空显示
str[i] = 0xff;
}
}
/*************************************向串口发送字符串****************************/
void send(void)
{
if(copyOK) //串口准备好且缓冲区准备好
{
i = 0;
REN = 0; //发送过程中禁止接收数据
copyOK = 0; //清缓冲区准备好标志
SBUF = str[i++]; //发送字符串首字符
number = 7; //置发送计数器
}
else
return; //没准备好则返回
}
/**************************************串口中断响应*********************************/
void serial(void) interrupt 4
{
LED = ~LED;//LED闪烁
if(RI)//为接收中断
{
RI=0; //清接收中断标志
sbuffer = SBUF; //读取串口缓冲区数据
if((sbuffer == 0x55) && (receive == 0)) //判断是否为数据头 ,是数据头则准备接收
{
receive = 1; //开始接收标志
cmd_numb = 0; //清接收计数器
re_finish = 0; //清接收完成标志
}
else if(sbuffer == 0xaa) //判断数据尾
{
re_finish = 1; //置接收完成标志
receive =0; //清接收标志
}
else if(receive){ //判断当前是否处于接收状态
buffer[cmd_numb++] = sbuffer; //当前字符送缓冲区
}
else //无效命令则返回
return;
}
else{
TI=0; //为单个字符发送完中断
if(!number) //字符串发送完
{ REN = 1; //允许接收
}
else{ //字符串未发送完
SBUF = str[i++]; //发送下一字符
number--; //发送字符数减一
}
}
}
/*************************************执行PC端命令*******************************/
void DispatchCmd(void)
{ uchar p;
switch(buffer[0])
{
case 1: //设置DS1302
v_Set1302(&buffer[1]);
for(p=0;p<8;p++)
str[p] = 0x55;
copyOK = 1;
send();
break;
case 2: //读取DS1302
for(p=0;p<8;p++)
str[p] = 0x00;
v_Get1302(&str);
copyOK = 1;
send();
break;
default:
return;
}
}
/***************************************主函数************************************/
main()
{
P0 = 0xff;
P2 = 0xff;
P1 = 0xff;
initial();
while(1){//主循环
if(re_finish){//接收完成
re_finish = 0;//清接收完标志
copyOK = 0;//清填充完标志
DispatchCmd();//执行命令
}
}
}
/**************************************结束***************************************/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?