序
🔥 毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是:基于51单片机电子万年历的设计
1 系统硬件电路设计
电子万年历电路原理图见附件一,系统由主控制器AT89C52、时钟芯片DS1302、温度传感器DS18B20传感器、显示电路及键盘扫描电路组成。
1.1 主控器 AT89C52
ATMEL公司生产的AT89C52单片机采用高性能的静态80C51设计,由先进工艺制造,并带有非易失性Flsah程序存储器。它是一种高性能、低功耗的8位CMOS微处理芯片,市场应用最多。主要性能特点有:
8KB Flash ROM,可以檫写1000次以上,数据保存10年。
256字节内部RAM。
电源控制模式
——时钟可停止和恢复;
——空闲模式;
——掉电模式。
6个中断源。
4个中断优先级。
4个8位I/O口。
全双工增强型UART。
3个16位定时/计数器,T0、T1(标准80C51)和增加的T2(捕获和比较)。
全静态工作方式:0~24MHz。
1.2 时钟电路 DS1302
1.2.1. DS1302的性能特性
实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;
用于高速数据暂存的31×8位RAM;
最少引脚的串行I/O;
2.5~5.5V电压工作范围;
2.5V时耗电小于300nA;
用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;
简单的3线接口;
可选的慢速充电(至Vcc1)的能力。
DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM。它经过一个简单的串行接口与微处理器通信。实时时钟/日历提供秒、分、时、日、周、月和年等信息。对于小于31天的月和月末的日期自动调整,还包括闰年校正的功能。时钟的运行可以采用24h或带AM(上午)/PM(下午)的12h格式。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302有主电源/后备电源双电源引脚:Vcc1在单电源与电池供电的系统中提供低电源,并提供低功率的电池备份;Vcc2在双电源系统中提供主电源,在这种运用方式中,Vcc1连接到备份电,以便在没有主电源的情况下能保存时间信息以及数据。DS1302由Vcc1或Vcc2中较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc时, DS13026由Vcc1供电。
1.2.2 DS1302数据操作原理
DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。无论是读周期还是写周期,开始8位指定40个寄存器中哪个将被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作是写入时写入数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。
如果在传送过程中置RST脚为低电平,则会终止本次数据传送,并且I/O引脚变为高阻态。上电运行时,在Vcc大于等于2.5V之前,RST脚必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。DS1302的引脚及内部结构图如图4.1所示,表4.1为各引脚的功能。
DS1302的控制字如图4.2所示。控制字节的最高位(位7)必须是逻辑1;如果它为0,则不能把数据写入到DS1302中。位6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。位5~1(A4~A0)指示操作单元的地址。最低有效位(位0)如为0,表示要进行写操作;为1表示进行读操作。控制字节总是从最低位开始输入/输出。
为了提高对32个地址的寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。位6规定时钟或RAM,而位0规定读或写。在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能寄存数据。在多字节方式中,读或写从地址0的位0开始。必须按数据传送的次序写最先的8个寄存器。但是,当以多字节方式写RAM时,为了传送数据不必写所有31字节。不管是否写了全部31字节,所写的每一字节都将传送至RAM。
图1.1 DS1302引脚及内部结构
表 1.1 DS1302引脚功能
引脚号 | 引脚名称 | 功 能 |
1 | Vcc2 | 主电源 |
2,3 | X1,X2 | 振荡源,外界32.768kHz晶振 |
4 | GND | 地线 |
5 | RST | 复位/片选线 |
6 | I/O | 串行数据输入/输出端(双向) |
7 | SCLK | 串行数据输入端 |
8 | Vcc1 | 后备电池 |
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。其日历、时间寄存器及其控制字见表1.2,其中奇数为读操作,偶数为写操作。
时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止震荡,进入低功耗的备份方式。通常在对DS1302进行写操作时(如进入时钟调整程序),停止震荡。当它为0时,时钟将开始启动。
AM-PM/12-24[小]时方式:[小]时寄存器的位7定义为12或24[小]时方式选择位。它为高电平时,选择12[小]时方式。在此方式下,位5是AM/PM位,此位是高电平时表示PM低电平表示AM。在24[小]时方式下,位5为第二个10[小]时位(20~23h)。
表 1.2 内部寄存器地址和内容
积存器名 | 命令字节 | 取值范围 | 积存器内容 | |||||||||
写 | 读 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |||
秒积存器 | 80H | 81H | 00~59 | CH | 10S | SEC | ||||||
分积存器 | 82H | 83H | 00~59 | 0 | 10 min | MIN | ||||||
[小]时积存器 | 84H | 85H | 00~23或01~12 | 12/24 | 0 | 10A/P | HR | HR | ||||
日积存器 | 85H | 87H | 01~28,29,30,31 | 0 | 0 | 10DATE | DATE | |||||
月积存器 | 88H | 89H | 01~12 | 0 | 0 | 0 | 10M | MONTH | ||||
周积存器 | 8AH | 8BH | 01~07 | 0 | 0 | 0 | 0 | 0 | DAY | |||
年积存器 | 8CH | D3H | 00~99 | 10YEAR | YEAR |
DS1302的晶震选用32.768kHz,电容推荐值为33pF,因为震荡频率较低,也可以不接电容,对计时精度影响不大。
1.3 测温电路的设计
测温电路主要使用温度传感器DS18B20,由于精度要求不高所以采用2位共阳LED数码管以动态扫描法实现温度显示。其设计原理图如附件一所示。
1.3.1 温度传感器工作原理
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要示通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:
独特的单线接口仅需要一个端口引脚进行通信;
多个DS18B20可以并联在唯一的三线上,实现多点组网功能;
无须外部器件;
可通过数据线供电,电压范围为3.0~3.5V;
零待机功耗;
温度以9或12数字量读出;
用户可定义的非易失性温度报警设置;
报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。
DS18B20采用3脚PR—35封装或8脚SOIC封装,其内部结构框图如图4.3所示。
64位ROM的位结构如图4.4所示。开始8位是产品类型的编号,接着是每个器件的唯一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。非易失性温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个调整暂存RAM和一个易失性的可电擦除的EERAM。高速暂存RAM的结构为8字节存储器,结构如图4.5所示。头2个字节包含测得的温度信息,第3和第4节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。第5个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。DS18B20工作时按此寄存器中的分辨率将温度转换为相应
精度的数值。该字节各位的定义如图4.6所示。低5位一直1,M是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,即用来设置分辨率,定义方法见表4.3。
由表4.3可见,DS18B20温度转换的时间比较长,而且设定的分辨率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625°C/LSB形式表示。
图1.3DS18B20内部结构图
当符号位S=0时,表现测得的温度值为正值,可以直接将二进制位转换为十进制,当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码再计算十进制值。表4.4是一部分温度值对应的二进制温度数据。
DS18B20完成温度转换后,把测得的温度值与RAM中的TH、TL字节内容作比较。若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机根据ROM的前56位来计算CRC值,并和存入DS18B20的CRC作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理如图4.8所示。图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。图中还隐含着计数门,当计算门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55°C所对应的一个基数分别置入减法计数器1、温度寄存器中,减法计数器1和温度寄存器被预置在-55°C所对应的一个基数值。
减法计数器1对低温系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存的值将加1,减法计数器1的预置值将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值就是所测温度值。图4.8中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门未关闭就重复上述过程,直到温度寄存器值达到被测温度值。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲) 发ROM功能指令 发存储器操作命令 处理数据。
1.3.2 DS18B20与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为引线,3脚接电源。另一种是寄生电源供电方式。单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD和GND端均接地。由于单线制只有一根线,因此发送接口必须是三态的。
1.4 显示电路的设计
显示部分采用普通的共阳数码管显示,采用动态扫描,以减少硬件电路。考虑到第一次扫描17位数码管显示时会出现闪烁情况,设计时17个数码管分3排同时扫描。第一排8个数码管分别为千年、百年、十年、年、十月、月、十日、日,第二排7个数码管分别为十时、时、十分、分、十秒、秒,第三排3个数码管分别为星期、温度(两位)显示。显示时采用串行口输出段码,用1片74LS164来驱动3排数码管,这样扫描一次只需7ms。
表 1.5 74LS164特性表
操作模式 | 输 入 | 输 出 | |||
复 位 | MR | A | B | Q0 | Q1~Q7 |
移 位 | L | × | × | L | Q0~Q6 |
H | L | L | L | Q0~Q6 | |
H | L | H | L | Q0~Q6 | |
H | H | L | L | Q0~Q6 | |
H | H | H | H | Q0~Q6 |
74LS164内部为8个D触发器,用以实现数据的串行移位,74LS164特性见表4.5。单片机以串口方式0(移位寄存器方式)输出数据,3片74LS164作为3排共阳数码管的串/并转换显示接口。74LS164为TTl单向8位移位寄存器,可实现串行输入,并行输出。其中A、B(第1、2脚)为串行数据输入端,2个引脚按逻辑“与”运算规律输入信号,共一个输入信号时可并接,共同作为输入脚。CP(第8脚)为时钟输入端,可连接到串行口的TXD端。每一个时钟信号的上升沿加到CP端时,移位寄存器移一位。8个时钟脉冲过后,8位二进制数全部移入74LS164中。MR脚(第9脚)为复位端,当该脚为低电平时,移位寄存器各位复0;只有当它高电平时,时钟脉冲才起作用。Q1~Q8(第3~6和10~13引脚)并行输出端分别接数码管的h~a(因为串口从低位开始传送)各段对应的引脚上。在给出了8个脉冲后,最先进入74LS164的第一个字节数据到达了最高位。再来1个脉冲,第1个脉冲就会从最高位移出,进入下个74LS164的第1位。3片74LS164首尾相串,而时钟端则接在一起。这样,当输入8个脉冲时,从单片机RXD端输出的第1字节数据就进入了第1片74LS164中,而当第2个8个脉冲到来后,第1字节数据就进入了第2片74LS164,而随后的第2字节的数据则进入了第1片74LS164。这样,当第3个8个脉冲完成后,首次送出的数据被送到了最下面的164(第3片)中,其它数据依次出现在第二和第一片74LS164中,实现了数据在74LS164中的串行输入、并行输出。
在方式0状态下,串行口为同步移位寄存器方式,其波特率是固定的,为fosc/12。数据由RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)端输出。发送、接收数据时低位在先。所以根据提供的硬件电路图,在编写程序时,查共阳数码管的段码的二进制数据应该将正常的共阳数据管0~9的二进制值按位反序排序,如原来的二进制为11000000(C0H),要改为00000011(03H),就能使数码管正常显示。
1.5 键盘接口的设计
由于按键只有5个,用普通按钮接10K上拉电阻,用查询法完成读键功能。
2 系统程序的设计
2.1 阳历程序设计
因为使用了时钟芯片DS1302,阳历程序只需从DS1302各寄存器中读出年、周、月、日、[小]时、分、秒等数据,再处理即可。在首次对DS1302进行操作之前,必须对它进行初始化,然后从DS1302中读出数据,再经过处理后,送给显示缓冲单元。阳历程序流程图见图2.1所示。
图2.1 阳历程序流程图
2.2 时间调整程序设计
调整时间用5个调整按钮,1个作为移位、控制用,2个作为加和减用,还有2个作为闹钟调整使用,分别定义为控制按钮、加按钮、减按钮、闹钟加按纽、闹钟减按纽。在调整时间过程中,要调整的位与别的位应该有区别。所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。闪烁原理就是,让要调整的一位每隔一定时间熄灭一次,比如说50ms。利用定时器计时,当达到50ms溢出时,就送给该位熄灭符,在下一次溢出时,再送正常显示的值,不断交替,直到调整该位结束。此时送正常显示值给该位,再进入下一位调整闪烁程序。时间调整程序流程图如图2.2所示。
2.3 温度程序设计
系统程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序、显示数据刷新子程序等等。
2.3.1 主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量温度值,温度测量每1s进行一次。其程序流程图见2.3。
2.3.2 读出温度子程序
主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图2.4所示。
2.3.3 温度转换命令子程序
温度转换子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
图2.3 DS18B20温度计主程序流程图 图2.4 读出温度子程序流程图
原理图
仿真图
如果学弟学妹们在毕设方面有任何问题,随时可以私信我咨询哦,有问必答!学长专注于单片机相关的知识,可以解决单片机设计、嵌入式系统、编程和硬件等方面的难题。
愿毕业生有力,陪迷茫着前行!