使用1602液晶显示DS1302+s52时钟

合集下载

DS1302与液晶1602简单时钟

DS1302与液晶1602简单时钟

《单片机原理实验》考试报告题目:DS1302和1602时钟姓名:学号:班级:专业:电子信息工程指导老师:提交时间:DS1302和1602时钟***(**学院电子信息工程 ***班 **********)摘要:关键词:DS1302 ,液晶1602,89C51。

1.引言我们在日常生活中常常用到时钟来记录时间,有时候还不能准确的记录下时间,这就要用到芯片DS1302了。

时间还远远不够,因为人性化的设计自然是要清楚的显示年、月、日、星期、时间。

而在此用到的DS1302非常好的与时间进行同步,并且在掉电时不会对时间有影响,较理的考虑到了人们的思维模式,从而简单的控制了时钟,结合了常理的理论。

2.原理DS1302引脚X1 X2 32.768KHz 晶振管脚GND 地CE 复位脚I/O 数据输入/输出引脚SCLK 串行时钟Vcc1,Vcc2 电源供电管脚各引脚的功能为:Vcc1:主电源;Vcc2:备份电源。

当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。

SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。

该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。

DS1302控制字:控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。

位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。

控制字总是从最低位开始输出。

在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。

同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。

基于DS1302和LCD1602的可调数字钟

基于DS1302和LCD1602的可调数字钟

学习情境2-可调式数字钟之基于DS1302和LCD1602的可调数字钟☆点名,复习1、DS1302的引脚及其功能,以及DS1302与单片机的硬件连接?2、如何对DS1302读写数据,如何得到DS1302的时钟?☆新课讲授2.3 基于DS1302与LCD1602设计的可调数字钟上堂课程我们学会了使用DS1302,知道了如何在单片机系统中的连接,也详细的学习了如何得到DS1302的时钟,并且我们使用了16个数码管把年月日和时分秒实时地显示出来。

但数码管的显示毕竟有其自身的缺陷,现在在工业控制的各个环节,都使用液晶进行人机联系。

在日常生活中,我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通用器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED 数码管、液晶显示器。

发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中应用液晶显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。

因此,液晶显示器画质高且不会闪烁。

