//第八届电子钟
#include
#include
#include
#include
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
unsigned char count_1,tt_1;
unsigned char count,tt;
unsigned char init_time[]={50,59,23,0,0,0,0};
char time[7],time_temp[7],time_result[7];
char time_set[]={0,0,0};
unsigned char flag_yemian,flag_set,flag_set_1,flag_led;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0xc6};
unsigned char yi,er,san,si,wu,liu,qi,ba;
unsigned char wendu;
void allinit();
void delayms(int ms);
void display_12(yi,er);
void display_34(san,si);
void display_56(wu,liu);
void display_78(qi,ba);
void Timer0Init(void);
void Timer1Init(void);
void key_scan();
void ds1302_init();
void ds1302_read();
void time1();
void time2();
void time3();
void time4();
void time1_1();
unsigned char ds18b02_get();
void main(){
allinit();
ds1302_init();
Timer0Init();
Timer1Init();
EA=1;ET0=1;ET1=1;
yi=10;er=10;san=10;si=10;wu=10;liu=10;qi=10;ba=10;
while(1){
wendu=ds18b02_get();
ds1302_read();
key_scan();
//时钟显示页面
if(flag_yemian==0){
//进行时钟的换算
time_result[2]=time[2]+time_temp[2];
time_result[1]=time[1]+time_temp[1];
time_result[0]=time[0]+time_temp[0];
//进行判断,是否在边界。
time1_1();
//时钟显示
//正常
if(flag_set==0){
yi=time_result[2]/10;er=time_result[2]%10;san=10;si=time_result[1]/10;wu=time_result[1]%10;liu=10;qi=time_result[0]/10;ba=time_result[0]%10;
}
//设置时
else if(flag_set==1){
if(count==0){
yi=time_result[2]/10;er=time_result[2]%10;san=10;si=time_result[1]/10;wu=time_result[1]%10;liu=10;qi=time_result[0]/10;ba=time_result[0]%10;
}
else if(count==1){
yi=11;er=11;san=10;si=time_result[1]/10;wu=time_result[1]%10;liu=10;qi=time_result[0]/10;ba=time_result[0]%10;
}
}
//设置分
else if(flag_set==2){
if(count==0){
yi=time_result[2]/10;er=time_result[2]%10;san=10;si=time_result[1]/10;wu=time_result[1]%10;liu=10;qi=time_result[0]/10;ba=time_result[0]%10;
}
else if(count==1){
yi=time_result[2]/10;er=time_result[2]%10;san=10;si=11;wu=11;liu=10;qi=time_result[0]/10;ba=time_result[0]%10;
}
}
//设置秒
else if(flag_set==3){
if(count==0){
yi=time_result[2]/10;er=time_result[2]%10;san=10;si=time_result[1]/10;wu=time_result[1]%10;liu=10;qi=time_result[0]/10;ba=time_result[0]%10;
}
else if(count==1){
yi=time_result[2]/10;er=time_result[2]%10;san=10;si=time_result[1]/10;wu=time_result[1]%10;liu=10;qi=11;ba=11;
}
}
}
//闹钟设置
else if(flag_yemian==2){
//闹钟显示
//正常
if(flag_set_1==0){
yi=time_set[2]/10;er=time_set[2]%10;san=10;si=time_set[1]/10;wu=time_set[1]%10;liu=10;qi=time_set[0]/10;ba=time_set[0]%10;
}
//设置时
else if(flag_set_1==1){
if(count==0){
yi=time_set[2]/10;er=time_set[2]%10;san=10;si=time_set[1]/10;wu=time_set[1]%10;liu=10;qi=time_set[0]/10;ba=time_set[0]%10;
}
else if(count==1){
yi=11;er=11;san=10;si=time_set[1]/10;wu=time_set[1]%10;liu=10;qi=time_set[0]/10;ba=time_set[0]%10;
}
}
//设置分
else if(flag_set_1==2){
if(count==0){
yi=time_set[2]/10;er=time_set[2]%10;san=10;si=time_set[1]/10;wu=time_set[1]%10;liu=10;qi=time_set[0]/10;ba=time_set[0]%10;
}
else if(count==1){
yi=time_set[2]/10;er=time_set[2]%10;san=10;si=11;wu=11;liu=10;qi=time_set[0]/10;ba=time_set[0]%10;
}
}
//设置秒
else if(flag_set_1==3){
if(count==0){
yi=time_set[2]/10;er=time_set[2]%10;san=10;si=time_set[1]/10;wu=time_set[1]%10;liu=10;qi=time_set[0]/10;ba=time_set[0]%10;
}
else if(count==1){
yi=time_set[2]/10;er=time_set[2]%10;san=10;si=time_set[1]/10;wu=time_set[1]%10;liu=10;qi=11;ba=11;
}
}
}
//闹钟提醒
if(time_set[2]==time_result[2]&time_set[1]==time_result[1]&time_set[0]==time_result[0]){
flag_led=1;
tt_1=0;count_1=0;
}
display_12(yi,er);
display_34(san,si);
display_56(wu,liu);
display_78(qi,ba);
}
}
按键和定时器:
void key_scan(){
//时钟设置键
if(s7==0){
delayms(5);
if(s7==0){
flag_yemian=0;
flag_set++;
if(flag_set==4)
flag_set=0;
}
while(!s7);
flag_led=0;
flag_set_1=0;
P2=0X80;P0=0XFF;
}
//闹钟设置键
else if(s6==0){
delayms(5);
if(s6==0){
flag_yemian=2;
flag_set_1++;
if(flag_set_1==4)
flag_set_1=0;
}
while(!s6);
flag_led=0;
flag_set=0;
P2=0X80;P0=0XFF;
}
//加
else if(s5==0){
delayms(5);
if(s5==0){
if(flag_yemian==0){
//进行闹钟的换算
time1();
}
else if(flag_yemian==2)
time2();
}
while(!s5);
flag_led=0;
P2=0X80;P0=0XFF;
}
//减
else if(s4==0){
delayms(5);
if(s4==0){
if(flag_yemian==2)
time4();
else if(flag_yemian==0)
time3();
}
//按键显示温度
while(!s4){
if(flag_yemian==0&flag_set==0){
yi=11;er=11;san=11;si=11;wu=11;liu=wendu/10;qi=wendu%10;ba=12;
display_12(yi,er);
display_34(san,si);
display_56(wu,liu);
display_78(qi,ba);
}
}
flag_led=0;
P2=0X80;P0=0XFF;
}
}
//定时器0设置
void time_0() interrupt 1{
tt++;
if(tt==200){
tt=0;
count++;
if(count==2)
count=0;
}
}
//定时器1设置
void time_1() interrupt 3{
tt_1++;
if(flag_led==1){
if(tt_1==40){
tt=0;
count_1++;
if(count_1%2==0){
P2=0X80;P0=0XFF;P2=P2&0X1F;
}
else{
P2=0X80;P0=0XFE;P2=P2&0X1F;
}
if(count_1==25){
flag_led=0;
P2=0X80;P0=0XFF;P2=P2&0X1F;
}
}
}
}
时钟设置过程:
//时钟设置+
void time1(){
if(flag_set==1){
time_temp[2]++;
}
else if(flag_set==2){
time_temp[1]++;
}
else if(flag_set==3){
time_temp[0]++;
}
}
//时钟设置-
void time3(){
if(flag_set==1){
time_temp[2]--;
}
else if(flag_set==2){
time_temp[1]--;
}
else if(flag_set==3){
time_temp[0]--;
}
}
//时钟判断
void time1_1(){
if(time_result[2]>23){
time_result[2]=time_result[2]%24;
}
else if(time_result[2]<0){
time_result[2]=time_result[2]+24;
}
if(time_result[1]>59){
time_result[2]=time_result[1]/60+time_result[2];
time_result[1]=time_result[1]%60;
}
else if(time_result[1]<0){
time_result[1]=time_result[1]+60;
}
if(time_result[0]>59){
time_result[1]=time_result[0]/60+time_result[1];
time_result[0]=time_result[0]%60;
}
else if(time_result[0]<0){
time_result[0]=time_result[0]+60;
}
}
//闹钟设置+
void time2(){
if(flag_set_1==1){
time_set[2]=time_set[2]+1;
if(time_set[2]==24&(time_set[1]!=0|time_set[0]!=0))
time_set[2]=0;
if(time_set[2]>24)
time_set[2]=0;
}
else if(flag_set_1==2){
time_set[1]=time_set[1]+1;
if(time_set[1]==60&(time_set[0]!=0))
time_set[1]=0;
if(time_set[1]>60)
time_set[1]=0;
}
else if(flag_set_1==3){
time_set[0]=time_set[0]+1;
if(time_set[0]==60)
time_set[0]=0;
if(time_set[0]>60)
time_set[0]=0;
}
}
//闹钟设置-
void time4(){
if(flag_set_1==1){
time_set[2]=time_set[2]-1;
if(time_set[2]<0)
time_set[2]=23;
}
else if(flag_set_1==2){
time_set[1]=time_set[1]-1;
if(time_set[1]<0)
time_set[1]=59;
}
else if(flag_set_1==3){
time_set[0]=time_set[0]-1;
if(time_set[0]<0)
time_set[0]=59;
}
}
初始化及其他
//定时器1初始化
void Timer1Init(void)
{
AUXR |= 0x40;
TMOD &= 0x0F;
TL1 = 0x00;
TH1 = 0x28;
TF1 = 0;
TR1 = 1;
}
//定时器初始化
void Timer0Init(void)
{
AUXR |= 0x80;
TMOD &= 0xF0;
TL0 = 0x00;
TH0 = 0x28;
TF0 = 0;
TR0 = 1;
}
//时钟初始化
void ds1302_init(){
unsigned char i;
unsigned char add=0x80;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++){
Write_Ds1302_Byte(add,init_time[i]);
add=add+2;
}
Write_Ds1302_Byte(add,0x80);
}
//时钟读取
void ds1302_read(){
unsigned char i;
unsigned char add=0x81;
Write_Ds1302_Byte(0x8e,0x00);
for(i=0;i<7;i++){
time[i]=Read_Ds1302_Byte(add);
add=add+2;
}
Write_Ds1302_Byte(add,0x80);
}
//温度获取
unsigned char ds18b02_get(){
unsigned char temp,high,low;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delayms(1);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
init_ds18b20();
temp=high<<4;
temp=temp|(low>>4);
return temp;
}
//初始化
void allinit(){
P2=0XA0;P0=0X00;
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
P2=0X80;P0=0XFF;
}
void delayms(int ms){
int q,w;
for(q=0;q<ms;q++)
for(w=0;w<845;w++);
}
void display_12(yi,er){
P2=0XC0;P0=0X01;P2=0XE0;P0=seg[yi];
delayms(1);
P2=0XC0;P0=0X02;P2=0XE0;P0=seg[er];
delayms(1);
}
void display_34(san,si){
P2=0XC0;P0=0X04;P2=0XE0;P0=seg[san];
delayms(1);
P2=0XC0;P0=0X08;P2=0XE0;P0=seg[si];
delayms(1);
}
void display_56(wu,liu){
P2=0XC0;P0=0X10;P2=0XE0;P0=seg[wu];
delayms(1);
P2=0XC0;P0=0X20;P2=0XE0;P0=seg[liu];
delayms(1);
}
void display_78(qi,ba){
P2=0XC0;P0=0X40;P2=0XE0;P0=seg[qi];
delayms(1);
P2=0XC0;P0=0X80;P2=0XE0;P0=seg[ba];
delayms(1);
P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
delayms(1);
}