蓝桥杯单片机学习过程记录(十六)第八届电子钟

蓝桥杯单片机学习过程记录(十六)第八届电子钟


这届做的时间好像有点久,在中间关于时钟显示页面并设置这一步停了好久,后来设置了三个变量,得出了显示较为不错的结果,稍后去研究以下大佬们的代码学习学习。
还有一个问题是定时器的问题,定时器0的定时跟时钟差不多,但是定时器1就很有问题,40次却跟200差不多,不知道哪里的问题。
内容:
数码管、小灯
独立按键、定时器
温度传感器ds18b20
时钟芯片ds1302
主函数:

//第八届电子钟
#include<STC15F2K60S2.H>
#include<intrins.h>
#include<onewire.h>
#include<ds1302.h>
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);
}
发布了35 篇原创文章 · 获赞 39 · 访问量 5305

猜你喜欢

转载自blog.csdn.net/weixin_44747240/article/details/104410917