(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。

(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

2.3.1 LCD1602技术资料2.3.1.1 液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、可以进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉掌握51的c程序的编写6、掌握用Proteus进行系统设计仿真验证实验仪器、仪表目录1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时间和日期可调整,按键采用3个按键;至少在Proteus上调试通过。

扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在“Options for Target 1”的Output 选项中,将Create HEX Fil选项勾起来。

2、将编写的程序保存成“.C”的形式3、编译保存好的C文件,并根据提示修改程序中的错误,直到编译成功为止4、打开proteus软件,画出实验电路图5、在89C52中,载入原来已生成的HEX文档6、按下运行键,对Proteus进行软件仿真,观察运行结果原理、结果及分析一、设计方案原理与设计特点分析电子钟总的设计模块:各个模块电路原理分析:1、DS1302时钟采集模块:1.1电路原理图:1.2 DS1302分析:首先DS1302是DALLAS公司推出的涓流充电时钟芯片。

内含有一个实时时钟/日历和31字节静态RAM通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。

DS1302芯片广脚介绍:X1、X2为32.768KHz晶振管脚。

GND 为地。

基于LCD1602和DS1302的时间显示程序

基于LCD1602和DS1302的时间显示程序

/*========================================================== ==使用1602液晶显示DS1302+S51时钟+温度显示zhaojun 2007/06/29=========================================================== ===声明:1. 1602驱动程序照搬明皓的,非常好用2. DS1302驱动程序是参考网友修改而来NS1602R(16*2)模拟口线接线方式连接线图:---------------------------------------------------| LCM-----51 | LCM-----51|LCM------51 || ----------------------------------------------- || DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 || DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 || DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 || DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |---------------------------------------------------DS1302 接线图Vcc2 CLK I/O /RST| | | |---------------| 8 7 6 5 || DS1302 || || 1 2 3 4 |---------------| | | |VCC1 GND1. 脚接+5V 2,3. 脚32768HZ晶振4. 脚接地5. 脚接S51的P1.2 6. 脚接S51的P1.1 7. 接S51的P1.08. 脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容电压在2.5V以上即可维持按键说明:1. 共三个键,低电平有效2. P1.4 和P1.5 同时按:初始化3. P1.6 端口按键:选择要调整的项目4. P1.5 端口按键:增加;P1.4端口按键:减少[注:AT89S51使用12M晶振]源代码:=================定义与申明=========================================================== ==*/#include "regx51.h"#include "string.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned inttypedef unsigned char byte;typedef unsigned int word;//*********** 1602引脚定义引脚#define LCM_RS P2_0 // 数据/命令选择信号#define LCM_RW P2_1 // 读/写选择信号#define LCM_E P2_2 // 使能信号//*********** DS1302 时间显示定义部分sbit T_CLK=P1^0; //串行时钟输入sbit T_IO =P1^1; //串行数据端口sbit T_RST=P1^2; //复位端口//*********** 18B20温度显示定义部分sbit DQ=P3^3; //18B20 接P33口sbit ACC0=ACC^0;sbit ACC7=ACC^7;#define LCM_Data P0 //显示数据端口#define Busy 0x80 //用于检测LCM状态字中的Busy标识uchar id,timecount; //全局变量bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志bit sec,min,hour,year,mon,day,weekk; //闪烁标志位//*********************函数申明void Disp_line1(void); // 显示屏幕第一行void Disp_line2(void); // 显示屏幕第二行void id_case1_key(); // id为1时的下一级选择void Set(uchar,uchar); // 根据选择调整相应项目void RTInputByte(uchar); /* 输入1Byte */uchar RTOutputByte(void); /* 输出1Byte */void W1302(uchar, uchar); // 向DS1302写入一个字节uchar R1302(uchar); // 从DS1302读出一个字节void Set1302(uchar * ); // 设置时间//******* 1602LCD驱动********************************************************** void WriteDataLCM(uchar WDLCM); //写数据void WriteCommandLCM(uchar WCLCM,BuysC); //写指令uchar ReadStatusLCM(void); //读状态void LCMInit(void); //LCM初始化void DisplayOneChar(uchar X, uchar Y, uchar DData); //按指定位置显示一个字符void DisplayListChar(uchar X, uchar Y, uchar code *DData); //按指定位置显示一串字符void Delay5Ms(void); //5ms延时void Delay400Ms(void); //400ms延时Read_Temperature(char,char);//温度显示void mychar(void); //显示自定义字符void adjust_res(char res); //res 分别等于0x1f, 0x3f, 0x5f 温度读数分辨率分别对应// 0.5, 0.25, 0.125//初始化后设置为:07年07月04日星期3 12点00分00秒// 12:00:00 XX. C// 07/07/04 Week.3unsigned char inittime[7]={0x00,0x00,0x12,0x04,0x07,0x03,0x07};// 秒分钟小时日月星期年uchar code week[]={"Week."};//星期显示//========================= 主函数======================================================= /*****************************************************函数名:main()功能:主函数说明:入口参数:无返回值:无*****************************************************/void main(void){Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)mychar(); //显示自定义字符TMOD=0x01; //选择定时模式TH0=(65535-50000)/256;//取定时初值TL0=(65535-50000)%256;EA=1; //开中断TR0=1;ET0=1;W1302(0x90,0xa5); //打开充电二级管一个二级管串联一个2K电阻W1302(0x8e,0x80); //写保护,禁止写操作adjust_res(0x5f); //调整18B20的分辨率0x1f:0.5; 0x3f:0.25; 0x5f:0.125 while(1){if ((P1_4|P1_5)==0) // 初始化同时按下P1_4、P1_5{Delay5Ms(); // 适当延时,消除抖动if ((P1_4|P1_5)==0) Set1302(inittime); // 显示初始值}if (P1_6==0) // 设置和选择项目键{Delay5Ms(); // 适当延时,消除抖动if(P1_6==0){id++;if(id>7) id=0;} // 7个可调节项目循环调节while(P1_6==0);}switch(id) // 跳转到对应的项目进行设置{case 0:sec=0;Disp_line1(); Disp_line2();break;case 1: //调节年year=1;//设置年闪烁标志位Disp_line1(); Disp_line2();id_case1_key();break;case 2: //调节月year=0;mon=1;//设置月闪烁标志位Disp_line1(); Disp_line2();id_case1_key();break;case 3: //调节日mon=0;day=1;//设置日闪烁标志位Disp_line1(); Disp_line2();id_case1_key();break;case 4: //调节星期day=0;weekk=1;//设置星期闪烁标志位Disp_line1(); Disp_line2();id_case1_key();break;case 5: //调节小时weekk=0;hour=1;//设置小时闪烁标志位Disp_line1(); Disp_line2();id_case1_key();break;case 6: //调节分钟hour=0;min=1;//设置分钟闪烁标志位Disp_line1(); Disp_line2();id_case1_key();break;case 7: //调节秒min=0;sec=1;//设置秒钟闪烁标志位Disp_line1(); Disp_line2();id_case1_key();break;}}}//================================== 定时中断============================================= /*****************************************************函数名:void t0()功能:时间工作时,冒号闪烁说明:T0中断入口,方式1入口参数:无返回值:无*****************************************************/void t0(void) interrupt 1 using 0{TH0=(65535-50000)/256; //取50ms定时初值TL0=(65535-50000)%256;timecount++;if(timecount>9){timecount=0; //计时到,从先开始flag=~flag; //标志位取反}}//==================================== 项目设置=========================================== /*****************************************************函数名:void id_case1_key()功能:项目设置加减控制说明:P1.5和P1.4 <==> +和-入口参数:无返回值:无*****************************************************/ //id为1时的下一级选择void id_case1_key(){if (P1_5==0) //P1_5有按下,则数值增加(+){Delay5Ms(); //适当延时,消除抖动if(P1_5==0) Set(id,0); //根据选择调整相应项目if(id!=7) while(P1_5==0);}if (P1_4==0) //P1_4有按下,则数值减少(-){Delay5Ms(); //适当延时,消除抖动if(P1_4==0) Set(id,1); //根据选择调整相应项目if(id!=7) while(P1_4==0);}}/***************************************************** 函数名:void Set()功能:项目设置说明:sel_1=0时,数值加;sel_1=1时,数值减入口参数:sel和sel_1返回值:无*****************************************************/ //根据选择调整相应项目并写入DS1302void Set(uchar sel,uchar sel_1){signed char address,item;signed char max,mini;//偶数指令是写,奇数指令是读//最大值与最小值限定if(sel==7) {address=0x80; max=00;mini=0;} //秒if(sel==6) {address=0x82; max=59;mini=0;} //分钟if(sel==5) {address=0x84; max=23;mini=0;} //小时if(sel==3) {address=0x86; max=31;mini=1;} //日if(sel==2) {address=0x88; max=12;mini=1;} //月if(sel==1) {address=0x8c; max=99;mini=0;} //年if(sel==4) {address=0x8a; max=07;mini=1;} //星期//先从1302中读出数据,把数据转换成十进制进行加减设置;后从先转换回来写入1302中item=R1302(address+1)/16*10+R1302(address+1)%16;//从1302中读出1字节,再转换成十进制if (sel_1==0) item++; else item--; //sel_1=0则加,sel_1=1则减if(item>max) item=mini; //大于最大值,则赋最小值(循环)if(item<mini) item=max; //小于最小值,则赋最大值(循环)W1302(0x8e,0x00); //允许写操作W1302(address,item/10*16+item%10);//把调节好的十进制数据转换成十六进制后写入1302中W1302(0x8e,0x80); //写保护,禁止写操作}//========================================================== =============================/*****************************************************函数名:void Disp_line1()功能:显示时间和温度(XX:XX:XX XX.X C)说明:第一行显示数据处理入口参数:无返回值:无*****************************************************///屏幕显示第一行: 时间和温度显示void Disp_line1(void){Read_Temperature(10,0); //温度显示//冒号闪烁if(flag==0){DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);} else{DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}if(sec==1) //秒闪烁标志位{if(flag==1){DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒十位DisplayOneChar(8,0,R1302(0x81)%16+0x30); //显示秒个位}else{DisplayOneChar(7,0,0x20); //显示秒十位DisplayOneChar(8,0,0x20); //显示秒个位}}else{DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒十位DisplayOneChar(8,0,R1302(0x81)%16+0x30); //显示秒个位}if(min==1) //分钟闪烁标志位{if(flag==1){DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟十位DisplayOneChar(5,0,R1302(0x83)%16+0x30); //显示分钟个位}else{DisplayOneChar(4,0,0x20); //显示分钟十位DisplayOneChar(5,0,0x20); //显示分钟个位}}else{DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟十位DisplayOneChar(5,0,R1302(0x83)%16+0x30); //显示分钟个位}if(hour==1) //小时闪烁标志位{if(flag==1){DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时十位DisplayOneChar(2,0,R1302(0x85)%16+0x30);//显示小时个位}else{DisplayOneChar(1,0,0x20); //显示小时十位DisplayOneChar(2,0,0x20); //显示小时个位}}else{DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时十位DisplayOneChar(2,0,R1302(0x85)%16+0x30);//显示小时个位}}/*****************************************************函数名:void Disp_line2()功能:显示日期和星期(XX/XX/XX Week.X)说明:第二行显示数据处理入口参数:无返回值:无*****************************************************/// 屏幕显示第二行日期和星期void Disp_line2(void){DisplayOneChar(3,1,0x2f); //显示固定字符DisplayOneChar(6,1,0x2f);DisplayListChar(10,1,week);if(year==1) //年闪烁标志位{if(flag==1){DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年十位DisplayOneChar(2,1,R1302(0x8d)%16+0x30);//显示年个位}else{DisplayOneChar(1,1,0x20); //显示年十位DisplayOneChar(2,1,0x20); //显示年个位}}else{DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年十位DisplayOneChar(2,1,R1302(0x8d)%16+0x30);//显示年个位}if(mon==1) //月闪烁标志位{if(flag==1){DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月十位DisplayOneChar(5,1,R1302(0x89)%16+0x30);//显示月个位}else{DisplayOneChar(4,1,0x20); //显示月十位DisplayOneChar(5,1,0x20); //显示月个位}}{DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月十位DisplayOneChar(5,1,R1302(0x89)%16+0x30);//显示月个位}if(day==1) //日闪烁标志位{if(flag==1){DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日十位DisplayOneChar(8,1,R1302(0x87)%16+0x30);//显示日个位}else{DisplayOneChar(7,1,0x20); //显示日十位DisplayOneChar(8,1,0x20); //显示日个位}}else{DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日十位DisplayOneChar(8,1,R1302(0x87)%16+0x30);//显示日个位}if(weekk==1) //星期闪烁标志位{if(flag==1){DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期}else{DisplayOneChar(15,1,0x20); //显示星期}}{DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期}}//================================ LCM1602控制部分=======================================/*****************************************************函数名:void WriteDataLCM()功能:向LCM1602中写入数据说明:将形参WDLCM中的数据写入LCM中入口参数:WDLCM返回值:无*****************************************************///写数据void WriteDataLCM(uchar WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;//写入数据到LCMLCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/*****************************************************函数名:void WriteCommandLCM()功能:向LCM1602中写入指令说明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测入口参数:WCLCM,BuysC返回值:无*****************************************************///写指令void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM; //写入指令LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}/*****************************************************函数名:uchar ReadStatusLCM()功能:读状态说明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替入口参数:无返回值:LCM_Data*****************************************************///读状态uchar ReadStatusLCM(void){LCM_Data = 0xFF; //LCM数据口先置1LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); //检测忙信号.如果忙,则不执行return(LCM_Data);//不忙返回读取数据}/*****************************************************函数名:void LCMInit()功能:初始化LCM1602说明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作入口参数:无返回值:五*****************************************************///LCM初始化void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); // 三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0); // 0x38指令表示:8位数据显示模式,俩行多显示Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); // 显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); // 关闭显示WriteCommandLCM(0x01,1); // 显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置}/*****************************************************函数名:void DisplayOneChar()功能:按指定坐标中写入数据说明:X-横坐标,Y-纵坐标入口参数:X,Y,DData返回值:*****************************************************///按指定位置显示一个字符void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x01;X &= 0x0F; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码WriteDataLCM(DData);}/*****************************************************函数名:void DisplayListChar()功能:向指定坐标中写入字符串说明:X-横坐标,Y-纵坐标入口参数:X,Y,*DData返回值:*****************************************************///按指定位置显示一串字符***原来的遇到空格0x20就不显示***void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength,j;ListLength = strlen(DData);//strlen:读取字符串的长度Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (X <= 0xF) //X坐标应小于0xF{for(j=0;j<ListLength;j++){DisplayOneChar(X, Y, DData[j]); //显示单个字符X++;//横坐标加1,纵坐标不变}}}//=================================== 自定义字符==========================================/*****************************************************函数名:void mychar()功能:自定义字符--CGRAM说明:LCM1602字符库中没有温度符号,自定义温度符号入口参数:无返回值:无定义形式:1602中定义CGRAM的形式如下:---------------------------------------------------------------------------| CGRAM地址设置| 自定义的代码|| DB7 DB6 | DB5 DB4 DB3 | DB2 DB1 DB0 | DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 || 0 1 | 0 0 0 | X X X | 0 0 0 0 * 0 0 0 || 0 1 | 0 0 1 | X X X | 0 0 0 0 * 0 0 1 || ... | ... | ... | ... ... || 0 1 | 1 1 0 | X X X | 0 0 0 0 * 1 1 0 || 0 1 | 1 1 1 | X X X | 0 0 0 0 * 1 1 1 |---------------------------------------------------------------------------1. 1602共能定义8个5x8字符;2. CGRAM地址设置: X X X--DB2 DB1 DB0对应写入地址,1~8行;DB5 DB4 DB3对应自定义字符代码;DB7 DB6为指令码,不可变.3. 自定义的代码: 高4位DB7 DB6 DB5 DB4为0000时它的低3位DB2 DB1 DB0对应于第1-8个,DB3为无关项。

时钟DS1302在液晶1602显示程序

时钟DS1302在液晶1602显示程序

#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="ziye334"; uchar code table1[]="0123456789"; uchar code table2[]="DAY-";sbit rs=P2^5;sbit rw=P2^6;sbit en=P2^7;sbit rst=P1^7;sbit io=P3^5;sbit clk=P1^6;sbit ACC0=ACC^0;sbit ACC7=ACC^7;sbit key1=P1^0;sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit key5=P1^4;uchar num;uchar t_sec,sec1,sec2;uchar t_min,min1,min2;uchar t_hr,hr1,hr2;uchar t_mon,mon1,mon2; uchar t_date,date1,date2; uchar t_year,year1,year2; uchar t_day,day1,flag;void input_1byte(uchar TD) {uchar i;ACC=TD;for(i=8;i>0;i--){io=ACC0;clk=1;clk=0;ACC=ACC>>1;}}uchar output_1byte(void) {uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=io;clk=1;clk=0;}return(ACC);}void write_ds1302(uchar add,uchar dat) {rst=0;clk=0;rst=1;input_1byte(add);input_1byte(dat);clk=1;rst=0;}uchar read_ds1302(uchar add){uchar inf;rst=0;clk=0;input_1byte(add);inf=output_1byte();clk=1;rst=0;return(inf);}void delay(uchar z) //延时{uint x,y;for(x=110;x>0;x--)for(y=z;z>0;z--);}void write_com(uchar com) //写指令{rs=0;rw=0;en=0;P0=com;delay(5);en=1;delay(5);}void write_date(uchar date) //写数据{rs=1;rw=0;en=0;P0=date;delay(5);en=1;delay(5);en=0;}void init_lcd(){en=0;write_com(0x38); //显示write_com(0x0c); //光标不显示write_com(0x06); //指针加1,整屏不移动write_com(0x01); //清屏write_com(0x80);}void init_1302(){write_ds1302(0x8e,0x00);//关闭写保护write_ds1302(0x90,0xaa); //定义充电write_ds1302(0x80,0x30); //秒write_ds1302(0x82,0x59);//分write_ds1302(0x84,0x23);//时write_ds1302(0x86,0x31);//日write_ds1302(0x88,0x12);//月write_ds1302(0x8a,0x04);//星期write_ds1302(0x8c,0x11);//年write_ds1302(0x8e,0x80);//打开写保护}void display(){t_sec=read_ds1302(0x81);sec1=t_sec&0x0f;sec2=(t_sec>>4);t_min=read_ds1302(0x83);min1=t_min&0x0f;min2=(t_min>>4);t_hr=read_ds1302(0x85); hr1=t_hr&0x0f;hr2=(t_hr>>4);t_date=read_ds1302(0x87); date1=t_date&0x0f;date2=(t_date>>4);t_mon=read_ds1302(0x89); mon1=t_mon&0x0f;mon2=(t_mon>>4);t_day=read_ds1302(0x8b); day1=t_day&0x0f;t_year=read_ds1302(0x8d); year1=t_year&0x0f;year2=(t_year>>4);write_com(0x80+0x4e);write_date(table1[sec2]); write_com(0x80+0x4f); write_date(table1[sec1]); write_com(0x80+0x4d); write_date(':');write_com(0x80+0x4c); write_date(table1[min1]); write_com(0x80+0x4b); write_date(table1[min2]); write_com(0x80+0x4a); write_date(':');write_com(0x80+0x49); write_date(table1[hr1]); write_com(0x80+0x48); write_date(table1[hr2]);write_com(0x80+0x0f); write_date(table1[date1]); write_com(0x80+0x0e); write_date(table1[date2]);write_com(0x80+0x0d);write_date('/');write_com(0x80+0x0c);write_date(table1[mon1]);write_com(0x80+0x0b);write_date(table1[mon2]);write_com(0x80+0x0a);write_date('/');write_com(0x80+0x09);write_date(table1[year1]);write_com(0x80+0x08);write_date(table1[year2]);write_com(0x80+0x40+5);write_date(table1[day1]); }void main(){init_lcd();delay(5);init_1302();delay(5);for(num=0;num<7;num++) {write_date(table[num]);delay(10);}write_com(0x80+0x41);for(num=0;num<4;num++) {write_date(table2[num]);delay(10);}while(1){if(flag==0){display();}}}。

LCD1602显示DS1302时钟时间

LCD1602显示DS1302时钟时间

/******************************************************************* DS1302ºÍLCD1602£¬C51µ¥Æ¬»úCÓïÑÔ*****************************************************************/ #include<AT89x51.h>#define uchar unsigned char/**********DS1302******************/#define write_second 0x80#define write_minute 0x82#define write_hour 0x84#define read_second 0x81#define read_minute 0x83#define read_hour 0x85#define write_day 0x86#define read_day 0x87#define write_month 0x88#define read_month 0x89#define write_week 0x8A#define read_week 0x8B#define write_year 0x8C#define read_year 0x8D#define write_protect 0x8E/******DS1302*************/sbit ACC_7=ACC^7;sbit SCLK =P1^2;sbit DIO =P1^3;sbit CE =P1^4;sbit P3_add=P3^0;sbit P3_OK =P3^1;//////LCD1602//////////////#define LCD_DB P0sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;/******¶¨Ò庯Êý****************/#define uchar unsigned char#define uint unsigned intvoid LCD_init(void);//ÉùÃ÷³õʼ»¯º¯Êývoid LCD_write_command(uchar command);//дָÁÊývoid LC D_write_data(uchar dat);//дÊý¾Ýº¯Êývoid delay_n40us(uint n);//ÑÓʱº¯Êý//*******³õʼ»¯º¯Êý***************void LCD_init(void){LCD_write_command(0x38);//ÉèÖÃ8λ¸ñʽ£¬2ÐУ¬5x7LCD_write_command(0x0c);//ÕûÌåÏÔʾ£¬¹Ø¹â±ê£¬²»ÉÁ˸LCD_write_command(0x06);//É趨ÊäÈ뷽ʽ£¬ÔöÁ¿²»ÒÆλ--------------LCD_write_command(0x01);//Çå³ýÆÁÄ»ÏÔʾ----------------delay_n40us(100);//ʵ¼ùÖ¤Ã÷£¬ÎÒµÄLCD1602ÉÏ£¬ÓÃfor Ñ»·200 ´Î¾ÍÄÜ¿É¿¿Íê³ÉÇåÆÁÖ¸Áî¡£}//********дָÁÊý***********ÉèÖÃÏÈÏò1602дÈëµÄÊý¾ÝΪµØÖ·*void LCD_write_command(uchar dat){LCD_DB=dat;LCD_RS=0;//Ö¸ÁîLCD_RW=0;//дÈëLCD_E=1;//ÔÊÐíLCD_E=0;//²úÉúϽµÑØdelay_n40us(1);//ʵ¼ùÖ¤Ã÷£¬ÎÒµÄLCD1602 ÉÏ£¬ÓÃfor Ñ»·1 ´Î¾ÍÄÜÍê³ÉÆÕͨдָÁî¡£}//дÈë×Ö·û´®º¯Êývoid writeDataLcd(unsigned ch ar dat)// дÈëÊý¾Ý{LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_DB = dat;LCD_E=1;delay_n40us(10);LCD_E=0;}//********ÑÓʱº¯Êý***************void delay_n40us(uint n){ uint i;uchar j;for(i=n;i>0;i--)for(j=0;j<2;j++); //ÔÚÕâ¸öÑÓʱѻ·º¯ÊýÖÐÎÒÖ»×öÁË2´ÎÑ»·}//**********DS1302*************************//void write1302(unsigned char addr,dat){unsigned char i,temp;CE=0;SCLK=0;CE=1;for(i=0;i<8;i++) //????{SCLK=0;temp=addr;if(temp&0x01==0x01)DIO=1;elseDIO=0;addr>>=1;SCLK=1;}for(i=0;i<8;i++) //????{SCLK=0;temp=dat;if(temp&0x01==0x01)DIO=1;elseDIO=0;dat>>=1;SCLK=1;}}unsigned char read1302(unsigned char addr) {unsigned char i,temp;CE=0;SCLK=0;CE=1;for(i=8;i>0;i--)//?????????{SCLK =0;temp =addr;if(temp&0x01==0x01)DIO=1;elseDIO=0;addr>>=1;SCLK=1;}for(i=8;i>0;i--)//???{ACC_7=DIO;SCLK=1;ACC>>=1;SCLK=0; //???????}CE=0;return(ACC);}///////////////////////////////////// void Initial(void){write1302(write_protect,0x00);write1302(write_second,0x56);write1302(write_minute,0x34);write1302(write_hour,0x12);write1302(write_protect,0x80);}//*********Ö÷º¯Êý*****************void main(void){uint i;uchar sec,min,hour,week,year,month,day;EA=1;EX0=1;Initial();LCD_init();write1302(write_hour,0x23);write1302(write_minute,0x58);write1302(write_year,15);write1302(write_month,11);write1302(write_day,20);write1302(write_week,5);while(1){sec=read1302(read_second);min=read1302(read_minute);hour=read1302(read_hour);week= read1302(read_week);year =read1302(read_year);month= read1302(read_month);day=read1302(read_day);LCD_write_command(0x80);writeDataLcd(0x00);if(hour<12)writeDataLcd(0x41);elsewriteDataLcd(0x70);writeDataLcd(0x6d);writeDataLcd(0x3a);writeDataLcd(0x30+(0x03 & (hour>>4))); writeDataLcd(0x30+(0x0f & hour)); writeDataLcd(0x3a);writeDataLcd(0x30+(0x07 & (min>>4)));writeDataLcd(0x30+(0x0f & min));writeDataLcd(0x3a);writeDataLcd(0x30+(0x07 & (sec>>4))); writeDataLcd(0x30+(0x0f & sec)); writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x30+week);for(i=0;i<49;i++)writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x00);writeDataLcd(0x32);writeDataLcd(0x30);writeDataLcd(0x30+year/10); writeDataLcd(0x30+year%10); writeDataLcd(0x2d);writeDataLcd(0x30+month/10);writeDataLcd(0x30+month%10);writeDataLcd(0x2d); writeDataLcd(0x30+day/10); writeDataLcd(0x30+day%10);}}void intsvr0(void) interrupt 0 using 3 {}。

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计的电子钟

以DS1302实时时钟芯片和液晶显示屏CD1602实验目的:1、能够以DS1302实时时钟芯片和液晶显示屏CD1602为基础设计一款电子钟2、熟悉DS1302芯片的工作过程3、熟悉CD1602芯片的工作过程4、能够进行必要的扩展,如用第三DS18B20新品进行温度采集和显示5、熟悉把握51的c程序的编写6、把握用Proteus进行系统设计仿真验证实验仪器、外表名目1、DS1302实时时钟芯片1片2、LCD1602液晶显示屏1个,3、80C52芯片1片5、DS18B20芯片一片6、晶振、电容、电阻、开关各若干等7、proteus仿真软件8、Keil C51、PC机实验设计任务以DS1302实时时钟芯片和液晶显示屏LCD1602为基础设计一个电子钟,要求:时刻和日期可调整,按键采纳3个按键;至少在Proteus上调试通过。

扩展:闹钟和重要日期提醒功能(增加蜂鸣器),闹铃音乐功能实验步骤1、打开Keil软件,新建一个工程文件,选择好芯片,并记得在“Opti ons for Target 1”的Output选项中,将Create HEX Fil选项勾起来。

2、将编写的程序储存成“.C”的形式3、编译储存好的C 文件,并按照提示修改程序中的错误,直到编译成功为止4、打开proteus 软件,画出实验电路图5、在89C52中,载入原先已生成的HEX 文档6、按下运行键,对Proteus 进行软件仿真,观看运行结果 原理、结果及分析一、设计方案原理与设计特点分析 电子钟总的设计模块:各个模块电路原理分析: 1、DS1302时钟采集模块: 1.1电路原理图:1.2 DS1302分析:第一DS1302是DALLAS 公司推出的涓流充电时钟芯片。

内含有一个实时时钟/日历和31字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作。

DS1302芯片广脚介绍:X1、X2为32.768KHz 晶振管脚。

基于DS1302和LCD1602的可调数字钟

基于DS1302和LCD1602的可调数字钟

学习情境2-可调式数字钟之基于DS1302和LCD1602的可调数字钟☆点名,复习1、DS1302的引脚及其功能,以及DS1302和单片机的硬件连接?2、如何对DS1302读写数据,如何得到DS1302的时钟?☆新课讲授2.3 基于DS1302和LCD1602设计的可调数字钟上堂课程我们学会了使用DS1302,知道了如何在单片机系统中的连接,也详细的学习了如何得到DS1302的时钟,并且我们使用了16个数码管把年月日和时分秒实时地显示出来。

但数码管的显示毕竟有其自身的缺陷,现在在工业控制的各个环节,都使用液晶进行人机联系。

在日常生活中,我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通用器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED 数码管、液晶显示器。

发光管和LED数码管比较常用,软硬件都比较简单,在单片机系统中使用液晶显示器作为输出器件有以下几个优点:(1)显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。

因此,液晶显示器画质高且不会闪烁。

(2)数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

(3)体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。

(4)功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

2.3.1 LCD1602技术资料2.3.1.1 液晶显示简介1、液晶显示原理:液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛使用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

基于DS1302和LCD1602的万年历-闹钟-时钟-用开发版直接显示的程序---副本

基于DS1302和LCD1602的万年历-闹钟-时钟-用开发版直接显示的程序---副本

实时时钟芯片DS1302应用,DS18B20应用实例——可调时钟,LCD1602显示:(时间+温度)说明:需要按程序中定义的接口。

按自己接口,只要在程序中修改接口定义即可。

1、DS1302引脚排列:如下图引脚说明:1)Vcc1:后备电源,VCC2:主电源。

在主电源关闭的情况下,也能保持时钟的连续运行。

DS1302由Vcc1或Vcc2两者中的较大者供电。

当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。

当Vcc2小于Vcc1时,DS1302由Vcc1供电。

2)X1、X2:振荡源,外接32.768kHz 晶振。

