#include <REGX52.H>
#include"ds1302.h"
#include"onewire.h"
#define uint unsigned int
#define uchar unsigned char
uchar arr1[8]={0,0,16,0,0,16,0,0};//时钟显示
uchar arr2[8]={0,0,16,0,0,16,0,0};//时间调节
uchar arr3[8]={0,0,16,0,0,16,0,0};//闹钟页面
uchar arr4[8]={18,18,18,18,18,0,0,12}; //温度显示
//-------共阳数码管的段码编码表(无小数点)--------
//0 1 2 3 4 5 6 7 8 9 A b C D E F - .
unsigned char code SMG_NoDot[19]={0xc0,0xf9,
0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f,0xff};
//-----------------------------------------------
unsigned char code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
unsigned char TIME[3] = {0x57, 0x59, 0x23};
/* 秒 分 时 日 月 星期 年 */
uchar hour,min,sec;
uchar shour,smin,ssec;
uchar face=0;
bit flag1=0;
void init_ds1302();
void write_time();
void ds18b20();
void get_time();//读时间
bit flag=0;
uchar count1=0,count2=0;
void delay(uint x)
{
while(x--);
}
void select573(unsigned char channel,value)
{
P2=(P2&0x1f)|0x00;
P0=value;
switch(channel)
{
case 4: P2=(P2&0x1f)|0x80;break;//led
case 5: P2=(P2&0x1f)|0xa0;break;//buzz
case 6: P2=(P2&0x1f)|0xc0;break;//pos
case 7: P2=(P2&0x1f)|0xe0;break;//value
case 0: P2=(P2&0x1f)|0x00;break;
}
P2=(P2&0x1f)|0x00;
}
void show_smg_bit(unsigned char pos,value)
{
select573(6,(0x01<<pos));
select573(7,value);
delay(500);
select573(6,(0x01<<pos));
select573(7,0xff);
}
void show_smg()//数码管显示
{
uchar i=0;
if(face==0){
for(i=0;i<8;i++)
{
get_time();//读时间
show_smg_bit(i,SMG_NoDot[arr1[i]]);
}
}
//----------------
if(face==1){
if(flag==1){
for(i=0;i<8;i++)
{
show_smg_bit(i,SMG_NoDot[arr2[i]]);
}
}
if(flag==0)
{
if(count1==1){
for(i=0;i<8;i++)
{
if(i==1||i==0)
{
select573(6,0x03);// 00011000
select573(7,0xff);
}else{
show_smg_bit(i,SMG_NoDot[arr2[i]]);
}
}
}
if(count1==2){
for(i=0;i<8;i++)
{
if(i==3||i==4)
{
select573(6,0x18);// 00011000
select573(7,0xff);
}else{
show_smg_bit(i,SMG_NoDot[arr2[i]]);
}
}
}
if(count1==3){
for(i=0;i<8;i++)
{
if(i==6||i==7)
{
select573(6,0xc0);// 00011000
select573(7,0xff);
}else{
show_smg_bit(i,SMG_NoDot[arr2[i]]);
}
}
}
}
}
//----------------------------------
if(face==2)
{
for(i=0;i<8;i++)
{
show_smg_bit(i,SMG_NoDot[arr3[i]]);
}
}
///-------
if(face==3)
{
for(i=0;i<8;i++)
{
show_smg_bit(i,SMG_NoDot[arr4[i]]);
}
}
}
void init_system()
{
select573(4,0xff);
select573(5,0x00);
init_ds1302();
}
//----------------------按键
uchar key()
{
uchar k=0;
if(P3_0==0){delay(10);if(P3_0==0){ k=7;while(P3_0==0){show_smg();}}}
if(P3_1==0){delay(10);if(P3_1==0){ k=6;while(P3_1==0){show_smg();}}}
if(P3_2==0){delay(10);if(P3_2==0){ k=5;while(P3_2==0){show_smg();}}}
if(P3_3==0){delay(10);if(P3_3==0){ k=4;if(face==0){while(P3_3==0){face=3;ds18b20();show_smg();}face=0;}
if(face!=0){while(P3_3==0){show_smg();}}}}
return k;
}
void scan_key()
{
uchar num;
num=key();
switch(num)
{
case 7: if(flag1==1){ flag1=0;TR1=0;
select573(4,0xff);}else{face=1;count1++;if(count1==1){ arr2[7]=sec%16;arr2[6]=sec/16;arr2[4]=min%16;arr2[3]=min/16;
arr2[1]=hour%16;arr2[0]=hour/16;}
if(count1>3){face=0;count1=0;write_time(); }}break;
case 6: if(flag1==1){ flag1=0;
TR1=0;
select573(4,0xff);}else{face=2;count2++;if(count2==1){arr3[0]=shour/10;arr3[1]=shour%10;arr2[7]=ssec%10;arr2[6]=ssec/10;
arr2[4]=smin/16;arr2[3]=smin/16;}if(count2>3){face=0;count2=0;}}break;
case 5: if(flag1==1){ flag1=0;
TR1=0;
select573(4,0xff);}else{if(face==1){
if(count1==1){ hour=(hour/16)*10+hour%16;hour++;hour=(hour/10)*16+(hour%10); }
if(count1==2){ min=(min/16)*10+min%16;min++;min=(min/10)*16+(min%10); }
if(count1==3){ sec=(sec/16)*10+sec%16;sec++;sec=(sec/10)*16+(sec%10); }
arr2[7]=sec%16;arr2[6]=sec/16;arr2[4]=min%16;arr2[3]=min/16;
arr2[1]=hour%16;arr2[0]=hour/16;
}
if(face==2)
{
if(count2==1){shour++;}
if(count2==2){smin++;}
if(count2==3){ssec++;}
arr3[0]=shour/10;arr3[1]=shour%10;arr3[7]=ssec%10;arr3[6]=ssec/10;arr3[4]=smin%10;arr3[3]=smin/10;
}}
break;
case 4: if(flag1==1){ flag1=0;
TR1=0;
select573(4,0xff);}else{
if(face==1){
if(count1==1){ hour=(hour/16)*10+hour%16;hour--;hour=(hour/10)*16+(hour%10); }
if(count1==2){ min=(min/16)*10+min%16;min--;min=(min/10)*16+(min%10); }
if(count1==3){ sec=(sec/16)*10+sec%16;sec--;sec=(sec/10)*16+(sec%10); }
arr2[7]=sec%16;arr2[6]=sec/16;arr2[4]=min%16;arr2[3]=min/16;
arr2[1]=hour%16;arr2[0]=hour/16;
}
if(face==2)
{
if(count2==1){shour--;}
if(count2==2){smin--;}
if(count2==3){ssec--;}
arr3[0]=shour/10;arr3[1]=shour%10;arr3[7]=ssec%10;arr3[6]=ssec/10;arr3[4]=smin%10;arr3[3]=smin/10;
}
}
break;
}
}
//----------ds18b20-----------
void ds18b20()
{
uchar high,low;
uint temp=0;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high;
temp=(temp<<8)|low;
temp=temp*0.0625;
arr4[5]=(char)(temp/10);
arr4[6]=(char)(temp%10);
}
//--------------ds1302---
void init_ds1302()
{
unsigned char i=0;
Write_Ds1302_Byte( 0x8e,0x00);
for(i=0;i<3;i++)
{
Write_Ds1302_Byte(WRITE_RTC_ADDR[i],TIME[i]);
}
Write_Ds1302_Byte( 0x8e,0x80);
}
void get_time()//读时间
{
hour=Read_Ds1302_Byte(READ_RTC_ADDR[2]);
min=Read_Ds1302_Byte(READ_RTC_ADDR[1]);
sec=Read_Ds1302_Byte(READ_RTC_ADDR[0]);
arr1[7]=sec%16;
arr1[6]=sec/16;
arr1[4]=min%16;
arr1[3]=min/16;
arr1[1]=hour%16;
arr1[0]=hour/16;
}
void write_time()
{
Write_Ds1302_Byte( 0x8e,0x00);
Write_Ds1302_Byte(WRITE_RTC_ADDR[0] ,sec);
Write_Ds1302_Byte(WRITE_RTC_ADDR[1] ,min);
Write_Ds1302_Byte(WRITE_RTC_ADDR[2] ,hour);
Write_Ds1302_Byte( 0x8e,0x80);
}
//---------------------------------
void init_time()
{
TMOD=0x11;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
TL1=(65536-50000)%256;
TH1=(65536-50000)/256;
TR0=1;
EA=1;
ET0=1;
ET1=1;
}
//-----------------------
//闹钟对比
bit flag2=0;
void naozhong()
{
uchar j=0;
uchar k=0;
for(j=0;j<8;j++)
{
if(arr1[j]==arr3[j])
{
k++;
}
}
if(k==8)
{
flag1=1;
TR1=1;
}
}
//-----------------
void main()
{
init_system();
init_time();
while(1)
{
scan_key();
show_smg();
naozhong();
}
}
uchar count3,count4;
uchar led=0xff;
void ser() interrupt 1
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
//200 000
if(flag1==1){
count3++;
if(count3==4){
count3=0;
if(led&0xff==0xff)
{
led=0xfe;
select573(4,led); }
else
{
led=0xff;
select573(4,led);
}
}
}
if(face==1){
count4++;
if(count4==20)
{
count4=0;
flag=~flag;
}
}
}
uchar count5=0;
void ser1() interrupt 3
{
TL1=(65536-50000)%256;
TH1=(65536-50000)/256;
count5++;
if(count5==100)
{
count5=0;
flag1=0;
TR1=0;
select573(4,0xff);
}
}
第8届蓝桥杯单片机---电子钟
最新推荐文章于 2025-05-13 16:44:40 发布

2961

被折叠的 条评论
为什么被折叠?



