数字温湿度变送器自动标定仪设计论
更新时间:2024-06-11 08:07:01 阅读量: 综合文库 文档下载
目 录
摘 要 ............................................. - 2 - 第1章 绪论 ........................................ - 4 - 1.1 开发背景及意义 ................................ - 4 - 1.2 本文所做的工作 ................................ - 4 - 第2章 自动标定仪的概述 ............................ - 5 - 2.1 自动标定仪的功能 .............................. - 5 - 2.2 自动标定仪的标定方法的初步选择 ............... - 10 - 2.3 自动标定仪的标定方法的最终确定 ............... - 10 - 第3章 硬件电路设计 ............................... - 11 - 3.1 单片机芯片介绍 ............................... - 12 - 3.2 自动标定仪工作电路 ........................... - 15 - 第4章 软件程序设计 ............................... - 16 - 4.1主程序 ....................................... - 16 - 4.2 主程序代码 ................................... - 17 - 4.3 显示模块程序代码 ............................. - 33 - 结 论 ............................................. - 39 - 致 谢 ............................................. - 40 - 参考文献 ............................................ - 41 -
- 1 -
摘 要
本文主要介绍数字接口温湿度变送器自动标定仪的设计理念,详细说明了温湿度数据采集与传输、液晶显示和调整限值等功能以及实现这些功能而进行的硬件电路设计和软件程序设计。本文给出了硬件电路原理图、主程序和部分子程序流程图以及源程序代码等。通过软、硬件设计使得该款数字接口温湿度变送器自动标定仪使其对应的温湿度变送器具有智能化、高精度、高可靠性等优势,具有广阔的应用前景。本文还提出了该款数字接口温湿度变送器自动标定仪存在的缺陷和尚需解决的一些问题,并给出了可能解决这些问题的途径和方法。
关键词:数字接口温湿度变送器自动标定仪;自动标定;温度;湿度。
- 2 -
ABSTRACT
This paper mainly introduces digital interface temperature and humidity transmitters automatic calibration apparatus design concept, detail the temperature and humidity data collection and transmission, liquid crystal display and adjustment function and limit and realize these function design of hardware circuit and software programming. This paper gives the hardware circuit principle diagram, main program and the terrorists program flow chart and source code, etc. Through the soft and hardware design makes duckshot almost digital interface temperature and humidity transmitters automatic calibration apparatus make its corresponding temperature and humidity transmitters features intelligence, high precision, high reliability, etc advantages, has wide application prospects. This paper also puts forward this digital interface temperature and humidity transmitters automatic calibration apparatus defects of some problems need to be solved the monk, and gives the possible ways of solving these problems and methods.
Keywords: digital interface temperature and humidity transmitters automatic calibration apparatus; Automatic calibration; Temperature; Humidity.
- 3 -
第1章 绪论
1.1 开发背景及意义
在工农业生产、气象、环保、国防、科研等部门及日常生活中,经常需要对环境温度与湿度进行测量机控制。准确测量温湿度对于生物制药、食品加工、造纸等行业更是至关重要。在温湿度测量技术不断法杖完善的今天,温湿度计也正在朝着集成化、智能化、系统化的方向发展。主要表现在以下两个方面:(1)温湿度传感器正从分立元件向集成化、智能化、系统化的方向迅速发展,为开发新一代温湿度测控系统创造了有利条件;(2)在温湿度测量系统中普遍采用线性化处理、自动温度补偿和自动校准湿度等几项新技术。
数字式温湿度计相对于指针式温湿度计而言最大的优势在于读数方便,能够满足许多场合经常需要对环境与湿度进行测量的需求,为人们提供一种快捷高效、低成本的数字化测量工具。具有广阔的应用前景和较高的推广价值。而要数字接口温湿度计更正确的工作以及更广泛的运用,数字接口温湿度计的自动标定也就不可或缺了。 1.2 本文所做的工作
本文采用STC11L04E单片机对数字温湿度传感器进行数据采集并予以自动标定。本文详细说明了对该款数字接口温湿度变送器的自动标定过程,并提供了硬件电路原理图、程序流程图以及源程序代码等。
- 4 -
第2章 自动标定仪的概述
2.1 自动标定仪的功能
自动标定仪的功能是采用AMS2302数字温湿度传感器(也叫DHT22数字温湿度传感器)采集的温湿度数据作为基准的温湿度。给由和我同组的同学刘伟进行设计制作的数字接口温湿度变送器进行自动标定,以确保数字接口温湿度变送器的准确度。
在完成标定仪制作后实现了以下功能:
1、 数字接口温湿度变送器传送的温度数值误差<0.5℃; 2、 数字接口温湿度变送器传送的湿度数值误差<2%RH; 3、 数字接口温湿度变送器传送的温湿度数值的数字显示。 标定仪实物图如下:
- 5 -
图2.1
(1)数字接口温湿度变送器简介
自动标定仪对应的数字接口温湿度变送器由和我同组的同学刘伟进行设计制作,该数字接口温湿度变送器由独立的温度测量电路和湿度测量电路组成并最终以单总线对测量得到的数据进行传输。
其温度测量采用了热敏电阻和一精确电阻分别与同一电容在一样的电路中进行充放电,通过电容充电时间的比较计算热敏电阻的确切阻值,再根据热敏电阻与温度的对比关系得出具体温度值,其电路如下图所示:
图2.2
该数字接口温湿度变送器的湿度测量采用电容式湿度传感器HS1101与TLC555芯片组成振荡电路转换电容值为频率值,通过频率F与湿度RH之间的关系式计算得出具体湿度值。其电路如下:
- 6 -
图2.3
其计算关系式如下:
Fmes(Hz) = F55(Hz)(1.1038-1.936810-3*RH+3.011410-6*RH2-3.440310-8*RH3) 该数字接口温湿度变送器采用单总线传输数据,其传输数据的通信协议如下
图2.4
该数字接口温湿度变送器传输数据为32位,分别为温度高8位,温度低8位,相对湿度8位和校验的8位。其中校验的8位为温度高,温度低8位,相对湿度8位相异或的结果,若校验错误,则放弃该数据,并重新传输数据。 (2)作为基准的温湿度传感器简介
自动标定仪采用AMS2302数字温湿度传感器(也叫DHT22数字温湿度传感器)采集的温湿度数据作为基准的温湿度。
- 7 -
AMS2302 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个AM2302传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。产品为4针单排引脚封装。连接方便, 特殊封装形式可根据用户需求而提供。
- 8 -
AMS2303的接线图如下:
图2.5
- 9 -
2.2 自动标定仪的标定方法的初步选择
数字接口温湿度自动标定仪的功能主要是给对应的数字接口温湿度变送器进行自动标定,也就是要分别给数字接口温湿度变送器测出的温度和湿度的误差进行自动补偿以确保数字接口温湿度变送器的准确度。
在指导老师的提议下初步选择了自动标定仪的标定方法:将对应的数字接口温湿度变送器的测量曲线进行线性化处理,在进行线性化处理之后,标定仪则只需在任意的两种不同的温湿度环境下采集数字接口温湿度变送器的测量数据与确定的基准数据进行比较,计算出线性化后的测量曲线的斜率和起点值便可以做到准确的标定。
2.3 自动标定仪的标定方法的最终确定
在初步选择了自动标定仪的标定方法后,按该方法进行标定时遇到了一些问题。主要是对应的数字接口温湿度变送器的测量曲线的线性化处理实现十分困难。温度测量的指数曲线,湿度测量的3次方曲线很难进行线性化处理,而且采用的湿敏元件通过测量频率计算湿度的3次方曲线会根据选择的基准湿度值的变化而变化,而这种变化也并非曲线平移,这导致湿度测量曲线线性化误差很大且无法校准。
出于以上原因,我对自动标定仪的标定方法进行了调整。首先,温度模块中,由于数字接口温湿度变送器采用的温度采集方法是通
- 10 -
过精确计算热敏电阻与低温漂电阻的比值通过公式T?1lnk1?BT2得出
对应温度T,其中
1为热敏电阻与低温漂电阻阻值相等时对应的温T2度T2的倒数,这种采集方法主要的误差来自于热敏电阻阻值的计算误差和热敏电阻自身原因造成的阻值与温度对应关系误差,因此只需标定好式中的参数确的温度值。
其次,在湿度模块中,由于数字接口温湿度变送器采用的湿度采集方法是通过计算电容式湿度传感器与TLC555芯片组成的振荡电路给出的频率来计算具体的湿度,计算公式如下:
Fmes(Hz) = F55(Hz)(1.1038-1.936810-3*RH+3.011410-6*RH2-3.440310-8*RH3)1,将之输入数字接口温湿度变送器可得出精T2在式中频率Fmes(Hz)为测得频率而F55(Hz)为基准的55%RH湿度条件下电容式湿度传感器与TLC555芯片组成的振荡电路给出的频率,由公式我们能计算出具体湿度。因此,只需标定好基准的55%RH湿度条件下电容式湿度传感器与TLC555芯片组成的振荡电路给出的频率
F55(Hz)便可。将测得频率Fmes(Hz)与该时刻的基准湿度值RH代入公式便
能标定好F55(Hz)即标定好湿度模块。
第3章 硬件电路设计
自动标定仪需要采集数字式温湿度变送器的数据与基准数据进行比较,再根据比较结果予以变送器补偿以完成标定。由于变送器
- 11 -
直接传送数字信号的数据,所以自动标定仪的硬件电路只需要单片机的最小工作电路,设定好数据采集引脚和标定参数传送引脚便可。硬件电路结构框图如下图所示:
图3.1
3.1 单片机芯片介绍
(1)选用STC11L04E单片机的原因【4】
时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设臵加密性强,无法解密,采用宏晶最新第六代加密技术。 1/2/3/4/5/6/8/16/32/52/62K字节片内Flash程序存储器,擦写次数10万次以上。
1280/256字节片内RAM数据存储器超强抗干扰,超强抗静电,整机可轻松过2万伏静电测试。
芯片内EEPROM功能,擦写次数10万次以上速度快,1个时钟/机器周期,可用低频晶振,大幅降低EMI。
ISP / IAP,在系统可编程/在应用可编程,无需编程器/仿真器--出口欧美的有力保证。
- 12 -
2个16位定时器,兼容普通8051的定时器T0/T1 输入/输出口多,最多有40个I/O,复位脚如当I/O口使用,可省去外部复位电路。 1个独立波特率发生器(故无需T2做波特率发生器),缺省是T1做波特率发生器超低功耗:
可编程时钟输出功能,T0在P3.4输出时钟,T1在P3.5输出时钟,BRT在P1.0输出时钟掉电模式:外部中断唤醒功耗 <0.1uA,支持下降沿/低电平和远程唤醒。
硬件看门狗(WDT)STC11xx系列增加了掉电唤醒专用定时器,启动掉电唤醒定时器。
全双工异步串行口(UART),兼容普通8051,可当2个串口使用(串口可在P3与P1之间任意切换)典型功耗<2uA。
先进的指令集结构,兼容普通8051指令集,有硬件乘法/除法指令适用于电池供电系统,如水表、气表、便携设备等。
通用I/O口(36/40个),复位后为: 准双向口/弱上拉(普通8051传统I/O口)空闲模式:
典型功耗 <1.3mA正常工作模式: 2mA - 7mA可设臵成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏。 在系统可编程,无需编程器,无需仿真器,可远程升级每个I/O口驱动能力均可达到20mA,44/40管脚的IC建议整个芯片不要超过120mA,可送STC-ISP下载编程器,1万片/人/天20/18/16管脚的IC建议整个芯片不要超过60mA内部集成高可靠复位电路,复位脚设臵为I/O口使用时,复位脚可浮空。
- 13 -
(2) STC11L04E主要性能:
高速:1个时钟/机器周期,增强型8051内核,速度比普通8051快8~12倍复位脚:烧录程序时如设臵为I/O口,可当I/O口使用或浮空。
宽电压:5.5~4.1V/3.7V,3.6V~2.4V/2.1V(STC11/10L系列)。 低功耗设计:空闲模式(可由任意一个中断唤醒)不用的I/O口:浮空即可。
低功耗设计:掉电模式(可由任意一个外部中断唤醒,可支持下降沿/低电平使用LQFP44封装时,最多有40个I/O口和远程唤醒,STC11xx系列还可通过内部专用掉电唤醒定时器唤醒)。
支持掉电唤醒的管脚:
INT0/P3.2,INT1/P3.3,T0/P3.4,T1/P3.5,RxD/P3.0(或RxD/P1.6)使用PDIP40封装时,最多有36个I/O口。
工作频率:0~35MHz,相当于普通8051:0~420MHz。 STC11L04E单片机所有I/O口均可由软件配臵成4种工作类型之一。4种类型分别为:准双向口(标准8051输出模式)、推挽输入(高阻)或开漏输出功能。每个口由2个控制寄存器中的相应位控制每个引脚工作类型。STC11L04E单片机上电复位后为准双向口(传统8051的I/O口)模式。2V以上时为高电平,0.8V以下时为低电平。 STC11L04E单片机管脚图如下:
- 14 -
图3.2
3.2 自动标定仪工作电路
由于变送器直接传送数字信号的数据,所以自动标定仪的硬件电路只需要单片机的最小工作电路,设定好数据采集引脚和标定参数传送引脚便可。
图3.3
- 15 -
第4章 软件程序设计
4.1主程序
首先,单片机通过单总线接收来自数字接口温湿度变送器和作为基准的AMS2302数字温湿度传感器采集到的数据(其中数字接口温湿度变送器湿度部分直接传送电容式传感器HS1101和TLC555芯片组成的振荡电路所给出的频率)。然后将两者的数据进行比较计算得出需要的标定值传输给数字接口温湿度变送器。程序流程图如下:
- 16 -
图3.4
4.2 主程序代码 #include<12C5A.TXT> #include
typedef unsigned char BYTE; typedef unsigned int WORD; WORD
tem=257;
BYTE hum=58;
//555
//---------------------------- WORD tem_2301 = 241;
WORD
hum_2301 = 657; //2301
BYTE code t[]={\BYTE code rt[]={\BYTE tempra_2301[4]; BYTE humini_2301[4]; uchar tempra[4]; uchar humini[2];
- 17 -
//---------------------------------------------------- void delay(WORD i) //延时约x个ms { WORD j; for(i;i>0;i--)
for(j=950;j>0;j--);
}
void delaytime(WORD i) //延时约x个ms { while(i--){
_nop_ ();
_nop_ (); }}
//-----------------2301------------------------ sbit wire = P3^4; void check_rt()
//读数据准备信号
{ P3M1 = 0XFF; P3M0 = 0XFF; wire = 0; delaytime(600); //延时*us
wire = 1; delaytime(16); // 31us
_nop_ ();
_nop_ ();
- 18 -
_nop_ (); P3M1 = 0XFF; P3M0 = 0X00; while(wire); // 等待2301拉低
_nop_ ();
_nop_ ();
//低
_nop_ ();
while(!wire); // 等待拉高
_nop_ ();
_nop_ ();
//高
_nop_ ();
while(wire); // 等待2301拉低
_nop_ ();
_nop_ ();
_nop_ ();
}
//--------------------------------------------- BYTE redata_2301() //接收一位数据{ WORD WEI;
TH0 = 0; TL0 = 0;
EA = 0;
- 19 -
while(!wire); TR0 = 1; while(wire); TR0 = 0; EA = 1; if(TL0>50)
WEI = 1;
else WEI = 0; return WEI;
}
//------------------------------------------- BYTE read_byte_2301() //接收一个字节{ BYTE dat = 0;
BYTE temp; BYTE a; int i = 7; while(i>=0)
{ a = redata_2301(); temp = a<
}
- 20 -
return dat;
}
//------------------------------------------ void lcd2301() //显示字
{ BYTE i; LCD_send_command(0x80+0x40); for(i=0;i<4;i++) { LCD_send_data(t[i]); delay(15);
}
LCD_send_command(0x80+0x4a); for(i=0;i<4;i++)
{ LCD_send_data(rt[i]); delay(15);
}}
//-------------------------------------------- void display_2301() //显示数据
{ BYTE i,j; tempra_2301[0] = tem_2301/100+0x30; tempra_2301[1] = tem_2301/10+0x30; tempra_2301[2] = 0x2e;
tempra_2301[3] = tem_2301+0x30;
- 21 -
humini_2301[0] = hum_2301/100+0x30; humini_2301[1] = hum_2301/10+0x30; humini_2301[2] = 0x2e;
humini_2301[3] = hum_2301+0x30; LCD_send_command(0x80+0x44); for(i=0;i<4;i++)
{ LCD_send_data(tempra_2301[i]); delay(15);
}
LCD_send_command(0x80+0x40+12); for(j=0;j<4;j++)
{ LCD_send_data(humini_2301[j]); delay(15);
}}
//------------------------------------ void readdata_2301() { BYTE hum_h,hum_l; BYTE tem_h,tem_l; BYTE check; BYTE checkdata; WORD
tem_hum,tem_tem;
check_rt();
- 22 -
hum_h = read_byte_2301(); hum_l = read_byte_2301(); tem_h = read_byte_2301(); tem_l = read_byte_2301(); check = read_byte_2301(); tem_hum = hum_h<<8; tem_tem = tem_h<<8; hum_2301 = tem_hum|hum_l; tem_2301 = tem_tem|tem_l;
checkdata = hum_h + hum_l + tem_h + tem_l; // if(check==checkdata) // hum = 5;
、
P3M1 = 0X00; P3M0 = 0X00;
}
//---------555----------------------------- sbit date = P3^5;
BYTE readbit()//接收一位数据 { BYTE WEI; TH0 = 0; TL0 = 0;
EA = 0;
- 23 -
while(!date); TR0 = 1; while(date); TR0 = 0; EA = 1; if(TL0>30)
WEI = 1;
else WEI = 0; return WEI;
}
//------------------------------------------- BYTE read_byte() //接收一个字节{ BYTE dat = 0;
BYTE temp; BYTE a; int i = 7; while(i>=0) { a = readbit(); temp = a<
}
- 24 -
return dat;
}
//----------------------------------------------- void display_555()
//显示数据
{ BYTE i; tempra[0] = tem/100+0x30; tempra[1] = tem/10+0x30; tempra[2] = 0x2e; tempra[3] = tem+0x30; humini[0] = hum/10+0x30; humini[1] = hum+0x30; LCD_send_command(0x80+4); for(i=0;i<4;i++)
{ LCD_send_data(tempra[i]); delay(15);
}
LCD_send_command(0x80+12); for(i=0;i<2;i++)
{ LCD_send_data(humini[i]); delay(15);
}}
//----------------------
- 25 -
BYTE readdata_555() //555握手
{ P3M1 = 0XFF; P3M0 = 0XFF; date = 0; delaytime(300); //延时*us
date = 1;
delaytime(2); // *us P3M1 = 0XFF; P3M0 = 0X00; TH0 = 0; TL0 = 0;
while(date); // 等待拉低 TR0 = 1;
_nop_ ();
_nop_ ();
_nop_ ();
_nop_ (); while(!date); // 约31us TR0 = 0;
if(TL0<34&&TL0>28) return 1;
else
- 26 -
return 0;
}
//--------------------------------------------------------------- void conmu_555() { BYTE che; BYTE jiao,check; BYTE th,tl; WORD temp; che = readdata_555(); if(che) { while(date); th = read_byte(); tl = read_byte(); hum = read_byte(); jiao = read_byte(); temp = th<<8;
tem = temp|tl;
} check = th^tl; check = check^hum; if(jiao != check)
hum = 5;
- 27 -
P3M1 = 0X00; P3M0 = 0X00;
}
//-------------------------------------------------------------- void lcd_555()
//显示字
{ char i; LCD_send_command(0x80); for(i=0;i<4;i++) { LCD_send_data(t[i]); delay(15);
}
LCD_send_command(0x80+10); for(i=0;i<4;i++)
{ LCD_send_data(rt[i]);
delay(15);
} }
//---------------------------------------------- void UartInit(void)
//9600bps@12MHz
{ PCON &= 0x7f; //波特率不倍速 SCON = 0x50;
//8位数据,可变波特率
BRT = 0xD9;
//设定独立波特率发生器重装值- 28 -
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
AUXR |= 0x01;//串口1选择独立波特率发生器为波特率发生器 AUXR |= 0x10;
//启动独立波特率发生器
}
void UART_T(unsigned char UART_data) { //定义串口发送数据变量 // ES=0; //禁止穿行中断 SBUF = UART_data; //将接收的数据发送回去 while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
// ES=1; //打开穿行中断 // delay(100); }
//-------------频率----------------------------- sbit checkFre = P3^3; //检测频率脚 double
Frequency;
//Hz
double F55;
double gain = (3.35272e-3);
WORD calculateFrequency() //计时25个周期 { BYTE t_num = 25; TH0 = 0;
TL0 = 1;
- 29 -
EA = 0;
while(checkFre==0); _nop_ ();_nop_ (); while(1)
{ if(checkFre==0) break;
} TR0=1;
//等待负跳变开始计时 while(t_num--) { while(1)
{ if(checkFre==1) break;
} while(1)
{ if(checkFre==0) break;
} }
TR0=0; //下次负跳变停止计时 EA = 1;
return((300000.0/(TH0*256+TL0))*1000);
}
void calFre()
- 30 -
{ BYTE i = 10; }
//-------------com------------------------------ void biaoding() { calFre();
F55 = Frequency / (( 3.0134e-6 ) * hum_2301 * hum_2301 - WORD FF;
FF = calculateFrequency(); while(i--) { WORD AA; }
Frequency = FF;
AA = calculateFrequency(); FF = (FF + AA)/2;
( 3.4503e-8 ) * hum_2301 * hum_2301 * hum_2301 - ( 1.9308e-3 ) * hum_2301 + 1.0900); }
void com(double dat) { double a;
unsigned char *p=(char*)&a; unsigned char q[4]; char i;
- 31 -
a = dat;
for(i=0;i<4;i++,p++)
{ q[i]=*p;
} for(i = 0;i<4;i++) { UART_T(q[i]); delay(2000);
}}
//---------------------------------------------- void main() { int num = 5; LCD_init();
TMOD = 0x11;
// EA = 1; // ES = 1; UartInit();
lcd2301();
lcd_555(); while(num--)
{ conmu_555(); //读555温湿度 delay(2000);
readdata_2301();//读2301温湿度- 32 -
}
display_555(); display_2301();
biaoding(); com(F55); com(3.35272e-3); while(1)
{ conmu_555(); //读555温湿度
delay(2000);
readdata_2301();//读2301温湿度 display_555(); display_2301();
} }
//---------------------------------------------------------------- 4.3 显示模块程序代码
/*********************LCD1602头文件********************/ #ifndef _LCD1602_H_ #define _LCD1602_H_
/***********************LCD1602**************************/
#define LCDIO P1 //定义P2口与LCD1602的数据口相接
接
线
引
脚
定
义
- 33 -
sbit LCD_RS=P2^0; sbit LCD_RW=P2^1; sbit LCD_EN=P2^2; sbit LCD_BUSY=LCDIO^7; //输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移 #define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动
#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位 //设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C //显示开 #define LCD_DISPLAY_OFF 0x08 //显示关 #define LCD_CURSOR_ON 0x0A //光标显示 #define LCD_CURSOR_OFF 0x08 //光标不显示 #define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁 #define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁 //光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
- 34 -
#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位 #define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位 #define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位 //工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示 #define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示 #define LCD_CLEAR_SCREEN 0X01 //清屏 /***********************LCD1602******************************/
#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址 #define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址 #define LINE1 0 //第一行 #define LINE2 1 //第二行
#define LINE_LENGTH 16 //每行的最大字符长度 /**********************
另
外
相
关
的
定
地
址
相
关
*********************************/ #define HIGH 1 #define LOW 0 #define TURE 1 #define FALSE 0 #define uchar unsigned char #define uint unsigned int
- 35 -
//*****************************************************/ void LCD_check_busy(void) //检测LCD状态,看它是不是还在忙呢 { do
{ LCD_EN=0; LCD_RS=0; LCD_RW=1; LCDIO=0xff; LCD_EN=1; }
while(LCD_BUSY==1); LCD_EN=0; }
//*******LCD1602写命令***************/ void LCD_send_command(uchar command) {
LCD_check_busy(); LCD_RS=LOW; LCD_RW=LOW; LCD_EN=HIGH; LCDIO=command; LCD_EN=LOW; }
- 36 -
///**LCD1602写数据*************/ void LCD_send_data(uchar dat) {
LCD_check_busy(); LCD_RS=HIGH; LCD_RW=LOW; LCD_EN=HIGH; LCDIO=dat; LCD_EN=LOW; }
///************显示单个字符*********************/ void LCD_write_char(uchar x,uchar y,uchar dat) {
unsigned char address; if (y == LINE1)
address = LINE1_HEAD + x; else
address = LINE2_HEAD + x; LCD_send_command(address); LCD_send_data(dat); }
///**************LCD1602的初始化******************/
- 37 -
void LCD_init(void) {
LCD_send_command(LCD_DISPLAY_DOUBLE_LINE);
LCD_send_command(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_send_command(LCD_CLEAR_SCREEN); }
//********************************************************/ ///*************LCD1602显示字符串******************/ void LCD_disp_string(uchar x,uchar y,uchar *Data) { if(y==LINE1)
{ if(x { LCD_send_command(LINE1_HEAD+x); for(;x if(*Data!='\\0') { x=0; y=LINE2; } } } - 38 - if(y==LINE2) { LCD_send_command(LINE2_HEAD+x); for(;x //*******************************************************/ #endif //***************************************************** 结 论 经过努力,本次毕业设计成功实现了数字接口温湿度变送器自动标定仪对数字接口温湿度变送器的自动标定。本设计硬件电路比较简单,但是,由于扩展了EEPROM,使得软件程序设计较为复杂。在开发这款温湿度传感器的过程中遇到了许多问题,比如:如何扩展EEPROM?单片机如何从EEPROM指定地址读写程序?数值转换等。但是,经过认真思考,这些问题最终得以解决。 通过这次毕业设计,使我对四年以来所学的专业知识有了更深层次上的认识。不仅提高了动手能力,而且是我对产品开发的过程有了更深刻的了解。 - 39 - 致 谢 四年的大学本科阶段很快就要过去了,在我的毕业论文即将完成之际,谨向所有在四年的学习过程中给予我指导和帮助的老师和同学表示深深的谢意。 特别感谢我的指导老师杨进宝老师,他严谨的治学精神和生活态度也深深地影响着我,使我受益无穷。 - 40 - 参考文献 【1】 于永、戴佳、常江、51单片机C语言常用模块与综合系统设计,电子工业出版社。 【2】 【3】 孙育才,单片微型计算机及其应用,东南大学出版社。 赵亮、侯国锐,单片机C语言编程与实践,人民邮电出版社。 【4】 【5】 【6】 STC11F04E datasheet. www.symcukf.com. EEPROM datasheet.www.fpga-arm.com. 1602字符型LCD。长沙太阳人电子有限公司。www.hificat.com. - 41 -
正在阅读:
数字温湿度变送器自动标定仪设计论06-11
第一次学做饭作文800字07-09
我把青春献给党征文08-25
五年级《生命生态与安全》教学工作总结12-16
荷之韵作文600字07-04
秋天的景色作文三年级07-01
立足文化打造广西旅游景点新品牌08-08
日语一级N1副词整理12-17
安全风险预控 员工不安全行为管理手册ok04-15
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 定仪
- 温湿度
- 变送器
- 数字
- 自动
- 设计
- 民事诉讼法(2009.7新)
- 商务广告翻译 - 图文
- 城市污水处理厂工程质量验收记录表-全套表格
- 95-《基础会计》练习(一)
- 大米的37种做法
- 2018年中考历史真题单元汇编九下第三单元第一次世界大战和战后初
- 2013-2018年中国运动服行业市场分析及投资可行性研究报告
- 有色动力厂党委实施党建目标质量管理体系建设的实践体会
- 新版教科版四年级科学上册全册教学设计
- 呼叫中心精品文档分享:华夏银行95577客服中心顾问咨询项目方案
- 传热学试题大全
- 机械设计教程-习题集
- 2018年海南高考化学试题及答案(精美word版,精校版)
- 有趣的作文课
- 国内外铁路重载运输发展概述 - 图文
- 声律启蒙注释
- 2011江西八校高三联考试题答案(理综)
- 菁华埝桥学校安全工作预案
- 池塘推土、清除杂草及树木等工程施工方案
- xx旅游开发项目立项申请报告(发改委标准)