📄 settime.c
字号:
#include<reg51.h>
#define uchar unsigned char
sbit SCLK = P2^6;
sbit IO = P2^7;
sbit RST = P2^5;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit DQ = P1^0;
sbit select = P3^2;
sbit add = P3^3;
sbit dec = P3^4;
sbit esc = P3^5;
bit flag2;
uchar flag,flag1;
uchar sec,min,hour,date,month;
uchar Num[10];
/* {0,1,2,3,4,5,6,7,8,9, °,C} */
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0x9c,0xbf,0xff};
uchar code SW[]={0x01,0x02,0x04,0x08};
void delay_2us(uchar t)
{
while(--t);
}
void delay_50us(uchar t)
{
uchar i;
for(;t>0;t--)
for(i=23;i>0;i--);
}
void Reset(void)
{
DQ = 0;
delay_50us(12);
DQ = 1;
delay_50us(2);
}
void WriteByte(uchar byte)
{
uchar i,j;
bit dat;
for(i=8;i>0;i--)
{
DQ = 0;
dat = byte & 0x01;
byte = byte>>1;
if(dat)
{
DQ = 1;
}
else
{
DQ = 0;
}
delay_2us(30);
DQ = 1;
j++;
j++;
}
}
uchar ReadBit(void)
{
uchar dat;
uchar i;
DQ = 0;
i++;
i++;
DQ = 1;
i++;
i++;
dat = P1^0;
delay_2us(30);
DQ = 1;
return (dat);
}
uchar ReadByte(void)
{
uchar i,j,val;
val = 0x00;
for(i=8;i>0;i--)
{
val = val >> 1;
j = ReadBit();
val = (j << 7) | val;
}
return (val);
}
void Start_ds18b20(void)
{
Reset();
delay_2us(10);
WriteByte(0xcc);
WriteByte(0x44);
}
uchar ReadTemp(void)
{
uchar tempL,tempH,temp;
Reset();
delay_2us(50);
WriteByte(0xcc);
WriteByte(0xbe);
tempL = ReadByte();
tempH = ReadByte();
flag = tempH & 0x80;
if(flag != 0)
{
tempL = ~tempL + 1;
tempH = ~tempH + 1;
}
tempL = tempL & 0xf0;
tempH = tempH & 0x0f;
temp = (tempL >> 4) | (tempH << 4);
return (temp);
}
/*********写一字节**********/
void writebyte1302(uchar data0)
{
uchar i;
ACC = data0;
for(i=8;i>0;i--)
{
IO = ACC0;
SCLK = 1;
SCLK = 0;
ACC = ACC >> 1;
}
}
/*******读一字节******************/
uchar readbyte1302()
{
uchar i;
for(i=8;i>0;i--)
{
ACC = ACC >> 1;
ACC7 = IO;
SCLK = 1;
SCLK = 0;
}
return(ACC);
}
/*********向DS1302写一字节内容********/
void Write1302(uchar Addr,uchar data1)
{
RST = 0;
SCLK = 0;
RST = 1;
writebyte1302(Addr);
writebyte1302(data1);
SCLK = 1;
RST = 0;
}
/*************读DS1302一字节的内容*********/
uchar Read1302(uchar Addr)
{
uchar temp;
RST = 0;
SCLK = 0;
RST = 1;
writebyte1302(Addr);
temp = readbyte1302();
SCLK = 1;
RST = 0;
return(temp);
}
void settime()
{
uchar temp1,temp2;
uchar premin,prehour,predate,premonth;
temp1 = min / 10;
temp2 = min % 10;
premin = (temp1<<4) | temp2;
temp1 = hour / 10;
temp2 = hour % 10;
prehour = (temp1<<4) | temp2;
prehour = prehour | 0x80;
temp1 = date / 10;
temp2 = date % 10;
predate = (temp1<<4) | temp2;
temp1 = month / 10;
temp2 = month % 10;
premonth = (temp1<<4) | temp2;
Write1302(0x8e,0x00); //关闭写保护,准备向DS1302写入初始值
Write1302(0x80,0x80);
Write1302(0x82,premin);
Write1302(0x84,prehour);
Write1302(0x86,predate);
Write1302(0x88,premonth);
Write1302(0x80,0x00);
Write1302(0x8e,0x80); //打开写保护,禁止向DS1302写入
}
void Init1302()
{
Write1302(0x8e,0x00); //关闭写保护,准备向DS1302写入初始值
Write1302(0x80,0x00); //启动DS1302
Write1302(0x8e,0x80); //打开写保护,禁止向DS1302写入
}
/*********读取当前时间**********/
void Gettime()
{
sec = Read1302(0x81);
min = Read1302(0x83);
hour = Read1302(0x85);
date = Read1302(0x87);
month = Read1302(0x89);
min = (min / 16) * 10 + min % 16;
hour = hour & 0x1f;
hour = (hour / 16)*10 + hour % 16;
date = (date / 16) * 10 + date % 16;
month = (month / 16) * 10 + month % 16;
}
void showtemp(uchar x)
{
uchar n,w;
if(flag != 0)
{
Num[3] = 12;
}
else
Num[3] = 13;
Num[0] = 11;
Num[1] = x%10;
Num[2] = x/10;
for(n=50;n>0;n--)
{
for(w=0;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(5);
}
}
}
void scankey()
{
if(select == 0)
delay_50us(100);
if(select == 0)
{
while(!select);
flag1++;
}
if(flag1 == 1) //设置小时状态时
{
if(add == 0)
delay_50us(100);
if(add == 0)
{
while(!add);
if(hour == 12)
hour = 1;
else
hour++;
}
if(dec == 0)
delay_50us(100);
if(dec == 0)
{
while(!dec);
if(hour == 1)
hour = 12;
else
hour--;
}
}
if(flag1 == 2) //设置分钟状态时
{
if(add == 0)
delay_50us(100);
if(add == 0)
{
while(!add);
if(min == 59)
min = 0;
else
min++;
}
if(dec == 0)
delay_50us(100);
if(dec == 0)
{
while(!dec);
if(min == 0)
min = 59;
else
min--;
}
}
if(flag1 == 3) //设置月状态时
{
if(add == 0)
delay_50us(100);
if(add == 0)
{
while(!add);
if(month == 12)
month = 1;
else
month++;
}
if(dec == 0)
delay_50us(100);
if(dec == 0)
{
while(!dec);
if(month == 1)
month = 12;
else
month--;
}
}
if(flag1 == 4) //设置日期状态时
{
if(add == 0)
delay_50us(100);
if(add == 0)
{
while(!add);
if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
{
if(date == 31)
date = 1;
else
date++;
}
if((month == 4) || (month == 6) || (month == 9) || (month == 11))
{
if(date == 30)
date = 1;
else
date++;
}
else
{
if(date == 29)
date = 1;
else
date++;
}
}
if(dec == 0)
delay_50us(100);
if(dec == 0)
{
while(!dec);
if((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
{
if(date == 1)
date = 31;
else
date--;
}
if((month == 4) || (month == 6) || (month == 9) || (month == 11))
{
if(date == 1)
date = 30;
else
date--;
}
else
{
if(date == 1)
date = 29;
else
date--;
}
}
}
//在正常时间显示状态时按下dec键,可以在时间显示和温度显示状态之间切换
if(dec == 0)
delay_50us(100);
if(dec == 0)
{
while(!dec);
flag2 = !flag2;
}
//esc键按下,推出设置及温度显示状态,返回到时间显示
if(esc == 0)
delay_50us(100);
if(esc == 0)
{
while(!esc);
flag1 = 0;
flag2 = 0;
}
//else
// settime();
}
void showmin()
{
uchar n,w;
Num[0]=min % 10;
Num[1]=min / 10;
Num[2]=hour % 10;
Num[3]=hour / 10;
for(n=80;n>0;n--)
{
for(w=0;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
for(n=200;n>0;n--)
{
for(w=2;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
}
void showhour()
{
uchar n,w;
Num[0]=min % 10;
Num[1]=min / 10;
Num[2]=hour % 10;
Num[3]=hour / 10;
for(n=80;n>0;n--)
{
for(w=0;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
for(n=200;n>0;n--)
{
for(w=0;w<2;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
}
void showdate()
{
uchar n,w;
Num[0]=date % 10;
Num[1]=date / 10;
Num[2]=month % 10;
Num[3]=month / 10;
for(n=80;n>0;n--)
{
for(w=0;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
for(n=200;n>0;n--)
{
for(w=2;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
}
void showmonth()
{
uchar n,w;
Num[0]=date % 10;
Num[1]=date / 10;
Num[2]=month % 10;
Num[3]=month / 10;
for(n=80;n>0;n--)
{
for(w=0;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
for(n=200;n>0;n--)
{
for(w=0;w<2;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
}
void showtime()
{
uchar n,w;
Num[0]=min % 10;
Num[1]=min / 10;
Num[2]=hour % 10;
Num[3]=hour / 10;
for(n=10;n>0;n--)
{
for(w=0;w<4;w++)
{
P0 = 0xff;
P2=SW[w];
P0=table[Num[w]];
delay_50us(10);
}
}
}
void main()
{
uchar temp;
flag1 = 0;
Start_ds18b20();
delay_50us(10);
temp = ReadTemp();
Init1302();
while(1)
{
Gettime();
//Start_ds18b20();
//if((sec%16) > 4)
//for(i=5;i>0;i--)
//{
showtime();
// }
/*else
{
temp = ReadTemp();
for(i=10;i>0;i--)
{
showtemp(temp);
}
}*/
scankey();
while(flag2)
{
flag1 = 0;
scankey();
Start_ds18b20();
delay_50us(10);
temp = ReadTemp();
showtemp(temp);
}
while(flag1)
{
scankey();
flag2 = 0;
/* if(flag1 == 1)
{
Start_ds18b20();
delay_50us(10);
temp = ReadTemp();
showtemp(temp);
}*/
if(flag1 == 1)
showhour();
if(flag1 == 2)
showmin();
if(flag1 == 3)
showmonth();
if(flag1 == 4)
showdate();
if(flag1 == 5)
{
settime();
flag1 = 0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -