蓝桥杯单片机

DS1302模块

#include
#include
#define uchar unsigned char
#define uint unsigned int    

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
uchar yi,er,san,si,wu,liu,qi,ba;
bit s4,s5,s6,s7;
uchar num;
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
uchar Init_Time[]={50,59,23,22,1,2,24};
uchar shijian[7];

void Write_DS1302(unsigned char address ,unsigned char dat);
unsigned char Read_DS1302(unsigned char address); 
void Write_Byte(unsigned temp);
void DS1302_Init(void);
void DS1302_Get(void);

void Delayms(int ms);
void Allinit(void);
void Display1(yi,er);
void Display2(san,si);
void Display3(wu,liu);
void Display4(qi,ba);

void main(void)
{
    void Allinit();
    DS1302_Init();
    yi=0;er=8;san=10;si=5;wu=9;liu=10;qi=5;ba=0;
    while(1)
    {    
    
        DS1302_Get();
        yi=shijian[2]/10;er=shijian[2]%10;san=10;
        si=shijian[1]/10;wu=shijian[1]%10;liu=10;
    qi=shijian[0]/10;ba=shijian[0]%10;
        
        Display1(yi,er);
        Display2(san,si);
        Display3(wu,liu);
        Display4(qi,ba);    }
}


void DS1302_Init(void)    //初始化时钟
{
    unsigned char i,add;
    add=0x80;
    Write_DS1302(0x8e,0x00);
    for(i=0;i<7;i++)
    {
    Write_DS1302(add,Init_Time[i]);//写入
    add=add+2;//地址循环    
    }
    Write_DS1302(0x8e,0x80);
}
void DS1302_Get(void)    //初始化时钟
{
    unsigned char i,add;
    add=0x81;
    Write_DS1302(0x8e,0x00);
    for(i=0;i<7;i++)
    {
    shijian[i]=Read_DS1302(add);//写入
    add=add+2;//地址循环    
    }
    Write_DS1302(0x8e,0x80);
}

void Write_DS1302(unsigned char address ,unsigned char dat)//写时序
{
    RST=0;
    _nop_();
    SCK=0;
    _nop_();
    RST=1;
    Write_Byte(address);

    Write_Byte(((dat/10)<<4)|(dat%10));
}

void Write_Byte(unsigned temp)
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        SCK=0;
        SDA=temp&0x01;
        _nop_();
        _nop_();
        temp>>=1;
        _nop_();
        _nop_();
        SCK=1;
    }
}
unsigned char Read_DS1302(unsigned char address)
{
    unsigned char i,temp,dat1,dat2;
    RST=0;
    _nop_();
    SCK=0;
    _nop_();    
    RST=1;
    Write_Byte(address);
    //Read
    for(i=0;i<8;i++)
    {
        SCK=0;
     _nop_();
     _nop_();
    temp>>=1;    
    if(SDA)temp|=0x80;
    SCK=1;        
    }
    SDA=0;
    
    dat1=temp/16;
    dat2=temp%16;
    temp=dat1*10+dat2;
    
    return temp;
}

void Display1(uchar yi,uchar er)
{
    P2=0xc0;//打开控制数码管位选的573
    P0=0x01;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[yi];//
    Delayms(1);
    
    P2=0xc0;//打开控制数码管位选的573
    P0=0x02;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[er];//
    Delayms(1);    
}
void Display2(uchar san,uchar si)
{
    P2=0xc0;//打开控制数码管位选的573
    P0=0x04;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[san];//
    Delayms(1);
    
    P2=0xc0;//打开控制数码管位选的573
    P0=0x08;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[si];//
    Delayms(1);    
}
void Display3(uchar wu,uchar liu)
{
    P2=0xc0;//打开控制数码管位选的573
    P0=0x10;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[wu];//
    Delayms(1);
    
    P2=0xc0;//打开控制数码管位选的573
    P0=0x20;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[liu];//
    Delayms(1);    
}
void Display4(uchar qi,uchar ba)
{
    P2=0xc0;//打开控制数码管位选的573
    P0=0x40;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[qi];//
    Delayms(1);
    
    P2=0xc0;//打开控制数码管位选的573
    P0=0x80;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=tab[ba];//
    Delayms(1);    
}


void Allinit(void)//初始化
{
    P2=0xa0;//打开控制蜂鸣器的573
    P0=0x00;//关闭蜂鸣器继电器
    
    P2=0xc0;//打开控制数码管位选的573
    P0=0xff;//选中所有数码管
    P2=0xE0;//打开控制数码管段选的573
    P0=0xff;//关闭所有数码管
    
    P2=0x80;//打开控制LED的573
    P0=0xff;//关闭所有LED
}

void Delayms(int ms)
{
    int i,j;
    for(i=0;i     for(j=845;j>0;j--);
}    
 

你可能感兴趣的:(蓝桥杯,单片机,蓝桥杯,嵌入式硬件,c语言)