基于51单片机带温度显示的液晶万年历

合集下载

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计

基于51单片机的液晶显示万年历设计摘要随着社会的进步和发展,电子万年历作为日常计时工具被广泛地应用。

此电子万年历在硬件方面主要采用STC89C51单片机作为主控核心,由DS1302时钟芯片提供时钟及1602LCD液晶显示屏显示。

STC89C51单片机是由宏晶公司公司生产的,功耗小,电压可选用3.4v~5.5v电压供电;DS1302时钟芯片是美国DALLAS公司推出的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,而且DS1302的使用寿命长,误差小;对于数字电子万年历采用直观的数字显示,数字显示是采用的1602LCD液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒、温度等信息。

此外,该电子万年历在软件方面主要包括日历程序、时间调整程序,显示程序等。

所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,烧写到单片机上进行测试。

本次课程设计主要由时钟芯片DS1302和温度传感器DS18B20采集数据到单片机进行处理再通过LCD1602显示出来,本设计主要研究了液晶显示器LCD及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较。

关键词:单片机;DS1302;DS18B20;LCD1602ABSTRACTWith the social progress and development, Electronic calendar is widely used as a daily timing tool. The electronic calendar in hardware using STC89C51 microcontroller as the main control center, provided by the DS1302 clock chip and 1602LCD LCD display. STC89C51 microcontroller is produced by the macro crystal company, small power consumption, the voltage can be choosen among 3.4V ~ 5.5V for power supply; DS1302 clock chip is a low power real-time clock chip produced by DALLAS, it can be a time of years,months,days,weeks,hours,minutes,seconds, and DS1302 has a long service life. The error is small; for the digital electronic calendar using visual digital display, 1602LCD digital display is used to display LCD screen that can display years, months, days, weeks, hours, minutes and seconds, temperature and other information. In addition, the electronic calendar mainly includes calendar program,time to adjust procedures,display program etc in sofeware. After the completion of all the procedures, in the Keil software debugging, determine no problem after, and burning to the microcontroller test.The curriculum design mainly by the clock chip DS1302 and temperature sensor DS18B20 collecting data to the microcontroller for processing and then through the LCD1602 display, this design mainly studies the liquid crystal display LCD and the clock chip DS1302, the hardware connection and communication between the temperature sensor DS18B20 and the MCU, a number of hardware connection scheme for a detailed comparison.Key words:SCM,DS1302,DS18B20,LCD1602目录第一章绪论 ------------------------------------------------------------------------------------------------------------ - 1 -1.1 单片机的概述------------------------------------------------------------------------------------------------- - 1 -1.1.1 单片机的概念 --------------------------------------------------------------------------------------- - 1 -1.1.2 单片机的特点 --------------------------------------------------------------------------------------- - 1 -1.2 课题背景 ------------------------------------------------------------------------------------------------------- - 1 -1.3 课题内容 ------------------------------------------------------------------------------------------------------- - 2 - 第二章设计要求和方案 --------------------------------------------------------------------------------------------- - 3 -2.1 设计要求 ------------------------------------------------------------------------------------------------------- - 3 -2.2 设计方案 ------------------------------------------------------------------------------------------------------- - 3 -2.2.1 单片机芯片的选择--------------------------------------------------------------------------------- - 3 -2.2.2 各模块方案选择 ------------------------------------------------------------------------------------ - 3 -2.3 工作原理 ------------------------------------------------------------------------------------------------------- - 4 - 第三章系统的硬件设计及实现------------------------------------------------------------------------------------ - 7 -3.1 电路设计原理框图 ------------------------------------------------------------------------------------------ - 7 -3.2 STC89C51单片机的介绍 ----------------------------------------------------------------------------------- - 7 -3.2.1 主要功能及性能参数 ----------------------------------------------------------------------------- - 7 -3.2.2单片机的引脚功能说明 --------------------------------------------------------------------------- - 8 -3.3 各模块电路的设计及原理图 ----------------------------------------------------------------------------- - 9 -3.3.1 时钟电路模块的设计 ----------------------------------------------------------------------------- - 9 -3.3.2 温度采集模块的设计及原理图 --------------------------------------------------------------- - 11 -3.3.3 显示模块的设计及原理 ------------------------------------------------------------------------- - 11 - 第四章系统的软件设计 -------------------------------------------------------------------------------------------- - 13 -4.1 程序流程框图------------------------------------------------------------------------------------------------ - 13 -4.2 时间调整程序流程图 -------------------------------------------------------------------------------------- - 14 - 第五章系统测试 ------------------------------------------------------------------------------------------------------ - 15 -5.1 硬件测试 ------------------------------------------------------------------------------------------------------ - 15 -5.2 软件测试 ------------------------------------------------------------------------------------------------------ - 15 - 第六章总结与致谢 --------------------------------------------------------------------------------------------------- - 17 -6.1 总结------------------------------------------------------------------------------------------------------------- - 17 -6.2 致谢------------------------------------------------------------------------------------------------------------- - 18 - 参考文献 ------------------------------------------------------------------------------------------------------------------- - 19 - 附录 ------------------------------------------------------------------------------------------------------------------------ - 21 - 附录一:实物图 --------------------------------------------------------------------------------------------------- - 21 - 附录二:源程序 --------------------------------------------------------------------------------------------------- - 23 -第一章绪论1.1 单片机的概述1.1.1 单片机的概念单片机即单片微型计算机,是把中央处理器、存储器、定时/计数器、输入输出接口都集成在一块集成电路芯片上的微型计算机。

