国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
基于51單片機的LCD12864超聲波測距+溫濕度顯示代碼
[打印本頁]
作者:
coolfire
時間:
2021-4-30 02:13
標題:
基于51單片機的LCD12864超聲波測距+溫濕度顯示代碼
89c52rc單片機控制超聲波測距和讀取實時的溫濕度情況,按鍵控制切換注釋準確。
完整程序:
整合版本加按鍵C源碼.zip
(61.35 KB, 售價: 1 E幣)
2021-4-30 02:13 上傳
點擊文件名下載附件
售價: 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;
}
復制代碼
歡迎光臨 ELEOK (http://www.afoofa.cn/)
Powered by Discuz! X5.0