ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:18.36KB ,
资源ID:11139123      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11139123.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AT89C52与SHT10和1602液晶测温湿度的程序.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

AT89C52与SHT10和1602液晶测温湿度的程序.docx

1、AT89C52与SHT10和1602液晶测温湿度的程序/*端口定义* P1.0-SCK (SHT10) P1.1-DATA (SHT10) P0-DB0DB7 (LCD1602) P2.0-RS (LCD1602) P2.1-RW (LCD1602) P2.2-E (LCD1602)*/#include #include #include #include #include #include #define uchar unsigned char#define uint unsigned int/按键设置sbit TEM_UP = P12;sbit TEM_DOWN = P13;sbit HU

2、M_UP = P14;sbit HUM_DOWN = P15;sbit SHEZHI_ENTER = P16;sbit SHEZHI_EXIT = P17;float f_tem_up_value = 50.0;float f_tem_down_value = -30.0;float f_hum_up_value = 10.0;float f_hum_down_value = 100.0;/1602液晶端口定义 *sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn= P22;sbit ACC0 = ACC0;sbit ACC7 = ACC7;uchar str

3、7;/向LCD写入命令或数据*#define LCD_COMMAND 0 / Command#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_N

4、O_FLASH 0x00 /光标不闪动/设置输入模式*#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 / default#define LCD_MOVE 0x01 / 画面可平移#define LCD_NO_MOVE 0x00 /defaultunsigned char LCD_Wait(void);void LCD_Write(bit style, unsigned char input);/*1602液晶显示部分子程序*/void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);v

5、oid 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_Initi

6、al() 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)

7、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,%f, a); void welcome() LCD_Initial(); GotoXY(0,0); Print( Wel

8、come! ); GotoXY(0,1); Print( Code of sht10 ); delay(200);/*- ;模块名称:delay_n10us(); ;功 能:延时函数,延时约n个10us较精确的延时函数,_nop_()延时1us12M晶振;-*/void delay_n10us(uint n) /延时n个10us12M晶振 uint i; for(i=n;i0;i-) _nop_();_nop_();_nop_(); _nop_();_nop_();_nop_(); /*第一部分LCD1602设置 END*/*第二部分DHT90设置 START* sbit SCK = P10;

9、 /定义通讯时钟端口sbit DATA = P11; /定义通讯数据端口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

10、 1 #define MEASURE_HUMI 0x05 /000 0010 1 #define RESET 0x1e /000 1111 0 /*定义函数*/void s_transstart(void); /启动传输函数void s_connectionreset(void); /连接复位函数char s_write_byte(unsigned char value);/DHT90写函数char s_read_byte(unsigned char ack); /DHT90读函数char s_measure(unsigned char *p_value, unsigned char *p_c

11、hecksum, unsigned char mode);/测量温湿度函数void calc_dht90(float *p_humidity ,float *p_temperature);/温湿度补偿/*- ;模块名称:s_transstart(); ;功 能:启动传输函数;-*/ void s_transstart(void) / generates a transmission start / _ _ / DATA: |_| / _ _ / SCK : _| |_| |_ DATA=1; SCK=0; /Initial state _nop_(); SCK=1; _nop_(); DATA

12、=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; /*- ;模块名称:s_connectionreset(); ;功 能:连接复位函数;-*/ void s_connectionreset(void) / communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart / _ _ / DATA: |_| / _ _ _ _ _ _ _ _ _ _ _ / SCK : _| |_

13、| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_ unsigned char i; DATA=1; SCK=0; /Initial state for(i=0;i0;i/=2) /shift bit for masking if (i & value) DATA=1; /masking value with i , write to SENSI-BUS else DATA=0; SCK=1; /clk for SENSI-BUS _nop_();_nop_();_nop_(); /pulswith approx. 3 us SCK=0; DATA=1; /rel

14、ease DATA-line SCK=1; /clk #9 for ack error=DATA; /check ack (DATA will be pulled down by DHT90),DATA在第9个上升沿将被DHT90自动下拉为低电平。 _nop_();_nop_();_nop_(); SCK=0; DATA=1; /release DATA-line return error; /error=1 in case of no acknowledge /返回:0成功,1失败 /*- ;模块名称:s_read_byte(); ;功 能:SHT10读函数;-*/ char s_read_

15、byte(unsigned char ack) / reads a byte form the Sensibus and gives an acknowledge in case of ack=1 unsigned char i,val=0; DATA=1; /release DATA-line for (i=0x80;i0;i/=2) /shift bit for masking SCK=1; /clk for SENSI-BUS if (DATA) val=(val | i); /read bit _nop_();_nop_();_nop_(); /pulswith approx. 3 u

16、s SCK=0; if(ack=1)DATA=0; /in case of ack=1 pull down DATA-Line else DATA=1; /如果是校验(ack=0),读取完后结束通讯 _nop_();_nop_();_nop_(); /pulswith approx. 3 us SCK=1; /clk #9 for ack _nop_();_nop_();_nop_(); /pulswith approx. 3 us SCK=0; _nop_();_nop_();_nop_(); /pulswith approx. 3 us DATA=1; /release DATA-line

17、 return val; /*- ;模块名称:s_measure(); ;功 能:测量温湿度函数;-*/ char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) / makes a measurement (humidity/temperature) with checksum unsigned error=0; unsigned int i; s_transstart(); /transmission start switch(mode) /send command to se

18、nsor case TEMP : error+=s_write_byte(MEASURE_TEMP); break; case HUMI : error+=s_write_byte(MEASURE_HUMI); break; default : break; for (i=0;i100)rh_true=100; /cut if the value is outside of if(rh_true0.1)rh_true=0.1; /the physical possible range *p_temperature=t_C; /return temperature C *p_humidity=r

19、h_true; /return humidity%RH/*主函数*void main(void) value humi_val,temp_val; unsigned char error,checksum; LcdRw=0; s_connectionreset(); welcome();/显示欢迎画面 delay(2000); LCD_Initial(); while(1) / shezhi(); error=0; error+=s_measure(unsigned char*) &humi_val.i,&checksum,HUMI); /measure humidity error+=s_m

20、easure(unsigned char*) &temp_val.i,&checksum,TEMP); /measure temperature if(error!=0) s_connectionreset(); /in case of an error: connection reset else humi_val.f=(float)humi_val.i; /converts integer to float temp_val.f=(float)temp_val.i; /converts integer to float calc_dht90(&humi_val.f,&temp_val.f); /计算湿度与温度 GotoXY(0,0);/ Print(Tep:); GotoXY(0,1); Print(Hum:); zhuanhuan(temp_val.f);/转换温度为uchar方便液晶显示

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1