版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
11.1液晶显示万年历的设计
11.2数字心率计的设计
11.3数字温度计的设计
实例十一单片机应用系统实例11.1液晶显示万年历的设计11.1.1背景知识
1.万年历概述什么是万年历呢?万年历是编排年、月、日、节气等内容供人们查询的工具书,就是记录了一定时间范围内(比如100年或更多)的具体阳历与阴历的日期的年历。约公元前1450年,在定阳山下住着一位以砍柴采药为生的樵夫叫做万年,他平时对历法及节令比较感兴趣,从平时的生活中得到启发,做了一个利用漏水的方法来计时的五层漏壶。这样,不管天气如何都可以正确地掌握时间。有了计时的工具,万年更加用心地观察天时节令的变化。经过长期的归纳,他发现每隔三百六十多天,天时的长短就会重复一次。只要搞清楚日月运行的规律,就不用担心节令不准了。万年将他研究了数十载的成果——太阳历献给天子祖乙时,已是个白发苍苍的老人了。祖乙深受感动,就把太阳历定名为“万年历”,并封万年为“日月寿星”。随着时代的进步,万年历一直延续发展至今,世人为了使用方便,设计了各种各样实用的万年历,以便于人们使用及携带,并且在原来的基础上增加了许多其他的功能。现在大多数人用的是电子万年历。
2.16×2字符型液晶显示器的认识
液晶显示器以其功耗小、体积小、显示内容丰富、超薄轻巧等诸多优点在袖珍式仪表和低功耗应用系统中得到了越来越广泛的应用。
这里介绍的字符型液晶模块是一种用5×7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等。下面以长沙太阳人公司的2行16个字的1602液晶模块为例进行介绍。
1)主要技术参数
1602液晶模块的主要技术参数如表11-1所示。
2)引脚符号及说明
长沙太阳人公司的1602液晶模块总共有16引脚,各引脚符号及说明如表11-2所示。
3)控制器接口说明(HD44780及兼容芯片)
(1)基本操作时序如下:
•读状态:
输入:RS=L,R/W=H,E=H。
输出:D0~D7=状态字。
•写指令:
输入:RS=L,R/W=L,D0~D7=指令码,E=高脉冲。
输出:无。
•读数据:
输入:RS=H,R/W=H,E=H。
输出:D0~D7=数据。
•写数据:
输入:RS=H,R/W=L,D0~D7=数据,E=高脉冲。
输出:无。
(2)状态字说明如图11-1所示。
图11-1中,STA0~STA6是当前数据地址指针的数值;STA7是读/写操作使能,1为禁止,0为允许。
注意:每次对控制器进行读/写操作之前,都必须进行读/写检测,确保STA7为0。图11-1状态字
(3) RAM地址映射图。控制器内部带有80 × 8位(80字节)的RAM缓冲区,其对应关系如图11-2所示。图11-2RAM地址映射图
(4)指令说明。
①初始化设置。
•显示模式设置如表11-3所示。
•显示开/关及光标设置如表11-4所示。②数据控制。控制器内部设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM。
•数据指针设置如表11-5所示。
•读数据:见“控制器接口说明(HD44780及兼容芯片)”中的“基本操作时序”。
•写数据:见“控制器接口说明(HD44780及兼容芯片)”中的“基本操作时序”。
•其他设置见表11-6。
(5)初始化过程(复位过程)。
①延时15ms→写指令38H(不检测忙信号)→延时5ms→写指令38H(不检测忙信号)→延时5ms→写指令38H(不检测忙信号)。
注意:以后每次写指令、读/写数据操作之前均需检测忙信号。
②写指令38H(显示模式设置)→写指令08H(显示关闭)→写指令01H(显示清屏)→写指令06H(显示光标移动设置)→写指令0CH(显示开及光标设置)。
4) SMC1602A参考连接
(1) 8051系列总线方式如图11-3所示。图11-38051系列总线方式
(2) 8051系列模拟接口方式如图11-4所示。图11-48051系列模拟接口方式
5)控制器接口时序说明(HD44780及兼容芯片)
(1)读操作时序如图11-5所示。图11-5读操作时序
(2)写操作时序如图11-6所示。图11-6写操作时序
(3)时序图中各时序参数说明如表11-7所示。11.1.2设计任务及分析
1.设计任务
本实例要实现以下功能:
(1)显示日期和时间;
(2)具有校时功能,即可以调整时间和日期;
(3)具有省电工作模式,即不显示时钟,但是计时工作仍然进行;
(4)具有整点报时功能和闹钟功能。
2.设计方案
根据设计任务的要求,我们可以考虑采用如图11-7所示的设计框架。本设计任务要求具有校时功能和闹钟功能,显然在设计过程中需考虑由按键的输入来实现;要求能显示日期和时间,显然在设计过程中需考虑有显示器;要求有整点报时功能和闹钟功能,显然在设计过程中需考虑有声响电路。
(1)按键输入设计。根据设计要求在按键输入设计模块可以采用矩阵式键盘和独立式按键两种方案。考虑到矩阵式键盘一般适于硬件资源需求比较大,单片机I/O口数量有限的情况,况且要完成本设计要求,只设置五个按键就可以完成,所以选择独立式按键控制的方案。图11-7系统设计框图
(2)万年历显示设计。在单片机应用系统中,显示器通常有数码管和液晶模块两种。采用数码管显示成本低,软件设计简单,但硬件设计较复杂,且占用单片机I/O口资源较多;采用液晶模块显示成本较高,硬件设计简单,但软件设计较复杂。在本次的设计中采用液晶显示,这样在显示日期、时间时可以用一些符号来美化界面,而且缩小了产品的体积。
(3)声响电路设计。根据设计要求需要报时及闹铃声响,考虑产品的实用性及设计成本,于是采用较简单的无源蜂鸣器发声电路来实现。
(4)电源设计。由于本设计要求所需元件的工作电压都是 +5V,所以,电源设计直接采用能输出 +5V的开关电源。11.1.3设计与制作
1.万年历的基本结构
用STC89C51来控制液晶显示器,显示设计要求的内容。通过五个独立按键来修改要显示的内容,实现时间及日期的修改,其设计框图如图11-8所示。
2.万年历的硬件设计
万年历的完整设计电路如图11-9所示。若考虑烧写程序方便,则读者可以自行将串口下载电路加上。图11-8设计框图图11-9系统设计电路图单片机的管脚分配如表11-8所示。按键输入电路设计采用独立式,按键功能对照表如表11-9所示。液晶显示电路设计采用模拟口线方式。液晶显示器引脚及单片机I/O口对照表如表11-10所示。声响电路设计为两个发光二极管和一个蜂鸣器,用于整点的声光报时和闹钟的声光报警,蜂鸣器用三极管9012驱动。
3.万年历的软件设计
1)设计思路
程序设计采用模块化设计方法,包括主程序模块、键盘模块、显示模块、闹钟模块、报时模块和显示开关控制模块等,通过主程序按照一定顺序调用各功能模块来实现系统要求。在程序运行后若开启关闭显示器功能,则定时器仍继续工作。
2)操作说明
液晶显示万年历仿真图如图11-10所示。万年历的操作说明如下所述。图11-10液晶显示万年历仿真图
(1)校时设置操作。
①不在闹钟模式下,即显示器上未显示“&”图标时,按下“位选控制按钮”,进入校时设置状态,此时光标闪烁。
②“位选控制按钮”每按下一次,光标向右移动一个位置闪烁。当移到最后一个数值时,若再按下“位选控制按钮”,则光标回到第一个数值位置。
③每次按下“加1控制按钮”,光标闪烁位置的数据加1,当该位数据加到最大时回零。例如,分钟的个位数据为当前调整位,当其值为“9”时,再按一次“加1控制按钮”,该位显示“0”。
④设置完毕后,按下“返回和报时控制按钮”,回到正常计时状态。
(2)闹钟设置操作。
①在闹钟模式下,即显示器上显示“&”图标时,按下“位选控制按钮”,进入闹钟设置状态,此时光标闪烁,且闹钟设置只对小时和分钟设置。
②“位选控制按钮”每按下一次,光标向右移动一个位置闪烁,当移到最后一个数值时,若再按下“位选控制按钮”,则光标回到第一个数值位置。
③每次按下“加1控制按钮”,光标闪烁位置的数据加1,当该位数据加到最大时回零。例如,分钟的个位数据为当前调整位,当其值为“9”时,再按一次“加1控制按钮”,该位显示“0”。
④设置完毕后按下“返回和报时控制按钮”,回到正常计时状态。
(3)显示操作。
①按下“显示器控制按钮”可以进行显示时间和不显示时间选择。
②时间的标识为TIME,日期的标识为DATE,用“:”分隔时间的时、分、秒,用“-”分隔日期的年、月、日,用“&”表示闹钟开启标志,用“%”表示整点报时开启标志。
(4)闹钟操作。
①按下“闹钟控制按钮”进行闹钟模式和非闹钟模式选择,若为闹钟模式,则显示器显示“&”图标,否则不显示。
②在闹钟模式下,若当前时间与所设置的闹钟时刻一致,则闹钟指示灯(D2)亮,同时响起蜂鸣声。
(5)报时操作。
①按下“返回和报时控制按钮”进行整点报时模式和非整点报时模式选择,若为整点报时模式,则显示器显示“%”图标,否则不显示。
②整点报时模式下,若当前时间为整点,则整点指示灯(D1)亮,同时响起蜂鸣声。
3)程序设计
(1)主程序。软件设计采用模块式设计方法,总程序通过调用相应的功能模块来实现软件的功能。主程序流程图如图11-11所示。图11-11主程序流程图
(2)液晶初始化程序。根据前面液晶显示器的资料显示,在液晶显示器工作之前必须先进行初始化,通常我们把它放在程序的开始部分,只有经过初始化之后液晶才能正常工作,并可以根据要求进行相关设置,具体流程如图11-12所示。图11-12液晶初始化
(3)液晶初始状态程序。液晶显示初始状态的格式如图11-13所示。液晶初始状态程序流程图如图11-14所示。这部分程序实现了根据设计要求在液晶显示器的特定位置显示设定好的字符。在显示器上设置了“TIME”和“DATE”作为区别时间和日期的字母,用“:”和“-”分别间隔时间和日期,通过程序直接送它们的ASCII码3AH和2DH给液晶显示器。图11-13液晶显示初始状态的格式图11-14液晶初始状态程序流程图
(4)键盘程序。键盘程序流程图如图11-15所示。当相应的按键按下后程序就会执行对应的操作,系统会根据闹钟是否开启自动判断是校准时间还是设置闹钟定时时间。在闹钟未开启的情况下,当位选按键按下后就会进入时间调整并实现位置改变;当加1按键按下后就会实现加1。在程序中设定好了校准范围,时的十位不会超过3,即在2加1后就会变成0,在分的十位5加1后就会变成0,日期也进行同样的范围限定,这样就使我们在调整时间时变得很方便。在按下返回键后退出时间调整功能。图11-15键盘程序
(5)显示程序。显示格式如图11-16所示,液晶显示程序流程图如图11-17所示。这部分程序的任务是将更新的数据显示出来。时间的标识为TIME,日期的标识为DATE,用“:”分隔时间的时、分、秒,用“-”分隔日期的年、月、日,用“&”表示闹钟开启标志,用“%”表示整点报时开启标志。图11-16显示格式图11-17显示程序流程图
(6)闹钟开关程序。这部分程序用来控制闹钟功能的开启和关闭。这部分程序中设置了一个标志位,每按一下闹钟控制按键,程序就会取反标志位,程序根据标志位的情况判断是否开启闹钟功能并在液晶显示器上显示和清除闹钟开启的标志。程序流程图如图11-18所示。
(7)闹钟比较程序。这部分程序用来判断当前系统的时间和设定的闹钟时间是否相等。当系统的时间和设定的时间相等时,闹钟就会开始响铃直到手动关闭闹钟。这部分程序流程图如图11-19所示。图11-18闹钟开关程序流程图图11-19闹钟比较程序流程图
(8)报时开关程序。这部分程序用来控制报时功能的开启和关闭。这部分程序中设置了一个标志位,按一下按钮标志位就会取反一次,程序会根据标志位的状态判断是否开启报时功能,并且在显示器上显示,若开启则显示“%”,否则不显示。程序流程图如图11-20所示。图11-20报时开关程序流程图
(9)报时次数转换和报时程序。这部分程序根据时间的小时位的个位是否有进位来判断。当报时功能处于开启状态且小时位的个位有进位时把几点钟转换成报时次数。报时程序在报时功能处于开启状态下根据转换好的次数,几点钟发光二极管就闪亮几下,在报好时后自动熄灭。程序流程图如图11-21和图11-22所示。图11-21报时次数程序流程图图11-22报时程序流程图
(10)显示开关程序。这部分程序用来控制显示器的开关状态。当显示器处在关闭状态时,为省电模式,屏幕上不会显示时间,但仍计时,其他功能均正常;当显示器处在开启状态时,正常显示时间和功能图标。显示开关程序流程图如图11-23所示。图11-23显示开关程序流程图
;********************日期部分*********************
DAYL EQU 40H ;日个
DAYH EQU 41H ;日十
HENL EQU 42H ;-
MONTHL EQU 43H ;月
MONTHH EQU 44H ;月
HENH EQU 45H ;-
YEARO EQU 46H ;年
YEART EQU 47H
YEARS EQU 48H
YEARF EQU 49H
TEMP EQU 50H
;用作存储单元,显示子程序(DISPLAY)中用到
BIJIAO EQU 51H ;加1子程序(JIAYI)中用到
ZDRQO EQU 55H ;中断加1程序中用到
ZDRQT EQU 56H ;中断加1程序中用到
ZDRQS EQU 57H ;中断加1程序中用到
ZDRQF EQU 58H ;中断加1程序中用到
DIZHI EQU 59H
;键盘(JIANPAN)子程序中用到
NZBZ BIT 60H
;定时标志位在闹钟开关部分
BSCSBZ BIT 39H
;报时次数转换标志(BSCS)中用到
BSCSCC EQU 3AH ;报时次数存储(BSCS)中用到
ZDBSBZ BIT 3BH ;整点报时标志(SSBS)中用到
ZMBSBZ BIT 3CH ;整秒闪烁标志(SSBS)中用到
BSKGBZ BIT 3DH ;报时开启标志(BSKG)中用到
XKQHBZ BIT 3EH
;显示开启关闭标志(XIANKONG)中用到
;*****************************
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP ZD
ORG 0030H
MAIN: MOV SP,#60H ;给堆栈指针赋初值
MOV 30H,#05H ;秒
MOV 31H,#05H ;秒
MOV 32H,#3AH ;:
MOV 33H,#09H ;分
MOV 34H,#05H ;分
MOV 35H,#3AH ;:
MOV 36H,#03H ;时
MOV 37H,#01H ;时 ;****************日期部分*********************
MOV 40H,#09H ;日个
MOV 41H,#02H ;日十
MOV 42H,#2DH ;-
MOV 43H,#09H ;月
MOV 44H,#00H ;月
MOV 45H,#2DH ;-
MOV 46H,#09H ;年
MOV 47H,#09H
MOV 48H,#09H
MOV 49H,#02H
CLR P2.5 ;闹钟
CLR P2.6 ;整点报时
MOV 03H,#00H ;闹钟分个位
MOV 04H,#00H ;闹钟分十位
MOV 06H,#04H ;闹钟时个位
MOV 07H,#01H ;闹钟时十位
MOVB,#20
MOVTMOD,#01H ;定时器工作方式1
MOV TH0,#4CH
MOV TL0,#08H
SETB ET0 ;允许T0中断
SETB EA ;总中断开放
LCALL LCDRESET ;初始化LCD
LCALL DISPSTART ;调用显示初始状态
SETB TR0 ;开启定时器
CLR NZBZ ;闹钟开启关闭标志
CLRB SKGBZ ;报时开启关闭标志
CLR XKQHBZ ;显示开启关闭标志
LOOP:
LCALL JIANPAN ;按键子程序
LCALL DISPLAY ;显示子程序
LCALL NZBF ;闹钟部分
LCALL NZBJ ;闹钟比较
LCALL BSKG ;报时开关
LCALL BSCS ;报时次数
LCALL SSBS ;闪烁报时
LCALL XIANKONG
;调用显示开启关闭控制
SJMP LOOP
;============中断加1程序===================
ZD: PUSH ACC
MOV TH0,#4CH
MOV TL0,#08H
DJNZ B,ZDEND
MOVB,#20
INC SECONTL
SETB ZMBSBZ
MOV A,SECONTL
CJNE A,#0AH,ZDEND MOV SECONTL,#00H
INC SECONTH
MOV A,SECONTH
CJNE A,#06H,ZDEND
MOV SECONTH,#00H
INC MINIUTL
MOV A,MINIUTL
CJNE A,#0AH,ZDEND
MOV MINIUTL,#00H
INC MINIUTH
MOV A,MINIUTH
CJNE A,#06H,ZDEND MOV MINIUTH,#00H
INC HOURL
SETB BSCSBZ
SETB ZDBSBZ
MOV A,HOURL ;24小时的判断
CJNE A,#04H,ZDF
MOV A,HOURH
CJNE A,#02H,ZDEND
MOV HOURL,#00H
MOV HOURH,#00H
LCALL
ZDRQ
SJMP ZDEND
ZDF:
CJNE A,#0AH,ZDEND
MOV HOURL,#00H
INC HOURH
ZDEND:
POP ACC
RETI
;日期部分
ZDRQ: PUSH ACC
INC DAYL
;判断天数28、30、31部分
MOV A,MONTHH
;用于判断月份时,为31天、30天、28天
CJNE A,#01H,LL
MOV 55H,#0AH
;存放月份的十位转化为个位,为0AH
MOV A,MONTHL
ADD A,55H ;月份高低相加用于查表
SJMP LL3
LL: MOV A,MONTHL
ADD A,MONTHH
LL3: MOV 56H,A ;存放相加后的月份数据
MOV DPTR,#TAB5
MOVC
A,@A+DPTR
;查十位和天数的十位比较
MOV 57H,A
MOV A,56H
MOV DPTR,#TAB6;查个位和天数的个位比较
MOVC A,@A+DPTR
MOV 58H,A
MOV A,DAYH
CJNE A,57H,LL2
MOV A,DAYL
CJNE A,58H,LL2
MOV DAYH,#00H
MOV DAYL,#01H
SJMP LL4
LL2: MOV A,DAYL
CJNE A,#0AH,ZDRQEND
MOV DAYL,#00H
INC DAYH
MOV A,DAYH ;比较天数是否要进位
CJNE A,57H,ZDRQEND
MOV A,DAYL
CJNE A,58H,ZDRQEND
MOV DAYH,#00H
MOV DAYL,#01H
;月份和年份
LL4: INC MONTHL
MOV A,MONTHL
CJNE A,#03H,ZDRQ1
;用于判断为12月时的进位
MOV A,MONTHH
CJNE A,#01H,ZDRQ1
MOV MONTHL,#01H ;天数符合要求
MOV MONTHH,#00H
SJMP ZDRQ2
ZDRQ1:
CJNE A,#0AH,ZDRQEND
MOV MONTHL,#00H
INC MONTHH
SJMP ZDRQEND
ZDRQ2: INC YEARO ;年的加1
MOV A,YEARO
CJNE A,#0AH,ZDRQEND
MOV YEARO,#00H
INC YEART ;年的进位 MOV A,YEART
CJNE A,#0AH,ZDRQEND
MOV YEART,#00H
INC YEARS
MOV A,YEARS
CJNE A,#0AH,ZDRQEND
MOV YEARS,#00H
INC YEARF
MOV A,YEARF
CJNE A,#0AH,ZDRQEND
MOV YEARF,#00H
ZDRQEND:
POP ACC
RET
;液晶初始化
;===========初始化程序===============
LCDRESET: ;初始化程序
LCALL DELAY5MS ;延时15ms
LCALL DELAY5MS
LCALL DELAY5MS
MOV A,#38H
;显示模式设置(不检测忙信号)
LCALL LCDWCN ;共三次
LCALL DELAY5MS
MOV A,#38H
LCALL LCDWCN
LCALL DELAY5MS
MOV A,#38H
LCALL LCDWCN
MOV A,#38H;显示模式设置(以后均检测忙信号)
LCALL LCDWC
MOV A,#08H;显示关闭 LCALL LCDWC
MOV A,#01H ;显示清屏
LCALL LCDWC
MOV A,#06H ;显示光标移动设置
LCALL LCDWC
MOV A,#0CH ;设置开显示和显示光标
LCALL LCDWC
RET ;=============写指令===================
LCDWC: ;送控制字子程序(检测忙信号)
LCALLWAITIDLE
;******写指令*******;送控制字子程序(不检测忙信号)
LCDWCN:CLRRSPIN;RS=0,R/W=0,E=高脉冲
CLRRWPIN
MOVP0,A
SETBEPIN ;(
NOP ;给高电平脉冲
CLREPIN ;)
RET ;============写数据=================
LCDWD: ;写字符子程序
LCALLWAITIDLE
SETBRSPIN ;RS=1,R/W=0,E=高脉冲
CLR RWPIN
MOVP0,A
SETBEPIN
NOP
CLR EPIN
RET ;============等待控制器空闲=============
WAITIDLE:
PUSHACC
;在正常读/写操作之前必须检测LCD控制器状态
MOV
P0,#0FFH
LCALL
DELAY5MS
CLR
RSPIN;RS=0,R/W=1,E=高电平
SETB
RWPIN
SETB
EPIN
LCALL
DELAY5MS
WTD_PA:NOP;DB7:0表示LCD控制器空闲
JB P0.7,WTD_PA;1表示LCD控制器忙
CLR EPIN
POP ACC
RET ;***************初始状态子程序**************
DISPSTART:
;显示初始状态子程序
PUSH
ACC
MOV
A,#80H
LCALL
LCDWC
MOV
DPTR,#TAB ;显示字符
DISP1: CLR
A
MOVC
A,@A+DPTR
JZ
DISP2
LCALL
LCDWD
INC
DPTR
SJMP
DISP1
DISP2: MOV
A,#0C0H
LCALL
LCDWC
MOV
DPTR,#TAB1
DISP3: CLR
A
MOVC
A,@A+DPTR
JZ
DISP_END
LCALL
LCDWD
INC
DPTR
SJMP
DISP3
DISP_END:
POP
ACC
RET
;=============显示子程序=================
DISPLAY:PUSH PSW
PUSH ACC
SETB RS0
CLR RS1
MOV A,#85H
LCALL LCDWC
MOV R1,#38H
;第一行显示数据存储单元的起始地址
MOV TEMP,#30H
;第一行显示数据存储单元的结束地址
MOV R6,#2
PLAY: DEC R1
CJNE R1,#32H,PLY ;判断是否为冒号位
MOV A,MAOHAOL;是,则送冒号的ASCII码
SJMP PLAY1
PLY: CJNE R1,#35H,PLY1
MOV A,MAOHAOH
SJMP PLAY1
PLY1: CJNE R1,#42H,PLY2;判断是否为横杠的位置
MOV A,HENL ;是,则送横杠的ASCII码
SJMP PLAY1
PLY2: CJNE R1,#45H,PLY3
MOV A,HENH
SJMP PLAY1
PLY3: MOV A,@R1 ;用查表法送要显示的数据
MOV DPTR,#TAB2
MOVC
A,@A+DPTR
PLAY1: LCALL LCDWD
MOV A,R1
CJNE A,TEMP,PLAY
;判断第一行是否已显示好
MOV A,#0C5H
LCALL
LCDWC
MOV R1,#4AH
;第二行显示数据存储单元的起始地址
MOV TEMP,#40H ;第二行的结束地址
DJNZ R6,PLAY ;R6为0时两行显示结束
POP ACC
POP PSW
RET
;**************显示开启和关闭控制**************
XIANKONG:JB P2.0,XIANEND
LCALL DELAY5MS
JB P2.0,XIANEND
PUSH ACC
JNB P2.0,$
CPL XKQHBZ
JNB XKQHBZ,XK_LL
MOV A,#08H ;显示关闭
LCALL LCDWC
SJMP XK_LP
XK_LL: MOV A,#0CH;显示开启
LCALL LCDWC
XK_LP: POP ACC
XIANEND:RET
;********************按键子程序****************
JIANPAN:CLR RS0 ;键盘子程序
SETB RS1 ;键盘子程序
JB WEIXUAN,JIAN_END
;设置键的判断
LCALL
DELAY5MS
JB
WEIXUAN,JIAN_END
PUSH ACC
JNB
WEIXUAN,$
MOV
A,#0FH ;开启光标闪烁设置
LCALL LCDWCN
FAH: JNB NZBZ,JPNZSJ
;为“1”表示闹钟,为“0”表示时钟
LCALL
JPXS
;MOV A,#0FH ;开启光标闪烁设置
;LCALL
LCDWCN
MOV R4,#85H
;闹钟设定时间R4存放显示位地址
MOV R5,#2
;闹钟设定时间第一行、第二行等位置改变次数
MOV DIZHI,#8BH
;闹钟设定时间第一行结束地址
MOV R0,#07H
SJMP GIVED
JPNZSJ: CLR TR0
MOV A,#0FH ;开启光标闪烁设置
LCALL
LCDWCN
MOV R4,#85H ;R4存放显示位地址
MOV R5,#2
;第一行、第二行等位置改变次数
MOV DIZHI,#8DH ;第一行结束地址
MOV R0,#37H
GIVED: MOV A,R4
LCALL LCDWC
UPONE: JB FANHUI,UPtwo ;返回键的判断
LCALL
DELAY5MS
JB FANHUI,UPtwo
JNB FANHUI,$
SJMP GOBACK
UPtwo: JB JIAJIAN,IAM ;加1键的判断
LCALL
DELAY5MS
JB JIAJIAN,IAM
JNB JIAJIAN,$
LCALL
JIAYI ;调用按键加1子程序
AJMP GIVED
IAM: JB WEIXUAN,UPONE;位选键的判断
LCALL DELAY5MS
JB WEIXUAN,UPONE
JNB WEIXUAN,$
DEC R0
INC R4
LCALL JIAN ;调用位选比较程序
MOV A,R4
CJNE A,DIZHI,GIVED
JB NZBZ,FAH
;为“1”表示闹钟,为“0”表示时钟
MOV R4,#0C5H
MOV DIZHI,#0CFH
MOV R0,#49H
DJNZ R5,GIVED
SJMP FAH
GOBACK:
MOV A,#0CH ;关闭光标闪烁设置
LCALL LCDWCN
POP ACC
JIAN_END:
SETB TR0
RET
JPXS: MOV A,#85H
LCALL
LCDWC
MOV R1,#08H
;第一行显示数据存储单元的起始地址
JPXS_LL:DEC R1
CJNE R1,#05H,JPXS_LP
MOV A,#3AH
SJMP JPXS_LY
JPXS_LP:MOV A,@R1 ;用查表法送要显示的数据
MOV DPTR,#TAB2
MOVC A,@A+DPTR
JPXS_LY:LCALL LCDWD
CJNE R1,#03H,JPXS_LL
RET
;*****************位选比较控制程序***************
;在调整时间时以下各地址显示的数据是符号:冒号和横杠
;在这几位时跳到下一位
JIAN: CJNE R4,#87H,JIAN5
DEC R0
INC R4
SJMP JIANEND
JIAN5: CJNE R4,#8AH,JIAN1
DEC R0
INC R4
SJMP JIANEND
JIAN1: CJNE R4,#0C9H,JIAN2
DEC R0
INC R4
SJMP JIANEND
JIAN2: CJNE R4,#0CCH,JIANEND
DEC R0
INC R4
JIANEND:RET
;*********************按键加1子程序***************
JIAYI: INC @R0
MOV BIJIAO,@R0
MOV A,R0
ANL A,#0FH
CJNE R5,#02H,CICHU
;若相等,则为第一
行显示(时间);若不相等,则为第二行显示(日期)
MOV DPTR,#TAB3 ;查第一行显示(时间)的设定值
SJMP BIJI1
CICHU: MOV DPTR,#TAB4 ;查第二行显示(日期)的设定值
BIJI1: MOVC
A,@A+DPTR
CJNE A,BIJIAO,BIJI
;比较是否超过设定值
MOV @R0,#00H
BIJI: MOV A,@R0
;查表显示数据
MOV DPTR,#TAB2
MOVC
A,@A+DPTR
LCALL
LCDWD
RET
11.1.4系统功能测试
1.测试准备
按照原理图将各个原器件焊接到板子上,检查有无短接、虚焊,芯片是否已经插好。在准确无误后,插好芯片及液晶模块,打开电源开关,将编好的程序下载到单片机上,进行通电测试。
2.测试仪器及设备
测试仪器设备清单如表11-11所示。
3.测试方案
1)按键功能测试
在程序运行中有按键按下后,能否根据不同的键执行设定好的程序,以实现对日期和时间的调整,在进入时间修改程序后是否可以进行修改,位选键是否可以使用,显示控制键能否开启及关闭显示屏。
2)时间功能测试
测试时间是否可以准确实现进位、24小时的判断、2月份的28天以及其他月份的31天和30天的进位。测试时间是不是一秒一秒走得很准确以及时钟的误差。
3)显示功能测试
显示是否完全按照要求在液晶显示屏的设定位置显示,是否可以准确地更新时间及日期,在符号的位置是否正确地显示了“:”和“-”,在修改时间时光标是否能正确地在预修改的地方闪烁,修改位置改变时光标能否正确地跟随移动。
4)日期及时间修改功能测试
在位选键和加1键配合下能否选定位置并在程序设定好的范围内实现修改,在修改时间时能否准确地实现设定而不会超过设定的值,如在调整时的十位时,只会在0~2之间循环而不会超过,在程序中是否对所有的值都进行了上限值的设定。
5)报时和闹钟功能测试
在报时功能开启下液晶显示屏上是否有显示报时功能标志,到达整点时是否会发出声光报时(即发光二极管闪烁,蜂鸣器发出声音),报时是否准确。在闹钟功能开启后,时间走到和设定好的时间相等时,是否有声光报警,是否在准确的时间报警。11.2数字心率计的设计不论在生物医学还是在体育运动领域,心率都是一个重要的生理参数,它能反馈人的当前身体状况。近年来,测试心率的设备以多种形式出现,或者为单独的便携产品,或者集成于某些医疗设备或运动器材中,硬件电路也从单纯的数字电路向以微控制器为核心发展。本节将为读者介绍一种基于单片机的心率计的软/硬件设计。11.2.1心率的测量原理
心率是指心脏每分钟的跳动次数。目前常见的心率测量原理有以下三种:
(1)提取出心电信号(ECG)中的R波并将其整形为TTL脉冲,然后对该脉冲计数,一分钟内的计数脉冲个数便为心率(或者计数一小段时间,如6 s,再作乘法,得到心率),或者通过计算两个R波间的时间间隔(即周期)计算出心率。
(2)采用光电传感器检测人体组织半透明度随着心脏波动的变化,然后通过电路将该变化转换为脉冲,对脉冲计数,一分钟内脉冲的个数即为所测心率。
(3)用压电陶瓷片检测脉搏,再整形为脉冲信号,对脉冲计数,一分钟内脉冲的个数即为心率。
尽管上述三种方法的前端检测电路存在不同,但最终均通过对脉冲的计数完成对心率的检测。本书将采用第一种方法,基于其他方法的心率计设计请读者参考相关文献。11.2.2数字心率计的硬件设计
通过对第一种方法的分析容易看出,数字心率计中应包括R波提取及整形电路、计时电路、脉冲计数电路和显示电路。通过前面章节的学习我们知道,MCS-51单片机内包含两个可以工作于定时/计数模式的定时器,并且还能运用单片机做一些计算及控制显示电路,因此,可以采用以单片机为核心的电路来实现心率计硬件电路的设计。数字心率计硬件结构框图如图11-24所示。
1.R波提取及整形电路
R波提取电路如图11-25所示。图11-24数字心率计硬件结构框图图11-25R波提取电路该R波提取电路由比较器U1∶A、U1∶B及逻辑电路组成,电位器RV1、RV2组成门槛电平上下限的调节器,以便按需设定门槛电平。U1:B输出至RS触发器的端;U1:A输出至窄脉冲触发器,由U2∶D(11脚)输出5μs波宽的负脉冲。该脉冲一路送至反相器进行倒相,另一路经积分电路R12、C3送至RS触发器的端。当RS触发器的端为高电平时,不论端的电平如何变化,Q端均处于高电平;当端为高电平时,不论端的电平如何变化,Q端输出均为低电平。RS触发器Q端输出的电平(经积分电路R11、C2后)与反相器输出的电平分别控制与非门的输入端A、B,只有A、B两端同时为高电平时,与非门的输出端才有负脉冲输出。其工作过程如下:调节RV1、RV2使输入电位信号尖峰位于门槛电平上下限之间,输入信号的幅度超过下限比较器U1∶A所设定的门槛电平,U1∶A的输出端输出一负脉冲触发窄脉冲触发器,窄脉冲触发器输出一波宽5μs的负窄脉冲。该负脉冲一路送至倒相器,另一路送至RS触发器的端。同时,因为输入信号的幅度未超过上限比较器U1∶B所设定的门槛电平,所以U1∶B输出高电平,控制RS触发器的端。在这种状态下,无论端电平如何变化,RS触发器的Q端始终保持高电平。于是与非门A端也为高电平,其B端被反相器输出的正脉冲所控制。每当一个正脉冲出现,Y端输出一个负脉冲,即输出端产生一个与R波的尖峰落于上下限门槛电平间相对应的负脉冲,这样就完成了R波的提取。由于该提取电路输出的脉冲很窄,不便于后续计数电路计数,因此,在R波提取电路后加一级整形电路来拓宽脉冲宽度。整形电路如图11-26所示。图中的核心元件为555,工作于单稳态模式,当TR(Trigger,触发端)电压低于VCC/3时,其输出端处于高电平,该高电平的持续时间约为1.1RaC(Ra、C分别为图11-26中R13、C5的电阻值和电容值)。因此,只要选择适当的Ra和C便能得到计数电路需要的适宜宽度的脉冲。图11-26整形电路
2.计时、计数及显示电路
计时、计数分别由MCS-51单片机的定时器T0和T1承担,显示电路采用与图9-13模拟心电信号发生器相同的电路。11.2.3数字心率计的软件设计
1.流程图
从前面的分析中我们知道,数字心率计提供给用户的是每分钟心跳的次数,而显示的心率值则是通过提取R波得到脉冲,再计算每两个脉冲之间的时间间隔(即周期)最终得到的。因此,根据模块化程序设计的原则,软件包括以下子程序:显示子程序(需要延时子程序)、外部中断0服务子程序(接收脉冲输入并启动定时)、定时器T1中断服务子程序(获得周期)和心率计算子程序(包括2字节除以1字节子程序)。程序流程图如图11-27所示。图11-27程序流程图(a)主程序流程图;(b)心率计算子程序流程图;(c)外部中断0服务子程序流程图;(d)定时器T1服务子程序流程图
MAIN:
MOV SP, #60H ;初始化
MOV A, #0
MOV R0, #30H
MOV R4, #3
MOV COUNTER, #00H
CLR CNT
LOOPM:MOV @R0,A
INC R0
DJNZ R4, LOOPM
MOV TMOD, #10H
;T1工作于定时模式,工作方式1
MOV TH1, #0D8H ;定时10ms
MOV TL1, #0F0H
SETB EA
SETB ET1
SETB EX0
SETB IT0
LOOPT: LCALL DISPLAY
SJMP LOOPT
SUBET1:
PUSHPSW
PUSHACC
CLR RS0
CLR RS1
INC COUNTER
MOVA,COUNTER
ENDET1:
MOVTH1,#0D8H ;定时10ms
MOVTL1, #0F0H
POP ACC
POP PSW
RETI
SUBEX0:
PUSH PSW
PUSH ACC
CPL CNT
JB CNT,NEXT
CLR TR1
CLR EX0
LCALL CALHR
SJMP ENDEX0
NEXT:
MOV TH1, #0D8H ;定时10ms
MOV TL1,#0F0H
SETB TR1
ENDEX0:
POP ACC
POP PSW
RETI
;*********************************************
;子程序名:心率计算程序
;参数:输入为COUNTER
;说明:计算出心率值并转换为BCD码存入以30H开始的
;3个存储单元,用工作寄存器组2、R4、R5、R6、R7
;*********************************************
CALHR:
PUSH PSW
PUSH ACC
SETB RS1
CLR RS0 LCALL DIVBYTE
MOV A,RESULT
MOV B,#100 ;计算百位BCD码
DIV AB
MOV 30H,A
MOV A,B
MOV B,#10 ;计算十位、个位
DIV AB
MOV 31H,A
MOV 32H,B
ENDCAL:
POP ACC
POP PSW
SETB TR0
CLR CNT
MOV COUNTER,#0
RET
;*************************************************
;子程序名:双字节除法程序
;参数:输入参数为COUNTER,输出参数为RESULT
;说明:用工作寄存器组2、R0、R1、R2、R3
;*************************************************
DIVBYTE:
PUSHPSW
PUSHACC
SETBRS1
CLRRS0
MOVA,COUNTER ;判断除数是否为0
JZ ERR
MOV R3,#17H ;被除数高字节
MOV R2,#70H ;被除数低字节
MOV A,R3
CLR C
SUBB A,COUNTER
JNC ERR
MOV B,#8
LOOPD1:
CLR C
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C ;被除数最高位送F0
CLR C
SUBB A,COUNTER;
MOV R1,A
JB F0,LOOPD2
JC LOOPD3
LOOPD2:
INC R2 ;商加1
MOV A,R1
MOV R3,A ;余数放入R3中
LOOPD3:
DJNZ B,LOOPD1
CLR F0
MOV RESULT,R2
SJMP ENDDV
ERR: MOV RESULT,#0
ENDDV:
SETB EX0
POP ACC
POP PSW
RET
;************************************************
;子程序名:显示程序
;参数:40H~43H为一次存放设置标志,表示心率百位、十位、个位
;说明:用工作寄存器组1、R0、R3、R4
;************************************************
DISPLAY:
PUSH PSW
PUSH ACC
SETB RS0 ;选择通用寄存器组1
CLR RS1
MOV R3,#01H ;位选初始值
MOV R4,#3 ;循环次数
MOV R0,#30H ;显示缓冲区首地址
MOV DPTR,#TAB
LOOPDSP:
MOV A,@R0 ;读待显示数据
MOVC A,@A+DPTR ;查表,取得字段码
MOV P1,R3 ;发位选
MOV P0,A ;发送至端口
LCALL DELAY5
INC R0 ;准备显示下一位
MOV A,R3 ;改变位选值
RL A MOV R3,A
LCALL DELAY5
DJNZ R4,LOOPDSP ;显示3个数据
POP ACC
POP PSW
RET
;子程序名:延时子程序
;参数:无
;说明:延时5ms,用工作寄存器组1、R6、R7
;*************************************************
DELAY5:
PUSH PSW
SETB RS0
CLR RS1
MOV R7,#10
DL:
MOV R6,#100
DL6:DJNZ R6,DL6
DJNZ R7,DL
POP PSW
RET
TAB:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END11.3数字温度计的设计温度是一个重要的物理量,也是与人们的生活息息相关的参数。实验表明,人体在夏天和冬天感到舒适的温度存在差别,因此本节将介绍一种可设置工作模式、带声光报警的数字温度计的设计。11.3.1基于单片机的数字温度计概述相比于传统的液体温度计,数字温度计具有读数直观、测量时间短等特点,其应用广泛。常用于温度测量的传感器有金属热电阻、热敏电阻、热电偶,基于此类传感器的温度计结构如图11-28所示,需要选择适当的信号调理电路及A/D转换电路来为单片机提供数据。除此之外,也可以采用直接输出数字信号的温度传感器,比如DS18B20能够直接与单片机接口,使用方便,控制简单。图11-28数字温度计的一般结构11.3.2数字温度计的硬件设计
要设计数字温度计,传感器的选择至关重要。经过认真分析,决定采用单线(1-wire)可编程温度传感器DS18B20。采用DS18B20的数字温度计结构框图如图11-29所示。图11-29采用DS18B20的数字温度计结构框图
1.DS18B20简介
DS18B20是DALLAS半导体公司生产的单线智能温度传感器,属于新一代智能温度传感器,输出为数字信号,可直接与单片机接口,广泛应用于工业、民用、军事等领域的温度测量及控制仪器、测控系统和大型设备中。
1) DS18B20的性能特点
(1)采用单线技术(1-Wire),与单片机通信只需要一个引脚,无需经过其他变换电路,直接输出被测温度值(9位二进制数,含符号位)。
(2)测温范围为-55~+125℃,测量分辨率可达0.0625℃,在-10~+85℃范围内误差为±0.5℃。
(3)内含64位经过激光修正的只读存储器ROM,通过识别只读ROM中的唯一序列号实现单线多挂接。
(4)用户可分别设定各路温度的告警上、下限。
(5)将12位的温度值转换为数字量所需的时间不超过750ms。
(6)内含寄生电源。
2) DS18B20的引脚分布及结构
DS18B20的引脚排列如图11-30所示,各引脚说明见表11-12。图11-30DS18B20的引脚排列
DS18B20主要由四部分组成:64位光刻ROM、温度传感器、非易失的温度报警触发器TH和TL以及高速暂存器。
64位光刻ROM是出厂前被光刻好的,它可以看做是该DS18B20的地址序列号。64位ROM结构图如图11-31所示。图中,低8位为单线系列编码(DS18B20的编码是28H),紧接着的48位是唯一的序列号,最后8位是前56位的CRC校验值。CRC校验值的生成方法请参考DS18B20手册。图11-3164位ROM结构图
DS18B20的存储器由一个暂存RAM和非易失的EEPRAM构成。暂存RAM共9个存储单元,其结构如图11-32所示,非易失的EEPRAM结构如图11-33所示。暂存RAM中的TH、TL和配置字节是EEPRAM中TH、TL、配置字节的拷贝。改变TH、TL的值,可改变DS18B20的上、下限告警温度。通过设置配置字节的第6、7位,可完成温度值分辨率的配置。CRC值为前8个字节的校验值。图11-32DS18B20暂存RAM的结构
图11-33DS18B20EEPRAM的结构温度值的低、高位结构如图11-34(该图为12位分辨率的情况,如果配置为低的分辨率,则无意义位为0)所示。其中,低位字节包括二进制小数部分,高位字节包括符号位S(正温度为0,负温度为1)。
注意:温度为零上时,所测值便为温度值;温度为零下时,所测值取反加1后再加上符号才为实际温度值。图11-34DS18B20温度值的低、高位结构
2.单片机及显示
本系统中单片机采用ATMEL公司的AT89C51,它与MCS-51兼容,配有4 KBFlashROM。
显示单元采用16×2的字符/数字型液晶显示模块LM016L。
3.电路原理图
数字温度计的电路原理图如图11-35所示。图中,AT89C51的P0口接LM016L的数据接口,P1.0~P1.3作为键盘输入口,P3.5~P3.7与LM016L的控制线相连,DS18B20的数据线接P2.2,报警LED接P2.0、P2.1,蜂鸣器接P2.3。键盘工作于中断模式,由K1键触发。图11-35数字温度计的电路原理图11.3.3数字温度计的软件设计
数字温度计的软件需完成温度采集、温度显示及报警、键盘处理等功能。根据模块化程序设计的思想,数字温度计分为以下几个模块:温度采集模块、显示处理模块和键盘处理模块、报警处理模块。
DS18B20是单线器件,而AT89C51无单线接口,必须采用软件的方法来模拟单线的协议时序。
1.DS18B20的单线协议
DS18B20有严格的通信协议,主机访问DS18B20需要按照以下顺序进行。
1)初始化
单总线上的所有操作均从初始化开始。初始化过程如下:主机通过拉低单线480 μs以上来产生复位脉冲,然后释放该线,进入RX接收模式。主机释放总线时,会产生一个上升沿。DS18B20检测到该上升沿后,延时15~60μs,通过拉低总线60~240μs来产生应答脉冲。主机接收到从机的应答脉冲后,说明有单线器件在线,可进行后操作;若无应答,则说明器件不存在或连接错误,给出报警信息。
2) ROM操作命令
主机检测到应答脉冲后,便可以发起ROM操作命令。ROM操作命令共有5个,如表11-13所示。
3)内存操作命令
成功执行了ROM操作命令后,便可以使用内存操作命令执行相应操作。主机可提供六种操作命令,如表11-14所示。
4)数据处理
DS18B20器件要求采用严格的时序,以保证数据的完整性。与DS18B20的通信,是通过操作时隙来完成单总线上的数据传输的。发送所有的命令和数据时,都是字节的低位在前,高位在后。
(1)写时隙。当主机将单总线DQ从高电平拉到低电平时,便产生一个写时隙,所有的写时隙必须在60~120μs完成,且在每个循环之间至少需要1μs的恢复时间。写时隙有两种类型:写0和写1。DS18B20在DQ线变低后的15~60μs的窗口时间中对DQ线进行采样。如果为高电平,则为写1;如果为低电平,则为写0。对于主机产生写1时隙的情况,数据线必须先被拉低,然后释放。在写时隙开始后的15μs,允许DQ线拉至高电平;对于主机产生写0时隙的情况,DQ线必须被拉低至低电平且至少保持低电平60μs。
(2)读时隙。DS18B20器件仅在主机发出读时隙时,才向主机传输数据。所以在主机发出读数据命令后,必须马上产生读时隙,以便DS18B20能够传输数据。当主机从DS18B20读数据时,数据线从高电平拉至低电平,产生读时隙。数据线DQ必须保持低电平至少1μs,来自DS18B20的输出数据在读时隙下降沿之后15μs内有效。在此15μs内,主机必须停止将DQ引脚置低。读时隙结束时,DQ引脚将通过外部上拉电阻拉回至高电平。读时隙最短必须持续60μs,各读时隙间必须保证1μs的恢复时间。
2.流程图
在主程序中主要完成系统的初始化操作,其流程图如图11-36所示。温度采集及报警处理程序流程图如图11-37所示。图11-36主程序流程图图11-37温度采集及报警处理程序流程图 K4 BITP1.3
RSPIN BITP3.7
RWPIN BITP3.6
EPIN BITP3.5
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP SUBEX0 ;键盘处理
MAIN: MOV SP,#60H
SETB BEEP ;蜂鸣器
CLR FLAG1;
CLR FLAG2
CLR FLAG3
CLR FLAG4
CLR FLAG5
CLR FLAG7
CLR FLAG8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 头部经络疏通标准流程
- 刮痧排毒理疗执行标准
- 压力皮质醇检测解读指南
- 苹果低温贮藏保鲜技术方案
- 便秘人群膳食纤维补充方案
- 环保突发环境事件应急预案
- 风电机组叶片修复方案
- 风电场塔内施工方案
- 风电场进度管控方案
- 居家老年人日常用药管理安全指引
- 2026年广东省高三二模英语试卷(含答案)
- 2025年福建省公安辅警招聘考试题库(附答案)
- 2026届八省八校T8联考高三4月联合测评语文试题(含答案解析)
- 2025云南省国有股权运营管理有限公司招聘10人笔试参考题库附带答案详解
- 资产评估内部审核制度
- 统编版(新教材)道德与法治二年级下册第9课勤俭传家好
- 机械设计基础 第5版 课件全套 柴鹏飞 第1-12章 绪论、平面机构运动简图绘制 - 联轴器、离合器及制动器
- 液化石油气维修工安全教育培训考试题及答案
- 隔膜泵设备安装方案
- 仓储管理文件制度规范
- 2025年7月浙江省普通高中学业水平考试历史试卷(含答案)
评论
0/150
提交评论