基于stc51单片机的LCD1602显示时间的电子万年历(显示

基于stc51单片机的LCD1602显示时间的电子万年历(显示

1 课设所需软件简介1.1 Keil uVision4的简要介绍2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。

新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。

新版本支持更多最新的ARM芯片,还添加了一些其他新功能。

2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。

Keil C51开发系统基本知识Keil C51开发系统基本知识1. 系统概述Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

下面详细介绍Keil C51开发系统各部分功能和使用。

2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos 的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51及C51编译器编译生成目标文件(.OBJ)。

目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。

ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

使用独立的Keil仿真器时,注意事项:* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。

基于单片机带温度显示的液晶万年历

基于单片机带温度显示的液晶万年历

摘要在寒假期间我用一周时间完成了这个液晶万年历,它可以显示年月日、时分秒、以及温度(可上下限报警),可以对时间进行加一或减一调整,并加入了闰、平年时间调整,方便可行,已经调试成功。

考虑到成本和方便,本作品采用了STC89c52和DS18B20,计时用的是51单片机自带的十六位定时器/计数器T0,尽管对时间进行了误差调整但是还是有一定的误差,考虑到学校后改用DS1302时钟芯片,进一步减小误差。

温度显示精度达到0.1摄氏度。

关键词:单片机 DS18B20 万年历温度1.硬件工作介绍(1)上电自动复位及手动复位电路STC89c52单片机的RST端外部复位有两种操作方式:上电自动复位和按键手动复位。

本设计用上电自动复位以及手动复位下结合的方式外接电路(见附图)。

(2)时钟振荡电路作品中采用12M晶振,其连接方法如图所示,其中电容的值都为22pF。

(3)1602液晶显示接口1602采用标准的16脚接口(见附图),其中:第1脚:GND为地电源第2脚:VCC接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS 和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:VCC第16:GND(4)键盘键盘是通过S3(P3.2),S4(p3.3),S5(p3.4)对时钟进行调整,其S3选择要调整的对象如时,分,日,月等等,并在液晶屏上显示所选的对象。

S4对所选中的对象进行加一调整,而S5对所选对象进行减一调整。

基于51单片机的万年历

基于51单片机的万年历

基于51单片机的万年历摘要本篇论文主要介绍了运用单片机实现电子万年历的设计,其中51单片机作为对系统的主要控制器,由DS1302完成对时钟电路的显示和DS18B20对温度的检测。

设计主要由时钟电路模块、稳压电路模块、液晶显示模块、温度测试模块组成。

实现了年、月、日、星期、温度显示,及闹钟报警的功能。

这个设计具有体积小,简单方便,功能齐全,精度高等特点。

关键词51单片机;时钟芯片;温度显示;闹钟设置AbstractThis paper mainly introduces the realization of electronic calendar application of the design of SCM,51 MCU as the main controller of the system,DS1302 completed by the clock circuit display and temperature test DS18B20。

Designed for use mainly by the clock circuit module, voltage regulator circuit module, liquid crystal display module, temperature measurement modules。

Achieved a year, month, day, week, temperature display, and alarm clock function。

This design is small, simple and convenient, complete functions and high accuracy。

Key words51 MCU;Clock chip;Temperature display;Alarm clock settings目录1. 引言................................................ 错误!未定义书签。

基于51单片机的万年历设计

基于51单片机的万年历设计

基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。

51 单片机作为核心控制器,负责整个系统的运行和数据处理。

时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。

二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。

2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。

3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。

4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。

三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。

然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。

接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。

2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。

3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。

4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。

四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。

在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。

设置完成后,将新的时间数据保存到时钟芯片中。

五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。

通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。

六、系统调试在完成硬件和软件设计后,需要对系统进行调试。

基于51单片机的温度报警和万年历

基于51单片机的温度报警和万年历
uchar code table2[]={" : : "};
uchar num,miao,a,fen,shi,tt,date,s1sum,nian,yue,ri,week,i,temp;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
while(i--);
}
}
void ds18b20changtemp() //转换温度
{
ds18b20init();
delay1ms(1);
ds18b20write(0xcc); //跳过rom操作
ds18b20write(0x44); //温度转换命令
}
/*
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
unsigned char ds18b20init()
{
unsigned int i;
ds=0; //总线拉低480us-960us
i=70;
while(i--); //延时642us
ds=1; //然后拉高总线,ds18b20做出反应会在15——60us后总线拉高
i=0;
while(ds)
{
i++;
ye1602init();
if(temp<0)
{
writecom(0x80+0x40+11);
writedate('-');

基于51单片机的万年历与温度检测报警系统

基于51单片机的万年历与温度检测报警系统

基于51单片机的万年历与温度检测报警系统摘要随着社会发展需求的改变,电子万年历是一个应用非常广泛的实用日常计时工具,带有显示世纪,年,月,日,星期,时,分,秒和按键可调时间及其按键设置闹钟的功能,同时具有月末自动更新,闰年补偿功能等多种功能。

温度检测报警系统也是在日常生活和工业应用非常广泛的工具,能实时采集周围的温度信息进行显示,程序内部设定有报警上下限,根据应用环境不同可设定不同的报警上下限。

此系统是基于STC89C52单片机设计的,包含液晶显示模块,DS12C887实时时钟模块,DS18B20温度采集模块,键盘扫描模块,报警模块,HX1838红外接收头模块。

STC89C52作为控制核心,具有功耗低,功能强等特点,电压可选5VUSB 供电。

显示模块采用12864液晶动态显示,相对数码管而言经济实用,占用空间小,对于显示数字、字母最为合适,而且与单片机连线简单,占用IO口相对较少。

实时时钟芯片DS12C887是一款与DS12C885实时时钟兼容的替代产品,该器件提供RTC/日历、定时闹钟等功能,如果检测到主电源故障,该器件可自动切换到备用电源供电,DS12C887将石英晶体与电池集成在一起,在断电后仍可精确走10年。

温度检测报警模块采用数字式温度传感器DS18B20,该芯片具有精度高,测量范围广等优点,易与单片机连接,模块电路组成简单并同时具有温度报警功能。

关键词:STC89C52,DS12C887,DS18B20,12864液晶显示,电子万年历,采集周围设备温度、温度报警一、设计要求与方案论证1.1设计要求设计一个能够实现世纪,年,月,日,星期,小时,分,秒显示附带温度检测显示的实时时钟电子万年历,同时具有时间调节和闹钟设置功能,以及时间预设报警、温度报警、报警解除等功能。

该产品共设有四个按键,每个按键具有多种功能,充分利用各个按键。

也可利用红外遥控来进行实时调节,体现时尚方便的特性,并且通过编程还可以控制12864液晶显示,随心所欲。

基于51单片机的12864液晶显示的万年历

基于51单片机的12864液晶显示的万年历

附录程序
/*****************说明*********************************** 基于 51 单片机的 12864 液晶显示的万年历
版权所有,如需转载请通知本人,不得用于商业用途 ,仅限学习交流之用
*****************************************************************/
3
图-1 主控制系统
2.3.2 时钟电路模块的设计 DS1302 是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、
时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进 行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一 个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容, 但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
//延时 1MS/次
unsigned char
{
sec,min,hour,day,month,year,cen,week,
unsigned char i;
next,aa,bb,cc,dd,mm,temp0,LunarMonth,
while(--a)
LunarDay,LunarYear;
{
int temp;
9三三系统的软件设计系统的软件设计3131程序流程框图程序流程框图图图aa主程序流程图主程序流程图10图b计算阳历程序流程图计算阳历程序流程图1112图图cc时间调整程序流程图时间调整程序流程图yynnyynnyy图图dd设置温度报警闹钟的数据保存到设置温度报警闹钟的数据保存到at24c02at24c02中中是否进入温度报警上下限温度设置设置是否进入设置闹钟时间设置报警温度上下限开始设置闹钟的时间开始报警闹钟的开关是否开起at24c02存设置的功能保蜂鸣器开启闹钟报警功能开启结束设置13五五作品功能实现作品功能实现通过硬件的焊接与程序的编写本电子万年历终于完成了实现的功能如下

基于51单片机的电子万年历毕业设计论文

基于51单片机的电子万年历毕业设计论文
表4.1 DS1302引脚功能
引脚号
引脚名称
功能
1
Vcc2
主电源
2,3
X1,X2
振荡源,外界32.768kHz晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行数据输入端
8
Vcc1
后备电池
76 5 4 3210
1
RAM
A4
A3
A2
A1
A0
RAM
图4.2 DS1302的控制字
实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;
用于高速数据暂存的31×8位RAM;
最少引脚的串行I/O;
2.5~5.5V电压工作范围;
2.5V时耗电小于300nA;
用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;
简单的3线接口;
可选的慢速充电(至Vcc1)的能力。
2.用凌阳16位单片机设计。凌阳16位单片机有丰富的中断源和时基,方便本实验的设计。它的准确度相当高,并且C语言和汇编兼容的编程环境也很方便来实现一些递归调用。I/O口功能也比较强大,方便使用。用凌阳16位单片机做控制器最有特色的就是它的可编程音频处理,可完成语音的录制播放和识别。这些都方便对设计进行扩展,使设计更加完善。成本也相对低一些。但是,在控制与显示的结合上有些复杂,显示模组资源相对有限,而且单片机的稳定性不是很高。
Keywords:Electronicperpetual calendar;single-chip processor;temperature sensor;clock;digital display

基于51单片机的万年历代码(1602液晶实现)

基于51单片机的万年历代码(1602液晶实现)
month++; if(month>12)month=1; playmo(month); playx(); com(0x80+8); while(!key2); } } if(key3==0) { delay(5);
if(key3==0) {
month‐‐; if(month==0||month>12)month=12; playx(); playmo(month); com(0x80+8); while(!key3); } } } if(key4==0) { delay(5); if(key4==0) { keynum=0; com(0x0c); TR0=1; while(!key4); } }
hmiao=0; miao++; if(miao==60) {
miao=0; fen++; if(fen==60) {
fen=0; shi++; if(shi==24) {
shi=0; day++; playx(); if((Yeepyear(year))&&day==ryue[month]) 是否为闰年
} void plays(uchar s)
{ shi1=s/10; shi2=s%10; com(0x80+0x44); date(0x30+shi1); date(0x30+shi2); } void playf(uchar f) { fen1=f/10; fen2=f%10; com(0x80+0x47); date(0x30+fen1); date(0x30+fen2); } void playmi(uchar m) { miao1=m/10; miao2=m%10; com(0x80+0x40+10); date(0x30+miao1); date(0x30+miao2);

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。

万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。

本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。

二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。

2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。

3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。

4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。

(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。

然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。

2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。

3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。

三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。

(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。

数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。

(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。

单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。

基于51单片机的电子万年历系统的设计

基于51单片机的电子万年历系统的设计

参考内容
一、引言
单片机是现代电子设备中的重要组成部分,广泛应用于各种嵌入式系统设计。 51单片机作为一种经典的微控制器,因其结构简单、易于编程、可靠性高等优点, 被广泛用于各种领域,如智能家居、工业控制、物联网等。万年历作为一种日常 生活中常见的计时工具,具有显示日期、时间、星期、月份等功能,对于人们的 日常生活和工作有着重要的作用。本次演示将介绍一种基于51单片机的万年历设 计。
二、系统设计
1、硬件设计
基于51单片机的万年历设计需要硬件和软件的配合实现。硬件部分主要包括 51单片机、显示模块、按键输入模块和时钟芯片等。其中,51单片机作为主控制 器,负责处理各种数据和控制信号;显示模块用于显示日期、时间等信息;按键 输入模块用于用户输入操作;时钟芯片则为系统提供实时时间。
基于51单片机的电子万年历系 统的设计
目录
01 一、概述
03 三、软件设计
02 二、硬件设计 04 四、系统调试与优化
目录
05 五、应用场景及前景
07 参考内容
06 六、结论
随着科技的不断发展,单片机已经成为现代于51单片机的电子万年历系统设计具有广泛的实际应用价值。 本次演示将详细介绍这种系统的设计过程和实现方法。
感谢观看
首先需要进行硬件搭建,包括选择合适的单片机、显示模块、按键输入模块 和时钟芯片等,并将其连接起来。需要注意的是,在搭建硬件时需要考虑各个模 块之间的接口和连接方式,以确保系统能够正常工作。
2、软件编程
在硬件搭建完成后,需要进行软件编程。首先需要进行系统初始化,包括对 单片机进行初始化和对显示进行清屏处理。然后需要进行按键处理和时钟数据处 理,以实现用户输入和实时时间的读取。最后需要进行显示处理,将处理后的数 据显示到显示模块上。

51单片机的18B20、1302和LCM1602液晶显示温度与万年历显控制

51单片机的18B20、1302和LCM1602液晶显示温度与万年历显控制

摘要本设计以数字集成电路技术为基础,单片机技术为核心。

软件设计采用模块化结构,C语言编程。

系统通过LCD显示数据,可以显示日期(年、月、日、时、分、秒)以及温度。

在内容安排上首先描述系统硬件工作原理,着重介绍了各硬件接口技术和各个接口模块的功能;其次,详细的阐述了程序的各个模块和实现过程。

前言电子时钟是实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人家庭,车站,码头,办公室,银行大厅等场所,成为人们日常生活中的必需品。

数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。

钟表的数字化给人们生产生活带来了极大的方便,在此基础上完成的电子时钟精度高,功能易于扩展。

可扩展成为诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等电路。

所有这些,都是以钟表数字化为基础的。

因此,研究数字时钟及扩大其应用有着非常现实的意义。

本设计就是数字时钟简单的扩展应用。

1.1设计目标:利用单片机技术,以及模拟电子技术和数字电子技术的理论知识,设计实现MCS-51单片机对LCM1602液晶输出显示控制的这一基本要求。

1.2设计要求:本设计利用DS1302;DS18B20;LCD1602实现以下功能:(1) 显示日期功能(年、月、日、时、分、秒以及星期)(2) 可通过按键切换年、月、日及时、分、秒的显示状态(3) 可随时调校年、月、日或时、分、秒(4) 可每次增减一进行时间调节(5) 可动态完整显示年份,实现真正的万年历显示(6) 可显示温度2 设计方案2.1 控制器硬件控制电路主要用了AT89C52芯片处理器、LCD显示器等。

根据各自芯片的功能互相连接成电子万年历的控制电路。

软件控制程序主要有主控程序、电子万年历的时间控制程序、时间显示及星期显示和温度采集程序等组成。

主控程序中对整个程序进行控制,进行了初始化程序及计数器、还有键盘功能程序、以及显示程序等工作,时间控制程序是电子万年历中比较重要的部分。

基于51单片机的LCD万年历

基于51单片机的LCD万年历

●功能描述:本设计完成基于DS1307作为时钟芯片,以HD44780为控制器的LCD万年历显示。

●原理概述:如图一,时钟信号由DS1307模块串行发送到单片机,单片机处理后,将内容通过并行通讯发送到LCD液晶DDRAM 上显示,此过程一直在主函数中循环,从而实现了将“年”、“月”、“日”、“时”、“分”、“秒”在液晶上显示的功能。

●端口说明单片机的P0作为LCD的并行通讯数据端口、P3口的P3.5、P3.6、P3.7作为LCD的控制端口,来控制LCD显示模式、功能以及内容;P1.2、P1.3作为DS1307的串行通讯的数据端以及时钟端,来获取时钟信息到单片机。

●效果显示●图一(电路总图及万年历仿真结果)图二(DS1307时钟电路仿真结果)图三(LCD液晶电路仿真结果)●图四(DS1307与液晶显示数据仿真结果)●程序清单●(一)init.h和init.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: init.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 总初始化函数,引入所有头文件,定义特殊脚****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-11** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #ifndef INIT_H#define INIT_H/*--------------------------------------------------包含系统头文件---------------------------------------------------*/#include<reg52.h>#include <stdio.h>#include<intrins.h>#include<string.h>#include<stdio.h>/*--------------------------------------------------宏定义---------------------------------------------------*/#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define fosc 11059200 // 晶振为11.0592MHZ/*--------------------------------------------------包含自定义头文件---------------------------------------------------*/#include"lcd12864.h"#include"delay.h"//#include"table.c"//#include"da.h"//#include"MAX197.h"//#include"zlg.h"#include"ds1307.h"/*--------------------------------------------------定义特殊脚---------------------------------------------------*/sbit BELL=P1^4; //蜂鸣器/*--------------------------------------------------蜂鸣器函数---------------------------------------------------*/extern void didifast(uint i);extern void didislow(uint i);#endif/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: init.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 定义调试过程中用到的蜂鸣器标志****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"init.h"void didislow(uint i){for(;i>0;i--){BELL=~BELL;delay15ms();BELL=~BELL;delay15ms();}}void didifast(uint i){for(;i>0;i--){BELL=~BELL;delaynms(7);BELL=~BELL;delaynms(7);}}(二)delay.h和delay.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: delay.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 用于存放工程中用到的延时函数****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"delay.h"void delay100ms() //@11.0592MHz{unsigned char i, j;i = 180;j = 73;do{while (--j);} while (--i);}void delay10us() //@11.0592MHz{unsigned char i;i = 2;while (--i);}void delay125us(void){uint idata n;for(n=0;n<60*12;n++);//60*12 stc12c5a60s2}void delay20us(void){uchar idata n;for(n=0;n<120;n++);//10*12 stc12c5a60s2}void delay15ms(void){uint idata n;for(n=0;n<4000*12;n++);//4000*12 stc12c5a60s2 }void delaynms(unsigned int k) //@11.0592MHz {unsigned char i, j;for(;k>0;k--){_nop_();_nop_();_nop_();i = 11;j = 190;do{while (--j);} while (--i);}}/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: delay.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 存放所有用于延时的外部函数****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-11** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #ifndef DELAY_H#define DELAY_H/*--------------------------------------------------包含头文件---------------------------------------------------*/#include"init.h"/*--------------------------------------------------外部函数定义---------------------------------------------------*/extern void delay100ms();extern void delay10us();extern void delay125us(void);extern void delay20us(void);extern void delay15ms(void);extern void delaynms(uint k);#endif(三)DS1307.C和DS1307.H/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: ds1307.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: ds1307的底层驱动函数****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"init.h"sbit rtscl=P1^2;sbit rtsda=P1^3;uint tt=0;//uchar code table[]="0123456789";uchar time_receive[8];uchar convert_begin;uint t_click,tp;//**********************************************//over//**********************************************//********************************************///ds1307相关操作函数//传送与接收数据都是先高位//********************************************/void rt_delay() //操作延时,等待信号稳定{uchar i=10;while(i>0)i--;}/*void delay() // 操作之间的时间间隔{uchar i=200;while(i>0)i--;}*/void init_1307() //初始化1307{rtscl = 1; rt_delay(); rtsda = 1; rt_delay();}void start_1307() // 开始信号{rtsda = 1; rtscl = 1; rt_delay(); rtsda = 0; rt_delay();}void stop_1307() // 结束信号{rtsda = 0; rtscl = 1; rt_delay(); rtsda = 1; rt_delay();}void write_1307(uchar d ) //写1307{uchar i,j; rtscl = 0;for(i = 0;i < 8; i++){rtsda = (d >> 7);rtscl = 1;rt_delay();d = d << 1;rtscl = 0;}rtsda = 1;rtscl = 1;while((rtsda == 1) && (j < 255))j++;rtscl=0;}uchar read_1307(uchar b) //读1307{uchar d ,i;rtsda = 1; rtscl = 0;for(i = 0; i < 8; i++){rtscl = 1;rt_delay();d = d << 1;d = d | rtsda;rtscl=0;}rtsda = b;rt_delay();rtscl = 0;rtscl = 1;return d;}read_8byte_1307(){uchar i;start_1307( );write_1307( 0xd0 );write_1307( 0x00 );stop_1307( );for(i = 0;i < 8; i++){start_1307();write_1307(0xd1);time_receive[i]=read_1307(1);stop_1307();}}//********************************************** //over//********************************************** //**********************************************//**********************************************void ds1307init(){TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256; //定时器初始化EA=1;ET0=1;TR0=1;delay15ms();init_1307();start_1307();write_1307(0xd0);write_1307(0x00);write_1307(0x00);write_1307(0x59);write_1307(0x12);write_1307(0x05);write_1307(0x14);write_1307(0x12);write_1307(0x27);stop_1307();}//**************************************************************** //over//*************************************************************** //*************************************************************** //中断服务子程序//***************************************************************void time0() interrupt 1 using 1{TH0=(65536-1000)/256;TL0=(65536-1000)%256;if(convert_begin)t_click++;if(tt>=100){// read_8byte_1307();tt=0;tt++;}/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: ds1307.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 引入ds1307的外部函数,供主函数调用****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #ifndef DS1307_H#define DS1307_Hextern uchar time_receive[8];extern void ds1307init();extern read_8byte_1307();#endif(四)lcd12864.C和lcd12864.H/*******************************************************程序功能:显示字符*******************************************************//*******************************************************///////指令集//////write_cmd(0x30);//基本指令操作//1.设定DDRAM地址命令write_Cmd(0x90);//设定DDRAM地址,因为此时DDRAM地址已经溢出//2.显示状态命令write_Cmd(0x08);//整体显示关,游标关,游标位置关write_Cmd(0x0c);//整体显示开,游标关,游标位置关write_Cmd(0x0e);//整体显示开,游标开,游标位置write_Cmd(0x0f);//整体显示开,游标开,游标位置开//3.位址归位write_Cmd(0x02);//位址归位,游标回到原点write_Cmd(0x84); //将DDRAM地址设为0x88,游标在此闪烁//4.点设定指令//(以下四个命令是控制写入字符以后光标及整屏显示的移动)write_Cmd(0x07); //光标右移整体显示左移write_Data(0x20); //写入两个空格write_Data(0x20);write_Cmd(0x05); //光标左移整体显示右移write_Data(0x20); //写入两个空格write_Data(0x20);write_Cmd(0x06); //光标右移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);write_Cmd(0x04); //光标左移整体显示不移动write_Data(0x20); //写入两个空格write_Data(0x20);//5.游标和显示移位控制//(以下四个命令无需写入显示数据,直接控制光标和整屏显示的移动)write_Cmd(0x10); //光标左移write_Cmd(0x14); //光标右移write_Cmd(0x18); //整体显示左移,光标跟随write_Cmd(0x1c); //整体显示右移,光标跟随write_Cmd(0x0c); //关闭光标//6.进入扩展功能模式命令write_Cmd(0x34); //打开扩展功能模式,绘图显示关闭//7.反白命令write_Cmd(0x04); //同时反白1、3行write_Cmd(0x04); //再次反白1、3行,相当于关闭1、3行反白write_Cmd(0x05); //同时反白2、4行write_Cmd(0x05); //再次反白2、4行,相当于关闭2、4行反白//8.睡眠模式命令write_Cmd(0x08); //进入睡眠模式write_Cmd(0x0c); //退出睡眠模式//9.待命模式命令write_Cmd(0x01); //进入待命模式//10.打开GDRAM显示write_Cmd(0x36); //打开扩展功能模式,打开绘图显示Draw_TX(0x80,0x84,laba); //设置16*16大小图形Clear_GDRAM(); //清除上电复位后RAM中的随机数值Draw_TX(0x80,0x84,laba);//重新显示设置16*16大小图形//11.关闭GDRAM显示write_Cmd(0x34); //打开扩展功能模式,关闭绘图显示//12.设定基本指令集write_Cmd(0x30); //回到基本指令集//13.清除显示命令write_Cmd(0x01);//清屏*********************************************************/ #include"lcd12864.h"/*写指令到LCD*//*输入:指令输出:无*/void write_cmd(uchar cmd){lcd12864_rs=0;lcd12864_rw=0;lcd12864_cs=0;lcd12864_data=cmd;delay20us();lcd12864_cs=1;delay20us();lcd12864_cs=0;}/*写显示数据到LCD*//*输入:数据输出:无*/void write_data(uchar dat){lcd12864_rs=1;lcd12864_rw=0;lcd12864_cs=0;lcd12864_data=dat;delay20us();lcd12864_cs=1;delay20us();lcd12864_cs=0;/*设定显示位置*//*输入:坐标输出:无*/void lcd_pos(uchar x,uchar y){uchar pos;if(x==0){x=0x80;}else if(x==1){x=0x90;}else if(x==2){x=0x88;}else if(x==3){x=0x98;}pos=x+y;write_cmd(pos);//显示地址}/*LCD初始化设定*//*输入:无输出:无*/void lcd_init(){write_cmd(0x38); //基本指令操作delay125us();write_cmd(0x06); //运行方式delay125us();write_cmd(0x0c); //开显示,关光标delay125us();write_cmd(0x01); //清除lcd的显示内容delay15ms();}/*测试程序:显示相应的字符*/ /*void main(){uchar i;delay15ms();lcd_init();lcd_pos(0,0);i=0;while(dis1[i]!='\0'){write_data(dis1[i]);i++;}i=0;lcd_pos(1,0);while(dis2[i]!='\0'){write_data(dis2[i]);i++;}lcd_pos(2,0);i=0;while(dis3[i]!='\0'){write_data(dis3[i]);i++;}lcd_pos(3,0);i=0;while(dis4[i]!='\0'){write_data(dis4[i]);i++;}} *//*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: lcd12864.h** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 液晶的外部函数以及引脚定义****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/#ifndef LCD12864_H#define LCD12864_H/*--------------------------------------------------包含头文件---------------------------------------------------*/#include"init.h"//定义I/O接口sbit lcd12864_rs=P3^7;sbit lcd12864_rw=P3^6;sbit lcd12864_cs=P3^5;#define lcd12864_data P0//定义P0口为lcd12864的数据口/*写指令到LCD*//*输入:指令输出:无*/extern void write_cmd(uchar cmd);/*写显示数据到LCD*//*输入:数据输出:无*/extern void write_data(uchar dat);/*设定显示位置*//*输入:坐标输出:无*/extern void lcd_pos(uchar x,uchar y);/*LCD初始化设定*//*输入:无输出:无*/extern void lcd_init();#endif●(五)table.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: table.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 用于存放在液晶显示的内容****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ unsigned char dis1[]={" _LV AN_ "};unsigned char dis2[]={"date:**** / ** / ** "};unsigned char dis3[]={"time: ** / ** / ** "};unsigned char dis4[]={" by:13990513 "};●(一)main.c/*********************************Copyright (c)***********************************--------------------------File Info------------------------------** File Name: main.c** Last modified Date: 2014-12-27** Last Version: 2.1** Description: 基于HD44780控制器的LCD万年历显示****-----------------------------------------------------------------** Created By: lvan** Created date: 2014-11-14** Version: 1.0** Descriptions: The original version 初始版本********************************************************************************/ #include"init.h"#include"table.c"void display(){uchar i;delay15ms();lcd_pos(0,0);i=0;while(dis1[i]!='\0'){write_data(dis1[i]);i++;}i=0;lcd_pos(1,0);while(dis2[i]!='\0'){write_data(dis2[i]);i++;}lcd_pos(2,0);i=0;while(dis3[i]!='\0'){write_data(dis3[i]);i++;}lcd_pos(3,0);i=0;while(dis4[i]!='\0'){write_data(dis4[i]);i++;}}void display1307(){uint nian;//显示日期信息nian=time_receive[7]/16*10+time_receive[7]%16;dis2[5]='2';dis2[6]=(time_receive[4]/100)+0x30;dis2[7]=(time_receive[4]%100/10)+0x30;dis2[8]=(time_receive[4]%10)+0x30;//显示月份dis2[12]=time_receive[5]/16%2+0x30;dis2[13]=time_receive[5]%16+0x30;//显示日期dis2[17]=time_receive[6]/16%4+0x30;dis2[18]=time_receive[6]%16+0x30;// //星期// write_data(' ');// write_data(table[time_receive[3]%16]);//显示小时dis3[7]=time_receive[2]/16%4+0x30;dis3[8]=time_receive[2]%16+0x30;//显示分钟dis3[12]=time_receive[1]/16%8+0x30;dis3[13]=time_receive[1]%16+0x30;//显示秒dis3[17]=time_receive[0]/16%8+0x30;dis3[18]=time_receive[0]%16+0x31;didifast(1);}void main(){lcd_init();ds1307init();display();delaynms(10);while(1){didifast(2); //蜂鸣器,不用可注释read_8byte_1307();display1307();display();}}。

用51单片机做的万年历,显示用12864液晶

用51单片机做的万年历,显示用12864液晶

LCD12864.c#include "reg52.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int#define LCD_DB_PORT P0 //液晶DB0~DB7 #define LCD_START_ROW 0xc0 //起始行#define LCD_PAGE 0xb8 //页指令#define LCD_COL 0x40 //列指令//液晶引脚定义sbit LCD_DI=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;sbit LCD_CS1=P2^3;sbit LCD_CS2=P2^4;sbit LCD_RST=P2^5;bit Reverse_Display=0;//检查LCD是否忙bit LCD_Check_Busy(void){ LCD_DB_PORT=0xff;LCD_RW=1; _nop_(); LCD_DI=0;LCD_E=1; _nop_(); LCD_E=0;return(bit)(P0&0x80);}//向LCD发送命令void LCD_Write_Command(uchar c){ while(LCD_Check_Busy());LCD_DB_PORT=0xff; LCD_RW=0; _nop_(); LCD_DI=0;LCD_DB_PORT=c; LCD_E=1; _nop_(); LCD_E=0;}//向LCD发送数据void LCD_Write_Data(uchar d){ while(LCD_Check_Busy());LCD_DB_PORT=0xff;LCD_RW=0;_nop_();LCD_DI=1;//根据Reverse_Display决定是否反相显示if(!Reverse_Display)LCD_DB_PORT=d;else LCD_DB_PORT=~d;LCD_E=1;_nop_();LCD_E=0;}//初始化LCDvoid LCD_Initialize(void){ LCD_CS1=1;LCD_CS2=1;LCD_Write_Command(0x38);LCD_Write_Command(0x0f);LCD_Write_Command(0x01);LCD_Write_Command(0x06);LCD_Write_Command(LCD_START_ROW);}//通用显示函数//从第P页第L列开始显示W个字节数据,数据在r所指向的缓冲//每字节8位是垂直显示的,高位在下,低位在上//每个8*128的矩形区域为一页//整个LCD右由64*64的左半屏和64*64的右半屏构成void Common_Show(uchar P,uchar L,uchar W,uchar *r){ uchar i;if(L<64) //显示在左半屏或左右半屏{ LCD_CS1=1;LCD_CS2=0;LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL+L);if(L+W<64) //全部显示在左右半屏{ for(i=0;i<W;i++)LCD_Write_Data(r[i]);}else //如果越界则跨左右半屏显示{ for(i=0;i<64-L;i++)LCD_Write_Data(r[i]); //左半屏显示LCD_CS1=0;LCD_CS2=1; //右半屏显示LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL);for(i=64;i<W;i++)LCD_Write_Data(r[i]);}}else //全部显示在右半屏{ LCD_CS1=0;LCD_CS2=1;LCD_Write_Command(LCD_PAGE+P);LCD_Write_Command(LCD_COL+L-61);for(i=0;i<W;i++)LCD_Write_Data(r[i]);}}//显示8*16点阵字符void Display_A_Char_8X16(uchar P,uchar L,uchar *M) { Common_Show(P,L,8,M);Common_Show(P+1,L,8,M+8);}//显示一个16*16点阵汉字void Display_A_WORD(uchar P,uchar L,uchar *M) { Common_Show(P,L,16,M); //显示汉字上半部分Common_Show(P+1,L,16,M+16);}Main.c#include "reg52.h"#include "intrins.h"#include "string.h"#include "LCD_12864.c"#define uchar unsigned char#define uint unsigned int/*extern void LCD_Initialize(void);extern void Display_A_Char_8X16(uchar P,uchar L,uchar *M); extern void Display_A_WORD(uchar P,uchar L,uchar *M);//在调整日期时间时,用该位决定是否反白显示extern bit Reverse_Display=0;*/sbit SDA=P1^0; //DS1302数据线sbit CLK=P1^1; //DS1302时钟线sbit RST=P1^2; //DS1302复位线sbit k1=P3^4; //选择sbit k2=P3^5; //加sbit k3=P3^6; //减sbit k4=P3^7; //确定uchar tCount=0;//一年中每个月的天数,2月的天数由年份决定uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31};//所读取的日期时间uchar DateTime[7];//当前调整的时间对象:秒,分,时,日,月,年(0,1,2,3,4,6)//5对应星期,星期调节由年月日调整自动完成char Adjust_Index=-1;//水平与垂直偏移uchar H_Offset=10,V_Page_Offset=0;//年月日,星期,时分秒汉字点阵(16*16)------------------------------- uchar code DATE_TIME_WORDS[]={/*-- 文字: 年--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x 04,0x00,0x00,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x 04,0x04,0x00,/*-- 文字: 月--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x 00,0x00,0x00,0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x/*-- 文字: 日--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x 00,0x00,0x00,/*-- 文字: 星--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00, 0x00,0x00,0x00,0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x 40,0x00,0x00,/*-- 文字: 期--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0xFF,0x24,0x24,0x24,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xF E,0x00,0x00,0x88,0x48,0x2F,0x09,0x09,0x19,0xAF,0x48,0x30,0x0F,0x02,0x42,0x82,0x 7F,0x00,0x00,/*-- 文字: 时--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x0 0,0x00,0x00,/*-- 文字: 分--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x 40,0x80,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x 00,0x00,0x00,/*-- 文字: 秒--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0xC0,0x38,0x00,0xFF,0x00,0x08,0x 10,0x60,0x00,0x08,0x06,0x01,0xFF,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0C,0x 03,0x00,0x00,};//星期几的汉字点阵(16*16)----------------------------------uchar code WEEDDAY_WORDS[]={/*-- 文字: 日--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x 00,0x00,0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x 00,0x00,0x00,/*-- 文字: 一--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x 80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x 00,0x00,0x00,/*-- 文字: 二--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x 00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x 10,0x10,0x00,/*-- 文字: 三--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x 04,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x 20,0x20,0x00,/*-- 文字: 四--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0x FC,0x00,0x00,0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x 7F,0x00,0x00,/*-- 文字: 五--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x 02,0x00,0x00,0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x 40,0x40,0x00,/*-- 文字: 六--*//*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x 20,0x20,0x00,0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x 60,0x00,0x00,};//半角数字点阵(8*16)---------------------------------------------------- uchar code DIGITS[]={/*-- 文字: 0 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*-- 文字: 1 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x 20,0x00,0x00,/*-- 文字: 2 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x 21,0x30,0x00,/*-- 文字: 3 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x 11,0x0E,0x00,/*-- 文字: 4 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x 3F,0x24,0x00,/*-- 文字: 5 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x 11,0x0E,0x00,/*-- 文字: 6 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x 11,0x0E,0x00,/*-- 文字: 7 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x 00,0x00,0x00,/*-- 文字: 8 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x 22,0x1C,0x00,/*-- 文字: 9 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x 11,0x0F,0x00,};//向DS1302写入一字节void Write_A_Byte_TO_DS1302(uchar x){ uchar i;for(i=0;i<8;i++){ SDA=x&1; CLK=1; CLK=0; x>>=1;}}//从DS1302读取一字节uchar Get_A_Byte_FROM_DS1302(void) { uchar i,b,t;for(i=0;i<8;i++){ b>>=1; t=SDA; b|=t<<7; CLK=1; CLK=0;}//BCD码转换return(b/16*10+b%16);}//从DS1302指定位置读数据uchar Read_Data(uchar addr){ uchar dat;RST=0; CLK=0; RST=1;Write_A_Byte_TO_DS1302(addr);dat=Get_A_Byte_FROM_DS1302();CLK=1; RST=0;return(dat);}//向DS1302某地址写入数据void Write_DS1302(uchar addr,uchar dat){ CLK=0; RST=1;Write_A_Byte_TO_DS1302(addr);Write_A_Byte_TO_DS1302(dat);CLK=0; RST=0;}//设置时间void SET_DS1302(void){ uchar i;Write_DS1302(0x8e,0x00);//秒分时日月年依次写入for(i=0;i<7;i++){ //秒的起始地址1000 0000(0x80)//后续依次是分,时,月,周,年,写入地址每次递增2Write_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i]%10));}Write_DS1302(0x8e,0x80);}//读取当前日期时间void GetTime(void){ uchar i;for(i=0;i<7;i++){ DateTime[i]=Read_Data(0x81+2*i);}}//半断是否为闰年uchar isLeapYear(uint y){ return((y%4==0&&y%100!=0)||(y%400==0)); }//--------------------------------------------//求自2000.1.1开始的任何一天是星期几//函数没有通过,求出总天数后在求出星期几//因为求总天数可能会月出uint的范围//--------------------------------------------void RefreshWeekDay(void){ uint i,d,w=5; //已知1999.12.31是周五for(i=2000;i<2000+DateTime[6];i++){ d=isLeapYear(i)?366:365;w=(w+d)%7;}d=0;for(i=1;i<DateTime[4];i++)d+=MonthsDays[i];d+=DateTime[3];//保存星期,0~6表示星期日,星期一,二,、、、六,为了与DS1302的星期格式匹配,返回值需要加1DateTime[5]=(w+d)%7+1;}//年月日时分秒++/--void DateTime_Adjust(char x){ switch(Adjust_Index){ case 6: //年00-99if(x==1&&DateTime[6]<99)DateTime[6]++;if(x==-1&&DateTime[6]>0)DateTime[6]--;//获取2月天数MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;//如果年份变化后当前月份的天数大于上限则设为上限if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays [DateTime[4]];RefreshWeekDay(); //刷新星期break;case 4: //月01-12if(x==1&&DateTime[4]<12)DateTime[4]++;if(x==-1&&DateTime[4]>1)DateTime[4]--;//获取2月份天数MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;//如果月份变化后当前月份的天数大于上限则设为上限if(DateTime[3]>MonthsDays[DateTime[4]])DateTime[3]=MonthsDays [DateTime[4]];RefreshWeekDay(); //刷新星期break;case 3: //日00-28/29/30/31;调节之前首先根据年份得出该年中2月的天数MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28;//根据当前月份决定调节日期的上限if(x==1&&DateTime[3]<MonthsDays[DateTime[4]])DateTime[3]++;if(x==-1&&DateTime[3]>1)DateTime[3]--;RefreshWeekDay(); //刷新星期break;case 2: //时if(x==1&&DateTime[2]<23)DateTime[2]++;if(x==-1&&DateTime[3]>1)DateTime[2]--;break;case 1: //分if(x==1&&DateTime[1]<59)DateTime[1]++;if(x==-1&&DateTime[1]>1)DateTime[1]--;break;case 0: //秒if(x==1&&DateTime[0]<59)DateTime[0]++;if(x==-1&&DateTime[0]>1)DateTime[0]--;}}//定时器0每秒刷新LCD显示void T0_INT(void) interrupt 1{ TH0=-50000/256;TL0=-50000%256;if(++tCount!=2)return;tCount=0;if(Adjust_Index==-1)GetTime(); //如果未执行调整操作则正常读取当前时间//年后两位Reverse_Display=Adjust_Index==6; /*等同于{ if(Adjust_Index==6)Reverse_Display=1;else Reverse_Display=0; } */Display_A_Char_8X16(V_Page_Offset,16+H_Offset,DIGITS+DateTime [6]/10*16);Display_A_Char_8X16(V_Page_Offset,24+H_Offset,DIGITS+DateTime [6]%10*16);//月Reverse_Display=Adjust_Index==4;Display_A_Char_8X16(V_Page_Offset,48+H_Offset,DIGITS+DateTime [4]/10*16);Display_A_Char_8X16(V_Page_Offset,56+H_Offset,DIGITS+DateTime [4]%10*16);//日Reverse_Display=Adjust_Index==3;Display_A_Char_8X16(V_Page_Offset,80+H_Offset,DIGITS+DateTime [3]/10*16);Display_A_Char_8X16(V_Page_Offset,88+H_Offset,DIGITS+DateTime [3]%10*16);//星期Reverse_Display=Adjust_Index==5;Display_A_WORD(V_Page_Offset+2,96+H_Offset,WEEDDAY_WORDS +(DateTime[5]-1)*32);//时Reverse_Display=Adjust_Index==2;Display_A_Char_8X16(V_Page_Offset+5,16+H_Offset,DIGITS+DateTi me[2]/10*16);Display_A_Char_8X16(V_Page_Offset+5,24+H_Offset,DIGITS+DateTi me[2]%10*16);//分Reverse_Display=Adjust_Index==1;Display_A_Char_8X16(V_Page_Offset+5,48+H_Offset,DIGITS+DateTi me[1]/10*16);Display_A_Char_8X16(V_Page_Offset+5,56+H_Offset,DIGITS+DateTi me[1]%10*16);//秒Reverse_Display=Adjust_Index==0;Display_A_Char_8X16(V_Page_Offset+5,80+H_Offset,DIGITS+DateTi me[0]/10*16);Display_A_Char_8X16(V_Page_Offset+5,88+H_Offset,DIGITS+DateTi me[0]%10*16);}//键盘中断(INT0)void EX_INT0(void) interrupt 0{ if(k1==0) //选择调整对象{ if(Adjust_Index==-1||Adjust_Index==0)Adjust_Index=7;Adjust_Index--;if(Adjust_Index==5)Adjust_Index=4; //跳过对星期的调整}else if(k2==0)DateTime_Adjust(1); //加else if(k3==0)DateTime_Adjust(-1); //减else if(k4==0) //确定{ SET_DS1302(); //将调整后的时间写入DS1302Adjust_Index=-1; //操作索引重设为-1,时间继续正常显示}}//主程序void main(){ //液晶初始化LCD_Initialize();//显示年的固定前两位Display_A_Char_8X16(V_Page_Offset,0+H_Offset,DIGITS+2*16);Display_A_Char_8X16(V_Page_Offset,8+H_Offset,DIGITS);//显示固定汉字:年月日,星期,时分秒Display_A_WORD(V_Page_Offset,32+H_Offset,DATE_TIME_WORDS+ 0*32);Display_A_WORD(V_Page_Offset,64+H_Offset,DATE_TIME_WORDS+ 1*32);Display_A_WORD(V_Page_Offset,96+H_Offset,DATE_TIME_WORDS+ 2*32);Display_A_WORD(V_Page_Offset+2,64+H_Offset,DATE_TIME_WORD S+3*32);Display_A_WORD(V_Page_Offset+2,80+H_Offset,DATE_TIME_WORD S+4*32);Display_A_WORD(V_Page_Offset+5,32+H_Offset,DATE_TIME_WORD S+5*32);Display_A_WORD(V_Page_Offset+5,64+H_Offset,DATE_TIME_WORD S+6*32);Display_A_WORD(V_Page_Offset+5,96+H_Offset,DATE_TIME_WORD S+7*32);//允许INT0,T0中断IE=0x83;IP=0x01;IT0=0x01;TH0=-50000/256;TL0=-50000%256;TR0=1;while(1);}。

基于某stc51单片机的LCD1602显示时间_的电子万年历(显示当前温度)

基于某stc51单片机的LCD1602显示时间_的电子万年历(显示当前温度)

1 课设所需软件简介1.1 Keil uVision4的简要介绍2009年2月发布Keil μVision4,Keil μVision4引入灵活的窗口管理系统,使开发人员能够使用多台监视器,并提供了视觉上的表面对窗口位置的完全控制的任何地方。

新的用户界面可以更好地利用屏幕空间和更有效地组织多个窗口,提供一个整洁,高效的环境来开发应用程序。

新版本支持更多最新的ARM芯片,还添加了一些其他新功能。

2011年3月ARM公司发布最新集成开发环境RealView MDK开发工具中集成了最新版本的Keil uVision4,其编译器、调试工具实现与ARM器件的最完美匹配。

Keil C51开发系统基本知识Keil C51开发系统基本知识1. 系统概述Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

下面详细介绍Keil C51开发系统各部分功能和使用。

2. Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51及C51编译器编译生成目标文件(.OBJ)。

目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。

ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

使用独立的Keil仿真器时,注意事项:* 仿真器标配11.0592MHz的晶振,但用户可以在仿真器上的晶振插孔中换插其他频率的晶振。

基于51单片机和lcd1602的万年历设计

基于51单片机和lcd1602的万年历设计

基于单片机的万年历设计摘要古人依靠日冕、漏刻记录时间,而随着科技的发展,电子万年历已经成为日渐流行的日常计时工具。

本文研究的万年历系统拟用STC89C52单片机控制,以DS1302时钟芯片计时、DS18B20采集温度、1602液晶屏显示。

系统主要由温度传感器电路,单片机控制电路,显示电路以及校正电路四个模块组成。

本文阐述了系统的硬件工作原理,所应用的各个接口模块的功能以及其工作过程,论证了设计方案理论的可行性。

系统程序采用C语言编写,经Keil软件进行调试后在Proteus软件中进行仿真,可以显示年、月、日、星期、时、分、秒和温度并具有校准功能和与即时时间同步的功能。

实验结果表明此万年历实现后具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

关键词:万年历单片机仿真The Calendar of Design based on Single ChipAbstractAncient rely on corona, Louke recording time. The electronic calendar has become the popular tool for the daily timing.as the development of technology.In the calendar system , the STC89C52 is used to control,with the DS1302 clock chip timing, DS18B20 collecting temperature, 1602 LCD Displaying. The system is composed of four modules:the temperature sensor circuit, the MCU control circuit, the display circuit and the correction circuit.This paper describes the hardware works, the functions of each interface module and its working process, demonstrates design theory is Feasibility.. C language is used to program, after debugging in the Keil software,then simulating in the Proteus. The electronic calendar can display year, month, day, week, hours, minutes, seconds, temperature, and has calibration features and functionality with real time synchronization.The results show that this calendar is easy to read, intuitive display, versatile, simple circuits, and many other advantages,The design meets the development trend of electronic instruments and meters, and has broad market prospects.Keywords:Calendar ; MCU ; simulation目录第一章绪论 (1)1.1课题研究的意义 (1)1.2本课题主要的研究工作 (1)1.2.1研究内容 (1)1.2.2论文章节安排 (2)1.3本章小结 (2)第二章单片机的概述 (3)2.1单片机的定义和特点 (3)2.1.1单片机的定义 (3)2.1.2单片机的特点 (3)2.2单片机的发展现状和趋势 (4)2.2.1单片机的发展现状 (4)2.2.2单片机的发展趋势 (5)2.3编程语言的选择 (5)2.4本章小结 (6)第三章设计要求和方案论证 (7)3.1设计要求 (7)3.2单片机芯片的选择方案和论证 (7)3.3显示模块选择方案和论证 (7)3.4时钟芯片的选择方案和论证 (8)3.5温度传感器的选择方案与论证 (8)3.6电路设计最终方案决定 (9)3.7本章小结 (9)第四章系统的硬件设计与实现 (10)4.1电路设计框图 (10)4.2系统硬件概述 (10)4.3主要单元电路的设计 (11)4.3.1 STC89C52单片机简介 (11)4.3.2单片机主控制模块的设计 (13)4.3.3时钟电路模块的设计 (15)4.3.4温度传感器电路设计 (16)4.3.5独立式键盘设计 (19)4.3.6显示模块的设计 (19)4.4本章小结 (21)第五章系统的软件设计 (22)5.1程序流程图 (22)5.1.1系统总流程图 (22)5.1.2温度程序流程图 (23)5.1.3时钟程序流程图 (24)5.1.4液晶显示程序流程图 (25)5.2程序的设计 (26)5.2.1 DS18B20测温程序 (26)5.2.2读写DS1302程序 (27)5.2.3液晶显示程序 (29)5.3本章小结 (29)第六章仿真与调试 (30)6.1软件简介 (30)6.1.1 Keil软件简介 (30)6.1.2 Proteus ISIS简介 (30)6.2 Keil软件调试流程 (31)6.3 Proteus软件运行流程 (33)6.4 万年历的功能仿真 (35)6.5 硬件调试结果 (35)6.6本章小结 (39)第七章总结与展望 (40)参考文献 (41)附录一:系统电路图 (42)附录二:系统PCB板 (43)附录三:系统程序 (44)致谢 (57)第一章绪论1.1课题研究的意义万年历是我国古代传说中最古老的一部太阳历。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要在寒假期间我用一周时间完成了这个液晶万年历,它可以显示年月日、时分秒、以及温度(可上下限报警),可以对时间进行加一或减一调整,并加入了闰、平年时间调整,方便可行,已经调试成功。

考虑到成本和方便,本作品采用了STC89c52和DS18B20,计时用的是51单片机自带的十六位定时器/计数器T0,尽管对时间进行了误差调整但是还是有一定的误差,考虑到学校后改用DS1302时钟芯片,进一步减小误差。

温度显示精度达到0.1摄氏度。

关键词:单片机 DS18B20 万年历温度1.硬件工作介绍(1)上电自动复位及手动复位电路STC89c52单片机的RST端外部复位有两种操作方式:上电自动复位和按键手动复位。

本设计用上电自动复位以及手动复位下结合的方式外接电路(见附图)。

(2)时钟振荡电路作品中采用12M晶振,其连接方法如图所示,其中电容的值都为22pF。

(3)1602液晶显示接口1602采用标准的16脚接口(见附图),其中:第1脚:GND为地电源第2脚:VCC接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS 和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15脚:VCC第16:GND(4)键盘键盘是通过S3(P3.2),S4(p3.3),S5(p3.4)对时钟进行调整,其S3选择要调整的对象如时,分,日,月等等,并在液晶屏上显示所选的对象。

S4对所选中的对象进行加一调整,而S5对所选对象进行减一调整。

(5)蜂鸣器对温度进行测量,高低温超限报警,正常温度在15.0-36.0摄氏度,超过最高或低于最低温度就会鸣叫报警。

2.软件工作介绍由于C语言功能丰富,表达能力和可移植能力强,而且操作方便,简单易懂,因此软件部分由C语言编写,程序的重点和难点是闰月的时间调整以及键盘对时间的调整,恳请老师指正。

主程序流程图设计总结在制作的过程中,因为板子是在学校自己动手做的最小系统板,接插线还是比较简单的,难的是硬件的调试,因为理论与实践总是存在着差距,想出来的东西没有经过实践的检验是不可靠的,任何一个小小的疏忽大意都能导致失败。

比如说对hour, min , sec,day, moth的定义,一开始我用的unsigned char ,但是在调试减一时,减到零时再按下键盘就会出现乱码,几经调试,终于发现问题地所在并及时地解决了问题,之后再一次对硬件进行调试,终于成功了。

从这一方面来说,我认识到做要比说难得多,做的过程中必定有很多的阻碍,但是一定要慢慢来,一点一点地找出问题,再一点一点地解决它,这样的话,到达成功的彼岸也就仅仅是时间的问题了。

我通过这次设计,特别是通过对程序的编写,深层了解了单片机内部结构和外围器件的应用。

我学到的不仅仅是电子方面的知识,更重要的是,我学到了作为一名电子设计者所必需的心理素质,那就是——决心加上耐心!附录1:程序代码:#include <reg51.h>#define Lcd_Data P0 //定义数据端口#define _TH0_TL0_ (65536 - 50000)#define HI (_TH0_TL0_ / 256) //给高8位赋值#define LO (_TH0_TL0_ % 256) //给低8位赋值#define M 20 //(1000/50)1秒要20个中断的累计char hour = 0, min = 0, sec = 0,N=0,day=1,moth=1,week=7;//初始化要显示的值unsigned char SEG_TAB[] = {0x30,0x31,0x32, 0x33, 0x34, 0x35, 0x36, 0x37,0x38, 0x39};//0-9数字unsigned int year=8;sbit RS = P2^ 5; //定义和LCD的连接端口sbit RW = P2^ 4;sbit E = P2^ 3;sbit Busy = P0^ 7;sbit S3 = P3^2;//定义开关s3选择键sbit S4 = P3^3;//s4加一键sbit S5 = P3^4;//s5减一键sbit DQ = P2^0;//DS18B20sbit speak = P2^1; //蜂鸣器警报/******************************************************************** *******/void delay1(unsigned int num)//短延时函数{while( num-- );}/******************************************************************** **********/void Delay(unsigned char t)//长延时函数,延时1MS*t S{unsigned char a;while(--t != 0){for(a = 0; a < 125; a++);}}/*******************************************************************/ void Timer0Init(void) //初始化定时器0程序{TMOD = 0x01; //设置模式1 定时器0 工作方式0TH0 = HI; //给TH0,TL0赋初始值TL0 = LO;TR0 = 1; //启动定时器0ET0 = 1; //定时器中断开EA = 1; //总中断开}/******************************************************************** **********/void Read_Busy(void)//读忙信号判断{do{Lcd_Data = 0xff;RS = 0;RW = 1;E = 0;Delay(2);E = 1;}while(Busy);}/******************************************************************** **********/void Write_Comm(unsigned char lcdcomm) //写指令函数{Lcd_Data = lcdcomm;RS = 0;RW = 0;E = 0;Read_Busy();E = 1;}/******************************************************************** **********/void Write_Data(unsigned char lcddata)//写数据函数{Lcd_Data = lcddata;RS = 1;RW = 0;E = 0;Read_Busy();E = 1;}/******************************************************************** **********/void Init_LCD(void)//初始化LCD{Delay(400); //稍微延时,等待LCD进入工作状态Write_Comm(0x01);//清显示Write_Comm(0x02);//光标归位Write_Comm(0x38);//8位2行5*8Write_Comm(0x06);//文字不动,光标右移Write_Comm(0x0c);//显示开/关,光标开闪烁开Write_Comm(0x18);//左移}/******************************************************************** ***********/Init_DS18B20(void)//初始化ds1820{unsigned char x = 0;DQ = 1; //DQ复位delay1(8); //稍做延时DQ = 0; //单片机将DQ拉低delay1(80); //精确延时大于480usDQ = 1; //拉高总线delay1(14);x = DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay1(20);}/**********************************************************************************/ReadOneChar(void)//读一个字节{unsigned char i = 0;unsigned char dat = 0;for (i = 8; i > 0; i--){DQ = 0; // 给脉冲信号dat >>= 1;DQ = 1; // 给脉冲信号if(DQ)dat |= 0x80;delay1(4);}return (dat);}/******************************************************************** **************/WriteOneChar(unsigned char dat)//写一个字节{unsigned char i = 0;for (i = 8; i > 0; i--){DQ = 0;DQ = dat&0x01;delay1(5);DQ = 1;dat>>=1;}}/******************************************************************** **************/Read_Disp_Temperature(void)//读取并显示温度{unsigned int a = 0, b = 0, c = 0, t = 0;float tt = 0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a = ReadOneChar();b = ReadOneChar();t = b;t <<= 8;t = t | a;tt = t * 0.0625;t = tt * 10 + 0.5; //放大10倍输出并四舍五入a = t / 100; //十位b = t / 10 - a * 10; //个位c = t - a * 100 - b * 10; //小数位if((t>=360)||(t<=150)) //温度报警范围{ speak=0;}else speak=1;Write_Comm(0x8d); //lcd显示温度Write_Data( SEG_TAB[a]);Write_Data( SEG_TAB[b]);Write_Data( '.');Write_Data( SEG_TAB[c]);}/******************************************************************** **********/void main(void)//主函数--数字读取和计算{Init_LCD(); //初始化LCDTimer0Init();//初始化定时器0Write_Comm(0x83); //写入":"字符Write_Data(':');Write_Comm(0x86);Write_Data(':');Write_Comm(0x89);//温度提示字符Write_Data('T');Write_Data('e');Write_Data('m');Write_Data('p');Write_Comm(0xc1);//第二行首地址//写入"20 - -"字符Write_Data('2');Write_Data('0');Write_Comm(0xc5);Write_Data('-');Write_Comm(0xc8);Write_Data('-');Write_Comm(0xcb);Write_Data('-');while(1){Read_Disp_Temperature(); //温度if(S3==0){delay1(10);if(S3==0)N++;if(N>6) {N=0;}while(S3==0);Write_Comm(0xcf);Write_Data(SEG_TAB[N]); //显示切换键位所示的位置N//0:秒,1:分,2:时,3:日,4:月,5:年6:星期}if(S4==0)//时间调整--加{delay1(10);if(S4==0){if(N==1){min++;if(min==60) min=0;Write_Comm(0x84);Write_Data(SEG_TAB[min/10]);Write_Comm(0x85);Write_Data(SEG_TAB[min%10]);}if(N==2){hour ++;if(hour==24) hour=0;Write_Comm(0x81);Write_Data(SEG_TAB[hour/10]);Write_Comm(0x82);Write_Data(SEG_TAB[hour%10]);}if(N==3){day++;if(moth==2&&(year%4==0)&&day==30)day=1; //闰年2月天数计算if(moth==2&&(year%4!=0)&&day==29)day=1; //平年2月if((moth==4||moth==6||moth==9||moth==11)&&day==31)day=1;//4,6,9,11月计算if(day==32)day=1;//1,3,5,7,8,10,12月天数计算Write_Comm(0xC9);Write_Data(SEG_TAB[day/10]);Write_Comm(0xCa);Write_Data(SEG_TAB[day%10]);}if(N==4){moth++;if(moth==13)moth=1;Write_Comm(0xc6);Write_Data(SEG_TAB[moth/10]);Write_Comm(0xc7);Write_Data(SEG_TAB[moth%10]);}if(N==5){year++;if(year==51)year=0;Write_Comm(0xc3);Write_Data(SEG_TAB[year/10]);Write_Comm(0xc4);Write_Data(SEG_TAB[year%10]);}if(N==6){week++;if(week==8) week=1;Write_Comm(0xcc);Write_Data(SEG_TAB[year/10]);}while(S4==0);}}if(S5==0)//时间调整--减{delay1(10);if(S5==0){if(N==1){min--;if(min<0) {min=59;}Write_Comm(0x84);Write_Data(SEG_TAB[min/10]);Write_Comm(0x85);Write_Data(SEG_TAB[min%10]);}if(N==2){ hour--;if(hour<0){hour=23;}Write_Comm(0x81);Write_Data(SEG_TAB[hour/10]);Write_Comm(0x82);Write_Data(SEG_TAB[hour%10]);}if(N==3){ day--;if(moth==2&&(year%4==0)&&day<1)day=29;if(moth==2&&(year%4!=0)&&day<1)day=28; if((moth==4||moth==6||moth==9||moth==11)&&day<1)day=30;if(day<1)day=31;Write_Comm(0xC9);Write_Data(SEG_TAB[day/10]);Write_Comm(0xCa);Write_Data(SEG_TAB[day%10]);}if(N==4){ moth--;if(moth==0){moth=12;}Write_Comm(0xc6);Write_Data(SEG_TAB[moth/10]);Write_Comm(0xc7);Write_Data(SEG_TAB[moth%10]);}if(N==5){ year--;if(year<0){year=50;}Write_Comm(0xc3);Write_Data(SEG_TAB[year/10]);Write_Comm(0xc4);Write_Data(SEG_TAB[year%10]);}if(N==6){week--;if(week==0) week=7;Write_Comm(0xcc);Write_Data(SEG_TAB[week]);}while(S5==0);}}}}/******************************************************************** ******/void IsrTimer0(void) interrupt 1 using 1 //定时器0中断服务程序{static unsigned char count = 0; //定义静态变量countTR0 = 0; //时间误差调整TL0 += (_TH0_TL0_ + 9) % 256;TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;TR0 = 1;count++;if(count == M)//1秒种时间到{count = 0;sec++;if(sec == 60)//1分钟时间到{min++;sec = 0;if(min == 60)//1小时时间到{hour++;min = 0;if(hour == 24)//24小时时间到{ day++;week++;hour = 0;min = 0;sec = 0;if(week==8){ week=1;}if((moth==2&&(year%4==0)&&day==30)||(moth==2&&(year%4!=0)&&day==29)||( (moth==4||moth==6||moth==9||moth==11)&&day==31)||(day==32)){ //一个月到moth++;day=1;if(moth==13) //一年到{ year++;moth=1;}}}}}}Write_Comm(0x81); //时间显示Write_Data(SEG_TAB[hour/10]);Write_Comm(0x82);Write_Data(SEG_TAB[hour%10]);Write_Comm(0x83);Write_Data(':');Write_Comm(0x84);Write_Data(SEG_TAB[min/10]);Write_Comm(0x85);Write_Data(SEG_TAB[min%10]);Write_Comm(0x86);Write_Data(':');Write_Comm(0x87);Write_Data(SEG_TAB[sec/10]);Write_Comm(0x88);Write_Data(SEG_TAB[sec%10]);Write_Comm(0x8f);Write_Data( '.');Write_Comm(0xc3);Write_Data(SEG_TAB[year/10]);Write_Comm(0xc4);Write_Data(SEG_TAB[year%10]);Write_Comm(0xc5);Write_Data('-');Write_Comm(0xc6);Write_Data(SEG_TAB[moth/10]);Write_Comm(0xc7);Write_Data(SEG_TAB[moth%10]);Write_Comm(0xc8);Write_Data('-');Write_Comm(0xc9);Write_Data(SEG_TAB[day/10]);Write_Comm(0xca);Write_Data(SEG_TAB[day%10]);Write_Comm(0xcb);Write_Data('-');Write_Comm(0xcc);Write_Data(SEG_TAB[week]);Write_Comm(0xcd);Write_Data(0xfe);Write_Comm(0xce);Write_Data(0xfe);Write_Comm(0xcf+1);Write_Data(0xfe);}附录2:电路图。

相关文档
最新文档