3)RST:复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。

RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。

当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。

如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。

上电运行时,在Vcc>2.0V之前,RST必须保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

4)I/O为串行数据输入输出端(双向)。

5)SCLK为时钟输入端。

2、DS1302的控制字节DS1302 的控制字如下图所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

3、数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302实时时钟模块,1602显示

DS1302实时时钟模块,1602显示

/*******************说明:**************************将实时时钟数据通过LCD1602显示--------------------------------------------------基于51单片机**************************************************/#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar dis_time_buf[16]={0};//LCD1602引脚定义//采用8位并行方式,DB0~DB7连接至LCDDATA0~LCDDATA7 sbit RS=P2^0;sbit RW=P2^1;sbit CS=P2^2;#define LCDDATA P0//DS1302引脚定义sbit RST=P1^3;sbit IO=P1^2;sbit SCK=P1^1;//DS1302地址定义#define ds1302_sec_add 0x80 //秒数据地址#define ds1302_min_add 0x82 //分数据地址#define ds1302_hr_add 0x84 //时数据地址#define ds1302_date_add 0x86 //日数据地址#define ds1302_month_add 0x88 //月数据地址#define ds1302_day_add 0x8a //星期数据地址#define ds1302_year_add 0x8c //年数据地址#define ds1302_control_add 0x8e //控制数据地址#define ds1302_charger_add 0x90#define ds1302_clkburst_add 0xbe//初始时间定义uchar time_buf[8] = {0x20,0x10,0x06,0x01,0x23,0x59,0x55,0x02};//初始时间2010年6月1号23点59分55秒星期二//功能:延时1毫秒//入口参数:x//出口参数:无//说明:当晶振为12M时,j<112;当晶振为11.0592M时,j<122void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<112;j++);}//功能:12us延时//STC89C52为1T单片机,即1个时钟/机器周期,速度为AT89C52的12倍void Delay_xus(uint t){for(;t>0;t--){_nop_();}}//控制LCD写时序void LCD_en_write(void){CS=1;Delay_xus(20);CS=0;Delay_xus(20);}//写指令函数void Write_Instruction(uchar command){RS=0;CS=1;LCDDATA=command;LCD_en_write();//写入指令数据}//写数据函数void Write_Data(uchar Wdata){RS=1;RW=0;CS=1;LCDDATA=Wdata;LCD_en_write();//写入数据}//字符显示初始地址设置void LCD_SET_XY(uchar X,uchar Y){uchar address;if(Y==0)address=0x80+X;//Y=0,表示在第一行显示,地址基数为0x80address=0xc0+X;//Y非0时,表时在第二行显示,地址基数为0xC0 Write_Instruction(address);//写指令,设置显示初始地址}//在第X行Y列开始显示Wdata所对应的单个字符void LCD_write_char(uchar X,uchar Y,uchar Wdata){LCD_SET_XY(X,Y);//写地址Write_Data(Wdata);//写入当前字符并显示}//清屏函数void LCD_clear(void){Write_Instruction(0x01);Delay_xms(5);}//显示屏初始化函数void LCD_init(void){Write_Instruction(0x38); //8bit interface,2line,5*7dots Delay_xms(5);Write_Instruction(0x38);Delay_xms(5);Write_Instruction(0x38);Write_Instruction(0x08); //关显示,不显光标,光标不闪烁Write_Instruction(0x01); //清屏Delay_xms(5);Write_Instruction(0x04); //写一字符,整屏显示不移动//Write_Instruction(0x05); //写一字符,整屏右移//Write_Instruction(0x06); //写一字符,整屏显示不移动//Write_Instruction(0x07); //写一字符,整屏左移Delay_xms(5);//Write_Instruction(0x0B); //关闭显示(不显示字符,只有背光亮)Write_Instruction(0x0C); //开显示,光标、闪烁都关闭//Write_Instruction(0x0D); //开显示,不显示光标,但光标闪烁//Write_Instruction(0x0E); //开显示,显示光标,但光标不闪烁//Write_Instruction(0x0F); //开显示,光标、闪烁均显示}//DS1302初始化函数void ds1302_init(void){RST=0; //RST脚置低SCK=0; //SCK脚置低}//向DS1302写入一字节数据void ds1302_write_byte(uchar addr, uchar d){uchar i;RST=1; //启动DS1302总线//写入目标地址:addraddr = addr & 0xFE; //最低位置零,寄存器0位为0时写,为1时读for (i = 0; i < 8; i ++) {if (addr & 0x01) {IO=1;}else {IO=0;}SCK=1; //产生时钟SCK=0;addr = addr >> 1;}//写入数据:dfor (i = 0; i < 8; i ++) {if (d & 0x01) {IO=1;}else {IO=0;}SCK=1; //产生时钟SCK=0;d = d >> 1;}RST=0; //停止DS1302总线}//从DS1302读出一字节数据uchar ds1302_read_byte(uchar addr) {uchar i,temp;RST=1; //启动DS1302总线//写入目标地址:addraddr = addr | 0x01; //最低位置高,寄存器0位为0时写,为1时读for (i = 0; i < 8; i ++) {if (addr & 0x01) {IO=1;}else {IO=0;}SCK=1;SCK=0;addr = addr >> 1;}//输出数据:tempfor (i = 0; i < 8; i ++) { temp = temp >> 1;if (IO) {temp |= 0x80;}else {temp &= 0x7F;}SCK=1;SCK=0;}RST=0; //停止DS1302总线return temp;}//向DS302写入时钟数据void ds1302_write_time(void){ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护ds1302_write_byte(ds1302_sec_add,0x80); //暂停时钟//ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电ds1302_write_byte(ds1302_year_add,time_buf[1]); //年ds1302_write_byte(ds1302_month_add,time_buf[2]); //月ds1302_write_byte(ds1302_date_add,time_buf[3]); //日ds1302_write_byte(ds1302_hr_add,time_buf[4]); //时ds1302_write_byte(ds1302_min_add,time_buf[5]); //分ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒ds1302_write_byte(ds1302_day_add,time_buf[7]); //周ds1302_write_byte(ds1302_control_add,0x80); //打开写保护}//从DS302读出时钟数据void ds1302_read_time(void){time_buf[1]=ds1302_read_byte(ds1302_year_add); //年time_buf[2]=ds1302_read_byte(ds1302_month_add); //月time_buf[3]=ds1302_read_byte(ds1302_date_add); //日time_buf[4]=ds1302_read_byte(ds1302_hr_add); //时time_buf[5]=ds1302_read_byte(ds1302_min_add); //分time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59time_buf[7]=ds1302_read_byte(ds1302_day_add); //周}void Display(void){LCD_write_char(3,0,dis_time_buf[0]+'0');LCD_write_char(4,0,dis_time_buf[1]+'0');LCD_write_char(5,0,dis_time_buf[2]+'0');LCD_write_char(6,0,dis_time_buf[3]+'0');LCD_write_char(7,0,'/');LCD_write_char(9,0,dis_time_buf[5]+'0'); LCD_write_char(10,0,'/');LCD_write_char(11,0,dis_time_buf[6]+'0');LCD_write_char(12,0,dis_time_buf[7]+'0');LCD_write_char(15,0,dis_time_buf[14]+'0'); //第2行显示LCD_write_char(3,1,dis_time_buf[8]+'0'); LCD_write_char(4,1,dis_time_buf[9]+'0'); LCD_write_char(5,1,':');LCD_write_char(7,1,dis_time_buf[11]+'0');LCD_write_char(8,1,':');LCD_write_char(9,1,dis_time_buf[12]+'0');LCD_write_char(10,1,dis_time_buf[13]+'0');}//定时器中断函数void Timer2() interrupt 5 //定时器2是5号中断{static uchar t;TF2=0;t++;if(t==4) //间隔200ms(50ms*4)读取一次时间{t=0;ds1302_read_time(); //读取时间dis_time_buf[0]=(time_buf[0]>>4); //年dis_time_buf[1]=(time_buf[0]&0x0f);dis_time_buf[2]=(time_buf[1]>>4);dis_time_buf[3]=(time_buf[1]&0x0f);dis_time_buf[4]=(time_buf[2]>>4); //月dis_time_buf[5]=(time_buf[2]&0x0f);dis_time_buf[6]=(time_buf[3]>>4); //日dis_time_buf[7]=(time_buf[3]&0x0f);dis_time_buf[14]=(time_buf[7]&0x07); //星期//第2行显示dis_time_buf[8]=(time_buf[4]>>4); //时dis_time_buf[9]=(time_buf[4]&0x0f);dis_time_buf[10]=(time_buf[5]>>4); //分dis_time_buf[11]=(time_buf[5]&0x0f);dis_time_buf[12]=(time_buf[6]>>4); //秒dis_time_buf[13]=(time_buf[6]&0x0f);}}//定时器2初始化void Init_timer2(void){RCAP2H=0x3c;//赋T2初始值0x3cb0,溢出20次为1秒,每次溢出时间为50ms RCAP2L=0xb0;TR2=1; //启动定时器2ET2=1; //打开定时器2中断EA=1; //打开总中断}//主函数void main(void)Delay_xms(50);//等待系统稳定LCD_init(); //LCD初始化LCD_clear(); //清屏ds1302_init(); //DS1302初始化Delay_xms(10);ds1302_write_time(); //写入初始值Init_timer2(); //定时器2初始化while(1){Display();}}。

DS1302电子时钟1602液晶显示

DS1302电子时钟1602液晶显示

DS1302电子时钟1602液晶显示#include#define uchar unsigned char#define uint unsigned intsbit RS=P2^2; //1602液晶显示器456管脚sbit RW=P2^3;sbit EN=P2^4;sbit SCLK=P1^0; //1302时钟芯片756管脚sbit IO=P1^1;sbit RST=P1^2;uchar time[]=" ";uchar time1[]=" ";uchar time2[2]="--";uchar time3[2]="::";uchar miao,fen,shi,ri,yue,nian,xingqi;void delay(uchar x) //延时{uint i,j;for(i=0;i<x;i++)for(j=0;j<20;j++);}void write_com(uchar com) //写指令{RS=0;RW=0;P0=com; //写指令码delay(1);EN=1; //高脉冲delay(1);EN=0;}void write_dat(uchar dat) //写数据{RS=1;RW=0;P0=dat; //写数据delay(1);EN=1; //高脉冲delay(1);EN=0;}void lcd_init(){write_com(0x38); //初始化液晶write_com(0x0c); //显示开关;不显示光标;光标不闪烁write_com(0x06); //指针+1光标+1;整屏显示不移动write_com(0x01); //显示清屏}void write1302_byte(uchar temp) //传输时钟数据{uchar i;SCLK=0; //初始时钟线置为0delay(1);for(i=0;i<8;i++) //开始传输8个字节的数据{IO=temp&0x01; //取最低位,注意DS1302的数据和地址都是从最低位开始传输的delay(1);SCLK=1; //时钟线拉高,制造上升沿,IO的数据被传输delay(1);SCLK=0; //时钟线被拉低,为下一个上升沿做准备temp=temp>>1; //数据右移一位,准备传输下一位数据}}uchar read1302_byte() //读取时钟数据{uchar i,temp;for(i=0;i<8;i++){temp=temp>>1; //要返回的数据左移一位if(IO==1) //当数据线为高时,证时该位数据为1temp=temp|0x80; //要传输数据的当前值为1,若不是,则为0 SCLK=1; //拉高时钟线delay(1);SCLK=0; //制造下降沿 ,IO的数据被传输delay(1);}return temp; //返回读取的数据}uchar read1302(uchar com) //{uchar dat;RST=0; //初始CE线置为0SCLK=0; //初始时钟线置为0RST=1; //初始CE线置为1,传输开始write1302_byte(com); //传输命令字,要读取的时间/日历地址dat=read1302_byte(); //读取要得到的时间/日期SCLK=1; //时钟线拉高RST=0; //读取结束,CE置为0,结束数据的传输return dat; //返回得到的时间/日期}void write1302(uchar com,uchar dat)//写入的时间/日历{RST=0; //初始CE线置为0SCLK=0; //初始时钟线置为0RST=1; //初始CE线置为1,传输开始write1302_byte(com);//传输命令字,要写入的时间/日历write1302_byte(dat);//写入要修改的时间/日期SCLK=1; //时钟线拉高RST=0; //写入结束,CE置为0,结束数据的传输}void init_1302(){write1302(0x8e,0x00); //关保护write1302(0x80,0x00); //0的话开起秒write1302(0x80,0x35); //秒</x;i++)write1302(0x82,0x00); //分write1302(0x84,0x08); //时write1302(0x86,0x11); //日write1302(0x88,0x01); //月write1302(0x8a,0x01); //星期write1302(0x8c,0x16); //年write1302(0x8e,0x80); //开保护}void disp() //液晶{uchar i;write_com(0x80); //液晶第一行for(i=0;i<16;i++){write_dat(time[i]);}write_com(0xc0); //液晶第二行for(i=0;i<16;i++){write_dat(time1[i]);}}void main() //主函数{lcd_init(); //设置液晶init_1302(); //设置时间while(1) //循环{xingqi=read1302(0x8b); //读取的星期地址time[13]=xingqi+'0'; //数据转换miao=read1302(0x81);time[9]=miao/16+'0';time[10]=miao%16+'0';time[8]=time3[0];fen=read1302(0x83);time[6]=fen/16+'0';time[7]=fen%16+'0';time[5]=time3[1];shi=read1302(0x85);time[3]=shi/16+'0';time[4]=shi%16+'0';ri=read1302(0x87);time1[9]=ri/16+'0';time1[10]=ri%16+'0';time1[8]=time2[0];yue=read1302(0x89);time1[6]=yue/16+'0';time1[7]=yue%16+'0';time1[5]=time2[0];nian=read1302(0x8d);time1[3]=nian/16+'0';time1[4]=nian%16+'0';disp(); //返回时间日期在液晶中的位置及数据}}。

1602液晶显示DS1302实时时钟程序要点

1602液晶显示DS1302实时时钟程序要点

#include <reg51.h>#include <intrins.h>unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"}; unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月参变数unsigned char data dis_buf1[16]; //lcd上排显示缓冲区unsigned char data dis_buf2[16]; //lcd下排显示缓冲区unsigned char data year,month,date,week;//年、月、日、星期unsigned char data armhour,armmin,armsec;//闹钟时、分、秒unsigned char data hour,min,sec,sec100; //时、分、秒、百分之一秒unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值bit alarm; //标识是否启用闹钟,1--启用,0--关闭sbit rs = P2^0; //LCD数据/命令选择端(H/L)sbit rw = P2^1; //LCD读/写选择端(H/L)sbit ep = P2^2; //LCD使能控制sbit PRE = P1^6; //调整键(k3)sbit SET = P1^7; //调整键(k4)sbit SPK = P3^7;void delayms(unsigned char ms); //延时程序bit lcd_busy(); //测试LCD忙碌状态程序void lcd_wcmd(char cmd); //写入指令到LCD程序void lcd_wdat(char dat); //写入数据到LCD程序void lcd_pos(char pos); //LCD数据指针位置程序void lcd_init(); //LCD初始化设定程序void pro_timedate(); //时间日期处理程序void pro_display(); //显示处理程序void pro_key(); //按键处理程序void time_alarm(); //定时报警功能(闹钟) unsigned char scan_key(); //按键扫描程序unsigned char week_proc(); //星期自动计算与显示函数bit leap_year(); //判断是否为闰年void lcd_sef_chr(); //LCD自定义字符程序void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);//更新显示缓冲区函数// 延时程序void delay(unsigned char ms){ while(ms--){ unsigned char i;for(i = 0; i 250; i++){_nop_(); //执行一条_nop_()指令为一个机器周期_nop_();_nop_();_nop_();}}}//测试LCD忙碌状态bit lcd_busy(){bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1为忙碌,D7=0为空闲ep = 0;return result;}//写入指令到LCDvoid lcd_wcmd(char cmd){while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}//写入数据到LCDvoid lcd_wdat(char dat){while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}//LCD数据指针位置程序void lcd_pos(char pos){lcd_wcmd(pos|0x80); //数据指针=80+地址码(00H~27H,40H~67H)}//设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)void lcd_sef_chr(){ //第一个自定义字符lcd_wcmd(0x40); //"01 000 000" 第1行地址 (D7D6为地址设定命令形式 D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))lcd_wdat(0x1f); //"XXX 11111" 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭) lcd_wcmd(0x41); //"01 000 001" 第2行地址lcd_wdat(0x11); //"XXX 10001" 第2行数据lcd_wcmd(0x42); //"01 000 010" 第3行地址lcd_wdat(0x15); //"XXX 10101" 第3行数据lcd_wcmd(0x43); //"01 000 011" 第4行地址lcd_wdat(0x11); //"XXX 10001" 第4行数据lcd_wcmd(0x44); //"01 000 100" 第5行地址lcd_wdat(0x1f); //"XXX 11111" 第5行数据lcd_wcmd(0x45); //"01 000 101" 第6行地址lcd_wdat(0x0a); //"XXX 01010" 第6行数据lcd_wcmd(0x46); //"01 000 110" 第7行地址lcd_wdat(0x1f); //"XXX 11111" 第7行数据lcd_wcmd(0x47); //"01 000 111" 第8行地址lcd_wdat(0x00); //"XXX 00000" 第8行数据//第二个自定义字符lcd_wcmd(0x48); //"01 001 000" 第1行地址lcd_wdat(0x01); //"XXX 00001" 第1行数据lcd_wcmd(0x49); //"01 001 001" 第2行地址lcd_wdat(0x1b); //"XXX 11011" 第2行数据lcd_wcmd(0x4a); //"01 001 010" 第3行地址lcd_wdat(0x1d); //"XXX 11101" 第3行数据lcd_wcmd(0x4b); //"01 001 011" 第4行地址lcd_wdat(0x19); //"XXX 11001" 第4行数据lcd_wcmd(0x4c); //"01 001 100" 第5行地址lcd_wdat(0x1d); //"XXX 11101" 第5行数据lcd_wcmd(0x4d); //"01 001 101" 第6行地址lcd_wdat(0x1b); //"XXX 11011" 第6行数据lcd_wcmd(0x4e); //"01 001 110" 第7行地址lcd_wdat(0x01); //"XXX 00001" 第7行数据lcd_wcmd(0x4f); //"01 001 111" 第8行地址lcd_wdat(0x00); //"XXX 00000" 第8行数据}//LCD初始化设定void lcd_init(){lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据借口delay(1);lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"-")delay(1);lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}//闰年的计算bit leap_year(){bit leap;if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件leap=1;elseleap=0;return leap;}//星期的自动运算和处理unsigned char week_proc(){ unsigned char num_leap;unsigned char c;num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数if( leap_year()&& month=2 ) //既是闰年且是1月和2月c=5;elsec=6;week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期return week;}//更新显示缓冲区void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s){ dis_buf1[0]=t1; //dis_buf1[1]=0x20; //空格dis_buf1[2]=50; //'2'dis_buf1[3]=48; //'0'dis_buf1[4]=year/10+48;dis_buf1[5]=year%10+48;dis_buf1[6]=0x2d;dis_buf1[7]=month/10+48;dis_buf1[8]=month%10+48;dis_buf1[9]=0x2d; //'-'dis_buf1[10]=date/10+48;dis_buf1[11]=date%10+48;dis_buf1[12]=0x20;dis_buf1[13]=dis_week[4*week];dis_buf1[14]=dis_week[4*week+1];dis_buf1[15]=dis_week[4*week+2];dis_buf2[0]=t2[0];dis_buf2[1]=t2[1];dis_buf2[2]=t2[2];dis_buf2[3]=t2[3];dis_buf2[4]=t2[4];dis_buf2[5]=t2[5];dis_buf2[6]=0x20; //空格if (alarm)dis_buf2[7]=0x01; //alarm=1,显示闹钟启用标致(第二个自定义字符)elsedis_buf2[7]=0x20; //alarm=0,不显示闹钟启用标致dis_buf2[8]=dis_h/10+48;dis_buf2[9]=dis_h%10+48;dis_buf2[10]=0x3a; //':'dis_buf2[11]=dis_m/10+48;dis_buf2[12]=dis_m%10+48;dis_buf2[13]=0x3a;dis_buf2[14]=dis_s/10+48;dis_buf2[15]=dis_s%10+48;}//时间和日期处理程序void pro_timedate(){sec++;if(sec > 59){sec = 0;min++;if(min>59){min=0;hour++;if(hour>23){hour=0;date++;if(month==1||month==3||month==5||month==7||month==8||month==10||month== 12)if (date>31){date=1;month++;} //大月31天if(month==4||month==6||month==9||month==11)if (date>30){date=1;month++;} //小月30天if (month==2){if( leap_year())//闰年的条件{if (date>29){date=1;month++;}} //闰年2月为29天else{if (date>28){date=1;month++;}} //平年2月为28天}if (month>12) {month=1;year++;}if (year>99) year=0;}}}week_proc();if (sec==armsec && min==armmin &&hour==armhour){if (alarm)TR1=1; //闹钟启用时,报警时间到,启动Timer1}}//显示处理程序void pro_display(){ unsigned char i;lcd_pos(0x00);for (i=0;i=15;i++){lcd_wdat(dis_buf1[i]);}lcd_pos(0x40);for (i=0;i=15;i++){lcd_wdat(dis_buf2[i]);}}//Timer0中断处理程序,秒的产生void timer0() interrupt 1{TH0=0xdc; //Timer0置10ms定时初值dc00H(2^16=65536D,dc00H=56320D)TL0=0x00; //定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)sec100++;if(sec100 >= 100) //1秒时间 (100*10ms=1000ms=1s){sec100 = 0;pro_timedate();//调用时间和日期处理程序}if(sec&0x01) / /"willar"闪一秒,停一秒update_disbuf(0x00," ",hour,min,sec); //0x0 0表示显示00位置的自定义字符elseupdate_disbuf(0x00,"willar",hour,min,sec);pro_display(); //调用显示处理函数}//按键扫描程序unsigned char scan_key(){skey=0x00; //给变量vkey置初值skey|=PRE; //读取PRE键的状态skey=skey<<1; //将PRE键的状态存于skey的B1位skey|=SET; //读取SET键的状态,并存于skey的B0位return skey; //返回skey的键值(即PRE,SET的状态)//外部中断INT0中断处理程序void int0() interrupt 0{TR0=0;//禁止Timer0IE=0;//禁止中断lcd_wcmd(0x0e); //显示光标"_",整个光标不闪烁alarm=1;update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据,0x50表示要显示"P"pro_display(); //调用显示处理程序lcd_pos(0x47); //使光标位于第一个调整项下flag=0;vkey=0x03;while(flag^0x0a){skey = scan_key(); //扫描按键状态if (skey^vkey) //若skey与vkey相同,跳出循环,相异执行循环体{ delay(10); //去按键抖动skey = scan_key(); //转回扫描按键状态if (skey^vkey) //若skey与vkey相同,跳出循环,相异执行循环体{ vkey=skey; //将skey的值付给vkeyif (skey==0x01) //PRE 键按下{ flag++; / /调整标志位加1switch (flag) //将光标置于相应调整位置{cas e 1: lcd_pos(0x49);break; //光标置小时报警设置位置cas e 2: lcd_pos(0x4c);break; //光标置分钟报警设置位置cas e 3: lcd_pos(0x4f);break; //光标置秒时报警设置位置cas e 4: update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break; //光标置年调整位置cas e 5: lcd_pos(0x08);break; //光标置月调整位置cas e 6: lcd_pos(0x0b);break; //光标置日调整位置cas e 7: lcd_pos(0x49);break; //光标置时调整位置cas e 8: lcd_pos(0x4c);break; //光标置分调整位置cas e 9: lcd_pos(0x4f);break; //光标置秒调整位置def ault:break;}}if(skey==0x02) //SET键按下{ pro_key();//转设置按键处理程序}}}}lcd_wcmd(0x0c); //设置LCD开显示及光标不闪烁,不显示"-"lcd_wcmd(0x01); //清除LCD的显示内容IE=0x8f; / /CPU开中断,INT0,INT1,开中断TR0=1;//Timer0启动}//主程序,初始化及初值设定void main(){lcd_init(); //初始化LCDlcd_sef_chr(); //写入自定义字符号hour=0;min=0;sec=0; //开机时的时,分,秒显示armhour=0;armmin=0;armsec=0; //开机时的时,分,秒报警初值year= 5; month=1;date=1; //开机时的年,月,日,星期显示week_proc();alarm=1; //初始开机,启用闹钟IE = 0x8f; //CPU开中断,INT0,INT1,Timer0,Timer1开中断IP = 0x04; //设置INT0为中断最高优先级IT0=0;IT1=0; //外部INT0,INT1设置为电平触发方式(注意,触发不要选边沿方式,易误动) TMOD = 0x11; //Timer0,Timer1工作于模式1, 16位定时方式TH0 = 0xdc;TL0 = 0x00; //Timer0置10ms定时初值TH1 = 0xff;TL1 = 0x00; //Timer1置初值TR0 = 1; //Timer0启动TR1 = 0;while(1);}//设置按键处理程序void pro_key(){switch (flag){case 0:alarm=!alarm; //启用或关闭闹钟(alarm=1:启用,alarm=0:关闭)update_disbuf(0x50,"alarm:",armhour,armmin,ar msec); //更新显示数据pro_display();//调用显示处理lcd_pos(0x47);break;//光标回到原调整位置case 1:armhour++;if (armhour>23) armhour=0;update_disbuf(0x50,"alarm:",armhour,armmin,ar msec); //更新显示数据pro_display();//调用显示处理lcd_pos(0x49);break;//光标回到原调整位置case 2:armmin++;if (armmin>59) armmin=0;update_disbuf(0x50,"alarm:",armhour,armmin,ar msec);pro_display();lcd_pos(0x4c);break;case 3:armsec++;if (armsec>59) armsec=0;update_disbuf(0x50,"alarm:",armhour,armmin,ar msec);pro_display();lcd_pos(0x4f);break;case 4:year++;if (year> 99) year= 0;week_proc();//星期自动运算update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x05);break;case 5:month++;if (month>12) month=1;week_proc();//星期自动运算update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x08);break;case 6:date++;if(month==1||month==3||month==5||month==7||month==8||month==10||month== 12)if (date>31) date=1; //大月31天if(month==4||month==6||month==9||month==11)if (date>30) date=1; //小月30天if (month==2){if(leap_year())//闰年的条件{if (date>29) date=1;} //闰年2月为29天else{if (date>28) date=1;}} //平年2月为28天week_proc();//星期自动运算update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x0b);break;case 7:hour++;if (hour>23) hour=0;update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x49);break;case 8:min++;if (min>59) min=0;update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x4c);break;case 9:sec++;if (sec>59) sec=0;update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x4f);break;default:break ;}}//Timer1中断处理程序,产生报警的声音void timer1() interrupt 3{TH1=0xff;TL1=0x00;SPK=~SPK;}//外部中断INT1中断处理程序,停止报警声音void int1() interrupt 2{if(TR1)TR1=0;}//DS1302时钟程序#include <stc89c52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/******************************************************************** ///少占鱼制作河北正定欢迎您长沙航空职业技术学院//2010 年QQ:411656434//版权所有:#define LCD1602_RS P2_5 //定义引脚#define LCD1602_RW P2_6#define LCD1602_E P2_7#define LCD1602_IO P0#define Busy 0x80 //用于检测LCD1602状态字中的Busy标识const uchar num[]=" 3456789+";uchar code a[] = {" E N v"};void WriteData(uchar DAT);void WriteCommand(uchar command,BuysC);uchar ReadData(void);void Readbusy(void);void LCD1602_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void Displaystring(uchar X, uchar Y, uchar *DData);void Delay5Ms(void);void Delay400Ms(void);void delayms(uint);void delays(uint m) ;void delayus(uchar x) ;sbit DS1302_CLK =P2^0;// P1^0;sbit DS1302_IO =P2^1;// P1^1;sbit DS1302_RST =P2^2;// P1^2;uchar shuju;unsigned char time[]={0x11,0x03,0x28,0x01,0x12,0x39,0x00};// 初始化时间年月日星期时分秒uchar Display_Buffer[12]={"12:25:00"};//时、分、秒的格式uchar riqi[12]={"11-03-28"};//年、月、日的格式uchar xingqi[5]="week";//星期unsigned char second,minute,hour,week,day,month,year;/******************1602函数********************************//******************************************************************** /void delays(uint m){uint i,j;for(i=0;i<m;i++){for(j=0;j<1000;j++){;}}}void Delay(void){unsigned char i;unsigned int j;for(i=0;i<200;i++)for(j=300;j>0;j--);/******************************************************************** *********函数功能:向DS1302送一字节数据子程序入口参数:出口参数:********************************************************************* ********/void InputByte(unsigned char BYTE){char i;for(i=8;i>0;i--){ //前面在read_ds1302()函数里已经把CLK清0了DS1302_CLK=0;//这里再清0一次,看着清楚。

