基于 MCS-51 单片机温湿度仪系统的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东北林业大学
单片机原理实验课程设计
总结报告
机电工程学院
设计工程:基于MCS-51单片机温湿度仪系统地设计
工程完成人:谢文权、王世伟
指导教师:管雪梅副教授
学院:理学院
专业:物理学2010级物理一班
2012年11月25日
综合电子课程设计任务书
温湿度传感器综合实验
摘要
本系统用AT89C51、SHT10、键盘、数码管、液晶屏、DS1302等组成,系统包括测量温度、湿度地功能.系统除基本地测温湿度功能外,还具有时间日期设定、显示等功能.
在设计中我们应用LJD-SY-5200单片机实验系统做系统仿真.LJD-SY-5200实验系统具有丰富地硬件资源.本设计采用A T89C51单片机控制可编程芯片CH451实现对显示和键盘地控制.温湿度值在液晶屏幕上显示,时间在数码管上显示.
本文详细介绍了如何实现用键盘中断测量显示温湿度地功能,并实现键盘输入修改时间、I/O 口等功能.
关键词:sht10;测温湿度;时间显示;键盘设定初值;
目录
1 绪论2
1.1 引言 (2)
1.2 系统方案设计3
1.3方案论证3
2系统主要器件选型与依据4
2.1 LJD-SY-5200单片机实验系统.................................................... (4)
2.2 CH451DS1芯片简
介 (5)
2.3 DS1302芯片简介 (7)
2.4 SHT10 芯片简介 (9)
3系统地硬件设计10
3.1系统硬件设计总框
图 (10)
3.2温湿度测量电
路 (11)
3.3时间日期显示设
计.............. (12)
3.4键盘显示模块设计 (12)
4 系统地软件设计13
5 总结13
参考文献
附录A
温湿度传感器综合实验
1绪论
1.1引言
近年来随着科技地飞速发展,单片机地应用正在不断深入,同时带动传统控制检测技术日益更新.在实时检测和自动控制地单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够地,还应根据具体硬件结构软硬件结合,加以完善.
SHT10系列产品是一款高集成度地温湿度传感器芯片,提供全标定数字输出.它采用地CMOSens技术,确保产品具有极高地可靠性与卓越地长期稳定性.传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成地测温元件,并在同一芯片上,与14位地A/D 转换器以及串行接口电路实现无缝连接.因此,该产品具有品质卓越、超快响应、抗干扰能力强、极高地性价比等优点.每个传感器芯片都在极为精确地湿度腔室中进行标定,以镜面冷凝式湿度计为参照.校准系数以程序形式储存在OTP内存中,在标定地过程中使用.两线制地串行接口与内部地电压调整,使外围系统集成变得快速而简单.微小地体积、极低地功耗,使其成为各类应用地首选.
本系统采用MSC-51系列单片机和可编程串行I/O接口芯片CH451为中心器件来设计温湿度测量,本系统实用性强、操作简单、扩展功能强.
1.2 系统方案设计
利用控制芯片、测温电路、键盘显示模块、时钟电路、等分别实现:
(1)能够通过键盘输入日期和时间地初值;
(2)实时显示时、分、秒;
(3)测量并显示温湿度
(4)通过I/O口显示
图1-1为设计方案总体框图
图1-1设计方案总体框图
系统初始化后,液晶屏幕上显示“单片机实验”等,同时可通过键盘依次输入时、分、秒,输入完成后即在数码管上显示,通过功能键10能在液晶屏上显示温湿度,通过功能键11能显示I/O口流水灯.
1.3方案论证
(1)测温模块
方案:使用SHT10芯片测量温湿度,SHT10系列产品是一款高集成度地温湿度传感器芯片,提供全标定数字输出.它采用地CMOSens技术,确保产品具有极高地可靠性与卓越地长期稳定性.
(2)显示模块
方案一:使用LCD液晶屏作为时间日期显示,LCD 液晶显示器地构造是在两片平行地玻璃当中放置液态地晶体,两片玻璃中间有许多垂直和水平地细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面.显示清晰,实现功能全.
但是开发板P0口同时作用在点阵和液晶上,不能同时用,故该方案舍弃.
方案二:使用8为数码管作为显示,通过芯片CH451控制数码管,可实现时间和日期还有当前交通状态显示,缺点是数码管显示数字,显示不灵活多变.
但是LCD液晶屏与点阵IO口冲突,故选用方案二数码管作为显示模块.
(3) 时钟电路模块
方案一:DS1302一种高性能、低功耗、带RAM地实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V.采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节地时钟信号或RAM数
据.DS1302内部有一个31×8地用于临时性存放数据地RAM寄存器.
方案二:DS12C887实时时钟芯片功能丰富,可以用来直接代替IBM PC上地时钟日历芯片DS12887,同时,它地管脚也和MC146818B、DS12887相兼容.由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内地时间记录,有12小时制和24小时制两种模式.在12小时制模式中,用AM和PM区分上午和下午;时间地表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887地控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现
多种方波输出,并可对其内部地三路中断通过软件进行屏蔽.
由于DS12C887是并行方式,DS1302是串行方式,为了减少IO口占用,故选用DS1302
(4) 键盘显示控制模块
方案一:HD7279A是一片具有串行接口地,可驱动8位共阴式数码管(或64只独立LED)地智能显示驱动芯片,该芯片同时还可连接多达64键地键盘矩阵,单片即可完成LED显示、键盘接口地全部功能.
方案二:CH451 是一个整合了数码管显示驱动和键盘扫描控制以及μP 监控地多功能外围芯片.CH451 内置RC振荡电路,可以动态驱动8位数码管或者64位 LED,具有 BCD 译码、闪烁、移位等功能;同时还可以进行 64 键地键盘扫描;CH451 通过可以级联地串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能.
相比之下CH451性能更好一点,故选用CH451作为键盘显示控制芯片
2系统主要器件选型及依据
2.1 LJD-SY-5200单片机实验系统
(1) LJD-SY-5200 地基本结构:
LJD-SY-5200 实验系统地硬件部分主要由以下电路构成:显示电路(其中显
示电路包括液晶显示,数码管显示,发光二极管显示及8X8 三色LED 点阵显示),
键盘电路,USB 电路,串口电路,时钟电路,I2C电路,D/A&A/D 转换电路,
测温湿度电路,1-WIRE 总线电路,IC 卡电路,语音电路,蜂鸣器&继电器电路,
单脉冲发生电路,红外遥感电路等电路有机组合而成.而实验系统地软件部分则
是精心编写并测试通过地所有硬件部分驱动程序和大量地综合实验例程.
(2) LJD-SY-5200 硬件配置:
LJD-SY-5200 实验系统具有丰富地硬件资源,具体地硬件配置如下:液晶显示器采用地是两兆字库12232 汉字液晶屏,汉显液晶屏具有编程简单使用方便等其他液晶屏所不具备地优点;数码管采用地是8 段8 位数码管;键盘是4X4 行列式键盘,键盘与数码管通过专用键盘和数码管接口芯片CH451 与CPU 相连接,使用键盘接口芯片地好处就是可以大大减少编程地工作量,一个复杂地数码管显示位地闪烁移动操作,在此我们只需要一行简单地命令就能轻轻实现.
发光二极管部分采用地24 个红黄绿三色地发光二极管,大量地各色发光二级管组合在一起能够变换出五彩缤纷地色彩;点阵部分采用地8X8 三色点阵显示,点阵地驱动电路是两片74HC573 和一片74HC138 及八个8550 三极管和相应地限流电阻,其具体地使用方法详见后续章节地8X8LED 点阵地操作使用说明;USB 电路采用地是内部已经固化了USB 标准
通信协议地USB 接口芯片CH372,使用CH372可以在很大程度上简化USB 驱动程序地开发复杂程度,面对USB 驱动程序地开发初学者不再会望而却步,只要在熟悉相关通信协议地基础上即使是初学者也能轻轻松松开发出属于自己地USB 驱动程序.
时钟电路采用地是ds1302 实时时钟芯片,针对该芯片我们配置了较多地相关程序,包括通过数码管显示当前时间地RTC,可调节地通过数码管显示当前时间地RTC,可调节地通过数码管可显示当前时间和日期地RTC,通过12232 液晶显示屏显示当前时间和日期地RTC,这些程序在编写顺序上遵循地是循序渐进,由易到难地原则,是真正地针对初学者而为其量身定做地,具有很强地针对性,相信初学者一定会从中受益地;I2C电路采用地当前流行地AT24C02。
DA/AD 电路采用地分别是TLC5615&TLC549 转换芯片,他们具有简单实用操作方便地特点.
测温湿度电路采用地SHT10 温湿度传感器,它能够精确地测试出当前小环境温度和湿度,针对温湿度传感器我们为其配置了通过液晶屏及数码管显示当前温度&湿度地程序,详见后续章节地SHT10篇;1-WIRE 采用地是iButton(信息纽扣)--DS1990A-F5,可说这在当前是比较先进地,这在市面上其他同类产品中是不具备地;IC 卡电路采用地是西门子公司地SLE4442 逻辑加密卡;语音芯片采用地是ISD1420,具有20 秒地语音录放功能.
(3)LJD-SY-5200 地仿真方法:
把随机带地仿真监控芯片插到LJD-SY-5200 地CPU 插座上,将串口线地一端插到计算机地串口上,另一端与LJD-SY-5200 地串口相连接即完成硬件连接部分,接下来需要对仿真监控芯片地工作参数进行设定.
2.2 CH451DS1芯片简介
CH451 是一个整合了数码管显示驱动和键盘扫描控制以及μP 监控地多功能外围芯片.CH451 内置RC振荡电路,可以动态驱动8位数码管或者64位 LED,具有 BCD译码、闪烁、移位等功能;同时还可以进行 64 键地键盘扫描;CH451 通过可以级联地串行接口与单片机等交换数据;并且提供上电复位和看门狗等监控功能.
特点:
(1) 显示驱动
内置大电流驱动级,段电流不小于25mA,字电流不小于150mA.动态显示扫描控制,直接驱动 8位数码管或者 64 位发光管 LED. 可选数码管地段与数据位相对应地不译码方式或者 BCD 译码方式. 数码管地字数据左移、右移、左循环、右循环.各数码管数字独立闪烁控制.通过占空比设定提供16级亮度控制.支持段电流上限调整,可以省去所有限流电阻.扫描极限控制,支持1到8个数码管,只为有效数码管分配扫描时间.
(2) 键盘控制
内置64 键键盘控制器,基于8×8矩阵键盘扫描. 内置按键状态输入地下拉电阻,内置去抖动电路. 键盘中断,低电平有效输出. 提供按键释放标志位,可供查询按键按下与释放.
(3) 外部接口
高速地 4线串行接口,支持多片级联,时钟速度从0 到 10MHz. 串行接口中地DIN和DCLK信号线可以与其它接口电路共用,节约引脚. 完全内置时钟振荡电路,通常不需要外接晶体或者阻容振荡. 内置上电复位和看门狗Watch-Dog,提供高电平有效和低电平有效复位输出.
功能:
CH451 是一个多功能外围芯片,通过可以级联地 4 线串行接口与单片机、DSP、微处理器等交换数据.CH451 包含三个功能:数码管显示驱动、键盘扫描控制、μP 监控,三个功能之间相互独立,单片机可以通过操作命令分别启用、关闭、设定CH451地任何一个功能.CH451 地串行接口是由硬件实现地,单片机可以频繁地通过串行接口进行高速操作,而
绝不会降低 CH451 地工作效率. 图2-1为 CH451外围电路图.表2-1为按键键值表.表2-2为引脚功能表.表2-3为操作指令表.图2-2为CH451获得按键代码时序图
图2-1 CH451外围电路图
表2-1 按键键值表
表2-2引脚功能表
表2-3 操作指令表
图2-2 单片机从CH451获得按键代码时序图
2.3 DS1302芯片简介
DS1302是DALLAS公司推出地涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态 RAM 通过简单地串行接口与单片机进行通信,实时时钟/日历电路提供秒分时日日期月年地信息,每月地天数和闰年地天数可自动调整,时钟操作可通过AM/PM指示决定采用24或12小时格式 DS1302 与单片机之间能简单地采用同步串行地方式进行通信,仅需用到三个口线 1 RES 复位2 I/O 数据线 3 SCLK串行时钟时钟/RAM 地读/写数据以一个字节或多达 31 个字节地字符组方式通信,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW.
DS1302是由DS1202改进而来,增加了以下地特性,双电源管脚用于主电源和备份电源供应Vcc1为可编程涓流充电电源.附加七个字节存储器,它广泛应用于电话传真便携式仪器以及电池供电地仪器仪表等产品领域,下面将主要地性能指标作一综合:·实时时钟具有能计算 2100 年之前地秒分时日日期星期月年地能力,还有闰年调整能力.
· 31 8 位暂存数据存储 RAM
·串行 I/O 口方式使得管脚数量最少
·宽范围工作电压 2.0 5.5V
·工作电流 2.0V 时,小于 300nA
·读/写时钟或 RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式
· 8 脚 DIP 封装或可选地 8 脚 SOIC封装根据表面装配
·简单 3 线接口
·与 TTL兼容 Vcc=5V
·可选工业级温度范围 -40 +85
·与 DS1202 兼容
·在 DS1202 基础上增加地特性:对 Vcc1 有可选地涓流充电能力;双电源管用于主电源和备份电源供应;备份电源管脚可由电池或大容量电容输入;附加地 7 字节暂存存储器.
DS1302 地管脚排列及描述如图2-4所示.
图2-4 DS1302管脚图
·X1 X2 32.768KHz 晶振管脚;
·GND 地;
·RST 复位脚;
·I/O 数据输入/输出引脚;
·SCLK 串行时钟;
·Vcc1,Vcc2 电源供电管脚;
·DS1302内部寄存器;
·CH: 时钟停止位寄存器 2 地第 7 位 12/24 小时标志;
·CH=0 振荡器工作允许 bit7=1,12 小时模式;
·CH=1 振荡器停止 bit7=0,24 小时模式;
·WP: 写保护位寄存器 2 地第 5 位:AM/PM 定义;
·WP=0 寄存器数据能够写入 AP=1 下午模式;
·WP=1 寄存器数据不能写入 AP=0 上午模式;
·TCS: 涓流充电选择 DS: 二极管选择位
·TCS=1010 使能涓流充电 DS=01 选择一个二极管
·TCS=其它禁止涓流充电 DS=10 选择两个二极管
·DS=00 或 11, 即使TCS=1010, 充电功能也被禁止
DS1302 地管控制字如图2-5所示.DS1302 地读写时序图如图2-6所示.
图2-5 DS1302 地控制字
DS1302 地读写时序图如图2-6所示.
2.4 SHT10芯片简介
SHT10系列产品是一款高集成度地温湿度传感器芯片,提供全标定数字输出.它采用地CMOSens技术,确保产品具有极高地可靠性与卓越地长期稳定性.传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成地测温元件,并在同一芯片上,与14位地A/D 转换器以及串行接口电路实现无缝连接.因此,该产品具有品质卓越、超快响应、抗干扰能力强、极高地性价比等优点.每个传感器芯片都在极为精确地湿度腔室中进行标定,以镜面冷凝式湿度计为参照.校准系数以程序形式储存在OTP内存中,在标定地过程中使用.两线制地串行接口与内部地电压调整,使外围系统集成变得快速而简单.微小地体积、极低地功耗,使其成为各类应用地首选.
SHT10框图
SHT10命令集
3 硬件设计
3.1 系统硬件设计总框图
系统原理图设计如图3-1所示,A T89C51单片机硬件系统实现如下功能:(1)控制时钟芯片DS1302读取日期和时间,设置初值;
(2)控制CH451显示时间和日期;
(3)控制SHT10实现温湿度测量;
图3-1 系统原理图3.2温湿度测量电路
3.3 时间日期显示设计
电路如图3-3所示,该时钟电路可以对年、月、日、周、时、分、秒进行计时.DS1302实时时钟具体控制方法如下:
(1)单片机地P10口连接DS1302地I/O口,作为串行数据地输入和输出口;
(2)单片机地P11口连接DS1302地SCLK口,给DS1302提供读写数据地脉冲信号;
(3)单片机地P14口连接DS1302地RST口,起到时钟芯片地复位作用.
图3-3 时钟电路
3.4 键盘显示模块设计
键盘显示模块控制电路如图3-5所示,CH451控制键盘与8位数码管,有键按下时产生中断,并获得相应地键值,根据相应地键值做相应功能处理,具体控制方法如下:(1)单片机地P12口连接CH451地LOAD口,作为串行数据加载;
(2)单片机地P35口连接CH451地DIN口, 作为串行数据输入;
(3)单片机地P34口连接CH451地DCLK口,作为串行接口地数据时钟;
(4) 单片机地INT1口连接CH451地DOUT口,作为串口数据地输出和键盘中断;
(5) CH451地RST1口连接外部按键,起到上电复位和看门狗复位地作用.
图3-5 键盘显示原理图
4 系统地软件设计
本系统利用键盘实现时间初值地设定,并利用键盘中断实现温湿度测量及显示,I/O口流水灯显示.
5总结
系统设计简便、稳定性强、操作简单、程序设计简便.
系统不足:过于简单,系通过于平面化,深度不足
参考文献
[1]赵伟、张锡英.MCS—51系列单片机原理与应用东北林业大学出版社 2007
[2]蓝海芯片单片机板LJ—SY 5200附带材料
附表:。
******************************************************************************* *。
******************************************************************************* *
LOAD BIT P1.2 。
键盘和显示定义CH451
DIN BIT P3.5
DCLK BIT P3.4
DOUT BIT P3.3
DA TA_F EQU 0CH
DA TA_KEY EQU 0DH
MR EQU 08H
MR1 EQU 09H
MR2 EQU 0AH
MR3 EQU 0BH
COUNT EQU 0CH。
****************************************************
ADDR EQU 0EH 。
起始地显示位置
ADDR1 EQU 0FH 。
起始地显示位置临时变量
N1 EQU 10H 。
行数地临时变量。
p2.5=r/w p2.4=rs W_C_GLCD EQU 0cfffH 。
0 0 写指令
W_D_GLCD EQU 0dfffH 。
0 1 写数据
R_B_GLCD EQU 0efffH 。
1 0 读忙标志
R_D_GLCD EQU 0ffffH 。
1 1 读数据。
******************************************************* SCLK BIT P1.1 。
系统时钟芯片ds1302
IODA TA BIT P1.0 。
RST BIT P1.4 。
FLAG BIT 02H 。
读写标志位。
*********************************************************
DA T BIT P3.5
SCK BIT P3.4
ACK BIT 01H。
adr command r/w*/
STATUSW EQU 06H 。
000 0011 0*/ 写状态
STATUSR EQU 07H 。
000 0011 1*/ 读状态
MTEMP EQU 03H 。
000 0001 1*/ 测量温度
MHUMI EQU 05H 。
000 0010 1*/ 测量湿度
RESET EQU 1EH 。
000 1111 0*/。
**********************************
SDA bit P1.0 。
/* iic数据传送位 */ AT24C02A定义
SCL bit P1.1 。
/* iic时钟控制位 */
WP BIT P1.4。
**********************************
CS1 BIT P1.5 。
A/D TLC549CP管脚定义
SDA1 BIT P1.0
SCL1 BIT P1.1。
***************************************
CS2 BIT P1.3 。
DA片选信号
SCLK2 BIT P1.1 。
DA时钟信号
DIN2 BIT P1.0 。
10bit数字数据输入。
***********************************
ORG 00H
LJMP MAIN
ORG 03H
LJMP LINT0
ORG 0BH
LJMP LTIME0
ORG 13H
LJMP CH451_INT1 。
设置键盘中断外部中断1 ORG 23H
LJMP RECIVE
ORG 30H
MAIN: MOV SP,#60H
LCALL INITIAL_GLCD 。
调用LCD初试化
LCALL INICH451 。
显示和键盘初始化
LCALL DS1302INI 。
时钟芯片ds1302初始化
SETB IT1 。
置外部中断信号为边沿触发 SETB EX1 。
允许键盘中断
SETB EA 。
开总中断
STA T: MOV A,#01H 。
清除LCD显示器
LCALL COMMAND_GLCD
MOV DPTR,#DHZTAB1
MOV ADDR1,#00H 。
开始行位置
MOV N1,#6 。
显示数量
LCALL DHZ
LCALL OFFDIS
MOV 77H,#0
MOV 78H,#18H
MOV 79H,#18H
MOV 7AH,#0EH
MOV 7BH,#17H
LCALL DISPLAY
MOV 20H,#0
MOV DATA_KEY,#0
SETB EX1。
***********键盘判断***************************** KEY0: JNB 00H,KEY0
CLR 00H
MOV A,DA TA_KEY
KEY1: CJNE A,#41H,KEY2 。
'1'键。
-------------定时器------------
CLR EX1 。
禁止键盘中断
MOV TMOD,#01H 。
T0方式1
MOV TL0,#0B0H 。
定时50毫秒
MOV TH0,#3CH
MOV R5,#40 。
2秒
SETB ET0 。
允许T0中断
SETB EA
CLR F0
SETB TR0
JNB F0,$
CLR F0
AJMP STAT。
-------------外中断INT0--------------
KEY2: CJNE A,#42H,KEY3 。
'2'键
CLR EX1
SETB IT0 。
置外部中断0信号为边沿触发 SETB EX0
SETB EA
JNB 01H,$
CLR 01H
AJMP STAT。
------------存储器写记录-------------------
KEY3: CJNE A,#43H,KEY31 。
'3'键
LCALL OFFDIS
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
MOV 77H,#3
LCALL DISPLAY
SETB WP 。
控制允许24C02A读写
NOP
CLR WP
LCALL MEM
LCALL DELAY_1S
AJMP STAT。
------------存储器读记录---------------------
KEY31: CJNE A,#48H,KEY4 。
'4'键
LCALL OFFDIS
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
MOV 77H,#4
LCALL DISPLAY
JKEY: JNB 00H,JKEY
CLR 00H
MOV A,DA TA_KEY
CJNE A,#52H,JKEY1 。
'4+A'键按顺序显示记录 MOV 7AH,#0AH
LCALL DISPLAY
LCALL DELAY_1S
LCALL DISJILU 。
显示记录
AJMP STAT
JKEY1: CJNE A,#53H,JKEY2 。
'4+B'键按时间和日期显示记录 LCALL DISJILUDT
MOV 7AH,#0BH
LCALL DISPLAY
LCALL DELAY_1S
AJMP STAT
JKEY2: CJNE A,#53H,JKEY 。
‘4+E’键返回
MOV 7AH,#0EH
LCALL DISPLAY
LCALL DELAY_1S
AJMP STAT。
-----------串行通讯发送-----------------
KEY4: CJNE A,#49H,KEY5 。
'5'键
CLR EX1
LCALL TONGXIF
AJMP STAT。
-----------串行通讯接收----------------------
KEY5: CJNE A,#4AH,KEY6 。
'6'键
CLR EX1
LCALL TONGXIS
AJMP STAT。
------------蜂鸣器---------------------
KEY6: CJNE A,#4BH,KEY7 。
'7'键
CLR EX1
MOV R7,#10
KK: LCALL YAN300
CPL P1.6
LCALL YAN300
CPL P1.6
DJNZ R7,KK
SETB EX1
AJMP STAT。
-----------A/D---------------------------
KEY7: CJNE A,#50H,KEY8 。
'8'键
LCALL ADREAD
AJMP STAT。
-----------D/A----------------------------
KEY8: CJNE A,#51H,KEY9 。
'9'键
LCALL DAWRITE
AJMP STAT。
-----------D/A----------------------------
KEY9: CJNE A,#52H,KEY10 。
'A'键
LCALL OFFDIS
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
CONT: SETB ACK
LCALL MEASTEMP 。
测量温度结果在B(6位整数)A(8位小数)中 LCALL DISTEMP 。
显示测量温度
LCALL YAN300
LCALL MEASHUMI
LCALL DISHUMI
LCALL DELAY_1S
JNB 00H,CONT
CLR 00H
AJMP STAT。
----------键盘输入日期和时间初值------------------------
KEY10: CJNE A,#53H,KEY11 。
'B'键
LCALL OFFDIS
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
LCALL DT 。
键盘输入日期和时间初值
AJMP STAT。
-----------显示日期和时间-----------------------
KEY11: CJNE A,#58H,KEY12 。
'C'键
LCALL OFFDIS
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
MOV 77H,#0CH
LCALL DISPLAY
LCALL XTTIME
AJMP STAT。
-------------将记录个数清零-------------------------
KEY12: CJNE A,#59H,KEY13 。
'D'键
LCALL OFFDIS
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
MOV 77H,#0DH
LCALL DISPLAY
MOV 47H,#0A0H 。
写命令0A0H=1010 000(页地址) 0(写)
MOV 48H,#0 。
地址00H存记录个数
MOV 49H,#0 。
数据
LCALL WRDATA 。
记录个数清零
LCALL DELAY_1S
AJMP STAT
KEY13: AJMP KEY0。
***********按时间和日期显示记录***********************
DISJILUDT: MOV COUNT,#0 。
统计键盘输入年、月、日、时查询和显示
MOV R0,#30H
DDT: JNB 00H,DDT
CLR 00H
MOV A,DATA_F
MOV @R0,A
INC COUNT
RET。
-----------按顺序显示记录--------------------------------
DISJILU: SETB WP 。
控制允许24C02A读写
NOP
CLR WP
MOV 47H,#0A0H 。
写命令
MOV 48H,#0 。
地址
MOV 49H,#0A1H 。
读命令
LCALL RDDATA 。
读记录数
MOV R5,A
CLR C
MOV A,#1
SUBB A,#1
MOV B,#12 。
一个存储记录=12字节=年(2)、月、日、时、分、秒、星期、温度(2)、湿度(2)
MUL AB 。
计算存储记录地地址
ADD A,#1
MOV 48H,A 。
A=页内地地址 B=页地址
XCH A,B 。
A B互换
RL A 。
将页地址*2
ADD A,47H 。
将页地址+命令中
MOV 47H,A
LCALL DELAY10
MOV 7EH,R5
MOV 7BH,#1
JXDU0: LCALL DISPLAY
MOV R0,#30H
MOV R7,#12
JXDU1: LCALL RDDA TA 。
读记录数
MOV @R0,A
INC R0
INC 48H
LCALL DELAY10
DJNZ R7,JXDU1
LCALL DISDTWS 。
显示记录
INC 7BH
JNB 00H,$
CLR 00H
DJNZ R5,JXDU0
RET。
------------------------------------------------------
DISDTWS: MOV A,#80H 。
送显示地址第一行
LCALL COMMAND_GLCD 。
调写命令子程序
MOV R7,#7
MOV R0,#30H
JIXD2: LCALL DISDT 。
显示年、月、日\时、分、秒 DJNZ R7,JIXD2
MOV A,@R0
ADD A,#30H
LCALL WRITE_GLCD 。
显示星期
INC R0
MOV A,#90H 。
送显示地址第二行
LCALL COMMAND_GLCD 。
调写命令子程序
MOV R7,#2
JIXD3: MOV A,@R0
SW AP A
ANL A,#0FH 。
先显示高4位
ADD A,#30H
LCALL WRITE_GLCD 。
送显示
MOV A,@R0
ANL A,#0FH
ADD A,#30H
LCALL WRITE_GLCD 。
显示低4位
MOV A,#'.'
LCALL WRITE_GLCD 。
显示'.'
INC R0
MOV A,@R0
SW AP A
ANL A,#0FH 。
先显示高4位
ADD A,#30H
LCALL WRITE_GLCD 。
显示第一位小数
MOV A,@R0
ANL A,#0FH
ADD A,#30H
LCALL WRITE_GLCD 。
显示第二位小数
MOV A,#'-'
LCALL WRITE_GLCD 。
显示'-'
INC R0
DJNZ R7,JIXD3
RET。
***************显示日期和时间******** XTTIME: MOV R0,#40H
MOV R7,#7
SETB FLAG 。
FLAG=1 读日期和时间
LCALL RWRTC
LCALL TIAOZ
MOV A,#80H 。
送显示地址第一行
LCALL COMMAND_GLCD 。
调写命令子程序 MOV R7,#3
MOV R0,#30H
LCALL DISDT 。
显示年高2位
JIXU0: LCALL DISDT 。
显示年、月、日
DJNZ R7,JIXU1
AJMP JIXU2
JIXU1: MOV A,#"-"
LCALL WRITE_GLCD 。
显示'-'
AJMP JIXU0
JIXU2: MOV A,#90H 。
送显示地址第二行
LCALL COMMAND_GLCD 。
调写命令子程序 MOV R7,#3
JIXU3: LCALL DISDT 。
显示时、分、秒
DJNZ R7,JIXU4
AJMP JIXU5
JIXU4: MOV A,#"-"
LCALL WRITE_GLCD 。
显示'-'
AJMP JIXU3
JIXU5: CLR EA
MOV ADDR1,#15H
MOV N1,#2
MOV DPTR,#TAB
LCALL DHZ
MOV A,@R0
ADD A,#30H
LCALL WRITE_GLCD
SETB EA
JBC 00H,QUIT0
AJMP XTTIME
QUIT0: RET。
-----------------------------------------------
TIAOZ: MOV 30H,#20H 。
年
MOV 31H,46H
MOV 32H,44H 。
月
MOV 33H,43H 。
日
MOV 34H,42H 。
时
MOV 35H,41H 。
分
MOV 36H,40H 。
秒
MOV 37H,45H 。
星期
RET。
-------------------------------------------------
DISDT: MOV A,@R0
SW AP A
ANL A,#0FH
ADD A,#30H
LCALL WRITE_GLCD 。
显示'2'
MOV A,@R0
ANL A,#0FH
ADD A,#30H
LCALL WRITE_GLCD 。
显示'5'
INC R0
RET。
**********。
键盘输入日期和时间初值****************
DT: MOV 77H,#0BH
LCALL DISPLAY
JNB 00H,$
CLR 00H
MOV A,DA TA_KEY
KY1: CJNE A,#41H,KY2 。
'B+1'键输入年(2位BCD码如11年) LCALL KEYIN 。
键盘输入2位BCD码
MOV 30H,#8CH 。
年地址8CH=1 0 00 110(地址) 0
LCALL WRDT 。
写入
LJMP DT
KY2: CJNE A,#42H,KY3 。
'B+2'键输入月(2位BCD码如06月) LCALL KEYIN 。
键盘输入2位BCD码
MOV 30H,#88H 。
年地址88H=1 0 00 100(地址) 0
LCALL WRDT 。
写入
LJMP DT
KY3: CJNE A,#43H,KY4 。
'B+3'键输入日(2位BCD码如16日) LCALL KEYIN 。
键盘输入2位BCD码
MOV 30H,#86H 。
年地址86H=1 0 00 011(地址) 0
LCALL WRDT 。
写入
LJMP DT
KY4: CJNE A,#48H,KY5 。
'B+4'键输入星期(2位BCD码如02) LCALL KEYIN 。
键盘输入2位BCD码
MOV 30H,#8AH 。
年地址8AH=1 0 00 101(地址) 0
LCALL WRDT 。
写入
LJMP DT
KY5: CJNE A,#49H,KY6 。
'B+5'键输入时(2位BCD码如21时)
LCALL KEYIN 。
键盘输入2位BCD码
MOV 30H,#84H 。
年地址84H=1 0 00 010(地址) 0
LCALL WRDT 。
写入
LJMP DT
KY6: CJNE A,#4AH,KY7 。
'B+6'键输入分(2位BCD码如21分)
LCALL KEYIN 。
键盘输入2位BCD码
MOV 30H,#82H 。
年地址82H=1 0 00 001(地址) 0
LCALL WRDT 。
写入
LJMP DT
KY7: CJNE A,#4BH,KY8 。
'B+7'键输入秒(2位BCD码如21)
LCALL KEYIN 。
键盘输入2位BCD码
MOV 30H,#80H 。
年地址80H=1 0 00 000(地址) 0
LCALL WRDT 。
写入
LJMP DT
KY8: CJNE A,#5AH,KY9 。
'E'键返回
RET
KY9: LJMP DT。
*****************************************************
KEYIN: LCALL DELAY_1S
LCALL OFFDIS
MOV R0,#30H 。
键盘输入2位BCD码
MOV R4,#2
KEYIN1: JNB 00H,KEYIN1
CLR 00H
MOV A,DATA_F
MOV @R0,A
INC R0
DJNZ R4,KEYIN1
MOV A,30H
SW AP A
ADD A,31H 。
组合成压缩地BCD码如02H+03H->23H
MOV 31H,A
LCALL DELAY_1S
RET。
-----------------------------------------------
WRDT: MOV R0,#30H
LCALL WRRTC
RET。
********显示测量温度T=0.01*BA-40(温度校正)******************************** DISTEMP: MOV R2,#20h 。
R2=阶码 D7-最高位符号 D6D5D4D3D2D1-阶 D0-尾数符号位 MOV R3,B 。
将温度BA转成3字节浮点数存到R0为地址3个单元中
MOV R4,A
LCALL SU924 。
入口数据 R2R3R4 出口数据R2R3R4
MOV 40H,R2
MOV 41H,R3
MOV 42H,R4
MOV R0,#40H 。
XA= 温度
MOV 43H,#0F4H 。
将小数0.01转成3字节浮点数=F4A3D6H存到R1为地址3个单元中
MOV 44H,#0A3H
MOV 45H,#0D6H
MOV R1,#43H 。
XB=0.01
LCALL SATB 。
XA*XB->R2R3R4 实现0.01*测量温度BA
MOV 40H,R2
MOV 41H,R3
MOV 42H,R4
MOV R0,#40H 。
XA=0.01*测量温度BA
MOV 43H,#0CH 。
将数40转成3字节浮点数=0CA000H存到R1为地址3个单元中 MOV 44H,#0A0H
MOV 45H,#00H
MOV R1,#43H 。
XB=40
LCALL SAMB 。
XA-XB->R2R3R4=实现0.01*测量温度BA-40
MOV 40H,R2
MOV 41H,R3
MOV 42H,R4
MOV R0,#40H
LCALL FDHEX 。
将浮点数(正数)转化为16进制 r0为地址地3字节浮点数->r2r3(整数)r4r5(小数)
MOV R0,#51H
MOV R7,#2
LCALL BINXSBCD 。
将r4r5中2进制小数转化为bcd->r0为地址地RAM中即40H41H
LCALL BINBCD 。
将r2r3中2进制整数转化为bcd->r4r5r6
MOV 50H,R6
MOV ADDR1,#00H 。
第一行显示"温度"
MOV N1,#2 。
数量2个
MOV DPTR,#DHZTAB3 。
需要显示地汉字位置
LCALL DHZ 。
调用汉字显示子程序
MOV A,R6
SWAP A
ANL A,#0FH 。
先显示高4位
ADD A,#30H
MOV B,A
MOV A,#02H 。
送显示地址
ORL A,#80H 。
送显示地址
LCALL COMMAND_GLCD 。
调写命令子程序
MOV A,B
LCALL WRITE_GLCD 。
送显示
MOV A,R6
ANL A,#0FH
ADD A,#30H
LCALL WRITE_GLCD 。
显示低4位
MOV A,#'.'
LCALL WRITE_GLCD 。
显示'.'
MOV A,51H
ADD A,#30H
LCALL WRITE_GLCD 。
显示第一位小数
MOV A,52H
ADD A,#30H
LCALL WRITE_GLCD 。
显示第二位小数
MOV A,51H
SWAP A
ADD A,52H
MOV 51H,A
RET。
********显示测量湿度RH=0.0405*BA-4-0.0000028*BA*BA(湿度校正)******************
DISHUMI: MOV R2,#20h 。
R2=阶码 D7-最高位符号 D6D5D4D3D2D1-阶 D0-尾数符号位 MOV R3,B 。
将湿度BA转成3字节浮点数存到R0为地址3个单元中
MOV R4,A
LCALL SU924 。
入口数据 R2R3R4 出口数据R2R3R4
MOV 40H,R2
MOV 41H,R3
MOV 42H,R4
MOV R0,#40H 。
XA= 湿度
MOV R1,#40H 。
XB= 湿度
LCALL SATB 。
XA*XB->R2R3R4 实现BA*BA
MOV 43H,R2
MOV 44H,R3
MOV 45H,R4
MOV R0,#43H 。
XA=BA*BA
MOV 56H,#0DCH 。
将小数0.0000028转成3字节浮点数=DCBBE6H存到R1为地址3个单元中
MOV 57H,#0BBH
MOV 58H,#0E6H
MOV R1,#56H 。
XB=0.0000028
LCALL SATB 。
XA*XB->R2R3R4 实现0.0000028*BA*BA
MOV 56H,R2
MOV 57H,R3
MOV 58H,R4
MOV R0,#40H 。
XA=BA
MOV 43H,#0F8H 。
将小数0.0405转成3字节浮点数=F8A5E2H存到R1为地址3个单元中
MOV 44H,#0A5H
MOV 45H,#0E2H
MOV R1,#43H 。
XB=0.0405
LCALL SATB 。
XA*XB->R2R3R4 实现0.0405*BA
MOV 40H,R2
MOV 41H,R3
MOV 42H,R4
MOV R0,#40H 。
XA=0.0405*BA
MOV R1,#56H 。
XB=0.0000028*BA*BA
LCALL SAMB 。
XA-XB->R2R3R4=实现0.0405*BA-0.0000028*BA*BA
MOV 40H,R2
MOV 41H,R3
MOV 42H,R4
MOV R0,#40H 。
XA=0.0405*BA-0.0000028*BA*BA
MOV 43H,#06H 。
将数4转成3字节浮点数=068000H存到R1为地址3个单元中
MOV 44H,#80H
MOV 45H,#00H
MOV R1,#43H 。
XB=4
LCALL SAMB 。
XA-XB->R2R3R4=实现0.0405*BA-0.0000028*BA*BA-4
MOV 40H,R2
MOV 41H,R3
MOV 42H,R4
MOV R0,#40H
LCALL FDHEX 。
将浮点数(正数)转化为16进制r0为地址地3字节浮点数->r2r3(整数)r4r5(小数)
MOV R0,#53H
MOV R7,#2
LCALL BINXSBCD 。
将r4r5中2进制小数转化为bcd->r0为地址地RAM中即40H41H
LCALL BINBCD 。
将r2r3中2进制整数转化为bcd->r4r5r6
MOV 52H,R6
MOV ADDR1,#10H 。
第一行显示" 湿度"
MOV N1,#2 。
数量2个
MOV DPTR,#DHZTAB2 。
需要显示地汉字位置
LCALL DHZ 。
调用汉字显示子程序
MOV A,R6
SWAP A
ANL A,#0FH 。
先显示高4位
ADD A,#30H
MOV B,A
MOV A,#12H 。
送显示地址
ORL A,#80H 。
送显示地址
LCALL COMMAND_GLCD 。
调写命令子程序
MOV A,B
LCALL WRITE_GLCD 。
送显示
MOV A,R6
ANL A,#0FH
ADD A,#30H
LCALL WRITE_GLCD 。
显示低4位
MOV A,#'.'
LCALL WRITE_GLCD 。
显示'.'
MOV A,53H
ADD A,#30H
LCALL WRITE_GLCD 。
显示第一位小数
MOV A,54H
ADD A,#30H
LCALL WRITE_GLCD 。
显示第二位小数
MOV A,53H
SWAP A
ADD A,54H
MOV 53H,A
RET。
******************************************************
DHZTAB1: DW 0B6ABH,0B1B1H,0C1D6H,0D2B5H,0B4F3H,0D1A7H 。
"东北林业大学" DHZTAB2: DW 0CAAAH,0B6C8H 。
"湿度"
DHZTAB3: DW 0CEC2H,0B6C8H 。
"温度"
TAB: DW 0D0C7H,0C6DAH 。
'星期'。
************显示汉字16X16点阵************************
DHZ: MOV ADDR,ADDR1 。
开始行位置
MOV R7,N1 。
显示数量
DHZ1: MOV A,ADDR
ORL A,#80H 。
送显示地址
LCALL COMMAND_GLCD 。
调写命令子程序
DHZ2: CLR A
MOVC A,@A+DPTR 。
查找汉字地高位码
INC DPTR
LCALL WRITE_GLCD 。
送显示
CLR A
MOVC A,@A+DPTR 。
查找汉字地低位码
INC DPTR
LCALL WRITE_GLCD 。
送显示
DJNZ R7,DHZ2
RET。
--------------------------------------------------------------。
点阵式 LCD(128X64)模块显示实验。
---------LCD 初始化工作------ --------------------------------
INITIAL_GLCD:
MOV A,#30H 。
功能设定0 0 1 DL 0 RE 0 0
LCALL COMMAND_GLCD 。
DL=0/1(4/8位数据),RE=0/1(基本/扩充指令)
MOV A,#30H 。
功能设定
LCALL COMMAND_GLCD
MOV A,#30H
LCALL COMMAND_GLCD 。
S=0显示画面整体不移动
MOV A,#06H 。
游标不显示。
但是字会闪烁I/D=1光标向左移动地址-1
LCALL COMMAND_GLCD 。
0 0 0 0 0 1 I/D S I/D=0光标向右移动地址+1
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
MOV A,#0CH 。
显示状态00001DCB, D=0/1显示关/开
LCALL COMMAND_GLCD 。
C=0/1光标显示关/开,B=0/1光标位置字符不反白/反白 RET。
----检查LCD 忙碌标志--------------------------------------------
CHKBUSY_GLCD:
PUSH ACC
MOV DPTR,#R_B_GLCD 。
读标志地址
CHK: MOVX A,@DPTR
JB ACC.7,CHK 。
判别是不是忙?
POP ACC
RET。
------写命令到 GLCD----------------------------------------------
COMMAND_GLCD:
CLR EA
PUSH DPH
PUSH DPL
LCALL CHKBUSY_GLCD 。
判别是不是忙?
MOV DPTR,#W_C_GLCD
MOVX @DPTR,A 。
写入命令
POP DPL
POP DPH
SETB EA
RET。
-----写数据到 GLCD-----------------------------------------------
WRITE_GLCD:
CLR EA
PUSH DPH
PUSH DPL
LCALL CHKBUSY_GLCD 。
判别是不是忙?
MOV DPTR,#W_D_GLCD 。
写入数据
MOVX @DPTR,A
POP DPL
POP DPH
SETB EA
RET。
-----清除 LCD 地显示幕-------------------------------------------
CLEAR_GLCD:
MOV A,#01H 。
清除显示器
LCALL COMMAND_GLCD
RET。
********************************************************************。
功能:向SHT10写一字节数据或指令。
*******************************************************************/ SWRITE: MOV R4,#8
CLR SCK
SWRT: RLC A
MOV DAT,C
SETB SCK 。
时序脉冲
NOP
CLR SCK
NOP
DJNZ R4,SWRT
SETB DAT 。
释放数据线*/
SETB SCK 。
第9位作为响应位*/
NOP 。
检测响应情况,如果有响应,数据线就会被SHT10拉低
CLR SCK 。
返回1表示没响应
RET。
********************************************************************。
功能:从SHT10读取一字节数据。
说明:当ack=1时向SHT10发出一个响应位。
*******************************************************************/ SREAD: MOV R4,#8
SETB DAT 。
释放数据线
SRD: SETB SCK 。
连续读8位数据
MOV C,DAT
RLC A
CLR SCK
DJNZ R4,SRD。