您当前的位置:首页 > 发表论文>论文发表

液晶屏毕业论文

2023-02-23 15:33 来源:学术参考网 作者:未知

液晶屏毕业论文

呵呵,连这个都能,看来LED发展挺快的!!

基于51单片机的汉字LCD智能显示模块设计 毕业论文

用单片机进行温度的控制及LCD显示系统的设计论文编号:JD909 包括开题报告,任务书。 论文字数:14253,页数:45摘 要 温度测量与控制是工程实践中常见的问题,在工业生产中有着广泛的应用。针对此领域的发展方向,本论文设计了一个基于单片机的智能温度测量系统。本系统以AT89C51单片机为微控制器,采用数字温度传感器DS18B20作为测温元件, 温度传感器DS18B20采集温度信号送给单片机处理,单片机再把处理后的温度数据送到LCD上显示出来。 能够实现快速、准确的测温功能和越限声光报警功能。本论文完成了系统硬件电路的设计,给出了软件流程框图,并编写了相关的软件程序。 关键词:温度测量;传感器 ;单片机;LCD显示

Abstract

Temperature measuring and the controlling are very common in the project practice and are widely adopted in the industry production . In view of development direction of this domain, this paper introduces a temperature measuring system which take the AT89C51 single chip microcontroller as an controlling unit and the digital temperature sensor --DS18B20, as temperauture measuring transducer. The collected temperature signals of the digital temperature transducer--DS18B20 are processed by the single chip microcontroller. The processed temperature signals are displayed on the LCD.This system has achieved prompt and precise temperature measuring and the super warnning function by sound and light .This paper has finished the design of hardware curcuit and compiled related software program..

Key word: Temperature measuring;Sensor;Single Chip Microcontroller ;LCD Display 目 录摘 要 I
Abstract II
绪 论 1
1系统的设计方案 3
2硬件设计
2.1 单片机的选用 4
2.2 温度检测电路的设计 6
2.3 键盘模块的设计 10
2.4 液晶显示模块的设计 12
2.5 声光报警电路的设计 16
3软件设计
3.1 程序设计语言和软件开发环境 17
3.2 软件程序设计 18
4抗干扰设计
4.1. 硬件方面的措施 26
4.2 软件抗干扰技术 26
结 论 28
致 谢 29
参考文献 30
附录: 源程序 31以上回答来自:

电子信息工程毕业论文开题报告

随着人们自身素质提升,报告的用途越来越大,我们在写报告的时候要注意逻辑的合理性。那么报告应该怎么写才合适呢?以下是我为大家整理的电子信息工程毕业论文开题报告,希望能够帮助到大家。

毕业设计的内容和意义

毕业设计内容:

1.熟悉单片机系统设计方法,独立完成电路和程序设计。

2.用PROTEUS进行系统调试和仿真。

3.设计、制作并调试硬件系统。

4.完成相关软件文档资料。

毕业设计应完成的技术文件:

1.3000字以上毕业设计开题报告,2000字以上英文参考文献的中文译文。

2.毕业设计论文(15000字以上)。

3.提供设计原理图和相应程序。

毕业设计意义:

随着时代的发展,现代化建设步伐不断加快,对道路照明及道路亮化工程需求也更大,而能源的供需矛盾也越来越突出,节电节能、绿色照明的要求越来越迫切,越来越高。现在再采用那些传统的手控、钟控照明系统的方法已不能满足要求。如何充分利用高科技手段解决上述矛盾也就成为当前照明控制领域一个新的和紧要的课题。路灯照明是日常生活中必不可少的公共设施。路灯照明耗电量约占总耗电量的15%,全国各地无不面对电力紧张带来的各种问题。面对供电紧张形势,路灯巡查对于国家来讲是一项需要耗费大量人力的工作,各种临时应急节电措施被广泛采用:夜晚间隔关灯、调整路灯开关的时间、在用电紧张的日子里关闭景观照明等等,当用电高峰过后,这些措施可能就被束之高阁,明年的用电高峰来临,一切又会重新开始。这样的节电措施,在缓解用电紧张的同时,却带来资源的浪费和对人们日常生活的负面影响。缓解用电紧张的最佳和有效的办法是对用电实施智能化管理,减少浪费,使我们的每一度电都能物尽其用!启用先进路灯监控系统,可以对路灯实施统一启闭,对夜间照明系统和路灯的实时监控和管理,确保高效稳定,全天候运行,控制不必要的“全夜灯照明”,有效节约电能消耗。对于学校公共照明系统来说,采用智能化的管理系统是实现能源节约、减少资源浪费、满足人们生活要求、显示现代化校园的科学解决方案。

目前已有一小部分校园参考了公路路灯的节能措施,到了后半夜将电灯亮度调低,或采取等间隔亮灯的方式来节约用电,但是这样一个方法却带来路灯过亮或过暗的问题:

1.控制落后

开关灯方式落后:当前路灯控制,还停留在手动、光控、钟控方式。受季节、天气和人为因素影响,自动化管理水平低,经常该亮时不亮,该灭时不灭,极易造成极大的能源浪费,增加了财政负担。

2.操控不便

调节操控能力不足,无法远程修改开关灯时间,不能根据实际情况(天气突变,重大事件,节日)及时校时和修改开关灯时间。

3.灯况不明

不具备路灯状况监测,现有的照明设施管理工作主要采用人工巡查模式,不仅工作量大,还浪费人力、物力、财力。故障依据主要来源于巡视人员上报和市民投诉缺乏主动性、及时性和可靠性,不能实时、准确、全面地监控全城的路灯运行状况缺乏有效的故障预警机制。

4.不能很好的应用在前半夜

因为其前半夜6个小时以上全部采取正常亮度,这样就会出现在没有行人、车辆经过校园道路时的电力资源浪费这一现象,而除了晚上6点-9点人车流高峰期以外其余时间人车流量确实相对较少,所以我们认为校园照明有更大的节能潜力。

针对以上现有节能情况分析,我们设计了一种高效率的智能节能路灯,路灯控制器内应同时设有光控和时控模块,该模块先服从光度控制,再服从时间控制,能满足达到一定光度开关路灯和达到特定时间开关路灯的要求。同时,我们认为路灯应改进为为红外感测路灯。针对校园人、车流量的高低峰时段对路灯分为节能状态和标准状态。在人车流量的高峰期如清晨上班时间和傍晚18点—21点,路灯要保持持续标准亮度,而在深夜路灯将转为节能状态,通过红外感测,只在有人、车通过时才变亮。使用红外感测,与声控相比,感应精度更高,避免了一些噪音而使灯无效闪烁。将所有的路灯连接到单片机上,单片机和计算机通信,用计算机控制路灯工作状态。可设定自动控制方式和人工控制方式。自动控制方式可根据地太阳活动规律,并结合实际情况控制路灯的工作方式。当夜幕降临,或光线已经较暗时,虽然未达到设定时间,也能自动开启。交通高峰期,应达到持续满额亮度;高峰期后,进入红外感应,实现智能和节能的控制。人工控制方式可随时设定开关时间、路灯开启比例或单独控制路灯的开与关。另外通过路灯的工作状态可对路灯损坏实现实时报警,并可显示具体的位置,提醒维修人员及时维修,中心控制器带有时钟芯片,该时钟芯片带有EEPROM,可以保持单片机工作参数,即使通信发生错误,路灯也能按照最后的程序进行工作。

文献综述

一、设计方案

本设计选用STC89C52单片机作为系统的核心部件,实现系统的控制和处理的功能。各模块所包含的功能如下:(1)红外模块:夜晚进行检测是否有行人。(2)显示模块12864:显示相应的时间和日期信息。(3)时钟模块:手动切换时间,自己设定开灯时间。(4)光敏电阻传感器模块:用于检测周围环境光强度,若光强低于标准值则开启路灯。

二、硬件电路设计

