完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include typedef unsigned char uchar; typedef unsigned int unint; unsigned char str1[]={""}; unsigned char str2[]={""}; unsigned char code dis1[] = {"TRH RH: "}; unsigned char code dis2[] = {"TRH T: "}; ***it TRH = P2^7;//温湿度传感器DHT11数据接入 ***it LCD_RS = P3^5; ***it LCD_RW = P3^6; ***it LCD_EN = P3^4; uchar TH_data,TL_data,RH_data,RL_data,CK_data; uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp; uchar com_data,untemp,temp; uchar respond; /*********************************************************************************/ void delayNOP() { _nop_(); _nop_(); _nop_(); _nop_(); } /*********************************************************************************/ /*********************************************************************************/ // 毫秒级延时子程序 /*********************************************************************************/ void delay_ms(unsigned char ms) { unsigned char i; while(ms--) { for(i = 0; i< 150; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } /*********************************************************************************/ /*********************************************************************************/ //5us级延时程序 /*********************************************************************************/ void delay_us() { uchar i; i--; i--; i--; i--; i--; i--; } /********************************************************************************/ /********************************************************************************/ // 测试LCD忙碌状态 //lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。 /********************************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /*******************************************************************************/ /*******************************************************************************/ // 写入指令数据到LCD /*******************************************************************************/ void lcd_wcmd(unsigned char cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*****************************************************************************/ /*****************************************************************************/ //写显示数据到LCD //RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。 /*****************************************************************************/ void lcd_wdata(unsigned char dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /****************************************************************************/ /****************************************************************************/ //LCD初始化设定 /****************************************************************************/ void lcd_init() { delay_ms(15); lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay_ms(5); lcd_wcmd(0x38); delay_ms(5); lcd_wcmd(0x38); delay_ms(5); lcd_wcmd(0x0c); //显示开,关光标 delay_ms(5); lcd_wcmd(0x06); //移动光标 delay_ms(5); //lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除 //delay_ms(5); } /****************************************************************************/ /****************************************************************************/ //设定LCD显示位置 /****************************************************************************/ void lcd_dis_pos(unsigned char pos) { lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 } /****************************************************************************/ /****************************************************************************/ //收发信号检测,数据读取 /****************************************************************************/ char receive() { uchar i; com_data=0; for(i=0;i<=7;i++) { respond=2; while((!TRH)&&respond++); delay_us(); delay_us(); delay_us(); if(TRH) { temp=1; respond=2; while((TRH)&&respond++); } else temp=0; com_data<<=1; com_data|=temp; } return(com_data); } /****************************************************************************/ /****************************************************************************/ //湿度读取子程序 //温度高8位== TL_data //温度低8位== TH_data //湿度高8位== RH_data //湿度低8位== RH_data //校验 8位 == CK_data //调用的程序有 delay();, Delay_5us();,RECEIVE(); /***************************************************************************/ void read_TRH() { //主机拉低18ms TRH=0; delay_ms(18); TRH=1; //DATA总线由上拉电阻拉高 主机延时20us delay_us(); delay_us(); delay_us(); delay_us(); //delay_us(); //delay_us();delay_us();delay_us();delay_us(); //主机设为输入 判断从机响应信号 TRH=1; //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!TRH) { respond=2; //判断DHT11发出 80us 的低电平响应信号是否结束 while((!TRH)&& respond++); respond=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(TRH && respond++); //数据接收状态 RH_temp = receive(); RL_temp = receive(); TH_temp = receive(); TL_temp = receive(); CK_temp = receive(); TRH=1; //数据校验 untemp=(RH_temp+RL_temp+TH_temp+TL_temp); if(untemp==CK_temp) { RH_data = RH_temp; RL_data = RL_temp; TH_data = TH_temp; TL_data = TL_temp; CK_data = CK_temp; } } //湿度整数部分 str1[0] = (char)(0X30+RH_data/10); str1[1] = (char)(0X30+RH_data%10); str1[2] = 0x2e; //小数点 //湿度小数部分 str1[3] = (char)(0X30+RL_data/10); str1[5] = 0X25; //"%" str1[6] = 0X52; //"R" str1[7] = 0X48; //"H" //温度整数部分 str2[0] = (char)(0X30+TH_data/10); str2[1] = (char)(0X30+TH_data%10); str2[2] = 0x2e; //小数点 //温度小数部分 str2[3] = (char)(0X30+TL_data/10); str2[5] = 0X27; //"'" str2[6] = 0X43; //"C" } /****************************************************************************/ //主函数 //TH,TL,RH,RL分别代表温湿度的整数和小数部分 /****************************************************************************/ void main() { unsigned char i,n=0x40,m; lcd_init(); delay_us(); while(1) { read_TRH(); //写字符 for(i=0;i<=7;i++) { lcd_dis_pos(i); //显示字符 lcd_wdata(dis1[i]); lcd_dis_pos(n+i); //显示字符 lcd_wdata(dis2[i]); } //写湿度数据 m=0x08; for(i=0;i<=7;i++) { lcd_dis_pos(m); lcd_wdata(str1[i]); m++; } //写温度数据 m=0x48; for(i=0;i<=7;i++) { lcd_dis_pos(m); lcd_wdata(str2[i]); m++; } delay_ms(100) ;//延时 } } |
|
|
|
电路图能发一份么
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你看看,stc12c5a60s2 11.0592M晶振
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 08:09 , Processed in 0.772341 second(s), Total 86, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号