单片机时钟芯片DS1302在LCD1602上显示年月日时分秒..

单片机时钟芯片DS1302在LCD1602上显示年月日时分秒..

单片机设计实验内容摘要:单片机实验是通过Proteus仿真并且与Keil相结合使用控制单片机使其在仿真中完成一系列所设计的程序。

我们这个小组所做的实验是仿真一个数字时钟,通过DS130这个芯片从计算机上读取时间信息,再由51单片机对数据进行处理、分配,将其输出在LCD160上,实现简单的数字时钟的功能。

设计内容及要求:(1)根据设计课题的技术指标和给定条件,在教师指导下,能够独立而正确地进行方案论证和设计计算,要求概念清楚、方案合理、方法正确、步骤完整;(2)要求学生掌握单片机的设计内容、方法和步骤;(3)要求会查阅有关参考资料和手册等;(4)要求学会选择有关元件和参数;(5)要求学会绘制有关电路图和设计流程图;(6)要求学会编写设计说明书。

系统框图:硬件选择:1、AT89C51AT89C5是一种带 4K字节 FLASH存储器(FPEROMFIash Programmable and Erasable Read Only Memory )的低电压、高性能 CMOS位微处理器,俗称单片机。

AT89C205是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次o该器件采用ATMEI高密度非易失存储器制造技术制造,与工业标准的MCS-5指令集和输出管脚相兼容。

由于将多功能8位 CPU和闪烁存储器组合在单个芯片中,ATMEL勺AT89C5是一种高效微控制器, AT89C205是它的一种精简版本。

AT89C5单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

AT89C51 外形及引脚排列主要特性:•与MCS-51兼容•4K字节可编程FLASH存储器•寿命:1000写 /擦循环•数据保留时间:10年•全静态工作:0Hz-24MHz•三级程序存储器锁定•128X 8位内部RAM•32可编程I/O线•两个16位定时器/计数器•5个中断源•可编程串行通道•低功耗的闲置和掉电模式•片内振荡器和时钟电路特性概述:AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM 32个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。

用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现

用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现

中州大学信息工程学院毕业设计(论文)2011— 2012学年第二学期题目:用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现学生姓名(学号)梁慧萍田萌萌宋书倩指导教师刘爱荣职称教授评阅教师职称时间中州大学信息工程学院毕业设计(论文)开题报告课题名称(来源、类型):用 DS1302 与 1602LCD 设计的可调式电子日历与时钟的设计指导教师:刘爱荣学生姓名:梁慧萍田萌萌宋书倩开题报告内容:(调研资料的准备,设计/论文的目的、要求、思路与预期成果;任务完成的阶段内容及时间安排;小组内其他成员的分工;完成设计(论文)所具备的条件因素等。

)1.目的:实现日历和时钟的显示并且能够调整2.要求:完成可调式电子日历和时钟的软件和硬件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。

控制程序的编写等。

3.预期成果:仿真成功,做出实物。

(1)显示初始值日历时钟初始值;(2)用按键调整日历时钟。

4.时间安排:第1周:熟悉课题的基本要求,查阅相关资料,初步拟定设计的整体方案,完成开题报告。

第2-3周:自学这次课题所涉及的相关内容,包括器件基础知识、单片机,DS1302时钟芯片工作原理和相关软件的使用以及LCD1602液晶显示屏的相关内容。

并设计一些简单的实际电路,熟练所学内容并加以巩固。

第4-6周:设计DS1302时钟模块的控制电路、LCD1602液晶显示电路、电源电路等硬件电路,并用Proteus仿真第7周:焊接调试电路,根据个部分的作用对硬件进行调试,最后联机调试。

第8周:写毕业设计论文,完成全部毕业设计5.小组成员分工:梁慧萍负责日历时钟模块的设计和控制程序的编写宋书倩负责液晶显示模块的设计田萌萌负责按键模块的设计指导教师签名:日期:2012年2月20日备注:(1)来源:A—教师拟订;B—学生建议;C—企业和社会征集;D—实习单位提供(2)类型:X—真实课题;Y—模拟课题;Z—虚拟课题中州大学信息工程学院毕业设计(论文)任务书指导教师:刘爱荣职称:教授学生人数: 3人学生姓名(学号、专业):梁慧萍田萌萌宋书倩毕业设计(论文)题目(来源、类型)用DS1302与LCD1602设计的可调式电子日历时钟的设计与实现毕业设计(论文)工作内容与基本要求(目标、任务、途径、方法、成果形式,应掌握的原始资料(数据)、参考资料(文献)以及设计技术要求、注意事项等)(纸张不够可加页)基本要求:(1)显示:年、月、日、时、分、秒;(2)具有年、月、日、时、分、秒的设置功能。

LCD1602液晶显示DS1302实时时钟Proteus仿真

LCD1602液晶显示DS1302实时时钟Proteus仿真

LCD1602液晶显示DS1302实时时钟Proteus仿真Proteus仿真图:仿真程序:#include#include#include#define uint unsigned int#define uchar unsigned char//*******LCD*******sbit LCDRS=P2^0; //LCD数据/命令选择端sbit LCDRW=P2^1; sbit LCDEN=P2^2; //LCD使能新号端//******DS1302******sbit IO=P1^0; //1302数据线sbit SCLK=P1^1; //1302时钟线sbit RST=P1^2; //复位uint num=0;//uchar*week[]={"SUN","***","MON","TUS","WEN","THU","FRI","SAT"}; uchar Date[]={"Date: 2000-00-00 "};uchar Time[]={"Time: *00:00-00* "};uchar date_time[7]; //从ds1302读取的当前日期时间//=======延时=======void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//********向1302写数据*********void write_ds1302(uchar dat){uchar i;for(i=0;i<8;i++){IO=dat & 0x01; //保持最后一位为1,读状态SCLK=1;delay(1);SCLK=0;dat >>= 1;}}//*********从1302读数据*********uchar read_ds1302(){uchar i,b=0x00;for(i=0;i<8;i++){b |= _crol_((uchar)IO,i);delay(1);SCLK=0;}return b/16*10+b%16; //与BCD码转换}//*********从指定位置读数据******** uchar read_data(uchar addr){uchar dat;RST=0;SCLK=0;RST=1;write_ds1302(addr);dat=read_ds1302();SCLK=1;RST=0;return dat;}//*********读取当前日期时间********* void read_date_time(){uchar i,addr=0x81;for(i=0;i<7;i++){date_time[i]=read_data(addr);addr+=2;}}//----------LCD写指令----------void lcd_write_com(uchar com){LCDRS=0; //RS为0时,写指令,RS为1时,写数据P0=com;delay(5);delay(5);LCDEN=0;}//----------LCD写数据----------void lcd_write_data(uchar dat){LCDRS=1;P0=dat;delay(5);LCDEN=1;delay(5);LCDEN=0;}//-------LCD初始化-------void lcd_init(){LCDEN=0;lcd_write_com(0x38); //LCD显示模式设置lcd_write_com(0x0c); //LCD显示开/关及光标设置lcd_write_com(0x06); //当写一个字符后地址指针加1,且光标加1lcd_write_com(0x01); //显示清屏}//---------设置液晶显示位置-----------void set_lcd_pos(uchar p){lcd_write_com(p | 0x80);}//---------液晶显示程序----------void lcd_print(uchar p,uchar *s){set_lcd_pos(p);for(num=0;num<16;num++){lcd_write_data(s[num]);delay(10);}}//----------日期时间转换-----------void format_datetime(uchar d,uchar *p){p[0]=d/10+'0';p[1]=d%10+'0';}//---------主程序----------void main(){LCDRW=0;lcd_init();while(1){read_date_time();format_datetime(date_time[6],Date+8); //年月日format_datetime(date_time[4],Date+11); format_datetime(date_time[3],Date+14);// strcpy(Date+13,week[date_time[5]]);format_datetime(date_time[2],Time+7); //时间转换format_datetime(date_time[1],Time+10);format_datetime(date_time[0],Time+13);lcd_print(0x00,Date);lcd_print(0x40,Time);}}。