1.主控制器STC89C52

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

STC89C52具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。

2.红外模块

本设计采用HC-SR501红外模块,它是基于红外线技术的'自动控制模块,采用德国原装进口LHI778探头设计,灵敏度高,可靠性强,超低电压工作模式,广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。该模块用于检测夜晚是否有行人路过,因此产生高地电平,并通过软件的方法来处理电平信号。

3.光敏电阻传感器模块

本设计采用3线制光敏电阻传感器模块,是一款灵敏型光敏电阻传感器,用比较器输出,信号干净,波形好,驱动能力强,超过15mA。同时配有可调电位器可调节检测光线亮度,用于检测周围环境光强度,若光强低于标准值则开启路灯。

4.显示模块

本设计采用液晶显示器12864显示时间和日期。液晶显示屏的第一行显示年月日,第二行显示的实时时钟,硬件电路中的12864的数据端口接到单片机P1口,数码管的4,5,6管脚分别与单片机的P3.0-P3.2相连,通过单片机的信息处理,从而在液晶显示屏上显示各段信息。

四、软件设计

主程序主要设计各个部分子程序的调用,子程序有时钟程序和显示子程序两部分。程序初始化后,红外模块子程序判断有没有行人,输出一个信号,经软件处理。12864液晶显示子程序主要通过接收主程序发出的信号,将其设置输入为模式子函数形成,并初始化LCD子函数,显示日期子函数,显示时间子函数。

五、仿真实现

该系统的软件仿真采用Proteus软件,当系统开机时,系统进入初始化界面,液晶显示第一行为时间信息,第二行为日期信息,当白天的时候,打开光强和红外判断,同时成立才开启路灯。设定按钮可手动改变时间信息。

参考文献:

1.胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社.2001.7

2.周润景等.Proteus在MCS-51&ARM7系统中的应用[M].北京:电子工业出版社.2006.10

3.侯玉宝等.基于Proteus的51系列单片机设计与仿真[M].北京:电子工业出版社.2008.8

4.张靖武等.单片机系统的PROTEUS设计与仿真[M].北京:电子工业出版社.2007.4

5.楼然苗等.单片机课程设计指导[M].北京:北京航空航天大学出版社.2007.7

6.周向红等.51系列单片机应用与实践教程[M].北京:北京航空航天大学出版社.2008.5

7.李林功.单片机原理与应用—基于实例驱动和Proteus仿真[M].北京:科学出版社.2010.5

8.薛钧义,张彦斌.MCS-系列单片微机计算机及其应用[M].西安:西安交通大学出版社.1997

9.何利民.单片机应用系统设计.[M]北京航空航天大学出版社.1995

研究内容

红外模块的使用

单片机读取时钟芯片

用液晶显示相关数据

绘出逻辑图

研究计划

第一周——第二周:下毕业设计任务书,明确设计要求。查阅、搜集毕业设计相关资料。着手翻译相关英文资料,并熟悉PROTEUS软件和单片机的相关开发知识。

第三周——第四周:对查阅的文献资料归纳综述撰写开题报告。完成毕业设计需求分析,确定系统框图。

第五周——第六周:方案论证,设计硬件电路。分析设计的电路,提出软件设计思路;毕业设计初期检查。

第七周——第八周:在PROTEUS中实现软、硬件设计与调试。分析调试中的问题,改进并重新调试达到技术要求。

第九周——第十周:软、硬件电路进行整体测试,修改并完善程序;毕业设计中期检查。

第十一周——第十二周:设计并制作印制电路板;完成硬件的安装和调试。完成整个系统的软件、硬件的调试。

第十三周——第十四周:研究工作总结,撰写毕业论文。

第十五周——第十六周:论文修改及评阅,论文答辩。

特色与创新

