⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数码管显示时钟演示程序.c

📁 51单片机试验板-sch-pcb-4.0M.zip
💻 C
字号:

/*********************************************************************
公司名称:
模块名称:数码管显示时钟演示程序
功    能:利用实时时钟         时钟芯片型号:DS1302 
说    明:
程序设计:朱雷        
设计时间:2008.01.19       
版 本 号: V1.0
*********************************************************************/

#include<reg51.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit beep=P2^6;//
sbit aa=P2^0;  //74hc138
sbit bb=P2^1;
sbit cc=P2^2;
sbit LE1=P2^7;

sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;

sbit ds1302_RST=P1^1;
sbit ds1302_IO=P1^2;
sbit ds1302_SCLK=P1^0;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

void init();
void delay_50us(uint t);
void display();

uchar  read_Byte();
void write_Byte(uchar tdata);
void write_data_ds1302(uchar taddr,uchar tdata);
uchar read_data_ds1302(uchar taddr);
void set_ds1302(uchar *P1302);
void get_ds1302() ;

void init_ds1302();

uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,
                     0x6d,0x7d,0x07,0x7f,0x6f,0x40};
uchar  initial_time[]={0x00,0x00,0x12};
                     //  秒   分   时   日   月   周   年
uchar  data   now_time[3];



void main()
{
    init();
    init_ds1302();
    set_ds1302(initial_time);
while(1)
  {
    get_ds1302();
    display();
  }
}


/******************************************************************** 
*函 数 名:delay_50us(uchar )
*功能描述:延时
*函数说明:延时50us
*调用函数:
*全局变量:
*输    入:
*返    回:  
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/

void delay_50us(uint t)
{
  uchar j;
  for(;t>0;t--)
   for(j=19;j>0;j--);

}


/******************************************************************** 
*函 数 名:delay_50us(uchar )
*功能描述:延时
*函数说明:延时50us
*调用函数:
*全局变量:
*输    入:
*返    回:  
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/
void init()
{
  P0=0xff;
  P2=0xff;
  P1=0xff;
  
}
/*数码管显示模块部分*/

/******************************************************************** 
*函 数 名:display()
*功能描述:数码管显示
*函数说明:显示格式为:
*调用函数:
*全局变量:
*输    入:
*返    回: 
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/
void display()
{
  uchar i;  
   LE1=1;//选通hc573
 //分别依次选通数码管的位选端
   aa=1;
   bb=1;
   cc=1;
   i=now_time[0]%16;  //显示秒个
   P0=table[i];
delay_50us(20);

   aa=0;
   bb=1;
   cc=1;             
   i=now_time[0]/16;  //显示秒十
   P0=table[i];     
 delay_50us(20);

   aa=1;
   bb=0;
   cc=1;
   P0=table[10];//显示"-"
 delay_50us(20); 


   aa=0;
   bb=0;
   cc=1;
   i=now_time[1]%16;  //显示分个
   P0=table[i];
delay_50us(20);


   aa=1;
   bb=1;
   cc=0;
  i=now_time[1]/16;   //显示分十
   P0=table[i];
delay_50us(20);

   aa=0;
   bb=1;
   cc=0;
   P0=table[10]; //显示"-"
delay_50us(20);



   aa=1;
   bb=0;
   cc=0;
   i=now_time[2]%16;    //显示时个
   P0=table[i];
delay_50us(20);
   aa=0;
   bb=0;
   cc=0;
 i=now_time[2]/16;    //显示时十
   P0=table[i];
delay_50us(10);
}






/*ds1302模块部分*/

