Forpersonal use only in study and research; not for commercial use
2008自考毕业论文
环境温湿度实时测控装置设计
学生姓名:
自考专业:电子工程
指导老师:
准考证号:
2008年10月10日
摘要
单片机成了无处不在的商品,同时带来了社会的发展,使我们的生活越来越美好,在自动控制和电子测量中,单片机是它们发展的核心,而单靠单片机的理论远远是不够的,它要硬件和相关的软件相结合,才能做出完美的产品。温湿度指标是许多工作场合的重要参数,不论是仓库管理、图书保存还是工业测量与计量检定,都需要符合操作规定的温湿度环境条件。而温湿度也是最不易保障的指标,针对这一情况,研制可靠且实用的温湿度控制器显得非常重要。本文介绍的温湿度实时控制装置可在0~50℃和20%~98%rh(相对湿度)的范围内任意设定温湿度值,其附加的通信接口可方便地实现与计算机的实时通信,而且便于功能的扩展,可保证温度、湿度满足设计指标。此外,该装置还可自动控制多个设备的多点时间控制电路,因而具有更广泛的应用前景。
【关键字】:AT89c51、DS18B20、湿度传感器
目 录
摘
要···········································1
第 | 一 | 章 | 概 |
况······································2
1.1 | 设 | 计 | 的 | 依 |
据···········································2
1.2功能及应用···········································2
第 | 二 | 章 | 硬 |
件·······································3
2.1 | 51 系 | 列 | 单 | 片 | 机 | 的 | 概 |
述·····························3
2.2 | 80c51 系 | 列 | 单 | 片 |
机·········································5
2.3 | DS18B20 的 | 用 |
法········································6
2.4 检 | 测 | 电 |
路············································10
第 | 三 | 章 | 软 |
件······································11
3.1 定 | 时 | 及 | 控 | 制 | 电 |
路·······································11
3.2 主 | 程 | 序 | 设 |
计·····································12
3.3 子 | 程 | 序 | 设 |
计·····································18
结 束
语·········································27
附
录·········································28
单片机构成的环境温湿度实时测控装置设计
前 言
1970年微处理器研制成功之后,随着就出现了单片机(即单片的微型计算机)。1971年美国Intel公司生产的4位单片机4004和1972年生产的雏型8位单片机8008,特别是1976年9月Intel公司的MCS-48单片机问世以来,在短短的十几年间,经历了多次更新换代,其发展速度大约每二、三年要更新一代、集成度增加一倍、功能翻一番。发展速度之快、应用范围之广已达到了惊人的地步。单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴
1.在智能仪器仪表上的应用
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化且功能比采用电子或数字电路更加强大。例如精密的测量设备(功率计,示波器,各种分析仪)。
2.在工业控制中的应用
用单片机可以构成形式多样的控制系统,数据采集系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统与计算机联网构成二级控制系统。
3.在家用电器中的应用
可以这样说,现在的家用电器基本上都采用了单片机控制,从电饭褒、洗衣机、电冰箱、空调、彩电、其他音响视频器材、再到电子秤量设备,五花八门,无所不在。
4.在计算机网络和通信领域中的应用
现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。
5.单片机在医用设备领域中的应用
单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。此外,单片机在工商,金融,科研、教育,国防航空航天等领域都有着十分广泛的用途。
第一章方案
1.1开发的依据
本课程开发的意义在于它的硬件成本低,他们之间的相互转换功能相当的简单,通信接口可方便地实现与计算机的实时通信,而且便于功能的扩展,可保证温度、湿度满足设计指标。此外,该装置还可自动控制多个设备的多点时间控制电路,对于我们来说它值得我们去开发。
1.2功能及应用
本文介绍的温湿度实时控制装置可在0~50℃和20%~98%rh(相对湿度)的范围内任意设定温湿度值。它的应用十分的广泛:仓库管理、图书保存还是工业测量与计量检定,都需要符合操作规定的温湿度环境条件。
●可以实时监测环境温湿度的变化情况,并记录、存储相关数据;
●对环境温湿度的控制可满足设计指标;
●具有多点定时设备控制电路,便于功能扩展;
●设有语音提示功能,可方便地实现仪器操作和工作管理提示;
●配有通信接口,可方便地与计算机进行通信;
●温湿度控制的精度分别为:温度(0~50℃)±0.5℃;湿度(20%~98%rh)±2%~3%rh。
第二章硬件
2.1单片机概述
自单片机出现至今,单片机技术已走过了近20年的发展路程。纵观20年来单片机发展历程可以看出,单片机技术的发展以微处理器(MPU)技术及超大规模集成电路技术的发展为先导,以广泛的应用领域为前提,表现出较微处理器更具个性的发展趋势。
单片机长寿命,这里所说的长寿命,一方面指用单片机开发的产品可以稳定可靠地工作十年、二十年;另一方面是指与微处理器相比的长寿命。随着半导体技术的飞速发展,MPU更新换代的速度越来越快,以386、486、586为代表的
MPU,很短的时间内就被淘汰出局,而传统的单片机如68HC05、8051等年龄已有15岁,产量仍是上升的。这一方面是由于其对相应应用领域的适应性,另一方面是由于以该类CPU为核心,集成以更多I/O功能模块的新单片机系列层出不穷。可以预见,一些成功上市的相对年轻的CPU核心,也会随着I/O功能模块的不断丰富,有着相当长的生存周期。新的CPU类型的加盟,使单片机队伍不断壮大,给用户带来了更多的选择余地。
8位、16位、32位单片机共同发展。这是当前单片机技术发展的另一动向。长期以来,单片机技术的发展是以8位机为主的。随着移动通讯、网络技术、多媒体技术等高科技产品进入家庭,32位单片机应用得到了长足发展。以Motorola68K为CPU的32位单片机97年的销售量达8千万枚。过去认为由于8位单片机功能越来越强,32位机越来越便宜,使16位单片机生存空间有限,而16位单片机的发展无论从品种和产量方面,近年来都有较大幅度的增长。单片机速度越来越快MPU发展中表现出来的速度越来越快是以时钟频率越来越高为标志的。而单片机则有所不同,为提高单片机抗干扰能力,降低噪声,降低时钟频率而不牺牲运算速度是单片机技术发展之追求。一些8051(如图1)。
单片机兼容厂商改善了单片机的内部时序,在不提高时钟频率的条件下,使运算速度提高了很多,Motorola单片机则使用了琐相环技术或内部倍频技术使内部总线速度大大高于时钟产生器的频率。68HC08单片机使用4.9M外部振荡器而内部时钟达32M,而M68K系列32位单片机使用32K的外部振荡器频率内部时钟可达16MHz以上。低电压与低功耗自80年代中期以来,NMOS工艺单片机逐渐被CMOS工艺代替,功耗得以大幅度下降,随着超大规模集成电路技术由3μm工艺发展到1.5、1.2、0.8、0.5、0.35近而实现0.2μm工艺,全静态设计使时钟频率从直流到数十兆任选,都使功耗不断下降。
Motorola最近推出任选的M.CORE可在1.8V电压下以50M/48MIPS全速工作,功率约为20mW。几乎所有的单片机都有Wait、Stop等省电运行方式。允许使用的电源电压范围也越来越宽。一般单片机都能在3到6V范围内工作,对电池供电的单片机不再需要对电源采取稳压措施。低电压供电的单片机电源下限已由2.7V降至2.2V、1.8V。0.9V供电的单片机已经问世。
图(1)
低噪声与高可靠性技术为提高单片机系统的抗电磁干扰能力,使产品能适应恶
劣的工作环境,满足电磁兼容性方面更高标准的要求,单片机商家在单片机内部电路中采取了一些新的技术措施。如美国国家半导体NS的COP8单片机内部增加了抗EMI电路,增强了“看门狗”的性能。Motorola也推出了低噪声的LN系列单片机。OTP与掩膜OTP是一次性写入的单片机。过去认为一个单片机产品的成熟是以投产掩膜型单片机为标志的。由于掩膜需要一定的生产周期,而OTP型单片机价格不断下降,使得近年来直接使用OTP完成最终产品制造更为流行。它
较之掩膜具有生产周期短、风险小的特点。
近年来,OTP型单片机需量大幅度上扬,为适应这种需求许多单片机都采用了在片编程技术(InSystem Programming)。未编程的OTP芯片可采用裸片Bonding技术或表面贴技术,先焊在印刷板上,然后通过单片机上引出的编程线、串行数据、时钟线等对单片机编程。解决了批量写OTP芯片时容易出现的芯片与写入器接触不好的问题。使OTP的裸片得以广泛使用,降低了产品的成本。编程线与I/O线共用,不增加单片机的额外引脚。而一些生产厂商推出的单片机不再有掩膜型,全部为有ISP功能的OTP。MTP向OTP挑战MTP是可多次编程
的意思。一些单片机厂商以MTP的性能、OTP的价位推出他们的单片机,如ATMELAVR单片机,片内采用FLASH,可多次编程。华邦公司生产的与8051兼容的单片机也采用了MTP性能,OTP的价位。这些单片机都使用了ISP技术,等安装。
2.2 51系列单片机
单片机分为:51单片机, , , 。下面要讲的是51系列的单片机,MCS-51的原生产商是Intel公司。最早推出80C51芯片的。作为MCS-51的一部分,按原MCS-51芯片的规则命名。例如80C31、80C51、87C51和89C51,这样我们就可以很容易地认出80C51的系列芯片了。
最小系统:
2.3DS18B20的用法
这是关于DS18B20的读写程序,数据脚P2.2,晶振11.0592mhz;18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒;可以将检测到的温度直接显示到AT89C51的两个数码管上;显示温度00到99度,很准确无需校正!
ORG0000H;单片机内存分配申明!
TEMPER_LEQU 29H;用于保存读出温度的低8位
TEMPER_HEQU 28H;用于保存读出温度的高8位
FLAG1EQU 38H;是否检测到DS18B20标志位
a_bitequ 20h ;数码管个位数存放内存位置
b_bitequ 21h ;数码管十位数存放内存位置
MAIN:
LCALLGET_TEMPER;调用读温度子程序
;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
;显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数MOVA,29H
MOVC,40H;将28H中的最低位移入C
RRCA
MOVC,41H
RRCA
MOVC,42H
RRCA
MOVC,43H
RRCA
MOV29H,A
LCALLDISPLAY;调用数码管显示子程序
CPLP1.0
AJMPMAIN
;这是DS18B20复位初始化子程序
INIT_1820;
SETBP2.2
NOP
CLRP2.2
;主机发出延时537微秒的复位低脉冲
MOVR1,#3
TSR1:MOVR0,#107
DJNZR0,$
DJNZR1,TSR1
SETBP2.2;然后拉高线
NOP
NOP
NOP
MOVR0,#25H
TSR2:
JNBP2.2,TSR3;等待DS18B20回应
DJNZR0,TSR2
LJMPTSR4 ;延时
TSR3:
SETBFLAG1 :置标志位,表示DS1820存在
CLRP1.7;检查到DS18B20就点亮P1.7LED
LJMPTSR5
TSR4:
CLRFLAG1 ;清标志位,表示DS1820不存在
CLRP1.1
LJMPTSR7
TSR5:
MOVR0,#117
TSR6:
DJNZR0,TSR6;时序要求延时一段时间
TSR7:
SETBP2.2
RET
;读出转换后的温度值
GET_TEMPER:
SETBP2.2
LCALLINIT_1820;先复位DS18B20
JBFLAG1,TSS2
CLRP1.2
RET;判断DS1820是否存在;若DS18B20不存在则返回TSS2:
CLRP1.3;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!
MOVA,#0CCH;跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;发出温度转换
LCALLWRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750
微秒
LCALLDISPLAY
LCALLINIT_1820;准备读温度前先复位
MOVA,#0CCH ; 跳过ROM匹配
LCALLWRITE_1820
MOVA,#0BEH ; 发出读温度命令
LCALLWRITE_1820
LCALLREAD_18200; 将读出的温度数据保存到35H/36H
CLRP1.4
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOVR2,#8;一共8位数据
CLRC
WR1:
CLRP2.2
MOVR3,#5
DJNZR3,$
RRCA
MOVP2.2,C
MOVR3,#21
DJNZR3,$
SETBP2.2
NOP
DJNZR2,WR1
SETBP2.2
RET
READ_18200:; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据MOVR4,#2 ; 将温度高位和低位从DS18B20中读出
MOVR1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOVR2,#8;数据一共有8位
RE01:
CLRC
SETBP2.2
NOP
NOP
CLRP2.2
NOPNOP
NOP
SETBP2.2
MOVR3,#8
RE10:
DJNZR3,RE10
MOVC,P2.2
MOVR3,#21
RE20:
DJNZR3,RE20
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
;显示子程序
display:mov a,29H;将29H中的十六进制数转换成10进制movb,#10 ;10 进制/10=10进制
divab
movb_bit,a ;十位在a
mova_bit,b ;个位在b
movdptr,#numtab ;指定查表启始
movr0,#4
dpl1:mov r1,#250 ;显示1000次
dplop:mov a,a_bit ;取个位数
MOVCA,@A DPTR ;查个位数的7段代码
movp0,a ;送出个位的7段代码
clrp2.7 ;开个位显示
acalld1ms ;显示1ms
setbp2.7
mova,b_bit ;取十位数
MOVCA,@A DPTR ;查十位数的7段代码
movp0,a ;送出十位的7段代码
clrp2.6 ;开十位显示
acalld1ms ;显示1ms
setbp2.6
djnzr1,dplop ;100 次没完循环
djnzr0,dpl1 ;4 个100次没完循环
ret
;1MS延时
D1MS:MOV R7,#80
DJNZR7,$
RET
;实验板上的7段数码管0~9数字的共阴显示代码
numtab:DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
END
2.4检测电路
(1)温度检测电路
温度检测电路选用dallas公司生产的一线式数字温度传感器ds18b20作为温度检测器件,该器件只有3个引脚(即电源vdd、地线gnd、数据线dq),且不需要外部元件,而是共用一条数据线进行通信,使用一根i/o线通信时,ds18b20的电源电压是以寄生方式供电的,因此,只需将其vdd和gnd端接地即可。该电路的检测温度范围为-55~+125℃;精度为
0.5℃;用9bit数字量来表示温度;每次将温度转换成数字量需200ms。
笔者采用三块ds18b20来实现对实验室环境温度的检测,之所以用三块,是为了更好地保持温度的恒定。使用时可分别将这三块ds18b20放置在房间的不同位置。获得温度信息时,先由pic16c73的ra2脚发送一个1ms的复位脉冲,以使ds18b20复位后将向pic16c73发送一个回应脉冲,pic16c73接到回应脉冲后将发送读ds1820序列号的读rom命令,以分别读取三个ds18b20的序列号(每一块ds18b20有唯一的序列号);然后,pic16c73再发出定位命令以选择在线的ds18b20并进行温度转换。此时pic16c73的ra1脚应输出一个保持2s以上的高电平信号来使sk214导通,
从而提供ds18b20在总线供电下进行温度转换时所需的1ma电流。当温度转换完成后,pic16c73的ra2脚会发送ds18b20的存储命令,从而完成温度信息数据的转换和读取。
(2)湿度信号的获取采用电容式湿敏传感器作为湿度检测器件。环境湿度与传感器电容成线性关系,所以可方便地将湿度转换成pic16c73可以接受的电信号,本例中采用el7556来实现转换。el7556由积分电路、基准电路、频率转换电路及频率—电压(f/v)转换电路等组成,积分电路及r1、r2、c1用于产生一定频率的脉冲信号并从5脚送至8脚。调节r2可对该脉冲信号频率进行调整,从而使湿度传感器的线性和灵敏度处于较好状态;基准电路和频率转换电路可将湿度传感器的电容变化转换成频率变化,再经频率—电压转换电路后从9脚输出与频率成线性的电压,然后经c3等滤波后送入pic16c73的ra0端,再进行a/d转换以将其转换成数字信号。本例中的湿敏传感器为mxs型电容式湿敏传感器,湿度为76%rh时的电容值为500pf,电容相对变化率为+1.7pf/%。当湿度为0%~100%rh时,9脚输出的相应信号频率为0~1000hz,
精度为2%,f/v电路输出的电压为0~5v。调整时,可先设定湿度为5%rh,然后调节r2,使9脚输出100mv电压即可。
第三章 软 件
3.1定时及控制电路
定时主要用于提前预热仪器设备和定时语音提醒等,该功能的实现由单片机来完成。时钟频率选用32.768khz,该频率可使单片机工作在最小功耗状态并可简化分频、定时程序的编写。可选用看门狗电路来作为定时基准,看门狗每18ms复位一次可确保时钟的准确及语音电路的播放操作。
控制驱动电路用于保护仪器。各个电磁阀的导通要有一定的时间间隔,本例中为2分钟。推荐的工作方式为:6:00电磁阀1导通,接通稳压电源;6:02以后每间隔2分钟接通一个相应设备(应先启动感性及大功率设备)。这样,当8:00上班后即可保证有些需要预热1~2小时的仪器设备进入最佳工作状态,从而提高工作效率,保证计量检定的质量。电器驱动电路控制的设备主要包括空调机、吹风机、吸湿机、加湿机等,可分别采用过零型固态继电器来控制工作。为了便于扩展该装置的功能,系统应留有足够的扩展空间。因此,设计时可用pic16c73的ra3口作控制口,另外可外扩两片pcf8574以作备用。该系统最多可控制16个设备以满足不同需要。继电器采用交流固态继电器,其内部采用光电隔离方式,可有效地避免电磁干扰。当单片机检测到温湿度信号超过设定值时,将从ra3口发出控制信号,并通过光耦产生大于5ma的触发电流使固态继电器启动相应的电器工作,从而实现对相应设备的控制。设计时应注意各个电器不要同时启动以免冲击电网,这部分工作可由软件延时完成。固态继电器可选择国产的h220d15。
3.2主程序设计
主程序是控制和管理的核心,主要完成在系统上电后进行定时器和中断处理操作的初始化。初始化主要完成对温湿度的设定和检查除定时器t0外的所有中断禁止,同时断开各电器的电源。初始化完成后,系统将开始正常运行,并进行温湿度检测、键盘扫描及定时处理等操作。
下面是本文的主程序:
#include<reg51.h>
//#include<absacc.h>
#include<intrins.h>
sbitRS = P3^0;
sbitRW = P3^1;
sbitE = P3^2;
sbitPSB = P3^5; //串并口选择
sbitRES = P3^3;
bitRD1 ;
#defineFIRST_ADDR 0 //定义字符/汉字显示起始位置
Unsignedchar code logo[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x1F,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x06,0x00,0x00,0x30,0x00,0x00,0x37,0xF8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x00,0x01,0x20,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x06,0x00,0x02,0x60,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x06,0x00,0x16,0x40,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x00,0x24,0x00,0x3F,0x80,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x0F,0x00,0x64,0x01,0xFF,0xF0,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x1F,0x00,0x60,0x0F,0xFF,0xFC,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xBF,0xE0,0x60,0x3F,0xFF,0xFE,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x80,0x80,0xFF,0x00,0x3F,0x7F,0xFF,0xC0,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x7E,0x01,0x81,0xF8,0x00,0x0F,0x01,0xE0,0x00,0x00,0x00,0x00,0x01,0xE6,0x00,0x00,0x0E,0x03,0x43,0xEF,0xFC,0x0F,0x80,0xC0,0x00,0x00,0x00,0x00,0x03,0x7F,0x00,0x00,0x0E,0x03,0x07,0xCF,0xFE,0x0F,0x80,0xC0,0x00,0x00,0x00,0x00,0x06,0x19,0x80,0x00,0x0E,0x06,0x0F,0xBF,0xFE,0x0F,0x80,0xC0,0x00,0x3F,0x80,0x00,0x06,0x00,0xC0,0x60,0x0E,0x06,0x1F,0x3F,0xBE,0x0F,0x00,0xC0,0x00,0xFF,0xC0,0x00,0x04,0x00,0xC0,0x60,0x0E,0x0E,0x3C,0x7F,0x9E,0x0F,0x10,0xC0,0x81,0x80,0x60,0x01,0x84,0x00,0xC0,0x60,0x0E,0x0C,0x38,0xFF,0xFE,0x1E,0x10,0xC1,0x83,0x00,0x21,0xC6,0x8C,0x00,0x60,0x38,0x1E,0x18,0x70,0xFF,0xFE,0x3C,0x30,0xC3,0x0E,0x00,0x63,0x2C,0x8C,0xE0,0x30,0x7F,0x9E,0x18,0x71,
0xFF,0xFC,0x78,0x70,0xC3,0x18,0x00,0x62,0x29,0x8D,0xF8,0x18,0x3E,0xBF,0x18,0xE1,0xFF,0xFC,0xF0,0x7C,0xC2,0x10,0x01,0xC2,0x25,0xF9,0x1E,0x08,0x30,0x76,0x18,0xC1,0xFF,0xF1,0xE0,0xEC,0xC0,0x30,0x03,0x02,0x24,0xF9,0x03,0x8C,0x20,0x66,0x11,0xC0,0xFF,0xE7,0x80,0x82,0x60,0x10,0x02,0x06,0x64,0x19,0x00,0x84,0x20,0xC6,0x11,0x80,0xFF,0x9F,0x00,0x00,0xF0,0x19,0xC2,0x06,0x64,0x1F,0x10,0xCC,0x01,0xC4,0x09,0x80,0x7F,0x7C,0x00,0x00,0xF8,0x0F,0x63,0x06,0x2C,0x1E,0x38,0xC8,0x01,0x84,0x01,0x80,0x00,0xF8,0x0C,0x00,0xD8,0x00,0x23,0x06,0x38,0x12,0x01,0x98,0x01,0x04,0x01,0x80,0x07,0xE0,0x18,0x00,0xCC,0x00,0x31,0x03,0x19,0xF6,0x01,0xF0,0x00,0x04,0x01,0x98,0x7F,0x00,0x30,0x00,0x86,0x00,0x11,0x01,0x18,0x37,0x81,0x80,0x00,0x04,0x01,0xC7,0xFC,0x00,0xE0,0x00,0x87,0x00,0x19,0x81,0x98,0x1D,0x9F,0x00,0x00,0x04,0x01,0xC0,0x00,0x01,0x80,0x01,0x83,0x80,0x18,0xF0,0x98,0x18,0x03,0x00,0x03,0x04,0x00,0xE0,0x00,0x07,0x00,0x01,0x01,0xC0,0xF8,0xD8,0x98,0xA8,0x03,0x00,0x07,0x04,0x00,0xF0,0x00,0x1E,0x00,0x03,0x00,0xE0,0xC0,0x08,0x99,0xEF,0x3E,0x00,0x0E,0x04,0x00,0x7C,0x00,0x7C,0x00,0x06,0x00,0x60,0xC0,0x08,0x99,0x12,0x36,0x00,0x1C,0x04,0x00,0x3F,0xCF,0xF0,0x00,0x0C,0x00,0x30,0x40,0x0C,0x99,0x10,0x02,0x00,0x3C,0x04,0x00,0x0F,0xFF,0xC0,0x00,0x38,0x00,0x18,0x7F,0xF8,0xFF,0x18,0x06,0x00,0x3C,0x04,0x00,0x03,0xFF,0x00,0x00,0x60,0x00,0x00,0x3F,0xF0,0x66,0x1F,0xFC,0x00,0x3C,0x04,0x00,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x0C,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x0C,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x0C,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
//延时子程序
voiddelay(unsigned int t)
{ unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++)
;
}
//测忙
voidchk_busy()
{ RD1=1;
delay(5);
RS=0;
RW=1;
E=1;
while((P2&0x80)==0x80);
E=0;
RD1=0;
}
//读数据
unsignedchar lcdrd()
{ unsigned char i;
RD1=1;
P3=0xFB;
_nop_();
E=1;
delay(5);
i=P2;
_nop_();
E=0;
return i;
}
//写数据
voidlcdwd(unsigned char dispdata)
{ chk_busy();
RD1=1;
_nop_();
RS=1;
RW=0;
E=1;
P2=dispdata;
delay(5);
_nop_();
E=0;
_nop_();
P2=0xff;
}
//写指令代码
voidlcdwc(unsigned char cmdcode)
{ chk_busy();
RD1=1;
_nop_();
RS=0;
RW=0;
E=1;
P2=cmdcode;
delay(5);
_nop_();
E=0;
_nop_();
P2=0xff;
}
voidDisp_img(unsigned char *img) //图形方式12864显示字模221横向取膜
{
unsignedchar i,j;
unsignedint k = 0;
lcdwc(0x36); //图形方式
for(i=0;i<32;i++)
{
lcdwc(0x80+i);
lcdwc(0x80);
for(j=0;j<16;j++)
{
lcdwd(img[k++]); }
}
for(i=0;i<32;i++)
{
lcdwc(0x80+i);
lcdwc(0x88);
for(j=0;j<16;j++)
{
lcdwd(img[k++]); }}}
//初始化
voidlcdreset()
{ delay(2000);
lcdwc(0x30); //选择基本指令集
lcdwc(0x30); //选择8bit数据流
delay(5);
lcdwc(0x0c); //开显示(无游标、不反白)
delay(5);
lcdwc(0x01); //清除显示,并且设定地址指针为00H
delay(5);
lcdwc(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
}
voidhzkdis(unsigned char code *s)
{ while(*s>0)
{ lcdwd(*s);
s++;
delay(500);
}
}
voidhzklib()
{ lcdwc(0x80+FIRST_ADDR);
hzkdis("少小离家老大回");
lcdwc(0x90+FIRST_ADDR);
hzkdis("乡音无改鬓毛衰。");
lcdwc(0x88+FIRST_ADDR);
hzkdis("儿童相见不相识,");
lcdwc(0x98+FIRST_ADDR);
hzkdis("笑问客从何处来。");
}
//整屏显示
//当ii=0时显示上面128×32
//当ii=8时显示下面128×32
voidlcdfill(unsigned char disdata)
{ unsigned char x,y,ii;
for(ii=0;ii<9;ii+=8)
for(y=0;y<0x20;y++)
for(x=0;x<8;x++)
{ lcdwc(0x36);
lcdwc(y+0x80); //行地址 lcdwc(x+0x80+ii); //列地址 lcdwc(0x30);
lcdwd(disdata);
lcdwd(disdata);
}}
main()
{ RES=0;
_nop_();
RES=1;
while(1)
{ PSB=1 ;
RW=0;
lcdreset(); //初始化LCD屏 lcdwc(0x01);
delay(1000);
//lcdfill(0xff);
delay(6000);
//lcdfill(0);
lcdwc(0x01);
delay(1000);
hzklib();
delay(4000);
lcdwc(0x01);
delay(1000);
Disp_img(logo);//显示湘灵电子LOGO
delay(4000);}}
3.3子程序设计
温度传感器选用ds1820,其软件的编写相对简单,ds1820输入单片机
的信号为9位数字信号,它不需要进行转换。这里应注意的是,软件控制单片机
向ds1820发送的复位脉冲一定要大于1ms,否则软件将无法正常运行。
这主要与ds1820的写时间有关,在用软件进行写0之后和写1之前,必须
有800μs的低脉冲,写1后再写1也是如此,否则将出现数据写错误。
#include<reg51.h>
#include<intrins.h>
#define BUSY1 (DQ1==0)
sbit DQ1 = P0^4;
unsignedchar idata TMP;
unsignedchar idata TMP_d;
unsignedchar f;
voidwr_ds18_1(char dat);
unsignedchar rd_ds18_1();
/***************延时程序,单位us,大于10us*************/
voidtime_delay(unsigned char time)
{time=time-10;
time=time/6;
while(time!=0)time--;
}
/*****************************************************/
/* reset ds18b20 */
/*****************************************************/
voidds_reset_1(void)
{ unsigned char idata count=0;
DQ1=0;
time_delay(240);
time_delay(240);
DQ1=1;
return;
}
voidcheck_pre_1(void)
{ while(DQ1);
while(~DQ1);
time_delay(30);}
voidread_ROM(void)
{ int n;
ds_reset_1();
check_pre_1();
wr_ds18_1(0x33);
for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}
}/*****************************************************/
/* Read a bit from 1820 位读取 */
/*****************************************************/
bittmrbit_1(void)
{ idata char i=0;
bitdat;
DQ1=0;_nop_();
DQ1=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
dat= DQ1;
time_delay(50);
returndat;
}
/*****************************************************/
/* read a bety from ds18b20 字节读取 */
/*****************************************************/
unsignedchar rd_ds18_1()
{
unsignedchar idata i,j,dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit_1();
dat=(j<<(i-1))|dat;
}
returndat;
}
/*****************************************************/
/* write a bety from ds18b20 写字节 */
/****************************************************/
voidwr_ds18_1(char dat)
{
signedchar idata i=0;
unsignedchar idata j;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat& 0x01;
dat= dat>>1;
if(testb)
{
DQ1=0;
_nop_();
_nop_();
DQ1=1;
time_delay(60);}
else
{ DQ1=0;
time_delay(50);
DQ1=1;
_nop_();
_nop_();}}}
intget_temp_1(void)
{unsigned char idata a=0,b=0;
unsignedchar idata i;
EA=0;
ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);
ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);
a=rd_ds18_1();
b=rd_ds18_1();
i=b; /*若b为1则为负温 */
i=(i>>4);
if(i==0)
{ f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
if(a>8)
{ TMP=(TMP+1);}}
else{
f=1;
a=a>>4;
b=b<<4;
TMP=(a|b);
TMP=~TMP;
TMP=(TMP+1);
}
EA=1;
return(TMP);
}
intget_temp_d(void)
{ unsigned char idata a=0,b=0;
unsignedchar idata i,m;
EA=0;
ds_reset_1();//复位
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);
ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);
a=rd_ds18_1();
b=rd_ds18_1();
i=b; /*若b为1则为负温 */
i=(i>>4);
if(i==0)
{
f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
TMP_d=a;
}
else
{
f=1;
a=~a;
a=(a+1);
b=~b;
b=(b+1);
m=a;
a=a>>4;
b=b<<4;
TMP=(a|b);
m=(m&0x0f);
TMP_d=m;
}
EA=1;
return(TMP);
结 束 语
通过本次设计使我认识并了解了基本的设计开发过程,在这个过程中,我的老
师与同学们给了我很多的启示与帮助,而且我觉得对以前不了解的单片机知识有
了一个更高更深的认识。我相信我所学的知识在以后的工作学习中会起到很大的
作用。
参 考 文 献
1.李广弟,《单片机基础》。北京航空航天大学出版社,2001年7月。
2.鲍宏亚,《MCS-51系列单片机应用系统》。中国宇航出版社,2005年9月。
3.谷树忠,《Protel2004 实用教程》。电子工业出版社,2005年2月。
4.何桥,《单片机原理及应用》。中国铁道出版社,2008年1月。
附 录
KeilC51 的编程语言常用的有2种:一种是汇编语言;另一种是C语言。用汇
编语言写单片机程序时,精确时间延时是相对容易解决的。比如,用的晶振频率
为12MHz 的AT89C51,打算延时20μs,51单片机的指令周期是晶振频率的
1/12,即一个机器周期为1μs,其精度可以达到1μs。用这种方法可以非常方
便地实现512μs 以下时间的延时。如果需要更长的时间,可以使用两层或更多
层的嵌套,当然其精度误差会随着嵌套层的增加而成倍增加。
延时函数有下:
voiddelay1(unsigned char i) {
while(i);}
主函数:
voidmain() {
while(1){
delay1(i);
}
}
使用KeilC51 的反汇编功能,延时函数的汇编代码如下:
C:0x00E6AE07MOVR6,0x07
C:0x00E81FDECR7
C:0x00E9EEMOVA,R6
C:0x00EA70FAJNZC:00E6
C:0x00EC22RET
以下无正文
仅供个人用于学习、研究;不得用于商业用途。
Forpersonal use only in study and research; not for commercial use.
仅供个人用于学习、研究;不得用于商业用途。
Nurfür den persönlichen für Studien, Forschung, zu kommerziellenZwecken verwendet werden.
Pourl 'étude et la recherche uniquement à des fins personnelles; pas àdes fins commerciales.
仅供个人用于学习、研究;不得用于商业用途。
толькодля людей, которые используются дляобучения, исследований и не должныиспользоваться
вкоммерческих целях.