路灯控制器内应同时设有光控和时控模块,该模块先服从光度控制,再服从时间控制,能满足达到一定光度开关路灯和达到特定时间开关路灯的要求。同时,路灯为红外感测路灯。针对校园人、车流量的高低峰时段对路灯分为节能状态和标准状态。在人车流量的高峰期如清晨上班时间和傍晚18点—23点,路灯要保持持续标准亮度,而在深夜路灯将转为节能状态,通过红外感测,只在有人、车通过时才变亮。

基于51系列的单片机和DS1302时钟芯片以及液晶显示的lcd1602电子万年历毕业设计,万分感谢。

#include<reg51.h>
#include"DS18B20_3.H"
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;
//flag用于读取头文件中的温度值,和显示温度值

#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)
sbit rs=P1^0;
sbit en=P1^2;
sbit rw=P1^1; //如果硬件上rw接地,就不用写这句和后面的rw=0了
sbit led=P3^7; //LCD背光开关

//DS1302时钟芯片与C51之间的引脚连接定义
sbit IO=P2^2;
sbit SCLK=P2^1;
sbit RST=P2^2;

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
/************************************************************
ACC累加器=A
ACC.0=E0H

ACC.0就是ACC的第0位。Acc可以位寻址。

累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,
是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,
常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。
一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。
***************************************************************/

//校时按键与C51的引脚连接定义
sbit key1=P2^4; //设置键
sbit key2=P2^5; //加键
sbit key3=P2^6; //减键

sbit buzzer=P2^0;//蜂鸣器,通过三极管9012驱动,端口低电平响

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

uchar code tab1[]={"20 - - "}; //年显示的固定字符
uchar code tab2[]={" : : "};//时间显示的固定字符

//延时函数,后面经常调用
void delay(uint xms)//延时函数,有参函数
{
uint x,y;
for(x=xms;x>0;x--)
for(y=120;y>0;y--);
}

/********液晶写入指令函数与写入数据函数,以后可调用**************/

/*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/

write_1602com(uchar com)//****液晶写入指令函数****
{
rs=0;//数据/指令选择置为指令
rw=0; //读写选择置为写
P0=com;//送入数据
delay(1);
en=1;//拉高使能端,为制造有效的下降沿做准备
delay(1);
en=0;//en由高变低,产生下降沿,液晶执行命令
}

write_1602dat(uchar dat)//***液晶写入数据函数****
{
rs=1;//数据/指令选择置为数据
rw=0; //读写选择置为写
P0=dat;//送入数据
delay(1);
en=1; //en置高电平,为制造下降沿做准备
delay(1);
en=0; //en由高变低,产生下降沿,液晶执行命令
}

lcd_init()//***液晶初始化函数****
{
write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
write_1602com(0x0c);//开显示不显示光标
write_1602com(0x06);//整屏不移动,光标自动右移
write_1602com(0x01);//清显示

write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示
for(a=0;a<14;a++)
{
write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分
//delay(3);
}
write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示
for(a=0;a<8;a++)
{
write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号
//delay(3);
}

}

/*********************over***********************/

/***************DS1302有关子函数********************/

void write_byte(uchar dat)//写一个字节
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//读一个字节
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;

}
return (ACC);
}
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据
{

RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;

write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07
write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01
write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10
write_1302(0x8e,0x80); //打开写保护

}