1602液晶显示DS1302实时时钟程序

1602液晶显示DS1302实时时钟程序

#include <reg51.h>#include <intrins.h>unsigned char code dis_week[]={"SUN,MON,TUE,WED,THU,FRI,SAT"}; unsigned char code para_month[13]={0,0,3,3,6,1,4,6,2,5,0,3,5}; //星期月参变数unsigned char data dis_buf1[16]; //lcd上排显示缓冲区unsigned char data dis_buf2[16]; //lcd下排显示缓冲区unsigned char data year,month,date,week;//年、月、日、星期unsigned char data armhour,armmin,armsec;//闹钟时、分、秒unsigned char data hour,min,sec,sec100; //时、分、秒、百分之一秒unsigned char data flag,vkey,skey;//设置状态计数标志、按键先前值、按键当前值bit alarm; //标识是否启用闹钟,1--启用,0--关闭sbit rs = P2^0; //LCD数据/命令选择端(H/L)sbit rw = P2^1; //LCD读/写选择端(H/L)sbit ep = P2^2; //LCD使能控制sbit PRE = P1^6; //调整键(k3)sbit SET = P1^7; //调整键(k4)sbit SPK = P3^7;void delayms(unsigned char ms); //延时程序bit lcd_busy(); //测试LCD忙碌状态程序void lcd_wcmd(char cmd); //写入指令到LCD程序void lcd_wdat(char dat); //写入数据到LCD程序void lcd_pos(char pos); //LCD数据指针位置程序void lcd_init(); //LCD初始化设定程序void pro_timedate(); //时间日期处理程序void pro_display(); //显示处理程序void pro_key(); //按键处理程序void time_alarm(); //定时报警功能(闹钟) unsigned char scan_key(); //按键扫描程序unsigned char week_proc(); //星期自动计算与显示函数bit leap_year(); //判断是否为闰年void lcd_sef_chr(); //LCD自定义字符程序void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s);//更新显示缓冲区函数// 延时程序void delay(unsigned char ms){ while(ms--){ unsigned char i;for(i = 0; i 250; i++){_nop_(); //执行一条_nop_()指令为一个机器周期_nop_();_nop_();_nop_();}}}//测试LCD忙碌状态bit lcd_busy(){bit result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result =(bit)(P0&0x80); //LCD的D0--D7中,D7=1为忙碌,D7=0为空闲ep = 0;return result;}//写入指令到LCDvoid lcd_wcmd(char cmd){while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写指令rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}//写入数据到LCDvoid lcd_wdat(char dat){while(lcd_busy()); //当lcd_busy为1时,再次检测LCD忙碌状态,lcd-busy为0时,开始写数据rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}//LCD数据指针位置程序void lcd_pos(char pos){lcd_wcmd(pos|0x80); //数据指针=80+地址码(00H~27H,40H~67H)}//设定二个自定义字符,(注意:LCD1602中自定义字符的地址为0x00--0x07,即可定义8个字符)//这里我们设定把一个自定义字符放在0x00位置(000),另一个放在0x01位子(001)void lcd_sef_chr(){ //第一个自定义字符lcd_wcmd(0x40); //"01 000 000" 第1行地址 (D7D6为地址设定命令形式 D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))lcd_wdat(0x1f); //"XXX 11111" 第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭) lcd_wcmd(0x41); //"01 000 001" 第2行地址lcd_wdat(0x11); //"XXX 10001" 第2行数据lcd_wcmd(0x42); //"01 000 010" 第3行地址lcd_wdat(0x15); //"XXX 10101" 第3行数据lcd_wcmd(0x43); //"01 000 011" 第4行地址lcd_wdat(0x11); //"XXX 10001" 第4行数据lcd_wcmd(0x44); //"01 000 100" 第5行地址lcd_wdat(0x1f); //"XXX 11111" 第5行数据lcd_wcmd(0x45); //"01 000 101" 第6行地址lcd_wdat(0x0a); //"XXX 01010" 第6行数据lcd_wcmd(0x46); //"01 000 110" 第7行地址lcd_wdat(0x1f); //"XXX 11111" 第7行数据lcd_wcmd(0x47); //"01 000 111" 第8行地址lcd_wdat(0x00); //"XXX 00000" 第8行数据//第二个自定义字符lcd_wcmd(0x48); //"01 001 000" 第1行地址lcd_wdat(0x01); //"XXX 00001" 第1行数据lcd_wcmd(0x49); //"01 001 001" 第2行地址lcd_wdat(0x1b); //"XXX 11011" 第2行数据lcd_wcmd(0x4a); //"01 001 010" 第3行地址lcd_wdat(0x1d); //"XXX 11101" 第3行数据lcd_wcmd(0x4b); //"01 001 011" 第4行地址lcd_wdat(0x19); //"XXX 11001" 第4行数据lcd_wcmd(0x4c); //"01 001 100" 第5行地址lcd_wdat(0x1d); //"XXX 11101" 第5行数据lcd_wcmd(0x4d); //"01 001 101" 第6行地址lcd_wdat(0x1b); //"XXX 11011" 第6行数据lcd_wcmd(0x4e); //"01 001 110" 第7行地址lcd_wdat(0x01); //"XXX 00001" 第7行数据lcd_wcmd(0x4f); //"01 001 111" 第8行地址lcd_wdat(0x00); //"XXX 00000" 第8行数据}//LCD初始化设定void lcd_init(){lcd_wcmd(0x38); //设置LCD为16X2显示,5X7点阵,八位数据借口delay(1);lcd_wcmd(0x0c); //LCD开显示及光标设置(光标不闪烁,不显示"-")delay(1);lcd_wcmd(0x06); //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}//闰年的计算bit leap_year(){bit leap;if((year%4==0&&year%100!=0)||year%400==0)//闰年的条件leap=1;elseleap=0;return leap;}//星期的自动运算和处理unsigned char week_proc(){ unsigned char num_leap;unsigned char c;num_leap=year/4-year/100+year/400;//自00年起到year所经历的闰年数if( leap_year()&& month=2 ) //既是闰年且是1月和2月c=5;elsec=6;week=(year+para_month[month]+date+num_leap+c)%7;//计算对应的星期return week;}//更新显示缓冲区void update_disbuf(unsigned char t1,unsigned char t2[],unsigned char dis_h,unsigned char dis_m,unsigned char dis_s){ dis_buf1[0]=t1; //dis_buf1[1]=0x20; //空格dis_buf1[2]=50; //'2'dis_buf1[3]=48; //'0'dis_buf1[4]=year/10+48;dis_buf1[5]=year%10+48;dis_buf1[6]=0x2d;dis_buf1[7]=month/10+48;dis_buf1[8]=month%10+48;dis_buf1[9]=0x2d; //'-'dis_buf1[10]=date/10+48;dis_buf1[11]=date%10+48;dis_buf1[12]=0x20;dis_buf1[13]=dis_week[4*week];dis_buf1[14]=dis_week[4*week+1];dis_buf1[15]=dis_week[4*week+2];dis_buf2[0]=t2[0];dis_buf2[1]=t2[1];dis_buf2[2]=t2[2];dis_buf2[3]=t2[3];dis_buf2[4]=t2[4];dis_buf2[5]=t2[5];dis_buf2[6]=0x20; //空格if (alarm)dis_buf2[7]=0x01; //alarm=1,显示闹钟启用标致(第二个自定义字符)elsedis_buf2[7]=0x20; //alarm=0,不显示闹钟启用标致dis_buf2[8]=dis_h/10+48;dis_buf2[9]=dis_h%10+48;dis_buf2[10]=0x3a; //':'dis_buf2[11]=dis_m/10+48;dis_buf2[12]=dis_m%10+48;dis_buf2[13]=0x3a;dis_buf2[14]=dis_s/10+48;dis_buf2[15]=dis_s%10+48;}//时间和日期处理程序void pro_timedate(){sec++;if(sec > 59){sec = 0;min++;if(min>59){min=0;hour++;if(hour>23){hour=0;date++;if(month==1||month==3||month==5||month==7||month==8||month==10||month== 12)if (date>31){date=1;month++;} //大月31天if(month==4||month==6||month==9||month==11)if (date>30){date=1;month++;} //小月30天if (month==2){if( leap_year())//闰年的条件{if (date>29){date=1;month++;}} //闰年2月为29天else{if (date>28){date=1;month++;}} //平年2月为28天}if (month>12) {month=1;year++;}if (year>99) year=0;}}}week_proc();if (sec==armsec && min==armmin &&hour==armhour){if (alarm)TR1=1; //闹钟启用时,报警时间到,启动Timer1}}//显示处理程序void pro_display(){ unsigned char i;lcd_pos(0x00);for (i=0;i=15;i++){lcd_wdat(dis_buf1[i]);}lcd_pos(0x40);for (i=0;i=15;i++){lcd_wdat(dis_buf2[i]);}}//Timer0中断处理程序,秒的产生void timer0() interrupt 1{TH0=0xdc; //Timer0置10ms定时初值dc00H(2^16=65536D,dc00H=56320D)TL0=0x00; //定时时间=(65536-56320)*(1/11.0592)*12=10ms (f0=11.0592Mhz)sec100++;if(sec100 >= 100) //1秒时间 (100*10ms=1000ms=1s){sec100 = 0;pro_timedate();//调用时间和日期处理程序}if(sec&0x01) / /"willar"闪一秒,停一秒update_disbuf(0x00," ",hour,min,sec); //0x0 0表示显示00位置的自定义字符elseupdate_disbuf(0x00,"willar",hour,min,sec);pro_display(); //调用显示处理函数}//按键扫描程序unsigned char scan_key(){skey=0x00; //给变量vkey置初值skey|=PRE; //读取PRE键的状态skey=skey<<1; //将PRE键的状态存于skey的B1位skey|=SET; //读取SET键的状态,并存于skey的B0位return skey; //返回skey的键值(即PRE,SET的状态)//外部中断INT0中断处理程序void int0() interrupt 0{TR0=0;//禁止Timer0IE=0;//禁止中断lcd_wcmd(0x0e); //显示光标"_",整个光标不闪烁alarm=1;update_disbuf(0x50,"alarm:",armhour,armmin,armsec); //更新显示数据,0x50表示要显示"P"pro_display(); //调用显示处理程序lcd_pos(0x47); //使光标位于第一个调整项下flag=0;vkey=0x03;while(flag^0x0a){skey = scan_key(); //扫描按键状态if (skey^vkey) //若skey与vkey相同,跳出循环,相异执行循环体{ delay(10); //去按键抖动skey = scan_key(); //转回扫描按键状态if (skey^vkey) //若skey与vkey相同,跳出循环,相异执行循环体{ vkey=skey; //将skey的值付给vkeyif (skey==0x01) //PRE 键按下{ flag++; / /调整标志位加1switch (flag) //将光标置于相应调整位置{cas e 1: lcd_pos(0x49);break; //光标置小时报警设置位置cas e 2: lcd_pos(0x4c);break; //光标置分钟报警设置位置cas e 3: lcd_pos(0x4f);break; //光标置秒时报警设置位置cas e 4: update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x05);break; //光标置年调整位置cas e 5: lcd_pos(0x08);break; //光标置月调整位置cas e 6: lcd_pos(0x0b);break; //光标置日调整位置cas e 7: lcd_pos(0x49);break; //光标置时调整位置cas e 8: lcd_pos(0x4c);break; //光标置分调整位置cas e 9: lcd_pos(0x4f);break; //光标置秒调整位置def ault:break;}}if(skey==0x02) //SET键按下{ pro_key();//转设置按键处理程序}}}}lcd_wcmd(0x0c); //设置LCD开显示及光标不闪烁,不显示"-"lcd_wcmd(0x01); //清除LCD的显示内容IE=0x8f; / /CPU开中断,INT0,INT1,开中断TR0=1;//Timer0启动}//主程序,初始化及初值设定void main(){lcd_init(); //初始化LCDlcd_sef_chr(); //写入自定义字符号hour=0;min=0;sec=0; //开机时的时,分,秒显示armhour=0;armmin=0;armsec=0; //开机时的时,分,秒报警初值year= 5; month=1;date=1; //开机时的年,月,日,星期显示week_proc();alarm=1; //初始开机,启用闹钟IE = 0x8f; //CPU开中断,INT0,INT1,Timer0,Timer1开中断IP = 0x04; //设置INT0为中断最高优先级IT0=0;IT1=0; //外部INT0,INT1设置为电平触发方式(注意,触发不要选边沿方式,易误动) TMOD = 0x11; //Timer0,Timer1工作于模式1, 16位定时方式TH0 = 0xdc;TL0 = 0x00; //Timer0置10ms定时初值TH1 = 0xff;TL1 = 0x00; //Timer1置初值TR0 = 1; //Timer0启动TR1 = 0;while(1);}//设置按键处理程序void pro_key(){switch (flag){case 0:alarm=!alarm; //启用或关闭闹钟(alarm=1:启用,alarm=0:关闭)update_disbuf(0x50,"alarm:",armhour,armmin,ar msec); //更新显示数据pro_display();//调用显示处理lcd_pos(0x47);break;//光标回到原调整位置case 1:armhour++;if (armhour>23) armhour=0;update_disbuf(0x50,"alarm:",armhour,armmin,ar msec); //更新显示数据pro_display();//调用显示处理lcd_pos(0x49);break;//光标回到原调整位置case 2:armmin++;if (armmin>59) armmin=0;update_disbuf(0x50,"alarm:",armhour,armmin,ar msec);pro_display();lcd_pos(0x4c);break;case 3:armsec++;if (armsec>59) armsec=0;update_disbuf(0x50,"alarm:",armhour,armmin,ar msec);pro_display();lcd_pos(0x4f);break;case 4:year++;if (year> 99) year= 0;week_proc();//星期自动运算update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x05);break;case 5:month++;if (month>12) month=1;week_proc();//星期自动运算update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x08);break;case 6:date++;if(month==1||month==3||month==5||month==7||month==8||month==10||month== 12)if (date>31) date=1; //大月31天if(month==4||month==6||month==9||month==11)if (date>30) date=1; //小月30天if (month==2){if(leap_year())//闰年的条件{if (date>29) date=1;} //闰年2月为29天else{if (date>28) date=1;}} //平年2月为28天week_proc();//星期自动运算update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x0b);break;case 7:hour++;if (hour>23) hour=0;update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x49);break;case 8:min++;if (min>59) min=0;update_disbuf(0x50,"time:",hour,min,sec);pro_display();lcd_pos(0x4c);break;case 9:sec++;if (sec>59) sec=0;update_disbuf(0x50,"time: ",hour,min,sec);pro_display();lcd_pos(0x4f);break;default:break ;}}//Timer1中断处理程序,产生报警的声音void timer1() interrupt 3{TH1=0xff;TL1=0x00;SPK=~SPK;}//外部中断INT1中断处理程序,停止报警声音void int1() interrupt 2{if(TR1)TR1=0;}//DS1302时钟程序#include <stc89c52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/******************************************************************** ///少占鱼制作河北正定欢迎您长沙航空职业技术学院//2010 年QQ:411656434//版权所有:#define LCD1602_RS P2_5 //定义引脚#define LCD1602_RW P2_6#define LCD1602_E P2_7#define LCD1602_IO P0#define Busy 0x80 //用于检测LCD1602状态字中的Busy标识const uchar num[]=" 3456789+";uchar code a[] = {" E N v"};void WriteData(uchar DAT);void WriteCommand(uchar command,BuysC);uchar ReadData(void);void Readbusy(void);void LCD1602_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void Displaystring(uchar X, uchar Y, uchar *DData);void Delay5Ms(void);void Delay400Ms(void);void delayms(uint);void delays(uint m) ;void delayus(uchar x) ;sbit DS1302_CLK =P2^0;// P1^0;sbit DS1302_IO =P2^1;// P1^1;sbit DS1302_RST =P2^2;// P1^2;uchar shuju;unsigned char time[]={0x11,0x03,0x28,0x01,0x12,0x39,0x00};// 初始化时间年月日星期时分秒uchar Display_Buffer[12]={"12:25:00"};//时、分、秒的格式uchar riqi[12]={"11-03-28"};//年、月、日的格式uchar xingqi[5]="week";//星期unsigned char second,minute,hour,week,day,month,year;/******************1602函数********************************//******************************************************************** /void delays(uint m){uint i,j;for(i=0;i<m;i++){for(j=0;j<1000;j++){;}}}void Delay(void){unsigned char i;unsigned int j;for(i=0;i<200;i++)for(j=300;j>0;j--);/******************************************************************** *********函数功能:向DS1302送一字节数据子程序入口参数:出口参数:********************************************************************* ********/void InputByte(unsigned char BYTE){char i;for(i=8;i>0;i--){ //前面在read_ds1302()函数里已经把CLK清0了DS1302_CLK=0;//这里再清0一次,看着清楚。

