基于Proteus的温湿度采集系统设计 下载本文

基于Proteus的温湿度采集系统设计

一.设计目的:

1.熟悉Proteus的操作环境,能够使用keil u-vision和Proteus对单片机程序进行联合调试的方法。

2.熟悉单片机的编程,学习根据时序图编写程序的方法,理解模块化编程的思想。 3.掌握1602液晶显示模块程序的编写。 二.设计要求:

通过SHT10土壤温湿度传感器对当前的温度和湿度进行采集,并将采集的结果送1602液晶进行实时显示。 三.设计方案: 1.硬件电路设计

(1)单片机最小系统

单片机最小系统由晶振电路和上电复位电路组成。 C122pf19U1XTAL1C222pfX1CRYSTAL18XTAL2R110k9RSTP0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617d0d1d2d3d4d5d6d7RSRWEC310uF293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51

图一单片机最小系统

(2)1602液晶显示电路

本设计采用LCD1602液晶作为显示器件,1602液晶也叫1602字符型液晶 它是一种专门用来显示字母、数字、符号等的点阵型液晶模块 它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔 每行之间也有也有间隔 起到了字符间距和行间距的作用,正因为如此 所以他不能显示图形。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

LCD1LM016LRP1RESPACK-8VSSVDDVEERSRWE456RSRWED0D1D2D3D4D5D6D7d0d1d2d3d4d5d6d77891011121314123456789d0d1d2d3d4d5d6d7123 图二液晶显示电路 (3)SHT10温湿度传感器电路 SHT10系列单芯片传感器是一款含有已校准数字信号输出的温湿度复合传感器。该传感器包括一个电容式聚合体测湿元件和一个能隙式测温元件组成,并与一个14位的AD转换器和串行接口电路进行无缝连接。采用两线式串行方式与单片机进行通信,但通信协议并不是IIC总线式。

U2%RH癈23DATASCKSHT10>18.043.0 2.软件设计

#define uchar unsigned char (1)液晶显示部分程序

#define uint unsigned int /*************端口定义***************

P1.0------SCK (SHT10) P1.1------DATA (SHT10) //1602液晶端口定义 P0------DB0~DB7 (LCD1602) sbit LcdRs= P2^0; P2.0------RS (LCD1602) sbit LcdRw= P2^1; P2.1------RW (LCD1602) sbit LcdEn= P2^2; P2.2------E (LCD1602) ************************************/ sbit ACC0 = ACC^0; sbit ACC7 = ACC^7; #include #include uchar str[7]; #include uchar dis[4]; #include #include //向LCD写入命令或数据 #include #define LCD_COMMAND // Command

0

#define LCD_DATA 1 // Data #define LCD_CLEAR_SCREEN 0x01 // 清屏

#define LCD_HOMING 0x02 // 光标返回原点

//设置显示模式

************************************************************ #define LCD_SHOW 0x04 //显示开

#define LCD_HIDE 0x00 //显示关

#define LCD_CURSOR 0x02 //显示光标

#define LCD_NO_CURSOR 0x00 //无光标

#define LCD_FLASH 0x01 //光标闪动

#define LCD_NO_FLASH 0x00 //光标不闪动

//设置输入模式************************************ #define LCD_AC_UP 0x02 #define LCD_AC_DOWN 0x00 // default #define LCD_MOVE 0x01 // 画面可平移 #define LCD_NO_MOVE 0x00 //default unsigned char LCD_Wait(void); void LCD_Write(bit style, unsigned char input); /****1602液晶显示部分子程序******/

void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void LCD_Write(bit style, unsigned char input) { LcdRs=style;

P0=input; delay(5);

LcdEn=1; delay(5);

LcdEn=0; } void LCD_SetDisplay(unsigned char DisplayMode)

{ LCD_Write(LCD_COMMAND,

0x08|DisplayMode); }

void LCD_SetInput(unsigned char

InputMode) {

LCD_Write(LCD_COMMAND, 0x04|InputMode);

} //初始化LCD********************************* void LCD_Initial() { LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏

LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动 } //液晶字符输入的位置************************ void GotoXY(unsigned char x, unsigned char y) {

if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40)); }

//将字符输出到液晶显示 void Print(unsigned char *str) { while(*str!='\\0') { LCD_Write(LCD_DATA,*str); str++; } }

void zhuanhuan(float a)//浮点数转换成字符串函数 { memset(str,0,sizeof(str)); sprintf (str,\ }

void Dataconv(unsigned char dat) { uchar temp; temp=dat/100; dis[0]=temp+0x30; temp=dat0; dis[1]=temp/10+0x30; dis[2]=temp+0x30; }

void welcome() { LCD_Initial(); GotoXY(0,0); Print(\ Welcome! \ GotoXY(0,1); Print(\ Code of sht10 \ delay(200); } /*-------------------------------------- ;模块名称:delay_n10us();

;功 能:延时函数,延时约n个10us 较精确的延时函数,\延时1us@12M晶振

;-------------------------------------*/ void delay_n10us(uint n) //延时n个10us@12M晶振 {

uint i; for(i=n;i>0;i--) { _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); } }

2.SHT10测量温湿度程序

sbit SCK = P2^3; //定义通讯时钟端口

sbit DATA = P2^4; //定义通讯数据端口

typedef union

{ unsigned int i; //定义了两个共用体 float f; } value;

enum {TEMP,HUMI}; //TEMP=0,HUMI=1

#define noACK 0 //用于判断是否结束通讯

#define ACK 1 //结束数据传输

//adr command r/w

#define STATUS_REG_W 0x06 //000 0011 0

#define STATUS_REG_R 0x07 //000 0011 1

#define MEASURE_TEMP 0x03 //000 0001 1

#define MEASURE_HUMI 0x05 //000