[10] 刘宝元,张玉虹,姜旭,段存丽.基于单片机的温湿度监控系统设计[J].国外电子测量技术,2009,(12):77-80.83.
【摘要】 温湿度是影响硝基软片生产和厚度检测的重要因素。采用AT89S52单片机为控制中心,由STH10温湿度传感器及1602字符型液晶模块构成硝基软片生产在线实时温湿度监控系统,实现对硝基软片生产环境的温湿度精确测量与控制。实践证明,该系统电路简单、工作稳定、集成度高,调试方便,测试精度高,保证硝基软片生产线的产品质量与合格率,具有一定的实用价值。
-31-
附录D 部分系统源程序
#include
unsigned char dispbuf[5]={0}; unsigned char temp[5]; unsigned char T0count; unsigned char timecount; bit flag;
unsigned long F; //频率值 unsigned int pF;//电容量 signed char RH;//湿度
unsigned char Tset,Rset;//默认的温度报警线
unsigned char menu;//菜单变量,0时正常,1时设置温度,2时设置湿度 sbit K0=P2^0;//定义键盘K0 sbit K1=P2^1;//定义键盘K1 sbit K2=P2^2;//定义键盘K2 sbit beep=P1^0;
sbit LCD_RS = P2^7; sbit LCD_E = P2^6;
#define LCD_DATA P0
/************************************************** ** 函数名称: dellay
** 入口参数:h(unsigned int型) ** 出口参数:无
** 功能描述: 短暂延时,使用11.0592晶体,约0.01MS ****************************************************/ void dellay(unsigned int h) {
while(h--); //0.01MS }
/************************************************** ** 函数名称: WriteDataLcd
** 入口参数:wdata(unsigned char型) ** 出口参数:无
** 功能描述: 写数据到LCD
****************************************************/ void WriteDataLcd(unsigned char wdata) {
-32-
LCD_RS=1;
LCD_DATA=wdata;
dellay(100); //短暂延时,代替检测忙状态 LCD_E=1;
dellay(100); //短暂延时,代替检测忙状态 LCD_E=0; }
/************************************************** ** 函数名称: WriteCommandLcd
** 入口参数:wdata(unsigned char型) ** 出口参数:无
** 功能描述: 写命令到LCD
****************************************************/ void WriteCommandLcd(unsigned char wdata) {
LCD_RS=0;
LCD_DATA=wdata;
dellay(100); //短暂延时,代替检测忙状态 LCD_E=1;
dellay(100); //短暂延时,代替检测忙状态 LCD_E=0; }
//LCD初始化
void lcd_init(void) {
LCD_E=0;
WriteCommandLcd(0x38);
WriteCommandLcd(0x38); //显示模式设置 WriteCommandLcd(0x08); //关闭显示
WriteCommandLcd(0x0c);
WriteCommandLcd(0x06); //显示光标移动设置 WriteCommandLcd(0x01); //显示清屏
WriteCommandLcd(0x90); //显示开及光标移动设置 }
/************************************************** ** 函数名称: display_xy
** 入口参数:x(unsigned char型),y(unsigned char型) ** 出口参数:无
** 功能描述: 设置光标位置, x是列号,y是行号
****************************************************/
void display_xy(unsigned char x,unsigned char y)
-33-
{
if(y==1) x+=0x40; x+=0x80;
WriteCommandLcd(x); }
/******************************************************************** ** 函数名称: display_char
** 入口参数:x(unsigned char型),y(unsigned char型),dat(unsigned char型) ** 出口参数:无
** 功能描述: 在具体位置显示单个字符,x是列号,y是行号
*********************************************************************/ void display_char(unsigned char x,unsigned char y,unsigned char dat) {
display_xy(x,y); WriteDataLcd(dat); }
/********************************************************************* ** 函数名称: display_string
** 入口参数:x(unsigned char型),y(unsigned char型),s(指针型) ** 出口参数:无
** 功能描述: 在具体位置显示字符串,以/0结束,x是列号,y是行号
**********************************************************************/ void display_string(unsigned char x,unsigned char y,unsigned char *s) {
display_xy(x,y); while(*s) { WriteDataLcd(*s); s++; } }
//*****************//
//以下是DS18B20驱动程序 //*****************//
unsigned char data temp_data[2]={0x00,0x00}; //读出温度暂放
unsigned char data _1820display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用 unsigned int tmp;
-34-
sbit DQ=P2^4;
sbit DQVCC=P2^3; sbit DQGND=P2^5;
//**************温度小数部分用查表法***********// unsigned char code ditab[16]= {
0x00,0x01,0x01,0x02, 0x03,0x03,0x04,0x04, 0x05,0x06,0x06,0x07, 0x08,0x08,0x09,0x09 };
/*****************11us延时函数*************************/ //
void _18B20_delay(unsigned int t) {
for (;t>0;t--); }
/****************DS18B20复位函数************************/ _18B20_reset(void) {
char presence=1; while(presence) { while(presence) { DQ=1; _nop_();_nop_();//从高拉倒低 DQ=0; _18B20_delay(50); //550 us DQ=1; _18B20_delay(6); //66 us presence=DQ; //presence=0 复位成功,继续下一步 } _18B20_delay(45); //延时500 us presence=~DQ; }
DQ=1; //拉高电平 }
-35-