基于单片机的温度测量报警器+秒表--杨华碧1010401024_第1页
基于单片机的温度测量报警器+秒表--杨华碧1010401024_第2页
基于单片机的温度测量报警器+秒表--杨华碧1010401024_第3页
基于单片机的温度测量报警器+秒表--杨华碧1010401024_第4页
基于单片机的温度测量报警器+秒表--杨华碧1010401024_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、基于单片机的温度测量报警器+秒表作者:杨华碧摘 要温度是日常生活中不可缺少的物理量,温度在各个领域都有积极的意义。很多行业中以及日常生活中都有大量的用电加热设备,如用于加热处理的加热热水器,用于洗浴的电热水器及各种不同用途的温度箱等,采用单片机对它们进行检测具有检测方便、简单、灵活性大等特点,而且还可以大幅提高被控系统的性能,从而能被大大提高产品的质量。因此,智能化温度检测技术正被广泛地应用。本温度设计采用现在流行的STC89C52单片机为检测器,用DS18B20检测的方法,再配以其他电路对热水器的水温进行检测。关键词:STC89C52;DS18B20;绪论研究背景温度是人类生产生活中非常关键

2、的一项物理量,温度检测系统广泛应用于社会生活的各个领域 ,如家电、汽车、材料、电力电子等 。温度检测是工业生产过程中和日常生活中经常遇到的检测问题,人们需要对各种加热炉、热处理炉、家用热水器中温度进行监测。特别是在冶金 、化工、建材、食品、机械、石油等工业中,具有举足重轻的作用,因而设计一种较为理想的温度检测系统是非常有价值的。工业生产中温度检测具有单向性、时滞性、大惯性和时变性的特征,同时要实现温度检测的快速性和准确性,对于提高产品质量具有很重要的现实意义。对于不同场所、不同工艺、所需温度高低范围不同、精度不同,则采用的测温元件、测温方法也将不同;产品工艺不同、检测温度的精度不同、时效不同,

3、则对数据采集的精度和采用的检测算法也不同。因而,对温度的测量方法要多种多样。随着电子技术和微型计算机的迅速发展,微机测量和检测技术也得到了迅速的发展和广泛的应用。利用微机对温度进行测量的技术,也便随之而生,并得到日益发展和完善,越来越显示出其优越性。研究内容本设计的内容是温度检测系统,检测对象是空气的温度。温度检测在日常生活及工业领域应用相当广泛,比如电热水器,孵化器,发酵缸等场所的温度检测。这些场合都需要有一种能够比较精确快速实现所需温度的测量器。本文设计的目的就是实现一种可连续高精度调温的温度测量器。需要实现以下功能:(1)调节设置温度。(2)通过实际温度反馈快速准确的实现所需温度。(3)

4、在液晶屏幕中显示温度值。(4)超温报警。(5)检测温度的同时进行计时。1. 系统方案论证及设计1.1 系统方案设计对于空气温度测量系统来说方案有很多:如采用单片机检测、PLC检测、PC机检测等。利用单片机实现温度测量利用单片机实现空气气温的检测,系统主要包括现场温度采集、温度显示、报警装置和以单片机stc89c52作为微处理器。温度采集电路以数字形式将现场温度传至单片机,单片机结合现场温度与用户设定的目标温度,输送到lcd显示。1.2系统方案论证用单片机作为检测器,外围电路直接连接到单片机的检测方法具有灵活性高,易扩展的优势,并且现在的单片机一般都具有通信接口能够实现与外检测器通信,包括PC机

5、。单片机经过发展其可靠性已得到大家的认可,并且经济价格便宜,具有大规模应用的条件。更重要的是单片机体积小,能够直接放置在需要检测的装置中去,不用另外设计安装空间。1.3 系统方案实现本文选用单片机作为检测器,但要实现所需的温度检测的功能我们还需要另外的电子元器件组成电路,并发送和接受相应的电信号来组成一个完整的检测系统。所需的电路模块如图1-1所示:单片机数据显示电源超温报警晶振温度传感器被检测系统执行器图1-1 系统框图3. 硬件电路硬件合理选择和优化配置直接决定了空气温度检测系统的可靠性,以及检测效果的优劣,根据认真仔细的比较本文选用如下的硬件来实现系统要求的功能。3.STC89C52单片

