STC89C52+LCD12864+DS1302+DS18B20时钟原理图+源程序

2020-01-23来源: 51hei关键字:STC89C52  LCD12864  DS1302  DS18B20  时钟
STC89C52+LCD12864+DS1302 +DS18B20+PCB 时钟供大家学习。

            电子智能时钟程序
            单 片 机:STC89C52
     晶    振:12MHz
         时钟芯片:DS1302

            液 晶 屏:LCD12864


                时    间:2020年1月1日
                LCD12864使用并口连接方式,PSB、RST接高电平


140720efm5hu0becd52e03.jpg

51hei截图20191226104345.png


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


#include


#include


#include "LCD12864.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

[1] [2] [3]
关键字:STC89C52  LCD12864  DS1302  DS18B20  时钟 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic486538.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:ds1302驱动程序+lcd12864串行显示,使用结构体写,可读性更强
下一篇:12864+DS1302+DS18B20大字符时钟原理图与源程序

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC89C52RC单片机+串口+红外控制16路舵机程序
;   //串口输入C~                                mm=11;break;                        case 0x44:                       
发表于 2020-01-20
STC89C52RC单片机+串口+红外控制16路舵机程序
单片机成长之路(51基础篇) - 004 STC89C52MCU 软件系统复位
用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的8051单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。STC单片机增加了相应的硬件功能,内部的ISP/IAP控制寄存器ISP_CONTR便可以实现此功能。用户只需简单的控制ISP_CONTR特殊功能寄存器的其中两位SWBS和SWRST就可以实现系统复位。 ISP/IAP控制寄存器(ISP_CONTR)STC单片机ISP/IAP控制寄存器在特殊功能寄存器中的字节地址为E7H,不能位寻址,该寄存器用来管理和ISP/IAP相关的功能设定及是否软件复位等。单片机复位时该寄存器全部被清0。其各位的定义如表4.3.1所示
发表于 2020-01-16
单片机成长之路(51基础篇) - 004 STC89C52MCU 软件系统复位
DS3231模块配合stc89c52程序与原理图
这一阶段一直在学习宋雪松老师的书,感觉写的很棒,在普中开发板上写了DS1302的时钟(虽然很渣,自带的时钟芯片还有问题),心血来潮买了个时钟模块DS2321,买来不会用卖家提供的是Arduino的程序,源程序网上很多,但总想自己写,看了半天的DS2321时序图恍然大悟——这不是IIC时序么,赶紧把之前写的IIC文件拿过来,写了个下载进去,时钟不动,检查了一下是器件地址多加了<<1,改完走的一溜一溜的,程序名字是DS1302,因为是从1302改过来的,名字懒得改,并不是挂羊头卖狗肉可以放心食用实物图 单片机源程序如下:#include <reg52.h>#include<
发表于 2020-01-08
DS3231模块配合stc89c52程序与原理图
(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
#define Sector_size    0x0200 72 //STC89C51系列 73 #define STC89x51_EEPROM_Sector_Number     18 74 #define STC89x52_EEPROM_Sector_Number    10 75 #define STC89x53_EEPROM_Sector_Number    4 76 #define STC89x54_EEPROM_Sector_Number    90 77
发表于 2020-01-07
(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
单片机DIY小型电压表
这款电路简单制作容易的STC12C2052AD单片机0-9.9V电压表,电路简单,元件少,容易制作,PCB板为单面板,下面是制作好的实物。文后附有原理图、源程序等资料。单片机源程序如下:#include <STC12C2052AD.H>         //单片机头文件#include <intrins.h>                 //51基本运算(包括_nop_空函数)#define uchar unsigned char#define uint
发表于 2020-01-02
单片机DIY小型电压表
DS12887+lcd1602万年历仿真原理图+程序
下面是仿真原理图:51单片机驱动DS12887时钟芯片,采用lcd1602液晶屏来显示万年历源程序如下:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6;sbit wela=P2^7;sbit rs=P3^5;sbit lcden=P3^4;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit rd=P3^7;sbit s4=P3^3;sbit dsds=P1^7;sbit dsrw=P1^6;sbit dsas=P1^5;sbit dscs=P1^4;sbit
发表于 2020-02-06
DS12887+lcd1602万年历仿真原理图+程序
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved