+DS1302 +DS18B20 大字符时钟供大家学习。

电子智能时钟程序

单 片 机:STC89C52RC

晶    振:12MHz

时钟芯片:DS1302

液 晶 屏:LCM--ST7920

时    间:2019年11月26修改完成

LCM使用并口连接方式,PSB、RST接高电平    

制作出来的实物图如下:
 

电路原理图如下:
 

单片机源程序如下:

/*---------------------------------------------------------------------------

                电子智能时钟程序

                单 片 机:STC89C52RC

                晶    振:12MHz

                时钟芯片:DS1302

                液 晶 屏:LCM--ST7920

                时    间:2019年11月26修改完成

                LCM使用并口连接方式,PSB、RST接高电平    

------------------------------------------------------------------------------*/


/*-------------------------------头文件---------------------------------------*/

#include

#include

#include "LCD.h"

#include "DS1302.h"

#include "DS18B20.h"

#include "nongli.h"

#include "displaytime.h"

//#include "jieqi.h"

#define uint  unsigned int

#define uchar unsigned char


/*----------------------------定义按键---------------------------------------*/

sbit K1  = P2^3; //K1-设置  

sbit K2  = P2^2; //K2-确认、返回   

sbit K3  = P2^1; //K3-加         

sbit K4  = P2^0; //K4-减         

//sbit K5  = P3^7; //液晶背光控制按键,按一下亮,再按一下灭                 

//sbit BLK = P3^7; //液晶背光控制输出,低电平有效,PNP三极管控制。


/*---------------------函数声明------------------------------*/

void DelayM(uint);               

void ds_w(void);

void Conver_week(bit c,uchar year,uchar month,uchar day);

/*-----------------------------定义全局变量------------------------------*/

bit q=0, w=0;    //调时标志位

unsigned char yy,mo,dd,xq,hh,mm,ss,month_moon,day_moon,week,tiangan,dizhi,moontemp1,moontemp2;//定义时间映射全局变量(专用寄存器)

signed char address,item,max,mini;


/*-----------------------------延时函数 1MS/次-------------------------------*/

void DelayM(uint a)               

{

        uchar i;

        while( --a != 0) { for(i = 0; i < 125; i++); }                                      

}

/*-----------------------------日期、时间设置函数-----------------------------*/


void tiaozheng(void){

        yy = read_clock(0x8d);//调用1302时钟数据中的年数据,从地址0x8d中    

        mo = read_clock(0x89);//调用1302时钟数据中的月数据,从地址0x89中    

        dd = read_clock(0x87);//从1302芯片中读取日数据,从地址0x87中    

        week = read_clock(0x8b);//从1302芯片中读取星期数据,从地址0x8b中    

        lcm_w_test(0,0x80);


        lcm_w_word("20");//显示内容字符20

        write_data(yy/16+0x30);//函数参数1,代表本行写数据,YY/16+0X30得出年十位数字的显示码地址,送显示        

        write_data(yy%16+0x30);//函数?

        lcm_w_word("年");


        write_data(mo/16+0x30);

        write_data(mo%16+0x30);//与16取余数,得到月份的个位数,加0x30得到该数字的液晶内定显示码送显示

        lcm_w_word("月");     //调用字符显示函数,显示文字 月   


        write_data(dd/16+0x30);

        write_data(dd%16+0x30);//第一个1参数,表示本行写数据,日数据与16取余得个位数,加0x30得到显示码

        lcm_w_word("日");//显示字符 日 


        if(read_clock(0x85) != hh){  //如果程序中的小时与1302芯片中的不同,

                hh = read_clock(0x85);  //刷新程序中的小时数据   

        }

        lcm_w_test(0,0x91);//第一个参数0,表示本行写入LCM的是指令,指定显示位置91H(第三行左端)

        write_data(hh/16+0x30);  //显示十位

         

        write_data(hh%16+0x30);  //显示个位

        lcm_w_word("时");


        if(read_clock(0x83) != mm){//如果1302芯片中的分钟数据与程序中的分钟变量不相等                

                mm = read_clock(0x83);//刷新程序中的分钟数据

        }

        write_data(mm/16+0x30);//向液晶写数据,显示分钟的十位数

        write_data(mm%16+0x30);//向液晶写数据,显示分钟的个位数

        lcm_w_word("分");


        if(read_clock(0x81) != ss){//如果1302芯片中的分钟数据与程序中的秒钟变量不相等                

                ss = read_clock(0x81);//刷新程序中的秒钟数据

        }

        write_data(ss/16+0x30);//向液晶写数据,显示分钟的十位数

        write_data(ss%16+0x30);//向液晶写数据,显示分钟的个位数

        lcm_w_word("秒");         


}


/**********************************************************************************************************/

//调整时间子函数,设置键、数据范围、上调加一,下调减一功能。

void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302,函数参数是按动设置键的次数

  

        write_com(0x30); write_com(0x06);


        lcm_w_test(0,0x98);//第一参数0表示本行写入指令,指定下面行的 调整 显示起始位置为98H

        lcm_w_word("★调整");//调用字符显示函数,显示 调整字样

  

/*        if(sel==6)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;          

     tiaozheng();

     ds_w();

     tiaozheng();

          }

*/

//////////////////////////////////////////////////////////////

        if(sel==5)  {lcm_w_word("秒钟");address=0x80; max=59;mini=0;          

                tiaozheng();  //调用日期、时间调整函数

           ds_w();                  //被调数据加一或减一函数

           tiaozheng();

                                            

        }        //秒7,按动7次显示 调整秒钟   

                //并指定秒钟数据写入1302芯片的地址是0x82,秒钟数据的最大值是59,最小值是0

   /////////////////////////////////////////////////////////////////////////

        if(sel==4)  {lcm_w_word("分钟");address=0x82; max=59;mini=0;

           tiaozheng();

           ds_w();

           tiaozheng();

  

        }        //分钟6,按动6次显示 调整分钟

                //并指定分钟数据写入1302芯片的地址是0x82,分钟数据的最大值是59,最小值是0



        if(sel==3)  {lcm_w_word("小时");address=0x84; max=23;mini=0;

        /***********************************************************/

                 if(address > 12){

                                           address = address-12;        }

         /********************************************************/

            tiaozheng();

           ds_w();

           tiaozheng();

  

        }        //小时5,按动5次显示 调整小时

//规定小时数据写入1302芯片的位置是0x84,小时数据最大值23

关键字:  DS1302  DS18B20  大字符时钟