/******************************************************************** 
*函 数 名:read_Byte()
*功能描述:实时时钟读一字节
*函数说明:读DS13021Byte数据   下降沿输出一位数据
*调用函数:
*全局变量:
*输    入:ds1302_SCLK=0;
*返    回:ACC  
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/

uchar  read_Byte()
{
   uchar i;
   for(i=8;i>0;i--)
   {
     ACC=ACC>>1;
     ACC7=ds1302_IO;//由于ds1302读数据的时候,第一个数据读取在发一个Byte命令后,在第八位的下降沿
     ds1302_SCLK=1;
     ds1302_SCLK=0;//产生下降沿输出一位数据
   }
   return(ACC);
}


/******************************************************************** 
*函 数 名:write_Byte()
*功能描述:实时时钟写一字节
*函数说明:往DS1302写入1Byte数据  上升沿输入数据
*调用函数:
*全局变量:
*输    入:ds1302_SCLK=0;tdata
*返    回: 
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/
void  write_Byte(uchar tdata)
{
   uchar i;
   ACC=tdata;
   for(i=8;i>0;i--)
   {
     ds1302_IO=ACC0;
     ds1302_SCLK=1;
     ds1302_SCLK=0;//产生上升沿输入数据
     ACC=ACC>>1;
   }

}


/******************************************************************** 
*函 数 名:write_data_ds1302(uchar taddr,uchar tdata)
*功能描述:实时时钟写数据
*函数说明:先写地址,后写命令/数据
*调用函数:write_Byte(uchar tdata)
*全局变量:
*输    入:taddr;tdata
*返    回: 
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/

void write_data_ds1302(uchar taddr,uchar tdata)
{
   ds1302_RST=0;
   ds1302_SCLK=0;
   ds1302_RST=1;
   write_Byte(taddr);
   write_Byte(tdata); 
   ds1302_RST=0;
   ds1302_SCLK=1;
}

/******************************************************************** 
*函 数 名:read_data_ds1302(uchar taddr,uchar tdata)
*功能描述:读实时时钟地址里的数据
*函数说明:先写地址,后读命令/数据
*调用函数:write_Byte(uchar tdata);read_Byte()
*全局变量:
*输    入:taddr;
*返    回:tdata 
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/
uchar read_data_ds1302(uchar taddr)
{  
   uchar tdata;
    
   ds1302_RST=0;
   ds1302_SCLK=0;
   ds1302_RST=1;
   write_Byte(taddr);
   tdata=read_Byte(); 
   ds1302_RST=0;
   ds1302_SCLK=1;
   return(tdata);
}


/******************************************************************** 
*函 数 名:set_ds1302()
*功能描述:设置初始时间
*函数说明:先写地址,后读命令/数据
*调用函数:
*全局变量:
*输    入:taddr;
*返    回:tdata 
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/

void set_ds1302(uchar *P1302)
{
    uchar i;
    uchar taddr = 0x80; 
    write_data_ds1302(0x8e,0x00);           /* 控制命令,WP=0,写操作*/
    for(i =3; i>0; i--)
    { 
       write_data_ds1302(taddr,*P1302);    /* 秒 分 时 日 月 星期 年 */ 
        P1302++;
        taddr+=2;
    }
   write_data_ds1302(0x8e,0x80);           /* 控制命令,WP=1,写保护*/
}

/******************************************************************** 
*函 数 名:get_ds1302()
*功能描述:设置初始时间
*函数说明:先写地址,后读命令/数据
*调用函数:
*全局变量:
*输    入:now_time[];
*返    回:
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/

void get_ds1302() 
{
    uchar k;
    uchar taddr = 0x81;
    for (k=0; k<3.; k++)
    {
        now_time[k] = read_data_ds1302(taddr);/*格式为: 秒 分 时 日 月 星期 年 */
        taddr+= 2;
    }
}


/******************************************************************** 
*函 数 名:init_ds1302()
*功能描述:初始化ds1302
*函数说明:先写地址,后读命令/数据
*调用函数:
*全局变量:
*输    入:
*返    回:
*设    计:朱雷                 日    期:2008-01-19
*修    改:                     日    期: 
*版    本:
***********************************************************************/

void init_ds1302()
{
    ds1302_RST=0;
    ds1302_SCLK=0;
    write_data_ds1302(0x8e,0x00);
    write_data_ds1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -