蓝桥杯单片机

本文详细介绍了如何在C语言中使用DS1302模块获取并显示时间,包括初始化时钟、写入和读取数据以及控制数码管和LED的操作。
摘要由CSDN通过智能技术生成

DS1302模块

#include <STC15F2K60S2.H>
#include <intrins.h>
#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<ms;i++)
    for(j=845;j>0;j--);
}    
 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TvT<

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值