资源描述
- -
工业职业技术学院
毕业综合实践
课题名称:基于单片机的万年率的设计
作 者: 强 学 号:20213361
分 院:电子与信息工程
专 业:电子与信息工程技术〔物联网方向〕
指导教师: 胡蓉 专业技术职务: 教授
2021 年 3 月
- word.zl
- -
目 录
摘要
1. 绪论 1
1.1 设计目的 1
1.2 开展现状 1
1.3 解决问题 2
2. 硬件系统设计 3
2.1本设计所需的元器件 3
2.2 STC89C52RC单片机 4
2.2.1单片机主要特性 4
2.2.2单片机引脚说明 5
2.3 MAX232电平转换芯片 7
2.4 DS1302时钟芯片 8
2.5 DS18B20温度传感器 10
2.6 12864液晶 11
2.7 独立按键 12
3. 软件设计 13
3.1阳历与阴历转换 14
3.2 DS1302时钟芯片程序设计 14
3.3 DS18B20程序设计 21
3.4 12864液晶显示程序设计 22
4. 调试 26
总结 30
参考文献 31
答 32
附录一 33
附录二 34
- word.zl
- -
摘要:
随着电子技术的开展,万年历目前已经不再局限于以纸质的形式出现。以电脑软件或者电子产品形式出现的万年历被称为电子万年历。与传统纸质的万年历相比,电子万年历得到了越来越广泛的应用。采用电子万年历来显示时间已经成为了一种时尚。
本文提出了一种基于单片机的电子万年历的设计,以STC89C51作为主控制核心,与液晶LCD1602、时钟芯片DS1302、温度传感器DS18B20、独立式按键等模块组成硬件系统,能实现时间、温度的显示,以及时间的调整。
关键词:STC89C51,万年历,DS1302,DS13B20
绪论
1.1 设计目的
古人依靠日冕,漏刻记录时间。从古至今,人们的日常生活和工作都离不开对时间的准确把握。而随着科技的开展,电子万年历成为了日渐流行的日常计时工具。目前市场上的万年历功能强大,简单直观,给人们带来很大的方便。
对于万年历设计有很多实现的方法,自己动手设计与制作可以对硬件的构造和功能有更深的认识,并与软件结合,以到达理论与实践更好的结合,进一步提高综合运用所学知识进展设计的能力。这是对自己大学三年的学习的检验,具有重要的意义。
1.2 开展现状
据了解,目前市场上的电子万年历并不是采用51单片机作为主控制器的,基于单片机的万年历一般是学生和单片机爱好者在进展设计,谈不上占有市场。也许就是这样,研究单片机万年历的人不在少数,并且都在努力。努力不是单方面的,单片机的功能也应该要提高,STC89C52单片机就是这样的例子,其功能虽然没有大幅度提高,但使用起来更方便了。我相信,在不久的将来肯定会有功能更强大本钱更低的单片机出现,给我们的设计带来更多的便利。
1.3 解决问题
本课题主要通过单片机的功能和应用,利用编程软件和仿真软件进展设计,并制作实物。设计要到达预期的效果要解决以下问题:
(1)认真设计好万年历的逻辑原理图;
(2) 熟练使用C语言,运用编程软件进展软件设计;
(3) 在Proteus仿真平台上,对程序进展编译仿真;
(4) 认真仔细地对万年历进展组装焊接;
(5) 在确认没有问题的硬件实物上进展程序下载调试,以到达预期的效果要求;
2. 硬件系统设计
本设计将最小系统与所有用到的模块元件集合在一块万能板上,最小系统和其它模块均由自己动手焊接。首先是在万能板上布局,以到达合理的规划,保证设计的美观性。然后为了保证设计的质量,我将各元件的电源口与GND接地口再一次规划,用焊锡分别将电源线和GND接地线固定在了特定的位置,以降低线路的复杂度,让人一目了然。最后各模块元件与单片机之间均用电线直接由引脚处连接〔万能板的焊点处〕。为了保护各模块元件,本设计使用到的一些重要元件都使用的IC插槽或排母进展焊接,连线〔见实物图4.1〕。本设计的系统框架如图2.1所示:
12864液晶模块
单片机
STC89C52RC
DS1302时钟芯片模块
独立按键模块块
DS18B20温度传感器模块
内部时钟、复位模块
图2.1万年历的系统框架图
2.1本设计所需的元器件
①单片机:STC89C52RC;
②电平转换芯片:MAX232;
③时钟芯片:DS1302;
④温度传感器:DS18B20;
⑤液晶:QC12864B汉字图形点阵液晶;
⑥按钮开关;
2.2 STC89C52RC单片机
本设计采用STC89C52RC单片机[6],8K字节可编程闪烁存储器。STC89系列单片机是MCS-51系列单片机的派生产品,它们在指令系统、硬件构造和片资源上与标准8052单片机完全兼容。STC89系列是以8051为基核开发出的CMOS工艺单片机,DIP封装系列与8051为pin-to-pin〔引脚对引脚〕兼容。STC89系列单片机高速,低功耗,其程序写入时可通过串口采用STC-ISP.不占用用户资源,学习单片机时较好的选择。
2.2.1单片机主要特性
(1) CPU:由运算和控制逻辑组成,同时还包括中断系统和局部外部特殊功能存放器。中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
(2) RAM:用于存放要读写的数据,如运算的中间结果、最终结果以及欲显示的数据。8051部有128个8位用户数据存储单元和128个专用存放器单元,它们是统一编址的,专用存放器只能用于存放控制指令数据,用户只能,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
(3) ROM:8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
(4) I/O口:四组8位并行I/O口(P0、 P1、P2和P3),既可用作输入,也可用作输出。
(5) T/C定时/计数器:两个16位的可编程定时/计数器,既可以工作在定时模式,也可以工作在计数模式。
(6) 5个中断源的中断控制系统:8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
(7) 全双工串行口:一个全双工UART〔通用异步接收发送器〕的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
(8) 片振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率取决于单片机型号及性能。
2.2.2单片机引脚说明
图2.2 STC89C52RC封装引脚图
STC89C52RC的引脚封装和8051的引脚封装是一样的,均采用40Pin封装的双列直插DIP构造。下列图是它们的引脚配置,40个引脚中,Pin40为正电源,Pin20为地线;外置石英振荡器的时钟线Pin18和Pin19两根;4组8位共32个I/O口〔P0、P1、P2和P3〕,中断口线与P3口线复用。本设计只是实现简单的读写功能,不需要用到I/O口的第二功能。这里就不对单片机的引脚作出太详细的介绍,简单介绍一些专用引脚,其它引脚用到时再介绍。单片机引脚封装如图2.2所示。
(1) Pin9:RST复位信号复用脚,当STC89C52RC通电,时钟电路开场工作,在RST引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用存放器被清“0〞。RST由高电平下降为低电平后,系统即从0000H地址开场执行程序。然而,初始复位不改变RAM〔包括工作存放器R0-R7〕的状态,STC89C52RC的初始态。
STC89C52RC的复位方式可以是自动复位,也可以是手动复位〔按键电平复位和按键脉冲复位〕。此外,RST还是一个复引脚,Vcc掉电期间,此引脚可接上备用电源,以保证单片机部RAM的数据不丧失。本设计采用的是手动复位电路:按键电平复位。复位电路如图2.3所示。
图2.3 按键电平复位电路
(2) Pin18、19:XTAL1和XTAL2时钟产生电路引脚,这里使用的石英晶体振荡频率为11.0592MHz。时钟振荡电路如图2.4所示。
图2.4 时钟振荡电路
(3) Pin29:当外部程序存储器时,此引脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器那么把指令数据放到P0口上,由CPU读入并执行。
(4) Pin30:ALE/当外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。它还有一个特点是,当外部程序存储器时,ALE会跳过一个脉冲。
(5) Pin31:/VPP程序存储器的外部选通线,对于STC89C52RC来说,置有8kB的程序存储器,当为高电平并且程序地址小于8kB时,读取部程序存储器指令数据,而超过8kB地址那么读取外部指令数据。如为低电平,那么不管地址大小,一律读取外部程序存储器指令。
当使用到外部程序存储器时,要使用到一些特定功能的引脚,本设计中没有使用外部存储器。
2.3 MAX232电平转换芯片
当我们用STC-ISP.这个软件给STC89C52RC下载程序时,采用的是计算机串口〔RS-232电平:高 -12V 低+12V〕通信,所以计算机与单片机之间进展通信时需要电平转换芯片MAX232。
MAX232含有两个RS-232发送驱动器和接收驱动器,其中发送器的输入为TTL/CMOS电平,输出为RS-232电平。MAX232接收器的输入为RS-232电平,输出为TTL/CMOS电平。不使用的输入输出端可以悬空。MAX232的工作温度围为0℃至70℃。
MAX232的Pin14〔T1OUT〕引脚与串行口的2引脚连接,Pin13〔R1IN〕引脚与串行口的3引脚连接。Pin12〔R1OUT〕引脚和Pin11〔T1IN〕引脚分别与单片机的P3.0 /RXD〔串行输入口〕、P3.1 /TXD〔串行输出口)连接。这样单片机所需要的程序就可以从计算机下载了。计算机与单片机通信如图2.5所示。
图2.5 计算机与单片机通信连接图
2.4 DS1302时钟芯片
市场上可以选择的时钟芯片很多,功能也不尽一样,价格各异。DS1302[8] 是美国DALLAS 公司推出的一种串行接口实时时钟芯片。芯片部具有可编程日历时钟和31个字节的静态RAM,它可以对年、月、日、星期、时、分、秒进展计时,日历时钟可自动进展闰年补偿,及时准确,接口简单,使用方便,工作电压围宽,功耗低,芯片自身还具有对备份电池进展涓流充电功能,可以有效地延长备份电池的使用寿命。DS1302引脚封装如图2.6所示。
图2.6 DS1302封装引脚图
DS1302时钟芯片的引脚功能如下:
(1) Pin1:Vcc2为主电源。
(2) Pin8:Vcc1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。
(3) Pin2、3:X1、X2是振荡源,外接32.768kHz晶振。
(4) Pin5:是复位/片选线,通过把输入驱动置高电平来启动所有的数据传送。输入有两种功能:首先,接通控制逻辑,允许地址/命令序列送入移位存放器;其次,提供终止单字节或多字节数据的传送手段。当为高电平时,所有的数据传送被初始化,允许对DS1302进展操作。如果在传送过程中置为低电平,那么会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在v cc>2.0V之前,必须保持低电平。只有在SCLK为低电平时,才能将置为高电平。
(5) Pin6:I/O为串行数据输入输出端(双向),在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开场。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
(6) Pin7:SCLK为时钟输入端。
DS1302与单片机连接图如图2.7所示,具体的读写操作在第3局部软件设计中介绍。
2.7(a) DS1302 2.7(b) 单片机
图2.7 单片机与DS1302的连接引脚图
2.5 DS18B20温度传感器
温度是一个根本的物理量,自然界中的一切过程与温度密切相关。设计里参加DS18B20温度传感器可以使万年历的功能更齐全,可以随时了解温度的变化。DS18B20的封装引脚如图2.8和单片机与DS18B20的连接如图2.9。DS18B20温度传感器的I/O〔DQ〕引脚连接的是单片机的P3.3引脚。
图2.8 DS18B20封装引脚图 图2.9 单片机与DS18B20的连接图
DS18B20温度传感器是美国DALLS公司推出的DS1820的替代产品,其主要特性如下。
(1) 适应电压围更宽,电压围:3.0~5.5V,v cc为外接供电电源输入端,在寄生电源方式下可由数据线供电,GND为电源地。
(2) 独特的单线接口方式,DS18B20在与单片机连接时仅需要一个引脚〔DQ〕即可实现微处理器与DS18B20的双向通讯。
(3) DS18B20在使用中不需要任何外围元件,全部 传感元件及转换电路集成在形如一只三极管的集成电路。
(4) 温围:55℃~+125℃,在-10~+85℃时精度为±0.5℃。
(5) 可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温。
(6) 负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。
2.6 12864液晶
在本设计中,要显示阳历、阴历、星期、时间、生肖、温度及节日提醒,因此对显示器的要求较高。在这里我采用QC12864B汉字图形点阵液晶[10]作为显示模块,它可显示汉字及图形,置 8192 个中文汉字〔16X16 点阵〕、128 个字符〔8X16 点阵〕。可同时显示汉字个数为4x8=32个,同时显示字符的个数为4x16=64个。它与单片机连接如图2.10所示。
图2.10 12864液晶引脚电路图
在进展进展这个模块的设计时,考虑到12864液晶的显示方向,而单片机的P2引脚刚好与其它的引脚排列顺序相反〔可看图2.2〕,所以本设计中单片机与液晶进展数据传输时,用单片机的P2引脚与液晶的8位双向三态数据线〔DB0-DB7〕进展连接,这样大大简化了线路的复杂度。
2.7 独立按键
本设计采用的4个独立按键,分别是:“设置〞、“确认〞、“加〞、“减〞。判断“设置〞键是否按下及第几次按下可以分别对日期、时间、星期选定,然后按“加〞、“减〞即可进展设置,“确认〞键按下后,新数据即写入时钟芯片。例如,“设置〞键按1下,即可以对年份进展设置,按4下,即是可以对小时进展设置。其电路设计如图2.11所示。
图2.11 时间设置电路
3. 软件设计
本设计利用软件进展程序的编写。C语言是一种编译型程序设计语言,它兼顾了许多种高级语言的特点,并且具备汇编语言的功能,C 语言可以像汇编语言一样对位、字节和地址进展操作。目前,使用C语言进展程序设计已经成为软件开发的一个主流。C语言程序本身不依赖于机器硬件系统,根本上不作修改就可将程序从不同的单片机中移植过来。用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改良、扩大和移植。而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。虽然汇编语言效率高,对硬件的可操控性更强,体积小,但是不易维护,可移植性差。本设计程序实现了阳历日期、阴历日期、时间、星期、温度、节日提醒等功能。图3.1是主程序流程图。
开场
LCD、DS1302、DS18B20及相关变量初始化
调液晶显示程序
设置键是否按下
N
Y
调用设置子程序
刷新
图3.1 主程序流程图
3.1阳历与阴历转换
阳历与阴历的转换,这局部程序是参考杜阳教师的程序,程序中总共有199〔1901-2099〕年的阳历对应阴历数据。
阳历对应的阴历数据〔每年占用单片机三字节〕格式:第一字节BIT7-4位表示闰月月份,为0,那么无闰月;BIT3-0位对应阴历第1-4月的大小。第二字节BIT7-0位对应阴历第5-12月大小。第三字节BIT7位表示阴历第13月大小〔月分对应的位为1,表示农历月大〔30天〕为0表示小〔29天〕〕;第三字节BIT6-5位表示春节的阳历月份,BIT4-0位表示春节公历日期。
例:阳历2021年对应阴历2021年数据为:0X0B,0X4A,0X43。
0X0B和0X4A的二进制数表示为:00001011,01001010,这两个字节表示阴历2021年没有闰月,也就是没有第十三个月。一,三,四,六,九,十一月都是月大〔30天〕,其它都是月小〔29天〕。
0X43的二进制数表示为:01000011,这里的BIT6-5位为10〔2位可表示4个月〕,表示阴历2021年的春节在阳历2021年的2月份。BIT4-0位为00011〔00000-11111,5位最大数为31〕,表示3日。整个字节就表示阴历2021年的春节在阳历2021年的2月3日。
3.2 DS1302时钟芯片程序设计
在本设计中,要实现万年历的功能,DS1302时钟芯片是少不得的,虽然只用单片机也可以实现,但是将会造成时间误差较大,不好调节。用DS1302时钟芯片不仅可以大大的防止那样的问题,还可以减小程序的编写量。这个模块是本设计中是很重要的模块。如图3.2是DS1302时钟芯片工作的流程图。
开场
相关变量初始化
DS1302去保护
复位端产生一个高电平
复位端产生一个高电平
写DS1302地址
写DS1302地址
延时一段时间
延时一段时间
向该地址写数据
将该地址数据读出
地址增加
地址增加
数据写完否
数据读完否
N N
Y Y
显示数据
图3.2 DS1302时钟芯片工作流程图
通过流程图我们对DS1302时钟芯片是如何工作的有了个大概的了解,现在进一步了解DS1302时钟芯片关于日历、时间的存储器,先看表3.1。
表3.1 读写存放器地址
读存放器
写存放器
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
围
81H
80H
CH
10秒
秒
00~59
83H
82H
10分
分
00~59
85H
84H
1/0
0
10
时
时
1~12/ 0~23
AM/PM
87H
86H
0
0
10日
日
1~31
89H
88H
0
0
0
10月
月
1~12
8BH
8AH
0
0
0
0
0
星期
1~7
8DH
8CH
10年
年
0~99
8FH
8EH
WP
0
0
0
0
0
0
0
—
由表可以看出存放秒到年的7个存放器的地址是固定且有规律的。写存放器都是偶数〔80H~8Ch〕,读存放器都是奇数〔81H~8Ch〕,存放的数据格式为BCD码形式。
秒存放器〔写80H、读81H〕的bit7位定义为时钟暂停标志〔CH〕当该位置为1时,时钟振荡器停顿,DS1302时钟芯片处于低功耗状态,为0时,时钟开场运行。
时存放器〔写84H、读85H〕的bit7位为1时,DS1302时钟芯片运行于12小时模式,bit7位为0时,DS1302时钟芯片运行于24小时模式〔本设计是24小时模式〕。当运行于12小时模式时,bit5位为0时,表示AM,bit5位为1时,表示PM。当运行于24小时模式时,bit5位和bit4位一起表示24小时的10位。
控制存放器〔写8EH、读8FH〕的bit7位是写保护位〔WP〕,其它7位均置0,在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一存放器的写操作。也就是说在电路上电的初始态WP为1,这时不能改写表中任何一个时间存放器,只有将WP改写为0,才能进展存放器的写操作。
3.4 12864液晶显示程序设计
下面先看一下12864液晶并行连接的读写时序:
LCD的写时序:
RS引脚有H〔高〕L〔低〕两种状态,RS=H时,单片机将进展写数据操作;RS=L时,单片机将进展写指令操作。R/W引脚要与RS的状态结合,具体操作看表3.2,R/W在这里不管RS是上下都是进展写操作。E引脚为使能信号,E=H→L时,配合R/W进展写数据或指令;E=H时,配合R/W进展读数据或读指令。程序操作时注意延时,延时的大小很重要。
LCD的读时序:
读时序与写时序差不多,区别是R/W在读操作时是拉高的,与写操作相反,其它都一样。同样要注意延时。
12864液晶与单片机通信时,可以采用串行数据通信和并行数据通信,我这里将液晶的DB0~DB7引脚对应的接上单片机的P2.0~P2.7引脚,因此采用的是并行数据通信。
局部根本指令介绍见表3.2。
表3.2 局部根本指令介绍
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
去除显示
L
L
L
L
L
L
L
L
L
H
显示状态
L
L
L
L
L
L
H
D
C
B
写RAM
H
L
D7
D6
D5
D4
D3
D2
D1
D0
读RAM
H
H
D7
D6
D5
D4
D3
D2
D1
D0
读忙状态
L
H
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
表中的RS=H表示DB0-DB7为显示数据,RS=L表示DB0-DB7为显示指令数据。R/W=H且E〔使能信号〕=H表示数据被读到DB0-DB7,RW=L且E=H→L表示DB0-DB7的数据被写到RAM。DB0-DB7表示数据口。H表示高电平,L表示低电平。
(1) 去除显示功能:去除显示屏幕,把DDRAM位地址计数器调整为“00H〞。
(2) 显示状态功能:D=1表示整体显示开〔ON〕,C=1表示游标开,B=1表示游标位置开。
(3) 写RAM〔写资料到RAM〕功能:写资料到部的RAM。〔DDRAM/CGRAM/TRAM/GDRAM〕。
(4) 读RAM〔读出RAM的值〕功能:从部RAM读取资料〔DDRAM/CGRAM/TRAM/GDRAM〕。
(5) 读忙状态〔读取忙碌状态和位址〕功能:读取忙碌状态〔BF〕可以确认部动作是否完成,同时可以读出位址计数器〔AC〕的值。
字符显示RAM在液晶模块中的地址为80H~9FH,字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表3.3所示。
表3.3 RAM地址与显示区域对应关系
80H
81H
82H
83H
84H
85H
86H
87H
90H
91H
92H
93H
94H
95H
96H
97H
88H
89H
8AH
8BH
8CH
8DH
8EH
8FH
98H
99H
9AH
9BH
9CH
9DH
9EH
9FH
总结:
本设计在进展Proteus软件仿真时,没有成功,因为Proteus软件的元件库里没有带中文字库的液晶,要想成功仿真,需要对程序进展大围的修改,最终决定放弃Proteus软件仿真,直接采用硬件进展调试。
硬件的线路设计和元件组装都花了较长的时间,虽然以前也焊接过一些东西,但不能说那就是有经历。以前焊接的东西都是有现成的电路板,只是把元件对应的组装起来就根本没问题了。在本设计中,并没有现成的电路板,而是用万能板自己搭线组装。在整个硬件焊接到一半时,才发现将液晶屏的引脚弄反了,只能进展修改。
在进展程序调试时,一些大问题比拟容易找出并改正,而一些小的问题就比拟麻烦,因此一定要注意细小的问题。
本设计总体最终实现了阳历及阴历的日期显示、时间、星期、温度的显示,独立按键调节时间、日期、星期等功能。本设计整个过程还算顺利,没出现太大的问题,缺乏的地方是没有整点报时和闹铃的功能。
参考文献
[1]郁正.单片机原理及应用.:大学,2003.9.
[2]王怀平,王仁波,胡开明.Proteus仿真设计基于单片机AT89C51的电子万年历[J].科技广场,2021,10:197-198.
[3]永雄,沙河.电子线路CAD实用教程〔第三版〕.:电子科技大学, 2007.7〔2021.8重印〕.
[4]谭浩强.C程序设计〔第三版〕.:清华大学,2005〔2007重印〕.
[5]〔日〕晶体管技术编辑部编,洋等译,宗光华校.电子技术:原理·制作·实验.:科学,2005.
[6]全利,肖兴达.单片机原理及应用教程〔第二版〕.:机械工业,2007.7.
[7]雷伏容,小林,浩.51单片机常用模块设计查询手册.:清华大学,2021.01.
[8]肖炎根,舒望.基于实时时钟芯片的电子万年历的设计[J].电子技术,2007,Z3:91-94.
[9]畅生,宣宗强,雷振亚等.传感器简明手册及应用电路——温度传感器分册〔上册〕.:电子科技大学,2005.11.
[10]宏,家田.液晶显示器件应用技术.:机械工业,2004.2.
[11]德全.可调家用万年历的单片机原理[J].师学院报,2021,03:95-98.
[12]志海、连鑫.单片微型计算机原理及应用.机械工业,2007.1.
[13]育才、雷思孝.单片机系统设计及工程应用.电子科技大学,2005.5.
[14]珍、付植桐.单片机原理与应用技术.清华大学大学,2004.2.
[15]红卫.基于单片机的智能系统设计与实现.电子工业,2005.9.
答
在这里我要首先感我的指导教师——胡蓉教师,本设计在王教师的悉心指导下完成的。从选题到设计完成王教师都是严格要求,帮助我解决各种难题。王教师对学术的严谨和精益求精的工作作风给我留下了深刻的印象,受益匪浅。其次我要感在大学时间里教我专业课和帮助过我的所有教师,没有教师们教的专业知识,我想完成这设计是不可能的。
对于单片机的应用,开场时对于一些细节性的东西只是一些模糊概念.通过此次设计,加深了理解,并通过查阅大量资料,对于一些概念仔细阅读与理解,同时也对过去学过的知识进展了重新稳固.并通过了解单片机与采集系统的开展前景,对于未来信息技术的开展有了大致的了解.
同时在在制作此设计时还需了解一些其他从未接触过的概念,通过不断的努力和认真的研读,更加锻炼了自我的自学能力,对自己的学习能力有了进一步提高.但同时同过设计,也发现了自身的缺乏,如对过去学过的知识遗忘过快,而且不能有效的把所有学过的知识融合在一起,对于过去所学的知识理解的不够透彻.今后仍需加深学习.加强自己的综合学习能力.
感12电信班的同学三年来对我学习、生活的关心和帮助。最后,向我的父亲、母亲、致,感他们对我的理解与支持。
附录一万年历硬件电路原理图:
附录二
#include<reg51.h>
#include"lcd1602.h"
#include"ds1302.h"
#include"ds18b20.h"
#define uint unsigned int
#define uchar unsigned char
uint b[6];
//年、月、日、时、分、秒
uchar code row1[]={"2021-01-01"};
uchar code row2[]={"00:00:00"};
uchar year1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
uchar year2[12]={31,29,31,30,31,30,31,31,30,31,30,31};//润年
uchar j[6]={0x85,0x88,0x8b,0x84+0x40,0x87+0x40,0x8a+0x40};//LCD地址
uchar i,k,jj=0,w,clock=0,bigclock=0,c=0,num;
//i循环数,k温度缓存,jj地址位
uint temp;
sbit b1=P3^0;//设置
sbit b2=P3^1;//上调
sbit b3=P3^2;//下调
sbit b4=P3^3;//转换
sbit b5=P3^4;//闹钟
sbit speaker=P3^5;
lcdscan()
{for(i=0;i<6;i++)
{ lcdwrite(j[i]);
lcdshuju(a[11-i*2]+0x30);
lcdwrite(j[i]+0x01);
lcdshuju(a[10-i*2]+0x30);
}
}
void key()
{ if(b1==0)
{ dsaddshuju(0x80,(a[1]<<4)+a[0]+0x80);
while(b1==0)
{
for(i=0;i<6;i++)
{b[i]=a[11-i*2+clock]*10+a[10-i*2+clock];}
if(b4==0)
{ delay(3);
jj++;
if(jj==6)
{jj=0;}
}
if(b2==0)
{ delay(3);
b[jj]++;
if(b[5]==60)b[5]=0;
if(b[4]==60)b[4]=0;
if(b[3]==24)b[3]=0;
if((b[0]%4==0&&b[0]%100!=0)||b[0]%400==0){if(b[2]>year2[b[1]-1])b[2]=1;}
else {if(b[2]>year1[b[1]-1])b[2]=1;}
if(b[1]==13)b[1]=1;
if(b[0]==100)b[0]=0;
}
if(b3==0)
{ delay(3);
b[jj]--;
if(b[5]==-1)b[5]=59;
if(b[4]==-1)b[4]=59;
if(b[3]==-1)b[3]=23;
if((b[0]%4==0&&b[0]%100!=0) || b[0]%400==0){if(b[2]<=0)b[2]=year2[b[1]-1];}
else {if(b[2]<=0)b[2]=year1[b[1]-1];}
if(b[1]==0)b[1]=12;
if(b[0]==-1)b[0]=99;
}
for(i=0;i<6;i++)
{ a[11-i*2+clock]=b[i]/10;
a[10-i*2+clock]=b[i]%10;
}
lcdwrite(j[jj]);
lcdshuju(0);
lcdwrite(j[jj]+1);
lcdshuju(0);
delay(200);
lcdwrite(j[jj]);
lcdshuju(a[11-2*jj+clock]+0x30);
lcdwrite(j[jj]+1);
lcdshuju(a[10-2*jj+clock]+0x30);
delay(200);
if(b1==1)
{ dsaddshuju(0x80,(a[1]<<4)+a[0]);
dson();}
if(b5==0)clock=12;} }}
void main()
{ speaker=0;
lcdrw=0;
dson();
lcdon();
lcdwrite(0x83);
for(i=0;i<10;i++)
{ lcdshuju(row1[i]);
delay(1);
}
lcdwrite(0x84+0x40);
for(i=0;i<8;i++)
{
lcdshuju(row2[i]);
delay(1);
}
dsrst=0;
dssclk=0;
while(1)
{for(i=0;i<5;i++)
{ dsrst=1;
dswrite(0x81+i*2);
k=dsread();
dsrst=0;
a[i*2]=k&0x0f;
a[i*2+1]=(k>>4)&0x0f;
}
dsrst=1;
dswrite(0x8d);
k=dsread();
dsrst=0;
a[10]=k&0x0f;
a[11]=(k>>4)&0x0f;
delay(100);
lcdscan();
key();
if(b5==0)
{ for(i=0;i<12;i++)
{if(a[i+12]==a[i])num
展开阅读全文