89c52rc单片机控制超声波测距和读取实时的温湿度情况,按键控制切换注释准确。
完整程序:
整合版本加按键C源码.zip
(61.35 KB, 售价: 1 E币)
单片机源程序部分如下: 完整源码请查看附件
- #include <reg52.h> //51 的头文件
- #include <intrins.h> //超声波的固有函数头文件
- #define uchar unsigned char //表示之后代码中的“uchar”全部代表“unsigned char”
- #define uint unsigned int //定义uint为无符号整型。
- #define LCD_databus P2 //定义LCD的数据口为P2
- //全局变量定义
- unsigned int time; //声明无符号类型 time
- unsigned int S,s_false; //声明无符号类型
- unsigned long num1; //声明无符号长整数
- bit flag;
- //12864液晶显示定义
- uchar code sj1[]={"<<超声波测距仪>>"};
- uchar code sj4[]={"当前距离:"};
- uchar code sj5[]={"错误 "};
- uchar dht_num=0; //用于while循环中计数,超时则跳出循环
- uchar code table[]={"温度:"};
- uchar code table1[]={"湿度:"};
- uchar code table2[]={"℃"};
- uchar dht_d1=0,dht_d2=0 ; //依次为湿度整数部分和湿度小数部
- uchar dht_t1=0,dht_t2=0 ; //依次为温度整数部分和温度小数部分
- uchar dht_j=0; //和校验,可选择是否使用,具体参照数据手
- uchar i,t11,t12,d11,d12;
- uchar t21,t22,d21,d22;
- //超声波引脚定义
- sbit Trig =P1^0; //定义引脚
- sbit Echo =P1^1;
- //12864液晶引脚定义
- sbit RS=P0^7; //命令数据
- sbit RW=P0^6; //读写
- sbit EN =P0^5;
- sbit dht_dat=P1^2; //用哪个I/O口自选,注意不要用P2口
- //定义按键
- sbit key1 = P3^5;
- sbit key2 = P3^4;
- /*****************ms延时函数*********************************/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*****************20us延时函数*********************************/
- void delay_20us()
- {
- uchar a;
- for(a=0;a<100;a++);
- }
- /*****************ms延时函数*********************************/
- void dh11delayms(uint xms)
- {
- uint i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- /*****************us延时函数*****************************/
- void delay_10us()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*写指令函数*/
- /*rs=l,rw=l,en=高脉冲,D0-D7=指令码。*/
- void write_cmd(uchar cmd)
- {
- RS=0;
- RW=0;
- EN=0;
- LCD_databus=cmd;
- dh11delayms(5);
- EN=1;
- dh11delayms(5);
- EN=0;
- }
- /***************************写显示数据************************/
- /*rs=h,rw=l,*/
- void write_dat(uchar date)
- {
- RS=1;
- RW=0;
- EN=0;
- LCD_databus=date;
- dh11delayms(5);
- EN=1;
- dh11delayms(5);
- EN=0;
- }
- /*****************初始化************************/
- void DH11init()
- {
- EN=0;
- RW=0;
-
- write_cmd(0x30); //基本指令操作
- dh11delayms(5);
- write_cmd(0x0c); //显示开,关光标
- dh11delayms(5);
- write_cmd(0x06);
- dh11delayms(2);
- write_cmd(0x01); //清除显示内容
- dh11delayms(5);
-
-
- }
- void dht_init()
- {
- dh11delayms(1000); //DHT11上电前准备时间,大概1s
- dht_dat=1; // //总线准备
- }
- uchar read_date() //接收一个8位数据,先高位后低位
- {
- uchar i,dat;
- for(i=0;i<8;i++) //也就是说程序是循环八次,把判断有“1”输出到dat中,然后输出一个八位的数据。
- {
- dht_num=2;
- while((dht_dat==0)&&(dht_num++)); //dht_dat 数据线由DH11拉低准备发送数据
- delay_10us();
- delay_10us();
- delay_10us();
- delay_10us();
- dat=dat<<1;
- if(dht_dat==1)
- {
- dht_num=2;
- dat=dat|0x01; //如果来自DQ的数据是高电平1,则把1放到dat的最低位
- while((dht_dat==1)&&(dht_num++));
- }
- }
- return dat;
- }
- void get_temp() //给DHT11一个开始信号,然后读取一次数据,共五个8位字节
- {
- dht_dat=0;
- dh11delayms(25);
- dht_dat=1; //单片机给起始脉冲信号
- delay_10us();
- delay_10us();
- delay_10us();
- delay_10us();
- dht_dat=1; //稍作延时,等待DHT11返回响应(响应为低电 平)
- if(dht_dat==0) //有响应才接收数据,否则不作处理
- {
- dht_num=2;
- while((dht_dat==0)&&(dht_num++));
- dht_num=2;
- while((dht_dat==1)&&(dht_num++));
- dht_d1=read_date();
- dht_d2=read_date();
- dht_t1=read_date();
- dht_t2=read_date();
- dht_j=read_date(); //一次读出五个数据
- }
- dht_dat=1; //释放总线
- dh11delayms(10);
- d11=dht_d1/10;
- d12=dht_d1%10;
- t11=dht_t1/10;
- t12=dht_t1%10;
-
- d21=dht_d2/10;
- d22=dht_d2%10;
- t21=dht_t2/10;
- t22=dht_t2%10;
-
- }
- //2864液晶写命令函数
- void xmn(unsigned char com)
- {
- RS=0;
- LCD_databus=com;
- delay(5);
- EN=1;
- delay(5);
- EN=0;
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|