6、机简介STC89C52是一个低电压,高性能单片机,带有4K字节的可反复擦写的程序存储器(PENROM)。和128字节的存取数据存储器(RAM),这种器件采用ATMEL公司的高密度、不容易丢失存储技术生产,并且能够与MCS-51系列的单片机兼容。片内含有8位中央处理器和闪烁存储单元,所以功能较强的STC89C52单片机能够提供一种安全可靠的检测方案,而被应用到检测领域中。STC89C52单片机的引脚如图3-1所示:图3-1 STC89C52STC89C52单片机主要功能部件包括中央处理器、片内数据存储器、片内程序存储器、震荡电路、电源与复位电路并行I/O接口、定时器/计数器、中断系统组成。简要介

7、绍一下本文用到的一些部件3.1.1 中央处理器中央处理器(CPU)是STC89C52单片机的核心部件,其字长为8位,主要由运算器和检测器等部件组成。运算器用于实现对操作数的算术逻辑运算和位操作。检测器是单片机的智慧检测部件,检测器的主要任务是识别指令,并根据指令的性质检测单片机各功能部件,从而保证单片机各部分能自动而协调地工作。3.1.2 片内数据存储器89c52单片机内部数据存储器容量仅为256B,与片外数据存储器空间(64K)相独立,采用8位地址码寻址。其中低地址空间的128B(007FH)供用户使用,可按规定规划为工作寄存区、堆栈区、位寻址数据存储器区和通用数据存储器区;高地址空间的12

8、8B(80FFH)为特殊功能寄存器(FSR),实际中只用到26B,其地址分布并不连续。3.1.3 片内程序存储区89C52单片机内部程序存储器容量为4KB,分布在整个64K程序存储器空间的低地址空间.3.1.4 振荡器和时序电路89C52单片机内部有震荡电路,只需外接石英晶体振荡器和频率微调电容即可产生024MHz震荡脉冲信号(震荡周期为单片机工作的最小时间单位),震荡脉冲经定时电路处理,产生CPU工作的各种时序信号。3.1.5 电源与复位89C52单片机采用DC5V供电工作电流为30mA左右,在掉电方式下,电流消耗可大大降低。89C52单片机需要外部电路提供上电或手动复位信号(高电平脉冲),

9、使单片机内各部件回到初始状态。3.1.6 并行I/O端口89C52单片机有四个8位并行I/O(输入/输出)端口,每个端口均是准双向口,助记符分别为P0、P1、P2、P3,通过32个引脚将各I/O端口线全部引出,与外部建立联络。外围电路的连接就主要通过这些I/O口实现与单片机的数据传输。3.1.7 定时/计数器在单片机实际应用中,往往需要精确的定时或对外部事件进行计数。89C52单片机内部设置的两个定时/计时器为此提供了便利。两个定时/计数器的助记符分别为T0、T1,可以设置为计数方式,实现对外部事件的计数;也可以设置为定时方式,实现精确定时。3.1.8 中断系统89C52单片机采用向量中断逻辑

10、,可以处理5个中断源的中断请求,并依据中断优先级安排进入相应的中断服务程序。5个中断源的中断向量为固定值,采用高低两级优先权队列和固定优先级相结合的管理模式。由于堆栈区容量限制,仅允许两级中断嵌套,即高优先权队列的中断请求可中断低优先权队列的中断服务,但同等优先权队列的高级别中断不能中断该队列中的低优先级中断服务。3.2 时钟电路时钟电路用于产生单片机工作时所必须的时钟检测信号。89C52单片机的内部电路在时钟信号检测下,严格地按照时序执行指令进行工作。单片机各功能部件的运行都是以时钟检测信号为基准工作的。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定运行。常用的

11、时钟电路设计有两种方式,一种是内部时钟方式,另一种为外部时钟方式。内部时钟方式受到的影响较少,能够提供更加稳定的信号,所以本文采用内部时钟方式。内部时钟方式的电路连接图3-2所示:图3-2 晶振硬件连接电路中的电容C1和C2典型值通常选择为30pF左右。对外接电容的值虽然没有严格的要求,但电容的大小会影响振荡器频率的高低、振荡器的稳定性和起振的快速性。晶振的震荡频率的范围通常是在1.2MHz12MHz之间。但时钟频率越高单片机的运行速度越快,但对电子器件的要求越高。考虑到所需的定时时间以及扩展和PC机的通信,本文选用11.0592MHz的频率3.3 单总线数字温度传感器DS18B20单线总线特

12、点单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。单总线通常要求外接一个约为 4.7K10K 的上拉电阻,这样,当总线闲置时其状态为高电平DS18B20的特点DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:     ( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。     (

13、2 )测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 + 125 ; 在 -10+ 85°C 范围内,精度为 ± 0.5°C 。  ( 3 )在使用中不需要任何外围元件。     ( 4 )持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。    ( 5 )供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。 ( 6 )测量参数可

14、配置 DS18B20 的测量分辨率可通过程序设定 912 位 ( 7 ) 负压特性 电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。( 8 )掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及报警温度的设定值。   DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。DS18B20内部结构如图所示, 主要由4部分组成:64 位ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的

15、,它可以看作 是该DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。64位ROM的排的循环冗余校验码(CRC=X8X5X41)。 ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。 DS18B20内部构成n DS18B20 内部结构主要由四部分组成: 64 位光刻 ROM 、温度传感器、非挥发的温度报警触发器 TH 和 TL 、配置寄存器。n      光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列码。 64 位光刻 ROM 的排列是

16、:开始 8 位(地址: 28H )是产品类型标号,接着的 48 位是该 DS18B20 自身的序列号,并且每个 DS18B20 的序列号都不相同,因此它可以看作是该 DS18B20 的地址序列码;最后 8 位则是前面 56 位的循环冗余校验码( CRC=X8+X5+X4+1 )。由于每一个 DS18B20 的 ROM 数据都各不相同,因此微控制器就可以通过单总线对多个 DS18B20 进行寻址,从而实现一根总线上挂接多个 DS18B20 的目的。3.8 报警电路当检测到实际温度大于设置温度32时,可认为空气温度过高,此时应发出报警信号,提醒人们注意。报警信号输出端定义为P2.4脚,连接电路如图

17、3-13所示:图3-13 报警电路(注意:图中的平1.2应为2.4)发声元件采用最常见的有源蜂鸣器,两端施加直流电压时就可以发声。三极管在电路中作用为开关器件。蜂鸣器本质是一个感性元件,其电流不能瞬变,因此必须有一个续留二极管提供续流,否则,在蜂鸣器两端会产生几十伏的尖峰电压,可能损坏驱动三极管,并干扰整个电路系统的其他部分。4. 软件结构和程序框图系统的软件由三大模块组成:主程序模块、功能实现模块和运算检测器模块4.1 主程序模块主程序的作用为循环调用各个子模块,通过调用各个子模块不断更新全局变量,然后各个子模块使用新的变量来实现检测的要求。4.2 功能实现模块功能实现模块按照各个检测单元实

18、现分别实现不同的功能,然后把个功能通过单片机联系起来组成一个完整的能较好实现预定功能的系统。4.2.3 温度采集子模块温度采集模块是用单片机采集ds18b20中的温度数字信号,然后保存在单片机中,作为检测的依据。由于ds18b20传输过来的为二进制信号,一位一位的传送到P3.4,所以要将其按权转化为单片机能够使用的十进制。d示。图4-4 读取温度流程图4.2.4 显示子模块显示子程序使用lcd示的方式,把设定温度和实际温度显示在lcd中.图4-5 显示流程图图4-7 定时器T1流程图结论本文通过对系统整体然后对每一个子模块的详细设计,我们得到了一个稳定可靠的空气温度检测系统。本系统能够准确地检

19、测空气温度到设定的温度,具有较好额调节功能。可能在实际工作中会出现或大或小的检测偏差。由于本文使用的检测器为89C52,而这种单片机具有串口通信的功能,如果对其加上串行总线就能和外部其他的检测器进行通信,比如将温度信号传递给PC机,从PC机设置设定温度等。而PC机能够连接到互联网,这就能组成一个远程的检测网络,从而组成物联网一样的检测网络。致 谢论文的设计过程中,我查阅了许多有关温度检测系统设计方面的文献资料,使我对温度检测的设计和使用有了更深的认识。从论文选题到完成论文,赖友源老师付出了大量的时间和心血,在设计过程中,赖友源老师从多方面进行指导。在此,我要由衷地感谢同时,我也要感谢给予我帮助

20、的同学,在不懂的环节为我努力探讨。报告的完成,不仅是我大学知识积累的体现,而且也是机械与电子工程学院所有老师悉心教导的结果,感谢他们让我掌握了一定的专业知识,专业技能和一些为人处世的道理。最要感激父母,是他们给我学习的机会,并且在学业期间给我大力支持和为我付出!参考文献1 张毅刚单片机原理及应用M高等教育出版社,20032 卢胜利单片机原理与应用技术实践M 机械工业出版社 ,20093 陈步月基于单片机的测试技术原理与应用M 机械工业出版社 ,20074 于海生微型计算机检测技术M第2版清华大学出版社,20095 胡寿松自动检测原理M第5版科学出版社,20096 陈夕松 汪木兰过程检测系统M科

21、学出版社,20097 王兆安 黄俊电力电子技术M第4版 机械工业出版社,20108 刘振全 杨世凤MATLAB语言与检测系统仿真M 化学工业出版社,20099 谭浩强C程序设计M第3版清华大学出版社,200510 赵景波PROTEL 99SE电路设计与制板M机械工业出版社,201011 李晓帆 姚根和高精度温度检测J怀化学院学报,2007 附录部分程序如下:文件1:/#include <at89x51.h>/用AT89C51时就用这个头文件#include <reg52.h>/用华邦W78E58B时必须用这个头文件#include <absacc.h>#in

22、clude <ctype.h>#include <math.h>#include <stdio.h>#include <string.h>#include <DS18B20.h>#include <lcd.c> /液晶显示头文件#include <lcd-1.c> /液晶显示头文件/sbit DQ = P34; /定义DQ引脚为P3.4unsigned char t2,*pt;/用来存放温度值,测温程序就是通过这个数组与主函数通信的unsigned char TempBuffer19=0x2b,0x31,0x3

23、2,0x32,0x2e,0x30,0x30,0x43,'0'/显示实时温度,上电时显示+125.00Cunsigned char TempBuffer017=0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'0'/显示温度上下限,上电时显示TH:+125 TL:+124Cunsigned char code dotcode4=0,25,50,75;/*因显示分辨率为0.25,但小数运算比较麻烦,故采用查表的方法*再将表值分离出十位和个位后送到十分位和百

24、分位*/void covert0( unsigned char TH, unsigned char TL)/将温度上下限转换为LCD显示的数据 if(TH>0x7F) /判断正负,如果为负温,将其转化为其绝对值 TempBuffer03=0x2d;/ /0x2d为"-"的ASCII码TH=TH;TH+; else TempBuffer03=0x2b;/0x2B为"+"的ASCII码 if(TL>0x7f) TempBuffer011=0x2d;/ /0x2d为"-"的ASCII码 TL=TL+1; else TempBuf

25、fer011=0x2b;/0x2B为"+"的ASCII码 TempBuffer04=TH/100+0x30; /分离出TH的百十个位 if( TempBuffer04=0x30) TempBuffer04=0xfe; /百位数消隐 TempBuffer05=(TH%100)/10+0x30;/分离出十位 TempBuffer06=(TH%100)%10+0x30; /分离出个位 TempBuffer012=TL/100+0x30; /分离出TL的百十个位 if( TempBuffer012=0x30) TempBuffer012=0xfe; /百位数消隐 TempBuffe

26、r013=(TL%100)/10+0x30;/分离出十位 TempBuffer014=(TL%100)%10+0x30; /分离出个位void covert1(void)/将温度转换为LCD显示的数据 unsigned char x=0x00,y=0x00; t0=*pt; pt+; t1=*pt; if(t1>0x07) /判断正负温度 TempBuffer10=0x2d; /0x2d为"-"的ASCII码t1=t1; /*下面几句把负数的补码*/t0=t0; /* 换算成绝对值*/x=t0+1; /*/t0=x; /*/if(x>255) /*/t1+; /

27、*/ else TempBuffer10=0x2b;/0xfe为变"+"的ASCII码 t1<<=4;/将高字节左移4位 t1=t1&0x70;/取出高字节的3个有效数字位 x=t0;/将t0暂存到X,因为取小数部分还要用到它 x>>=4;/右移4位 x=x&0x0f;/和前面两句就是取出t0的高四位 t1=t1|x;/将高低字节的有效值的整数部分拼成一个字节 TempBuffer11=t1/100+0x30; /+0x30 为变 09 ASCII码 if( TempBuffer11=0x30) TempBuffer11=0xfe;

28、/百位数消隐 TempBuffer12=(t1%100)/10+0x30;/分离出十位 TempBuffer13=(t1%100)%10+0x30; /分离出个位 t0=t0&0x0c;/取有效的两位小数 t0>>=2;/左移两位,以便查表 x=t0; y=dotcodex;/查表换算成实际的小数 TempBuffer15=y/10+0x30;/分离出十分位 TempBuffer16=y%10+0x30;/分离出百分位void delay(unsigned char i)while(i-);main() unsigned char TH=32,TL=0; /读取温度,温度值

29、存放在一个两个字节的数组中, unsigned intw,maini; /测温函数返回这个数组的头地址 T0init(); /定时器0初始化 while(1) spe=0; LCD_Initial();/lcd初始化/for(maini=0;maini<25;maini+) main_1();LCD_Initial(); pt=ReadTemperature(TH,TL,0x3f); /上限温度+110,下限-20,分辨率10位,也就是0.25Cdelay(100); /读取温度,温度值存放在一个两个字节的数组中, covert1(); /将温度转换为LCD显示的数据covert0(TH

30、,TL); /将温度上下限转换为LCD显示的数据 /第一个参数列号,第二个为行号,为0表示第一行/为1表示第二行,第三个参数为显示数据的首地址LCD_Print(1,1,TempBuffer0); /下一步扩展时可能通过这两个变量,调节上下限LCD_Print(1,0,TempBuffer1);for(w=0;w<999;w+) /*/ delay(400); /*/ /报警复位/ void timer0()interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;/定时50MSif(-timecount=0)timecount=20;

31、/执行20次后秒标志位置1timeflag=1; /1Sif(+timecount1>1)timecount1 = 0;bit_100ms = 1; /置100MS标志位文件2:/#include <at89x51.h>/用AT89C51时就用这个头文件#include <reg52.h>/用华邦W78E58B时必须用这个头文件sbit DQ = P34;/定义DQ引脚为P3.4 sbit spe=P24;/sbit spe=P37;/*ds18b20延迟子函数(晶振12MHz )*/ /*DS18B20对时间要求很严,但只能长不能短*在11.0592M下也行,因

32、为时间长些*/*6u秒*/void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ u

33、nsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-) DQ = 0; / 给脉冲信号 dat>>=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat);/*ds18b20写一个字节*/ void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i>0; i-) DQ = 0; DQ = dat&0

34、x01; delay_18B20(5); DQ = 1; dat>>=1; /*读取ds18b20当前温度*/unsigned char *ReadTemperature(char TH,char TL,unsigned char RS)unsigned char tt2;Init_DS18B20(); /初始化/WriteOneChar(0xCC); / 跳过读序号列号的操作/WriteOneChar(0x4E); /写入"写暂存器"命令,修改TH和TL和分辩率配置寄存器 /先写TH,再写TL,最后写配置寄存器/WriteOneChar(TH);/写入想设定的

35、温度报警上限/WriteOneChar(TL);/写入想设定的温度报警下限/WriteOneChar(RS);/写配置寄存器,格式为0 R1 R0 1,1 1 1 1/R1R0=00分辨率娄9位,R1R0=11分辨率为12位/delay_18B20(80); / this message is wery important/Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作/WriteOneChar(0x44); / 启动温度转换/delay_18B20(80); / this message is wery importantInit_DS18B2

36、0();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(80);tt0=ReadOneChar(); /读取温度值低位tt1=ReadOneChar(); /读取温度值高位if(tt1>0x01) spe=1; /报警/return(tt);文件3:#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code wlcome16=" Hua

37、Bi"/定义第一行显示数组uchar lcdtimer16=" 00 : 00 : 00.0"/定义第二行显示数组uchar timecount; /时间计数寄存器uchar timecount1;bit timeflag;/时间标志位bitbit_100ms;sbit e=P22;sbit rw=P21;sbit rs=P20;/-/延时函数,晶振为12MHZ,延时约为40US*dell/-void delay1(uint del1)uchar del2;for(;del1>0;del1-)for(del2=10;del2>0;del2-);/-/液

38、晶1602显示判忙函数/-void busy()uchar temp;temp=0x00;rs=0;/指令rw=1;/读BF值while(temp&0x80)=0x80)/如果BF值为1:P1=0xff;e=1;/允许读写temp=P1;/读取P1状态e=0;/禁止读写/-/向液晶显示器写命令函数/-void WR_com(uchar temp)busy();/调用判忙函数rs=0;/指令rw=0;/写P1=temp;/把指令写入RAMe=1;/允许读写e=0;/禁止读写/-/向液晶显示器写数据函数/-void WR_data(uchar num)busy();/调用判忙函数rs=1;

39、/数据rw=0;/写P1=num;/把数据写入RAMe=1;/允许读写e=0;/禁止读写/-/写显示数据函数(首地址:第一行还是/ 第二行?,待显示数组首地址)/-void disp_lcd(uchar addr,uchar *temp1)uchar i;WR_com(addr);/设置DDRAM地址delay1(100);for(i=0;i<16;i+)WR_data(temp1i);/写入要显示的数据delay1(100);/-/液晶显示器初始化函数/-void lcd_ini()char i;for(i=3;i>0;i-)P1=0x30;/8位数据接口rs=0;/指令rw=0

40、;/读e=1;/禁止读写e=0;/允许读写delay1(100);P1=0x38;/两行显示rs=0;/指令rw=0;/写e=1;/允许读写e=0;/禁止读写delay1(100);/-/液晶显示器复位函数/-void lcd_reset()WR_com(0x01);/清屏delay1(100);WR_com(0x06);/数据读、写后,AC加1delay1(100);WR_com(0x0c);/显示开delay1(100);/-/定时器初始化函数/-void T0init()TMOD=0x01;/设置定时器0方式1TH0=(65536-50000)/256;TL0=(65536-50000)