//------------------------------------
//温度显示子函数
void write_temp(uchar add,uchar dat)//向LCD写温度数据,并指定显示位置
{
uchar gw,sw;
gw=dat;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
write_1602dat(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码
}

//------------------------------------
//时分秒显示子函数
void write_sfm(uchar add,uchar dat)//向LCD写时分秒,有显示位置加、现示数据,两个参数
{
uchar gw,sw;
gw=dat;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(er+add);//er是头文件规定的值0x80+0x40
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

//-------------------------------------
//年月日显示子函数
void write_nyr(uchar add,uchar dat)//向LCD写年月日,有显示位置加数、显示数据,两个参数

{
uchar gw,sw;
gw=dat;//取得个位数字
sw=dat/10;//取得十位数字
write_1602com(yh+add);//设定显示位置为第一个位置+add
write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码
write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

//-------------------------------------------
void write_week(uchar week)//写星期函数
{
write_1602com(yh+0x0c);//星期字符的显示位置
switch(week)
{
case 1:write_1602dat('M');//星期数为1时,显示
write_1602dat('O');
write_1602dat('N');
break;

case 2:write_1602dat('T');//星期数据为2时显示
write_1602dat('U');
write_1602dat('E');
break;

case 3:write_1602dat('W');//星期数据为3时显示
write_1602dat('E');
write_1602dat('D');
break;

case 4:write_1602dat('T');//星期数据为4是显示
write_1602dat('H');
write_1602dat('U');
break;

case 5:write_1602dat('F');//星期数据为5时显示
write_1602dat('R');
write_1602dat('I');
break;

case 6:write_1602dat('S');//星期数据为6时显示
write_1602dat('T');
write_1602dat('A');
break;

case 7:write_1602dat('S');//星期数据为7时显示
write_1602dat('U');
write_1602dat('N');
break;

}

}

//****************键盘扫描有关函数**********************

void keyscan()
{
if(key1==0)//---------------key1为功能键(设置键)--------------------
{
delay(9);//延时,用于消抖动
if(key1==0)//延时后再次确认按键按下
{
buzzer=0;//蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key1);
key1n++;
if(key1n==9)
key1n=1;//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环
switch(key1n)
{

case 1: TR0=0;//关闭定时器
//TR1=0;
write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标
write_1602com(0x0f);//设置光标为闪烁
temp=(miao)/10*16+(miao);//秒数据写入DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);
break;
case 2: write_1602com(er+6);//按2次fen位置显示光标

//write_1602com(0x0f);
break;
case 3: write_1602com(er+3);//按动3次,shi
//write_1602com(0x0f);
break;
case 4: write_1602com(yh+0x0e);//按动4次,week
//write_1602com(0x0f);
break;
case 5: write_1602com(yh+0x0a);//按动5次,ri
//write_1602com(0x0f);
break;
case 6: write_1602com(yh+0x07);//按动6次,yue
//write_1602com(0x0f);
break;
case 7: write_1602com(yh+0x04);//按动7次,nian
//write_1602com(0x0f);
break;
case 8:
write_1602com(0x0c);//按动到第8次,设置光标不闪烁
TR0=1;//打开定时器
temp=(miao)/10*16+(miao);
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302
write_1302(0x8e,0x80);
break;

}

}

}
//------------------------------加键key2----------------------------
if(key1n!=0)//当key1按下以下。再按以下键才有效(按键次数不等于零)
{

if(key2==0) //上调键
{
delay(10);
if(key2==0)
{
buzzer=0;//蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key2);
switch(key1n)
{
case 1:miao++;//设置键按动1次,调秒
if(miao==60)
miao=0;//秒超过59,再加1,就归零
write_sfm(0x08,miao);//令LCD在正确位置显示"加"设定好的秒数
temp=(miao)/10*16+(miao);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,光标自动右移,所以要指定返回
//write_1602com(0x0b);
break;
case 2:fen++;
if(fen==60)
fen=0;
write_sfm(0x05,fen);//令LCD在正确位置显示"加"设定好的分数据
temp=(fen)/10*16+(fen);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
break;
case 3:shi++;
if(shi==24)
shi=0;
write_sfm(2,shi);//令LCD在正确的位置显示"加"设定好的小时数据
temp=(shi)/10*16+(shi);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 4:week++;
if(week==8)
week=1;
write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
write_week(week);//指定周数据显示内容
temp=(week)/10*16+(week);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 5:ri++;
if(ri==32)
ri=1;
write_nyr(9,ri);//令LCD在正确的位置显示"加"设定好的日期数据
temp=(ri)/10*16+(ri);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 6:yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);//令LCD在正确的位置显示"加"设定好的月份数据
temp=(yue)/10*16+(yue);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 7:nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);//令LCD在正确的位置显示"加"设定好的年份数据
temp=(nian)/10*16+(nian);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;

}

}

}
//------------------减键key3,各句功能参照'加键'注释---------------
if(key3==0)
{
delay(10);//调延时,消抖动
if(key3==0)
{
buzzer=0;//蜂鸣器短响一次
delay(20);
buzzer=1;
while(!key3);
switch(key1n)
{
case 1:miao--;
if(miao==-1)
miao=59;//秒数据减到-1时自动变成59
write_sfm(0x08,miao);//在LCD的正确位置显示改变后新的秒数
temp=(miao)/10*16+(miao);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00); //允许写,禁止写保护
write_1302(0x80,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码
write_1302(0x8e,0x80); //打开写保护
write_1602com(er+0x09);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
//write_1602com(0x0b);
break;
case 2:fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
temp=(fen)/10*16+(fen);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x82,temp);//向DS1302内写分寄存器82H写入调整后的分数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+6);//因为设置液晶的模式是写入数据后,指针自动加一,在这里是写回原来的位置
break;

case 3:shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
temp=(shi)/10*16+(shi);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(er+3);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 4:week--;
if(week==0)
week=7;

write_1602com(yh+0x0C);//指定'加'后的周数据显示位置
write_week(week);//指定周数据显示内容
temp=(week)/10*16+(week);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8a,temp);//向DS1302内写周寄存器8aH写入调整后的周数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+0x0e);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 5:ri--;
if(ri==0)
ri=31;
write_nyr(9,ri);
temp=(ri)/10*16+(ri);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x86,temp);//向DS1302内写日期寄存器86H写入调整后的日期数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+10);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 6:yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
temp=(yue)/10*16+(yue);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x88,temp);//向DS1302内写月份寄存器88H写入调整后的月份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+7);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;
case 7:nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
temp=(nian)/10*16+(nian);//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x8c,temp);//向DS1302内写年份寄存器8cH写入调整后的年份数据BCD码
write_1302(0x8e,0x80);//打开写保护
write_1602com(yh+4);//因为设置液晶的模式是写入数据后,指针自动加一,所以需要光标回位
break;

}

}

}

}

}

