📄 shiz.c
字号:
#define uint unsigned int
#define uchar unsigned char
#include <reg51.h>
#include <math.h>
sbit SDA = P3^1; //二线通信
sbit SCL = P3^0;
sbit LEDA = P3^3; //倒计时运行指示灯
sbit FY1 = P3^5; //放音控制1,高电平有效
sbit FY2 = P3^6; //放音控制2,高电平有效
sbit FY3 = P3^7; //放音控制3,高电平有效
bit c_flash = 0; //小时位闪烁标志
bit m_flash = 0; //分钟位闪烁标志
bit s_flash = 0; //秒位闪烁标志
bit ibflag;
//bit sf = 1; //定时标志位,sf=1:时间显示;sf=0:定时显示
#define M41T0_ADR 0xD0 //时钟芯片地址
#define WRITE 0x00 // WRITE command
#define READ 0x01 // READ command
uchar code tab[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳带圆点
unsigned long dingshi; //定时时长
void nop(uchar j);
void msec(uint x);
void display(uchar *p);
uchar RMT_SCAN(void);
void M41T0_Send (uchar *p);
uchar *M41T0_Receive (void);
uchar *read_time(void);
unsigned long time_to_long(void);
void timer_adj(void);
void clock_adj(void);
main()
{uchar key;
uchar *p;
EA = 0;
SDA = 1;
SCL = 1;
while(1)
{key = RMT_SCAN(); //遥控
switch(key)
{//case 4:sf = ~sf;break; //SWITCH_KEY,时间与定时切换
case 2:timer_adj();break; //TIMER_KEY,定时设定
case 1:clock_adj();break; //CLOCK_KEY,时间设定
default:break;
}
p = read_time();
display(p);
}
}
void nop(uchar j)
{uchar i;
for(i=0;i<j;i++)
{;}
}
void msec(uint x)
{ unsigned char j;
while (x--)
{ for (j=0;j<125;j++)
{;}
}
}
void display(uchar *pt)
{uchar i;
uchar temp;
temp = 0x01;
P2 = ~temp;
for(i = 0;i < 6;i++)
{P0 = pt[i];
msec(2);
temp <<= 1;
P2 = ~temp;
}
}
uchar RMT_SCAN(void)
{uchar temp1,temp2;
uchar i;
i = P1;
temp1 = i & 0xf0;
if(temp1)
{do{i = P1;
temp2 = i&0xf0;
}while(temp2);
temp1>>=4;
temp1 &= 0x0f;
return temp1;
}
else return 0;
}
uchar *read_time(void)
{uchar *pt,day[8];
uchar show[6]; //数码管显示数组
uchar i;
pt = M41T0_Receive();
for(i = 0;i < 8;i++)day[i] = *(pt+i);
show[0] = tab[day[0]&0x0f]; //秒个位
show[1] = tab[(day[0]&0x70)>>4]; //秒十位
show[2] = tab[day[1]&0x0f]; //分个位
show[3] = tab[(day[1]&0x70)>>4]; //分十位
show[4] = tab[day[2]&0x0f]; //时个位
show[5] = tab[(day[2]&0x30)>>4]; //时十位
return(show);
}
unsigned long time_to_long(void)
{uchar *pt,day[8];
uchar shi,feng,miao,i;
unsigned long th;
pt = M41T0_Receive();
for(i = 0;i < 8;i++)day[i] = *(pt+i);
shi = (day[2]&0x0f) + (day[2]>>4)*10;
feng = (day[1]&0x0f) + (day[1]>>4)*10;
miao = (day[0]&0x0f) + (day[0]>>4)*10;
th = miao + feng*60 + shi*3600;
return th;
}
void timer_adj(void)
{uchar idata day[3],*pt,dat[8];
uchar show[6]; //数码管显示数组
uchar shi,feng,miao,i;
uchar key;
bit ff;
uchar jm;
unsigned long th;
uchar flag = 1;
bit nflag,pflag;
day[2] = 0;
day[1] = 0;
day[0] = 0;
c_flash = 1;m_flash = 0;s_flash = 0;
while(1)
{if(c_flash){if(nflag){if(day[2]==0)day[2] = 23;
else day[2] = day[2] - 1;
nflag = 0;
}
if(pflag){if(day[2]==23)day[2] = 0;
else day[2] = day[2] + 1;
pflag = 0;
}
if(day[2]>23)day[2] = 0; //防止超阈值数据
} //时
if(m_flash){if(nflag){if(day[1]==0)day[1] = 59;
else day[1] = day[1] - 1;
nflag = 0;
}
if(pflag){if(day[1]==59)day[1] = 0;
else day[1] = day[1] + 1;
pflag = 0;
}
if(day[1]>59)day[1] = 0; //防止超阈值数据
} //分
if(s_flash){if(nflag){if(day[0]==0)day[0] = 59;
else day[0] = day[0] - 1;
nflag = 0;
}
if(pflag){if(day[0]==59)day[0] = 0;
else day[0] = day[0] + 1;
pflag = 0;
}
if(day[0]>59)day[0] = 0; //防止超阈值数据
}
//秒
show[0] = tab[day[0]%10]; //秒个位
show[1] = tab[day[0]/10]; //秒十位
show[2] = tab[day[1]%10]; //分个位
show[3] = tab[day[1]/10]; //分十位
show[4] = tab[day[2]%10]; //时个位
show[5] = tab[day[2]/10]; //时十位
if(c_flash)
{if(ff){show[4] = 0x7f; //圆点不灭
show[5] = 0xff;
if(jm++ > 15){ff = 0;jm = 0;}
}
else if(jm++ > 60){ff = 1; jm = 0;} //闪烁频率
}
if(m_flash)
{if(ff){show[2] = 0x7f;
show[3] = 0xff;
if(jm++ > 15){ff = 0;jm = 0;}
}
else if(jm++ >60){ff = 1; jm = 0;} //闪烁频率
}
if(s_flash)
{if(ff){show[0] = 0xff;
show[1] = 0xff;
if(jm++ > 15){ff = 0;jm = 0;}
}
else if(jm++ > 60){ff = 1; jm = 0;} //闪烁频率
}
display(show);
key = RMT_SCAN(); //遥控
switch(key)
{case 4:flag = flag + 1; //SWITCH_KEY,时段切换
if(flag > 3)flag = 1;
switch(flag){case 1:c_flash = 1;m_flash = 0;s_flash = 0;break;
case 2:c_flash = 0;m_flash = 1;s_flash = 0;break;
case 3:c_flash = 0;m_flash = 0;s_flash = 1;break;
default:break;
}
break;
case 8:pflag = 1;break; //ADJUST_KEY,数字增加
case 1:nflag = 1;break; //CLOCK_KEY,数字减小
case 2: {dingshi = (unsigned long)day[2]*3600+(unsigned long)day[1]*60+(unsigned long)day[0];
//TIMER_KEY,保存退出
if(dingshi < 301)break;//小于5分钟无效
th = time_to_long();
dingshi = dingshi + th;
goto pre_end;
}
default:break;
}
}
pre_end:{c_flash = 0;m_flash = 0;s_flash = 0; LEDA = 0;}//倒计时启动,指示灯亮
FY1 = 1;//地址选择,启动倒计时
/*************定时状态******************/
while(1){pt = M41T0_Receive();
for(i = 0;i < 8;i++)dat[i] = *(pt+i);
shi = (dat[2]&0x0f) + (dat[2]>>4)*10;
feng = (dat[1]&0x0f) + (dat[1]>>4)*10;
miao = (dat[0]&0x0f) + (dat[0]>>4)*10;
th = miao + feng*60 + shi*3600;
th = dingshi - th; //当前定时时间
if(th > 86399)th = th - 86400; //总时长超过24小时,当前时间进入第二天
if(th == 300)FY2 = 1; //定时状态,倒计时5分钟语音提示
if(th < 2 ){LEDA = 1;FY3 = 1; break;} //定时结束,指示灯灭
shi = th/3600;
feng = (th%3600)/60;
miao = th%60;
show[0] = tab[miao%10]; //秒个位
show[1] = tab[miao/10]; //秒十位
show[2] = tab[feng%10]; //分个位
show[3] = tab[feng/10]; //分十位
show[4] = tab[shi%10]; //时个位
show[5] = tab[shi/10]; //时十位
display(show);
}
}
void clock_adj(void)
{uchar idata day[8];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -