多路温湿度巡检仪设计与制作实训报告

多路温湿度巡检仪的设计

与制作

院系:能源与电气工程学院

班级:xxxx

姓名:xxx

学号:xxxx

日期:20##xx

  

前言        …………………………………………………………………………3

 第一章  设计任务 ..................................................4                           

 1.1设计题目........................................................4

 1.2设计目的........................................................4

 1.3设计任务........................................................4

第二章多路温湿度巡检仪……………………………………………5

2.1项目内容和要求…………………………………………………………………5

2.2绘制电路原理图………………………………………………6

2.3绘制印制电路板图………………………………………………7

第三章  相关知识简介………………………………………………9

3.1 AT89C51单片机………………………………………………………………9

3.2 AHT11温湿度传感器………………………………………………10

3.3 A\D TLC1543转换芯片……………………………………………………….13

3.4 LM358集成运放………………………………………………………………16

第四章程序设计与调试…………………………………17

4.1 控制要求………………………………………………………………………17

4.2 技术参数………………………………………………………………………18

4.3 程序设计………………………………………………………………………18

4.4 调试………………………………………………………………………23

4.5  系统功能及其操作说明-……………………………………………………23

4.6   试记录及调试结果-………………………………………………………24

总结………………………………………………………………………………26

致谢………………………………………………………………………………27

参考文献………………………………………………………………………28

   

本次实训是让学生了解小型单片机应用系统设计组成,掌握单片机定时器、中断、显示、键盘等单片机基本功能与典型接口应用,并能熟练地应用单片机仿真系统调试程序,使学生对单片机应用系统设计程序有一个基本了解,同时在实训环节中综合电路基础知识、查询资料、技术文件的编写等多项能力的训练,从而使学生体验一次完整的产品设计制作全过程,积累初步的职业素养。

学生可以从选择总体方案设计元器件入手,绘制电路原理图和印制电路板图,这些掌握后进行焊接工作,继而调试,总体而言就是这个流程,学生由浅入深,逐步学习,加强能力培养。

第一章   设计任务

1.1设计题目

多路温度巡检仪

1.2设计目的

通过小型微机应用产品的设计与调试过程,运用《微机原理及接口技术》课程所学的基本知识,在设计中加以应用,进而得到理解、巩固和提高,通过实践的过程学习与掌握分析与解决实际问题的方法与手段,提高设计、编程与调试的实际动手能力,作为工程技术工作的一次基本训练。

1.3设计任务

设计一个以单片机为核心的多路温度巡回检测显示仪表系统。通过多选一电子模拟开关及A/D转换器巡回采集各路温度传感及变送器的数据,进行信号处理及标度变换,以一定的节拍时间依序显示各检测回路的序号及温度值,并可通过按钮开关操控作冻结或切换显示,在单片机实验板台上模拟调试实现。

(一)基本设计要求

(1)、开机单片机实验板上的8位数码管、LED灯、蜂鸣器等设备进行自检自检。

(2)、八位LED 7段数码管显示当前检测回路的序号、温度值及温度单位“oC”或其他界面信息,温度显示单位为oC,保留一位小数。

(3)、八路温度按节拍巡回检测显示,温度测量范围-50.0°C~+50.0°C。

(4)、设选用的温度传感变送器将检测的-50°C~+50°C温度变换为0~5V电压信号,综合误差为±0.5°C。

(5)、应采取数字滤波技术提高测量的稳定性采用每一路的AD信号采集4次滚动存放保存的4次的温度值都是最新的温度值然后对这4次的温度值求平均值。

(6)、设置一个“冻结”按钮开关以操控进入与退出当前回路的冻结显示方式,冻结显示期间每0.5S更新一次温度值,冻结的时候只是路数不再改变只是显示当前路的温度值。

(7)、设置一个“切换”按钮开关以操控强行切换显示下一检测回路号及温度值。

(8)、对开关量输入进行软件消抖动处理比如冻结的按键进行键盘消抖动处理。

(二)    扩展功能(选做)

(1)、键盘设定巡回节拍范围为0.5S~5.0 S,设定过程为按下功能键F后在选择一个操作的数值比如F1,先返回当前的节拍值,再进行按照数字键进行设定节拍在这个状态下按下S键保存新的节拍值且保持此节拍值1S后返回到巡显的状态,按下C键的时候直接返回到巡显状态。

(2)、F键按下无操作时间超过10分钟后自动恢复为基本的温度巡显方式。

(3)、超上限告警功能,键盘设定温度上限值范围为-50 .0°C~+50.0°C,监测到某回路温度超上限时有相应的显示闪烁提示、LED指示、讯响告警及继电器触点输出控制功能。

(4)、实现带有回差的超上限告警功能,通过键盘设定回差值的范围为±0 .1°C~±5.0°C。

(5)、增加温度超下限告警处理功能。

(6)、每巡回显示一遍,穿插一个节拍显示实时钟,通过键盘设定时间。

(7)、其他功能扩展。

第二章多路温湿度巡检仪

 2.1项目内容和要求

主要项目任务有:

(1)根据项目技术要求,设计总体系统方案;

(2)根据方案选择传感器、处理器、相关芯片、继电器、电机等部件;

(3)使用AUTOCAD/PROTEL软件绘制控制系统电路原理图、印刷板图;

(4)焊接印刷电路板,调试线路;

(5)编写、调试应用程序。

功能块图

2.2绘制电路原理图

2.3绘制

2.3印制电路板图

第三章    相关知识简介

3.1 AT89C51单片机

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示

a:主要特性:
·与MCS-51 兼容

·4K字节可编程闪烁存储器
·寿命:1000写/擦循环
·数据保留时间:10年
·全静态工作:0Hz-24MHz

·三级程序存储器锁定
·128×8位内部RAM
·32可编程I/O线
·两个16位定时器/计数器
·5个中断源
·可编程串行通道
·低功耗的闲置和掉电模式
·片内振荡器和时钟电路

b;管脚说明:
VCC:供电电压。
GND:接地。
  P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
    P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
   P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
 P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
 P3口管脚 备选功能
 P3.0 RXD(串行输入口)
 P3.1 TXD(串行输出口)
 P3.2 /INT0(外部中断0)
 P3.3 /INT1(外部中断1)
 P3.4 T0(记时器0外部输入)
 P3.5 T1(记时器1外部输入)
 P3.6 /WR(外部数据存储器写选通)
 P3.7 /RD(外部数据存储器读选通)
 P3口同时为闪烁编程和编程校验接收一些控制信号。
 RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间

3.2 AHT11温湿度传感器

1.电气参数

供电电压(Vin):DC 4.5-6

消耗电流:      约2mA(MAX 3mA)

使用温度范围:0-50℃;

使用湿度范围:95%RH(非凝露);

检测湿度范围:20%RH-90%RH;

湿度检测精度:±5%RH(0-50℃,30%-80%RH);

标准湿度输出电压,根据其输出电压可以直接查表得出相应的湿度,0-50℃温度补偿,单片机校准线性输出,输出阻抗:1K以上。

2.使用注意事项

(1)        避免结露情况下使用。

(2)        推荐保存条件 :温度范围          10℃~40℃

                           湿度范围          60%RH以下

3.标准检测条件

大气中、温度25℃、供给电压5.0V DC作为基准。

特性测定,测定前先把温湿度模块放入25℃/0%RH的干燥空气中放置30分钟,湿度发生装置发生湿度60%RH,放入温湿度模块15分钟后测出电压值。

    《测定装置》

                    分流式湿度发生装置:SHR-1型

                   测定用表

         :福禄克45

3.3 A\D TLC1543转换芯片

TLC1543是美国TI公司生产的多通道、低价格的模数转换器。采用串行通信接口,具有输入通道多、性价比高、易于和单片机接口的特点,可广 泛应用于各种数据采集系统。 TLC1543为20脚DIP封装的CMOS 10位开关电容逐次A/D逼近模数转换器,引脚排列如图1所示。其中A0~A10(1~9、11、12 脚)为11个模拟输入端,REF+(14脚,通常为VCC)和REF-(13脚,通常为地)为基准电压正负端,CS(15脚)为片选端,在CS端的一个下降沿变化将 复位内部计数器并控制和使能ADDRESS、I/O CLOCK(18脚)和DATA OUT(16 脚)。ADDRESS(17脚)为串行数据输入端,是一个4位的串行地址用来选择 下一个即将被转换的模拟输入或测试电压。DATA OUT 为A/D转换结束3态串行输出端,它与微处理器或外围的串行口通信,可对数据长度和格式灵活编 程。I/O CLOCK为数据输入/输出提供同步时钟,系统时钟由片内产生。芯片 内部有一个14通道多路选择器,可选择11个模拟输入通道或3个内部自测电 压中的任意一个进行测试。片内设有采样-保持电路,在转换结束时,EOC(19 脚)输出端变高表明转换完成。内部转换器具有高速(10μS转换时间),高 精度(10位分辨率,最大±1LSB不可调整误差)和低噪声的特点。

TLC1543是CMOS、10位开关电容逐次逼近模数转换器。这些器件有三个输入端和一个三态输出端(片选CS、输入/输出I/O CLOCK、地址输入ADDRESS和数据输出DATA OUT)这样就和主处理器的串行口有一个直接的4线接口。可以进行高速的数据传输。
    除了进行高速的数据转换和通用的控制能力外,该器件有一个片内的14通道多路器,可以选择11个输入中的任意一个或3个内部自测试(self-test)电压中的一个。采样和保持是自动的。在转换结束时,“转换结束”(EOC)输出端变高以指示转换的完成。器件中的转换器结合外部输入的差分高阻抗的基准电压,具有简化比率转换、刻度以及模拟电路与逻辑电路和电源噪声隔离的特点。开关电容的设计可以使在整个温度范围内有较小的转换误差。

1. TLC1543的工作时序 

其工作过程分为两个周期:访问周期和采样周期。工作状态由CS使能或禁止,工作时CS必须 置低电平。CS为高电平时,I/O CLOCK、ADDRESS被禁止,同时DATA OUT为高 阻状态。当CPU使CS变低时,TLC1543开始数据转换,I/O CLOCK、ADDRESS使能,DATA OUT脱离高阻状态。随后,CPU向ADDRESS端提供4位通道地址,控 制14个模拟通道选择器从11个外部模拟输入和3个内部自测电压中选通1路送 到采样保持电路。同时,I/O CLOCK端输入时钟时序,CPU从DATA OUT 端接收前一次A/D转换结果。I/O CLOCK从CPU  接受10个时钟长度的时钟序列。前4个时钟用4位地址从ADDRESS端装载地址寄存器,选择所需的模拟通道,后6个时钟对模拟输入的采样提供控制时序。模拟输入的采样起始于第4个I/OCLOCK的下降沿,而采样一直持续6个I/O CLOCK周期,并一直保持到第10个I/O CLOCK的下降沿。转换过程中,CS的下降沿使DATA OUT引脚脱离高阻状态并 起动一次I/O CLOCK的工作过程。CS的上升沿终止这个过程并在规定的延迟 时间内使DATA OUT引脚返回到高阻状态,经过两个系统时钟周期后禁止I/O CLOCK和ADDRESS端。

2.软硬件设计要点

TLC1543的三个控制输入端CS、I/O CLOCK、ADDRESS 和一个数据输出端DATA OUT遵循串行外设接口SPI协议,要求微处理器具有 SPI接口。但大多数单片机均未内置SPI接口(如目前国内广泛采用的MCS51 和PIC系列单片机),需通过软件模拟SPI协议以便和TLC1543接口。TLC1543 芯片的三个输入端和一个输出端与51系列单片机的I/O口可直接连接。

软件设计中,应注意区分TLC1543的11个模拟输入通道和3个内部测试 电压地 址。 附 表为 模拟 通道和 内部 电压测 试地 址。程 序 软件 编 写 应 注 意 TLC1543通道地址必须为写入字节的高四位,而CPU读入的数据是芯片上次A/D转换完成的数据。                          

TLC154389C51接口程序:  TLC1543与89C51接口程序应完全依照TLC1543的工作时序编写,主要由CONVETER 子程序组成。由于转换完成的数据为10位,软件编写时将数据的高位字节存放在2EH单元中,低位字节存放在2FH单元中。其中R4、R3寄存器分别存放TLC1543的通道地址和数量;R1、R2寄存器存放A/D转换结果。本例程序中89C51晶振为11.0592MHz.

3.4 LM358集成运放

LM358 内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。

LM358 的封装形式有塑封8引线双列直插式和贴片式。

特性

内部频率补偿

直流电压增益高(约100dB)

单位增益频带宽(约1MHz)

电源电压范围宽:单电源(3—30V);

双电源(±1.5 一±15V)

低功耗电流,适合于电池供电

低输入偏流

低输入失调电压和失调电流

共模输入电压范围宽,包括接地

差模输入电压范围宽,等于电源电压范围

输出电压摆幅大(0 至Vcc-1.5V)

LM358运用:红外线探测报警器

该报警器能探测人体发出的红外线,当人进入报警器的监视区域内,即可发出报警声,适用于家庭、办公室、仓库、实验室等比较重要场合防盗报警。

第四章  程序设计与调试

4.1 控制要求

多路温湿度巡检仪,该控制设备适用于仓库,温湿大棚等需保持一定的温湿度,模拟生态环境的场所。通过控制加温、降温、送风、加湿等电机的运转,使场所的温湿度控制在预先设定的范围内。

要求控制系统可同时检测控制4个点,2个温度、2个湿度数据。

4.2 技术参数

主要技术参数:

工作电源:+5V;

工作环境:温度0-80℃,湿度 RH 50-99%;

控制范围:温度 10-40℃(可调);湿度 RH 60-99%(可调);

控制精度:温度≤±1℃;湿度≤ RH ±10%;

控制方式:可通过键盘设置上下限预定值;

显示:采用数码管显示;

4.3 程序设计

#include<reg51.h>

#include<intrins.h>

#define uchar unsigned char

#define uint  unsigned int

uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,

                         0xf8,0x80,0x90,0x89,0xbf,0xc6};

sbit  EOC=P1^4;sbit  CLK=P1^5;sbit  ADDR=P1^6;sbit  CS=P1^7;sbit  SDO=P3^3;sbit  VOICE=P2^0;sbit  LED=P2^0;

float temp1,temp2,hum1,hum2;float higher_limit=28.0,lower_limit=25.0; uchar average_count;uint time_count; uint alarm_count; uchar flag_display; uchar flag_alarm;

void delay(uint i)

{while(i--);}

float read1543(uchar port)

{float ad;uint i,ad1;uchar al=0,ah=0;CS=1; CLK=0;CS=0;    port<<=4;

       for (i=0;i<4;i++)

       {ADDR=(bit)(port&0x80);CLK=1;delay(10);CLK=0;port<<=1;}

       for (i=0;i<6;i++)

       {CLK=1;CLK=0;}CS=1;

       _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

       _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

       _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();CS=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

for (i=0;i<2;i++)

{SDO=1;CLK=1;ah<<=1;if (SDO) ah|=0x01;CLK=0;}

for (i=0;i<8;i++)

{SDO=1;CLK=1;al<<=1;if (SDO) al|=0x01;CLK=0;}

CS=1;ad1=ah;ad1<<=8;ad1|=al;ad=(float)((float)5*(float)ad1/(float)1024);return(ad);}

void display(uchar i)

{uchar a,b,c,d;switch(i)

{case 0:

{a=(uint)temp1/1000;b=(uint)temp1%1000/100;c=(uint)temp1%1000%100/10;d=(uint)temp1%1000%100%10;P2=0x80;P0=dispcode[1];delay(300);P2=0x00;P2=0x40;P0=dispcode[11];delay(300);P2=0x00;P2=0x20;

P0=dispcode[a];delay(300);P2=0x00;P2=0x10;P0=dispcode[b]&0x7f;delay(300);P2=0x00;P2=0x08;P0=dispcode[c];delay(300);P2=0x00;P2=0x04;P0=dispcode[d];delay(300);P2=0x00;P2=0x02;P0=dispcode[12];delay(300);P2=0x00;       }break;case 1:{

a=(uint)hum1/1000;b=(uint)hum1%1000/100;c=(uint)hum1%1000%100/10;d=(uint)hum1%1000%100%10;P2=0x80;P0=dispcode[1];delay(300);

P2=0x00;P2=0x40;P0=dispcode[11];delay(300);P2=0x00;P2=0x20;

P0=dispcode[a];delay(300);P2=0x00;P2=0x10;P0=dispcode[b]&0x7f;

delay(300);P2=0x00;P2=0x08;P0=dispcode[c];delay(300);P2=0x00;

P2=0x04;P0=dispcode[d];delay(300);P2=0xff;P2=0x02;P0=dispcode[10];delay(300);P2=0x00; }break;case 2:

{a=(uint)temp2/1000;b=(uint)temp2%1000/100;c=(uint)temp2%1000%100/10;d=(uint)temp2%1000%100%10;P2=0x80;P0=dispcode[2];delay(300);P2=0x00;P2=0x40;P0=dispcode[11];delay(300);P2=0x00;P2=0x20;P0=dispcode[a];delay(300);P2=0x00;P2=0x10;P0=dispcode[b]&0x7f;delay(300);P2=0x00;P2=0x08;P0=dispcode[c];       delay(300);P2=0x11;P2=0x04;

P0=dispcode[d];delay(300);P2=0x00;P2=0x02;P0=dispcode[12];delay(300);P2=0x00;}break;case 3:

{a=(uint)hum2/1000;b=(uint)hum2%1000/100;c=(uint)hum2%1000%100/10;d=(uint)hum2%1000%100%10;P2=0x80;P0=dispcode[2];delay(300);P2=0x00;P2=0x40;P0=dispcode[11];delay(300);P2=0x00;P2=0x20;P0=dispcode[a];delay(300);P2=0x00;P2=0x10;P0=dispcode[b]&0x7f;delay(300);P2=0x00;P2=0x08;P0=dispcode[c];delay(300);P2=0x00;P2=0x04;

P0=dispcode[d];delay(300);P2=0x00;P2=0x02;P0=dispcode[10];delay(300);P2=0x00;}break;default:break;} }

void init(void)

{P1&=0xf0; TMOD=0X11;TH0=(65535-20000)/256;TL0=(65535-20000)%256;TH1=(65535-25000)/256;TL1=(65535-25000)%256;EA=1;ET0=1;ET1=1;ES=1;     EX0=1; }

float change_temperature(float res) {    floathigh,low,datum;       if(res>27.215&&res<=28.469){high=28.469;low=27.215;datum=0;}

       if(res>26.023&&res<=27.215){high=27.215;low=26.023;datum=1;}

       if(res>24.891&&res<=26.023){high=26.023;low=24.891;datum=2;}

       if(res>23.814&&res<=24.891){high=24.891;low=23.814;datum=3;}

       if(res>22.791&&res<=23.814){high=23.814;low=22.791;datum=4;}

       if(res>21.817&&res<=22.791){high=22.791;low=21.817;datum=5;}

       if(res>20.891&&res<=21.817){high=21.817;low=20.891;datum=6;}

       if(res>20.009&&res<=20.891){high=20.891;low=20.009;datum=7;}

       if(res>19.170&&res<=20.009){high=20.009;low=19.170;datum=8;}

       if(res>18.371&&res<=19.170){high=19.170;low=18.371;datum=9;}

       if(res>17.610&&res<=18.371){high=18.371;low=17.610;datum=10;}

       if(res>16.885&&res<=17.610){high=17.610;low=16.885;datum=11;}

       if(res>16.194&&res<=16.885){high=16.885;low=16.194;datum=12;}

       if(res>15.535&&res<=16.194){high=16.194;low=15.535;datum=13;}

       if(res>14.907&&res<=15.535){high=15.535;low=14.907;datum=14;}

       if(res>14.308&&res<=14.907){high=14.907;low=14.308;datum=15;}

       if(res>13.736&&res<=14.308){high=14.308;low=13.736;datum=16;}

       if(res>13.190&&res<=13.736){high=13.736;low=13.190;datum=17;}

       if(res>12.670&&res<=13.190){high=13.190;low=12.670;datum=18;}

       if(res>12.172&&res<=12.670){high=12.670;low=12.172;datum=19;}

       if(res>11.697&&res<=12.172){high=12.172;low=11.697;datum=20;}

       if(res>11.244&&res<=11.697){high=11.697;low=11.244;datum=21;}

       if(res>10.810&&res<=11.244){high=11.244;low=10.810;datum=22;}

       if(res>10.369&&res<=10.810){high=10.810;low=10.369;datum=23;}

       if(res>10.000&&res<=10.369){high=10.369;low=10.000;datum=24;}

       if(res>9.621&&res<=10.000){high=10.000;low=9.621;datum=25;}

       if(res>9.259&&res<=9.621){high=9.621;low=9.259;datum=26;}

       if(res>8.912&&res<=9.259){high=9.259;low=8.912;datum=27;}

       if(res>8.581&&res<=8.912){high=8.912;low=8.581;datum=28;}

       if(res>8.263&&res<=8.581){high=8.581;low=8.263;datum=29;}

       if(res>7.959&&res<=8.263){high=8.263;low=7.959;datum=30;}

       if(res>7.668&&res<=7.959){high=7.959;low=7.668;datum=31;}

       if(res>7.389&&res<=7.668){high=7.668;low=7.389;datum=32;}

       if(res>7.122&&res<=7.389){high=7.389;low=7.122;datum=33;}

       if(res>6.866&&res<=7.122){high=7.122;low=6.866;datum=34;}

       if(res>6.621&&res<=6.866){high=6.866;low=6.621;datum=35;}

       if(res>6.385&&res<=6.621){high=6.621;low=6.385;datum=36;}

       if(res>6.160&&res<=6.385){high=6.385;low=6.160;datum=37;}

       if(res>5.943&&res<=6.160){high=6.160;low=5.943;datum=38;}

       if(res>5.736&&res<=5.943){high=5.943;low=5.736;datum=39;}

       if(res>5.537&&res<=5.736){high=5.736;low=5.537;datum=40;}

       if(res>5.345&&res<=5.537){high=5.537;low=5.345;datum=41;}

       if(res>5.162&&res<=5.345){high=5.345;low=5.162;datum=42;}

       if(res>4.986&&res<=5.162){high=5.162;low=4.986;datum=43;}

       if(res>4.816&&res<=4.986){high=4.986;low=4.816;datum=44;}

       if(res>4.654&&res<=4.816){high=4.816;low=4.654;datum=45;}

       if(res>4.497&&res<=4.654){high=4.654;low=4.497;datum=46;}

       if(res>4.347&&res<=4.497){high=4.497;low=4.347;datum=47;}

       if(res>4.203&&res<=4.347){high=4.347;low=4.203;datum=48;}

       if(res>4.064&&res<=4.203){high=4.203;low=4.064;datum=49;}

       if(res>3.884&&res<=4.064){high=4.064;low=3.884;datum=50;}

return(datum+(high-res)/(high-low));     }

void process(void)//AD值处理函数

{hum1=read1543(0)*23.33*100;temp2=change_temperature(31.25/read1543(3)-2.0)*100;temp1=change_temperature(31.25/read1543(1)-2.0)*100;hum2=read1543(2)*23.33*100;}

void judge(void)

{

if(temp1/100.0>=lower_limit)

{

TR1=1; / 1flag_alarm=1;}

       if(temp1/100.0>=higher_limit)

       {

TR1=1;flag_alarm=2;P1|=0Xf2;    

}

       else {TR1=0;flag_alarm=0;LED=1;0&=0Xf0;}}

void timer0(void) interrupt 1

{

TR0=0;TH0=(65535-1000)/256;TL0=(65535-1000)%256;time_count++;display(flag_display);if(time_count==300)

       {

time_count=0;flag_display++;if(flag_display==4)flag_display=0;}

       TR0=1;}

void timer1(void) interrupt 3

{

TR1=0;

TH1=(65535-250)/256;

TL1=(65535-250)%256;

alarm_count++;if(flag_alarm==1)

{if(alarm_count==400)

{VOICE=!VOICE;alarm_count=0;}}

else if(flag_alarm==2)

{if(alarm_count==100)

{VOICE=!VOICE;

alarm_count=0;P1|=0Xf2; }}}

void int0() interrupt 0

{uchar i;i=P3&0xf0;switch(i)

{case 0x70: P1|=0x01;break; case 0xb0: P1|=0x02;break;

case 0xd0: P1|=0x04;break;case 0xe0: P1|=0x08;break;default:break;}}

void main(void)

{

init();process();TR0=1;while(1)

{

process();judge();

}

4.4 调试

程序编好后,进行编译,无错误之后先在仿真电路图上进行模拟调试,如果现象是我们预计的再载入到芯片上,进行实物调试,。

4.5系统功能及其操作说明

1)硬件自检功能:本系统上电先是自检是L0-L7点亮0.5S熄灭,蜂鸣器响0.5S熄灭,L8-L15点亮,数码管按照每一段一段的循环点亮,到第八位的时候全部数码管点亮1S熄灭数码管。

(2)自动巡检功能:路数从第一路开始显示当前路的温度,每2S路次加1显示该路的温度值,到第九路的时候显示出来实时钟。路数返回到第一路。

(3)实时钟调整:当第九路的时候通过按键PB2、PB3、PB4可以进行对时钟,分钟,秒钟进行调整。

(4)冻结巡检功能:当按下PB0按键时路数不再变化1,一直显示当前路的温度,且温度值可以更新。

(5)手动切换功能:当按下PB1时路数按照以9为模加1。

(6)温度报警功能:如果当前路的温度高于40°C或者低于-40°C时,蜂鸣器响起,L0点亮。