41、%256;/装初值TR0=1;/启动计数IE=0x82;/开总中断,开定时器0中断timeflag=0;timecount=20;/-/清零时间函数/-void clear() /ASK码48对应数字0lcdtimer15 = lcdtimer13 = lcdtimer12 = 48; lcdtimer8 = lcdtimer7 = lcdtimer3 = lcdtimer2 = 48;/-void main_1()/lcd_ini();/初始化/lcd_reset();/复位disp_lcd(0x80,wlcome);/第一行显示WLCOME数组disp_lcd(0xc0,lcdtimer)

42、;/第二行显示时间if(bit_100ms = 1)/秒小数位bit_100ms = 0;if(+lcdtimer15>57)lcdtimer15 = 48;if(timeflag=1) /判断1S标志位timeflag=0; /清零秒标志位if(+lcdtimer13>57) /秒个位+1,是否大于9?(ASK码48-57)对应数字0-9)lcdtimer13 = 48; /清零秒个位if(+lcdtimer12>53) /秒十位+1,大于6?(48+6=53)lcdtimer12 = 48;/清零秒十位if(+lcdtimer8>57) /分个位+1,个位>9

43、?lcdtimer8 = 48;/分个位清零if(+lcdtimer7>53)/分十位+1,大于6?lcdtimer7 = 48; /分十位清零if(+lcdtimer3>57)/小时个位+1,大于9?lcdtimer3 = 48; /清零时个位if(+lcdtimer2>53)/小时十位+1,大于6?lcdtimer2 = 48; /小时十位清零disp_lcd(0xc0,lcdtimer);/第二行显示更新/-/定时器0中断服务函数/-文件4:/#include <at89x51.h>/用AT89C51时就用这个头文件#include <reg52.h&

44、gt;/用华邦W78E58B时必须用这个头文件#include <intrins.h>#include <time.h>/注意那个LCD_Wait()函数,它是判"忙"标志的,在实际硬件要把注掉的那种打开/Port Definitions*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x90;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论