第8届蓝桥杯单片机---电子钟

#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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值