(7)节拍设定功能:当按下K10键是进入节拍设定界面,等待按键按下当按下K0-K9键显示出来F0-K9。按下K11键确定按键,K12按键按下时返回到正常的巡检功能。

4.6  调试记录及调试结果

1、调试记录:第一天 发现不能显示出来小数点

原    因:没有对小数点的位进行显示。 

解决方案:

方案一、在查表显示子程序中的段码表加入带小数点的段码表,个位显示的时候只进行查带符号的段码表。虽然可以显示出来小数点,但是这个段码表不通用,比如说要显示带符号的5的时候,给显示缓存区写#05H不能显示正常的5.

方案二、在判断到显示到个位的时候给显示缓存区的最高位清零后再显示从而很好的显示出小数点。同理显示符号的时候判断出符号标志位为负的时候给该单元显示负号段码。

2、调试记录:第二天  上电后自检正常但是进入自动巡检的时候只是显示一个路次,后面的数码管都熄灭了。

解决方案:进入单片机模拟调试发现程序进入温度采集的子程序无法跳出,过程中只有该程序和定时器中断服务程序可以运行,经过仔细仿真的检查发现有一个标号表错了了,导致该子程序成了个死循环无法返回了,改正后发现情况还有一点改变但是还是不正常。回想到自己的程序是一次调用就要把8路每路采集四次温度值进行保存,每次AD转化就要有1MS的延时,这样一来这个子程序的调用就要花掉32 MS时间导致了后面的子程序调用不正常。改成每次调用的时候只进行一次AD转化,这样每个大循环大概8MS左右进行一次AD转换。发现显示正常了。

3、调试记录:发现温度巡检正常了但是当第一路和第二路时调节电位器的时候温度只能是从1.1~25.0~1.1显示,估计是转化成温度内码或者温度内码转化成BCD码的时候有错误。

解决方案:对上述两个程序进行仔细检查发现转化成温度内码的子程序中的工作寄存器R0和R1的值,对后面的温度内码转化成BCD的子程序中的R0和R1调用有影响,导致了计算出错了。以后调用子程序的时候先要记得对工作寄存器进行正确的初始化以保证后面程序调用的时候不出错。

4、调试记录:发现单板机在上电后直接显示出第二路的温度值且在该路停留的时间比较久明显长于设定的节拍。

解决方案:发现工作初始化的时候先打开定时器再进行的自检的操作的导致没有显示的时候定时器就开始了计时,把定时器开启放到自检程序后一切显示正常了。

 

在这两周的实训中,我们学会了自己动手制作多路温湿度巡检仪这个项目,从焊接印制板,到编程,再到模拟调试,实际调试,最后到做出实训结果,这个过程让我们的动手和动脑能力得到了加强,同时同学之间的友谊更为深刻了,大家在一起学会了珍惜,学会了互相帮助,学会了分工合作,学会了负责,而且小组间的团队合作精神也得到了很大的提高。

第一个礼拜主要是绘制原理图和印制板电路图。第二个礼拜主要是焊接板子,做好一个准备工作。在做完这些提前的准备工作后,我们便开始编程了,首先从简单的一部分程序开始编,然后进行整体的编程,经过一系列的调试与改动后,终于完成了程序。让我们感觉到实训中多做的项目还是很有趣,很有挑战性的。

在这次的实训中,我学到的不仅仅是科学知识,而且也学到了好多方法,做事情要细心,不能有所疏忽,就像我们对通讯进行设置时,一个地址有误就导致失败,一个点遗露就会对整个过程有所影响,所以我们平时做事情要细心认真,考虑周全。



                  

  


    本综合实训项目是在吴青等老师的悉心指导下完成的,他们对本次实训工作倾注了大量的心血。两周来,各位老师深厚的专业背景、严谨的治学态度、平易宽厚的人格作风使我受益匪浅。感谢您们对我的悉心教诲,使我顺利地完成了实训任务,在实训任务完成之际,衷心感谢各位老师对我的关心和培养!

感谢我同组同学及同班同学的帮助和关心!最后向审阅技术报告的老师致以深深的谢意!

参考文献

程海燕 《51单片机C语言应用》北京航空航天出版社2009

  蒋辉萍 《单片机原理与应用设计》北京航空航天出版社2007

    刘文涛 《单片机语言C51典型应用设计》人民邮电出版社2005

王建校 《51系列单片机及C51程序设计》科学出版社2007

范风强 《单片机语言C51应用实战集锦》电子工业出版社2005

相关推荐