如何实现DS1302实时时钟表显示在1602LCD液晶

如何实现DS1302实时时钟表显示在1602LCD液晶

如何实现DS1302实时时钟表显示在1602LCD液晶在1602LCD 液晶里显示实时时间:首先在DS1302 实时时钟芯片里写入一个时间,然后在这个芯片里读取这个时间,并显示在液晶里。

现在终于实现了...#include#include sbit SCLK=P3;sb it SDA=P3;sb it RST = P3 ;//unsigned char code Write_Address[]={0x80,0x82,0x84}; unsigned char code Read_Address[]={0x85,0x83,0x81}; unsigned char Time_Table[3];void Write_Byte(unsigned char Data)//写一个字节: 地址或数据{ unsigned char i;for(i=0; i>1;SCLK=1; } }void Write_RTC(unsigned char Address, unsigned char Data) { RST=0; _nop_(); SCLK=0; _nop_(); RST=1; Write_Byte(Address); Write_Byte(Data); RST=0;}unsigned char Read_Byte() //读一个字节: 数据{ unsigned char Data=0; unsigned char i; for(i=0; i>1; _nop_(); SCLK=1; } return Data;}unsigned char Read_RTC(unsigned char Address) //{ unsigned char Data=0; unsigned char Data1,Data2; RST=0; _nop_(); SCLK=0; _nop_(); RST=1; Write_Byte(Address); Data=Read_Byte(); RST=0; Data1=Data/16; Data2=Data%16; Data=Data2+Data1*10; return Data;}void Init_RTC() //初始化实时时钟表RTC{ Write_RTC(0x8e, 0x00); Write_RTC(0x80, 0x56); Write_RTC(0x82, 0x48); Write_RTC(0x84, 0x12); Write_RTC(0x8e, 0x80) }void DisplayTime() //把时间显示1602 液晶{ unsigned char i; InitLCD(); Write_Command(0x80+0x03); for(i=0; i<3; i++) { Time_Table[i]=Read_RTC(Read_Address[i]);Write_Data(0x30+Time_Table[i]/10); Write_Data(0x30+Time_Table[i]%10);if(i!=2) Write_Data(:); } }void main(){Init_RTC(); DisplayTime(); while(1);}其实,写这个程序,也是比较简单的,比在24C02 芯片里读写容易了。

电子时钟设计-DS1302+1602+可调闹钟+程序清单

电子时钟设计-DS1302+1602+可调闹钟+程序清单

摘要随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。

时间就是金钱、时间就是生命、时间就是胜利……,准确的掌握时间和分配时间对人们来说至关重要,时钟是我们生活中必不可少的工具。

电子钟的设计方法有很多种,但是基于单片机并通过LCD显示的电子时钟具有编程灵活、精确度高、便于携带、显示直观等特点。

利用STC89C52单片机对DS1302时钟芯片进行读写操作并通过1602字符液晶显示实时时钟信息,这样便构成了一个单片机电子时钟。

关键词:单片机,电子时钟,STC89C52,蜂鸣器ABSTRACTWith the rapid development of microcomputer technology in its promotion, modern electronics into almost all areas of society, a strong impetus to the development of social productive forces and social improvement in the level of information, but also to further improve the performance of modern electronic products.Time is a money, time is life, time is victory…Accurate grasp of time and allocation of time is crucial to people, The clock is necessary in our life tools . Clock Design There are many ways, however, produced by single chip electronic clock is more flexible programming, and easy expansion of electronic capabilities, high accuracy, easy to carry, display visual and so on.In this paper, through the use of STC89C52 microcontroller by DS1302 clock chips for reading and writing operation and through 1602 character liquid crystal display real-time clock information so that forming a single chip electronic clock.Key Words: Microcontroller,STC89C52,Electronic clock,buzzer目录绪论---------------------------------------------------------------0概述---------------------------------------------0研究目的-----------------------------------------0第1章设计要求与方案论证--------------------------------01.1 设计要求-------------------------------------01.2 系统基本方案选择和论证-----------------------11.2.1 单片机芯片的选择方案和论证---------------------11.2.2 显示模块选择方案和论证—————————————---11.2.3 时钟芯片的选择方案和论证-----------------------21.3 电路设计最终方案决定----------------------------------2第2章主要元件介绍-----------------------------------------32.1 STC89C52以及最小系统介绍--------------------32.1.1 STC89C52主要功能及PDIP封装----------------------22.1.2 STC89C52引脚介绍-----------------------------------22.1.3 STC89C52最小系统-----------------------------------42.2 DS1302时钟芯片以及集成时钟模块介绍----------52.2.1 DS1302概述------------------------------------------62.2.2 DS1302引脚介绍-------------------------------------62.2.3 DS1302使用方法-------------------------------------62.2.4 时钟集成模块内部原理图以及实物图--------------8 2.3 1602字符液晶以及显示模块介绍-----------------错误!未定义书签。

ds13021602键盘调整闹钟

ds13021602键盘调整闹钟