//-------------------------------
void init() //定时器、计数器设置函数
{
TMOD=0x11; //指定定时/计数器的工作方式为3
TH0=0; //定时器T0的高四位=0
TL0=0; //定时器T0的低四位=0
EA=1; //系统允许有开放的中断
ET0=1; //允许T0中断
TR0=1; //开启中断,启动定时器

}

//*******************主函数**************************
//***************************************************
void main()
{
lcd_init(); //调用液晶屏初始化子函数
ds1302_init(); //调用DS1302时钟的初始化子函数
init(); //调用定时计数器的设置子函数
led=0; //打开LCD的背光电源
buzzer=0;//蜂鸣器长响一次
delay(80);
buzzer=1;
while(1) //无限循环下面的语句:
{

keyscan(); //调用键盘扫描子函数

}
}

void timer0() interrupt 1 //取得并显示日历和时间
{

//Init_DS18B20();//温度传感器DS18b2初始化子函数,在头文件中
flag=ReadTemperature();//将18b2头文件运行返回的函数结果送到变量FLAG中,用于显示

//读取秒时分周日月年七个数据(DS1302的读寄存器与写寄存器不一样):

miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));

//显示温度、秒、时、分数据:

write_temp(12,flag);//显示温度,从第二行第12个字符后开始显示
write_sfm(8,miao);//秒,从第二行第8个字后开始显示(调用时分秒显示子函数)
write_sfm(5,fen);//分,从第二行第5个字符后开始显示
write_sfm(2,shi);//小时,从第二行第2个字符后开始显示

//显示日、月、年数据:
write_nyr(9,ri);//日期,从第二行第9个字符后开始显示
write_nyr(6,yue);//月份,从第二行第6个字符后开始显示
write_nyr(3,nian);//年,从第二行第3个字符后开始显示
write_week(week);

}

相关文章
学术参考网 · 手机版
https://m.lw881.com/
首页