标签:开始 数据线 int start 大神 reg 程序员 技术 很多
上上周末媳妇问我,家里温度多少,。。。我TM哪知道,租这么个鬼地方,啥也没有,我能猜的出来吗,当然“TM的”的是我现在现在加的。。。^_^,然后就想之前也买了一个树莓派4B也买了一个面包板,再回忆一下大学时曾经所学的知识,算求了,想做个这么个玩意儿,然后,就。。。。。网上一搜,20多块钱就能买一个。。。。但是作为一个程序员,就是这么喜欢折腾。。。也想多赞点儿私房钱。。然后就多要了点儿经费。。O(∩_∩)O哈哈~
我只是一个单纯的软件开发工程师。。对于硬件仅仅局限于大学那点儿知识而且毕业四五年了,早忘的差不多了,都是靠百度和各位大神的分享来去驱动。。。
左侧温度,右侧湿度 成品和仿真电路有区别,做着过程中发生了变化,就没有再去仿真了,就增加了俩个报警指示灯
(这里真是没想到,买个成品可能20块钱,但是你要做一个,各东西都得买。。前前后后下单了3次,这里只贴一张图吧。。,还买俩个万用表、电烙铁。。。。各种器件。。。线材啥的。。。。。反正很多)
(基本百度就完了,各种各样的都有,这个比较简单)左侧温度,右侧湿度
#include<reg51.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit Data=P3^6; //定义数据线 uchar rec_dat[9]; //用于显示的接收数据数组 //数码管数字 0--9 uint led[10]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { //rs=0时输入指令 P2=com; delay(5); } void DHT11_delay_us(uchar n) { while(--n); } void DHT11_delay_ms(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void DHT11_start() { Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(30); //延时18ms以上 Data=1; DHT11_delay_us(30); } uchar DHT11_rec_byte() //接收一个字节 { uchar i,dat=0; for(i=0;i<8;i++) //从高到低依次接收8位数据 { while(!Data); ////等待50us低电平过去 DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0 dat<<=1; //移位使正确接收8位数据,数据为0时直接移位 if(Data==1) //数据为1时,使dat加1来接收数据1 dat+=1; while(Data); //等待数据线拉低 } return dat; } //延时程序 单位ms void delay222(unsigned int x) { unsigned int i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } //设置温度值 void SetTemperature(uchar value) { //取出个位、十位数字 int unitPlace = value/1%10; int tenPlace = value/10%10; P0 = led[tenPlace]; P2 = 0x80; delay222(3); P2 = 0x00; P0 = led[unitPlace]; P2 = 0x40; delay222(3); P2 = 0x00; } //设置湿度值 void SetHumidity(uchar value) { //取出个位、十位数字 int unitPlace = value/1%10; int tenPlace = value/10%10; P0 = led[tenPlace]; P2 = 0x20; delay222(3); P2 = 0x00; P0 = led[unitPlace]; P2 = 0x10; delay222(3); P2 = 0x00; } void DHT11_receive() //接收40位的数据 { uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; int number; //闪烁频率 int count2; uchar tempValue; uchar humidityValue; number = 20; count2 = 0; DHT11_start(); count2 = 0; if(Data==0) { while(Data==0); //等待拉高 DHT11_delay_us(40); //拉高后延时80us R_H=DHT11_rec_byte(); //接收湿度高八位 R_L=DHT11_rec_byte(); //接收湿度低八位 T_H=DHT11_rec_byte(); //接收温度高八位 T_L=DHT11_rec_byte(); //接收温度低八位 revise=DHT11_rec_byte(); //接收校正位 DHT11_delay_us(25); //结束 if((R_H+R_L+T_H+T_L)==revise) //校正 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } /*数据处理,方便显示*/ // rec_dat[0]=‘0‘+(RH/10); // rec_dat[1]=‘0‘+(RH%10); // rec_dat[2]=‘R‘; // rec_dat[3]=‘H‘; // rec_dat[4]=‘ ‘; // rec_dat[5]=‘ ‘; // rec_dat[6]=‘0‘+(TH/10); // rec_dat[7]=‘0‘+(TH%10); // rec_dat[8]=‘C‘; //读取温度湿度 tempValue = RH; humidityValue = TH; while(count2 < number) { //设置温度 SetTemperature(tempValue); //设置湿度 SetHumidity(humidityValue); count2++; } count2=0; } } /*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中有详细讲解*/ void main() { uchar i; while(1) { DHT11_receive(); } }
买了俩个红色的2位共阳极数码管10脚的,结果没有接限流电阻,烧坏了一个,被迫又一次下单购买,结果购买错了,买了俩个绿色的共阴极18脚的,太恶心了,焊接过得人估计能体会
焊接的过程中,发现还可以增加个报警指示灯。于是又焊接了俩个报警指示灯连接到了P1.0(温度)和P1.1(湿度)
因为不会绘制pcb布线,就大概摆了一下,然后就开始焊接了。。。
实不相瞒,太恶心了,就因为买错了,买了个共阴极18脚的2位数码管。。就焊接成这样了,水平有限大神直接飘过吧。。。。
左侧是温度,右侧是湿度显示,然后因为数码管换了,所以程序也改了,并且新增了个报警指示灯
电路大概介绍
51单片机(STC89C52RC)读取DHT11模块温度湿度信号采集显示数码管
标签:开始 数据线 int start 大神 reg 程序员 技术 很多
原文地址:https://www.cnblogs.com/JiYF/p/12555161.html