#include<reg52.h> #include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit s4=P3^6;sbit s5=P3^3;sbit dula=P2^6;sbit wela=P2^7;sbit lcden=P2^5;sbit lcdrs=P1^0;sbit lcdrw=P1^1;sbit rd=P3^7;//定义的的4个键盘//时钟功能键//加键//减键//确认键//闹钟功能键//数码管操作//液晶操作//为了分离出3个独立键盘sbit FM=P2^3;//蜂鸣器口sbit ACC0=ACC^0;sbit ACC7=ACC^7;//累加器喂ACC这是位定义sbit sclk=P2^1;//DS1302操作sbit data1=P2^0;sbit rst=P2^4;uchar s1num,flag1,flag2,s5num;int miao,shi,fen,nian,yue,ri,week,afen,ashi;int x1,x2;uchar code table1[]="SUN";//星期字表uchar code table2[]="MON";uchar code table3[]="TUE";uchar code table4[]="WED";uchar code table5[]="THU";uchar code table6[]="FRI";uchar code table7[]="SAT";void delayms(uint xms)//延时函数{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}void di()//蜂鸣器函数{FM=0;delayms(100);FM=1;}void cmg88()//关数码管函数{dula=1;P0=0x00;dula=0;}void write_com(uchar com) {lcdrs=0;lcden=0;P0=com;delayms(5);lcden=1;delayms(5);lcden=0;}void write_date(uchar date) {lcdrs=1;lcden=0;P0=date;delayms(5);lcden=1;delayms(5);lcden=0;}void Write1302(uchar dat) {uchar i;ACC=dat;//液晶写命令函数//液晶写数据函数//向1302写一个字节数据for(i=8;i>0;i--){data1=ACC0;sclk=1;sclk=0;ACC=ACC>>1;}}void WriteSet1302(uchar Cmd,uchar dat)//根据命令,向1302写一个字节数据{rst=0;_nop_();sclk=0;_nop_();rst=1;delayms(2);Write1302(Cmd);Write1302(dat);sclk=1;rst=0;}uchar Read1302()//向1302读一个字节数据{uchar i;for(i=8;i>0;i--){ACC=ACC>>1;ACC7=data1;sclk=1;sclk=0;}return(ACC);}ucharReadSet1302(uchar Cmd)//根据命令,向1302读一个字节数据{uchar dat;rst=0;sclk=0;rst=1;Write1302(Cmd);dat=Read1302();sclk=1;rst=0;return(dat);}void inital_1302(){WriteSet1302(0x8e,0x00); WriteSet1302(0x90,0xaa); WriteSet1302(0x80,0x45); WriteSet1302(0x84,0x18); WriteSet1302(0x82,0x47); WriteSet1302(0x8c,0x16); WriteSet1302(0x88,0x05); WriteSet1302(0x86,0x23); WriteSet1302(0x8a,0x01); WriteSet1302(0xc0,0x07); WriteSet1302(0xfc,0x30); WriteSet1302(0x8e,0x80);}void write_sfm(uchar add,uchar dat) {uchar gw,sw;gw=dat%16;sw=dat/16;write_com(0x80+0x40+add);write_date(sw+0x30);write_date(gw+0x30);}void write_nyr(uchar add,uchar dat) {uchar gw,sw;gw=dat%16;sw=dat/16;write_com(0x80+add);write_date(sw+0x30);write_date(gw+0x30);}void write_week(uchar xq){//初始化DS1302函数//禁止写保护//定义充电//秒//时//分//年//月//日//星期//闹钟小时初始化//闹钟分钟初始化//开写保护//时分秒函数//年月日函数//写星期函数uchar x;write_com(0x80+12); switch(xq){case 1:for(x=0;x<3;x++) {write_date(table1[x]); }break;case 2:for(x=0;x<3;x++){write_date(table2[x]); }break;case 3:for(x=0;x<3;x++) {write_date(table3[x]); }break;case 4:for(x=0;x<3;x++) {write_date(table4[x]); }break;case 5:for(x=0;x<3;x++) {write_date(table5[x]); }case 6:for(x=0;x<3;x++) {write_date(table6[x]); }break;case 7:for(x=0;x<3;x++) {write_date(table7[x]); }break;}write_com(0x80+12); }void init(){flag1=0;flag2=0;rd=0;wela=0;lcdrw=0;lcden=0;fen=0;miao=0;shi=0;week=0;nian=0;yue=0;ri=0;s1num=0;s5num=0;write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80+1); write_date('2'); write_date('0'); delayms(5);write_com(0x80+5);write_date('-');delayms(5);write_com(0x80+8);write_date('-');delayms(5);write_com(0x80+0x40+3); write_date(':');//初始化操作//在液晶上写一些固定的数//在液晶上写一些固定的数//时间部分的两个冒号delayms(5);write_com(0x80+0x40+6); write_date(':');delayms(5);write_com(0x80+0x40+12); write_date(':');delayms(5);}void keyscan()//键盘扫描操作{if(s1==0&&s5num==0){delayms(5);if(s1==0&&s5num==0){s1num++;flag1=1;while(!s1);di();switch(s1num){case 1:write_com(0x80+0x40+8); write_com(0x0f);//光标闪烁break;case 2:write_com(0x80+0x40+5); break;case 3:write_com(0x80+0x40+2); break;case 4:write_com(0x80+14);break;case 5:write_com(0x80+10);break;case 6://时钟功能键并且闹钟不处于调整状态write_com(0x80+7);break;case 7:write_com(0x80+4);break;case 8:flag1=0;s1num=0;write_com(0x0c);WriteSet1302(0x8e,0x00);//第八次按时钟功能键后,把调整了的所有数据当前状态存入到DS1302中WriteSet1302(0x80,miao);WriteSet1302(0x84,shi);WriteSet1302(0x82,fen);WriteSet1302(0x8a,week);WriteSet1302(0x8c,nian);WriteSet1302(0x88,yue);WriteSet1302(0x86,ri);WriteSet1302(0x8e,0x80);break;}}}if(s1num!=0&&s5num==0)//时钟加键{if(s2==0){delayms(5);if(s2==0){while(!s2);di();switch(s1num){case 1:x1=miao%16;x2=miao/16;x1++;if(x1==10){x1=0;x2++;if(x2>=6)x2=0;}miao=x1+x2*16;write_sfm(7,miao);write_com(0x80+0x40+8); break;case 2:x1=fen%16;x2=fen/16;x1++;if(x1==10){x1=0;x2++;if(x2>=6)x2=0;}fen=x1+x2*16;write_sfm(4,fen);write_com(0x80+0x40+5); break;case 3:x1=shi%16;x2=shi/16;x1++;if(x1==10){x1=0;x2++;}if(x2>=2&&x1>=4){x1=0;x2=0;}shi=x1+x2*16;write_sfm(1,shi);write_com(0x80+0x40+2); break;case 4:x1=(week)%10;x2=(week)/10;x1++;if(x1==8)x1=1;week=x2*16+x1;write_week(week);write_com(0x80+14); break;case 5:x1=ri%16;x2=ri/16;x1++;if(x1==10){x1=0;x2++;}if(x2==3&&x1==2) {x1=0;x2=0;}ri=x1+x2*16;write_nyr(9,ri); write_com(0x80+10); break;case 6:x1=yue%16;x2=yue/16;x1++;if(x2==1&&x1==3) {x1=1;x2=0;}if(x1==10)x1=0;x2++;}yue=x1+x2*16;write_nyr(6,yue); write_com(0x80+7); break;case 7:x1=nian%16;x2=nian/16;x1++;if((x2==9)&&(x1==10)) {x1=0;x2=0;}if(x1==10){x2++;x1=0;nian=x1+x2*16; write_nyr(3,nian); write_com(0x80+4); break;}}}if(s3==0){delayms(5);if(s3==0){while(!s3);di();switch(s1num) {case 1:x1=miao%16;x2=miao/16;x1--;if(x1==-1){x1=9;x2--;//时钟减键if(x2==-1)x2=5;}miao=x1+x2*16;write_sfm(7,miao);write_com(0x80+0x40+8); break;case 2:x1=fen%16;x2=fen/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1)x2=5;}fen=x1+x2*16;write_sfm(4,fen);write_com(0x80+0x40+5); break;case 3:x1=shi%16;x2=shi/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1){x1=3;x2=2;}}shi=x1+x2*16;write_sfm(1,shi);write_com(0x80+0x40+2); break;case 4:x1=(week)%10;x2=(week)/10;x1--;if(x1==0)x1=7;week=x2*16+x1;write_week(week);write_com(0x80+14); break;case 5:x1=ri%16;x2=ri/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1){x1=1;x2=3;}}ri=x1+x2*16;write_nyr(9,ri);write_com(0x80+10); break;case 6:x1=yue%16;x2=yue/16;x1--;if((x2==1)&&(x1==-1)) {x1=9;x2--;}if((x2==0)&&(x1==0)) {x1=2;x2=1;}yue=x1+x2*16; write_nyr(6,yue); write_com(0x80+7); break;case 7:x1=nian%16;x2=nian/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1){x1=9;x2=9;}}nian=x1+x2*16;write_nyr(3,nian);write_com(0x80+4);break;}}}}if(s1num!=0||s5num!=0)//表示时钟或者闹钟处于调整状态{if(s4==0)//确定状态的按键{delayms(5);if(s4==0){if(s1num!=0)//表示时钟处于调整状态{while(!s4);//确定键被按下di();WriteSet1302(0x8e,0x00);//按了确认键后,把调整了的所有数据当前状态存入到DS1302中WriteSet1302(0x80,miao);WriteSet1302(0x84,shi);WriteSet1302(0x82,fen);WriteSet1302(0x8a,week);WriteSet1302(0x8c,nian);WriteSet1302(0x88,yue);WriteSet1302(0x86,ri);WriteSet1302(0x8e,0x80);flag1=0;write_com(0x0c);s1num=0;}if(s5num!=0){while(!s4);di();//表示闹钟处于调整状态WriteSet1302(0x8e,0x00);//调整闹钟,不能让时钟暂停,故没把时钟数据写入DS1302中WriteSet1302(0xc0,ashi);//把闹钟数据写入DS1302中WriteSet1302(0xfc,afen);WriteSet1302(0x8e,0x80);flag2=0;s5num=0;write_com(0x0c);}}}}if(s5==0&&s1num==0){delayms(5);if(s5==0&&s1num==0){s5num++;flag2=1;while(!s5);di();if(s5num==1){write_com(0x80+0x40+14);write_com(0x0f);}if(s5num==2){write_com(0x80+0x40+11);}if(s5num==3)//闹钟功能键并且时钟不处于调整状态{s5num=0;flag2=0;WriteSet1302(0x8e,0x00); WriteSet1302(0xfc,afen); WriteSet1302(0xc0,ashi); WriteSet1302(0x8e,0x80); write_com(0x0c);}}}if(s5num!=0&&s1num==0) {if(s2==0){delayms(5);if(s2==0){while(!s2);di();if(s5num==1){x1=afen%16;x2=afen/16;x1++;if(x1==10){x1=0;x2++;if(x2>=6)x2=0;}afen=x1+x2*16;write_sfm(13,afen);write_com(0x80+0x40+14); }if(s5num==2){x1=ashi%16;x2=ashi/16;x1++;if(x2>=2&&x1>=4){x1=0;//只有闹钟处于调整状态//闹钟加键x2=0;}if(x1==10){x1=0;x2++;}ashi=x1+x2*16;write_sfm(10,ashi);write_com(0x80+0x40+11);}}}}if(s3==0){delayms(5);if(s3==0){while(!s3);di();if(s5num==1){x1=afen%16;x2=afen/16;x1--;if(x1==-1){x1=9;x2--;if(x2==-1)x2=5;}afen=x1+x2*16;write_sfm(13,afen);write_com(0x80+0x40+14); }if(s5num==2){x1=ashi%16;x2=ashi/16;x1--;if(x1==-1){//闹钟减键x1=9;x2--;if(x2==-1){x1=3;x2=2;}}ashi=x1+x2*16;write_sfm(10,ashi);write_com(0x80+0x40+11); }}}}void laba(){if((shi==ashi)&&(fen==afen)&&(miao<=60&&miao>=0)) {di();}}void main(){//主函数//大初始化//关数码管函数//DS1302赋初值的初始化//从DS1302读出数据//读出数据送给液晶显示init();cmg88();inital_1302();ashi=ReadSet1302(0xc1);afen=ReadSet1302(0xfd);write_sfm(10,ashi);write_sfm(13,afen);while(1){keyscan();laba();if(flag1==0&&flag2==0)//经过一系列调整后,最终继续满足这个条件{//从DS1302读数据miao=ReadSet1302(0x81);//秒fen=ReadSet1302(0x83);//分shi=ReadSet1302(0x85);//时ri=ReadSet1302(0x87);//日yue=ReadSet1302(0x89);//月week=ReadSet1302(0x8b);//星期nian=ReadSet1302(0x8d);//年write_sfm(7,miao);write_sfm(4,fen);write_sfm(1,shi);write_nyr(9,ri);write_nyr(6,yue);write_nyr(3,nian);write_week(week);}}}//把它们送液晶显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))) //判断闹铃时间是否到,
ClockSound(); //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。
}
model0(); //输出显示屏幕
uchar code DATE[]={"Date"}; //字符串输出(日期)
uchar code alarmclock[]={"Clock"}; //字符串输出(闹铃)
uchar code lamp[]={"Lamp"}; //字符串输出(背光灯)
void Modset(); //模式键处理
void WriteDataLCM(uchar WDLCM);
void WriteCommandLCM(uchar WCLCM,BuysC);
uchar ReadStatusLCM(void);
void LCMInit(void);
{
case 1:
timesetup(); break; //时间设置
case 2:
datesetup();break; //日期设置
case 3:
alarmclockset();break;//闹铃设置
TH0=0x3c; //50ms
TL0=0xb0;
EA=1;
TR0=1;
ET0=1;
while(Leabharlann ) { if(TimerDown==0) //左移键按下后把背光灯打开
{Delay5Ms();
if(TimerDown==0)
#include <AT89x51.h>
#include <string.h>
#define LCM_RW P2_3 //定义引脚
#define LCM_RS P2_2
#define LCM_E P2_4
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
void systemsetup(void); //进入系统设置
uchar code systemp[]={"System.setup"}; //字符串输出(系统设定)
uchar code TIMER[]={"Time"}; //字符串输出(时间)
{a=0;msec=0;KeySound();//蜂鸣声
if(model--==1) //6种系统设置项目
model=6;
}
while(TimerUp==0);
}
if (TimerDown==0) //设置项目右移
{
Speaker=0; //开蜂鸣声
Delay5Ms();
Delay5Ms();
Delay5Ms();
Speaker=1; //关蜂鸣声
}
}
void Modset() //模式键处理
{ if(system==0)
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16; //取出背光灯时间并转换为十进制数
}
if((LED==0)&&LedTime==0) //延时间是否到
LED=1; //关闭背光灯
if(R1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。
void OutputInformation(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void Set1302(uchar * ); //设置时间
void KeySound(); //按键音
void ClockSound(); //闹铃蜂鸣声
uchar id,msec,model,LedTime,d;
bit a,b; //闪烁标志位
}
}
void systemsetup(void) //系统设置
{
model=1;
while(model!=0)
{
Out_LCM();
if (TimerUp==0) //设置项目左移
{Delay5Ms();
if(TimerUp==0)
void main(void)
{
Speaker=1; //关闭蜂鸣器
LED=0; //打开LED ,低电平有效,外接9012驱动
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
TMOD=0x01; //16位定时
{
Delay5Ms();
if(TimerDown==0)
{a=0;msec=0;KeySound();//蜂鸣声
if(model++==6)
model=1;
}
while(TimerDown==0);
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{
KeySound(); //蜂鸣声
LED=0; //打开背光灯
systemsetup(); //进入系统设置模式
void datesetup(void); //日期设置
void alarmclockset(void); //闹铃设置
void lampsetup(void); //背光灯设置
void timereset(void); //时间清零
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
Modset(); //调用模式键处理程序判断按键是否按下。
if(b==0)
{KeySound(); //蜂鸣声
switch(model) //进入进个项目设置
uchar code reset[]={"Reset"}; //字符串输出(时间归零)
uchar code exit[]={"Exit"}; //字符串输出(退出)
uchar code set[]={"Set"}; //字符串输出(设置)
uchar code sec[]={"sec"}; //字符串输出(秒)
uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置)
uchar code ClockOn[]={"ON"}; //字符串输出(ON)
uchar code ClockOff[]={"OFF"}; //字符串输出(OFF)
void timesetup(void); //时间设置
void RTInputByte(uchar); //输入 1Byte */
uchar RTOutputByte(void); //输出 1Byte */
void W1302(uchar, uchar); //向DS1302写入一个字节
uchar R1302(uchar); //从DS1302读出一个字节
}
}
void KeySound() //按键音
{
Speaker=0; //开蜂鸣声
Delay5Ms();
Speaker=1; //关蜂鸣声
}
void ClockSound() //闹铃蜂鸣声
{
if(a==0)
sbit system=P1^2; //模式
sbit TimerUp=P1^1; //时间加
sbit TimerDown=P1^0; //时间减
sbit Speaker=P1^3; //蜂鸣器
void Set(uchar,uchar); //根据选择调整相应项目
case 4:
lampsetup();break; //背光灯设置
case 5:
timereset();break; //时间清零
case 6:
model=0;break; //退出系统设置
{
Delay5Ms();
if(system==0)
{while(system==0);
KeySound(); //蜂鸣声
a=0;msec=0;b=0; //a、msec为闪烁标志,按键有动作时清零,不闪烁。
} //b为模式键确认动作。其它程判断b是否为零时来确定模式键是否动作。
{KeySound(); //蜂鸣声
LED=0; //打开背光灯
LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数
}
b=1; //模式键是否动作标志。为1时不动作,为0时动作。
uchar inittime[7]={0x00,0x10,0x19,0x29,0x03,0x04,0x06}; //初始化后设置为:06年3月29日星期3 19点10分0秒
void Out_LCM(void); //显示屏幕
void model0(void); //显示输出
void model1(void);
void model2(void);
相关文档
最新文档