《单片机应用实例开发》课件第11章_第1页
《单片机应用实例开发》课件第11章_第2页
《单片机应用实例开发》课件第11章_第3页
《单片机应用实例开发》课件第11章_第4页
《单片机应用实例开发》课件第11章_第5页
已阅读5页,还剩281页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论