📄 time-sync-2051.c
字号:
#include "stdio.h"
#include "reg51.h"
#define MAXLEN 8 // 串行口缓冲区 8ytes 大小
// 0 - 9 的编码
unsigned char code table[] ={ 0xee,0x48,0xd6,0xdc,0x78,0xbc,0xbe,0xc8,0xfe,0xfc,0xff };
//{ 0x11,0xb7,0x29,0x23,0x87,0x43,0x41,0x37,0x01,0x03,0x00 };
//第1 6 位的片选线
unsigned char code dig[] = { 0xc1,0x43,0x61,0x49,0x51,0x45};
unsigned char buffer[8],cbuf[8];
unsigned char count1,scan,i,ch,hour,min,sec,ptr,HOUR1,MIN1,SEC1,x,y;
bit fSec;
unsigned int count2;
void init(void);
void display(void);
main()
{
init();
while(1) {
if(fSec) { // 秒标志被置位
fSec = 0; // 清除秒标志
sec++; // 计算当前时间
if(sec==60) {
sec = 0; min++;
if(min==60) {
min = 0; hour++;
if(hour==24) hour = 0;
}
}
display(); // 显示当前时间
}
}
}
void init(void) {
scan = 0; fSec = 0; ptr = 0;
for(i=0;i<6;i++) buffer[i] = 0;
TCON &= 0x3F; //串行口初始化9600 8 N 1
TMOD &= 0x0F;
TMOD |= 0x20;
SCON = 0x50;
TH1 = TL1 = 0xfd;
TR1 = 1;
ES = 1;
TCON &= 0xCF; // 初始化Timer0
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = TL0 = 0;
ET0 = 1;
TR0 = 1;
EA = 1;
}
void timerint () interrupt 1 {
TR0 = 0;
TL0 = 0x16;
TH0 = 0xf7; // 0xf712 for 2.5ms //cal f697=63127 //247*256=63232--
TR0 = 1;
P1 = 0xff; P3 = dig[scan];
ch = buffer[scan]; // 依次显示6 位
P1 = table[ch];
scan++; if(scan==6) scan = 0;
count2++;
if(count2==399) {
count2 = 0; fSec = 1; // 秒脉冲标志置位
}
}
void SerInt() interrupt 4 {
if(RI) {
RI = 0;
ch = SBUF;
if(ch!='\r') {if(ptr<MAXLEN) { ch -= '0'; cbuf[ptr] = ch; ptr++; } }// 不是回车则放入缓冲区
else{if(ptr==7) { // 转换为当前时间
HOUR1 = cbuf[1] * 10 + cbuf[2];
if(HOUR1<99){SEC1= cbuf[5] * 10 + cbuf[6]; MIN1 = cbuf[3] * 10 + cbuf[4];
if (min>MIN1){x=MIN1+60-min;} else x=MIN1-min ;
if ((hour=0) &(min=0) & (sec<30 )){x=0;}
sec=SEC1;
min=MIN1;
hour=HOUR1;}
else{if(HOUR1=99){y = cbuf[3] * 10 + cbuf[4]; x = cbuf[5] * 10 + cbuf[6]; }}
}ptr=0;
} } }
void display(void) {
buffer[0] = hour/10; buffer[1] = hour%10; // 显示hh mm ss
buffer[2] = min/10; buffer[3] = min%10;
buffer[4] = sec/10; buffer[5] = sec%10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -