|
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
大一學(xué)生自己編程,供大家參考,仿真在下面
顯示效果----------第一行為距離-------第二行為溫濕度
注釋從keil復(fù)制過(guò)來(lái)的,不知為何變成了問(wèn)號(hào)
單片機(jī)源程序如下:
- #include<reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit rs=P3^5; //1602的數(shù)據(jù)/指令選擇控制線
- sbit en=P3^4; //1602的使能控制線
- sbit trig=P0^6; //超聲波測(cè)距模塊Trig
- sbit echo=P0^7; //超聲波測(cè)距模塊Echo
- float distance; //測(cè)量所得距離
- uchar code xianshi[]={"Distance: cm"} ;
- uchar code table[]={"0123456789"};
- uchar str1[2]; //存儲(chǔ)濕度數(shù)組
- uchar str2[2]; //存儲(chǔ)溫度數(shù)組
- sbit DATA = P3^7;//溫濕度傳感器DHT11數(shù)據(jù)接入端
- void display2();
- uchar TH_data,TL_data,RH_data,RL_data;
- uchar TH_temp,TL_temp,RH_temp,RL_temp;
- uchar check;
- uchar com_data,untemp,temp;
- uchar respond;
- void delay(uint n) //延時(shí)函數(shù)
- {
- uint x,y;
- for(x=n;x>0;x--)
- for(y=112;y>0;y--);
- }
- void delay_ms(uchar ms)// 毫秒延時(shí)函數(shù)
- { uchar i;
- while(ms--)
- {
- for(i = 0; i< 250; i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_(); //4us延時(shí)
- }
- }
- }
- void delay_us() //10us延時(shí)程序
- {
- uchar i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- uchar receive() // 把電平信息轉(zhuǎn)化為數(shù)據(jù)》》高電平持續(xù)26-28us為1;持續(xù)70us為0
- { uchar i;
- com_data=0;
- for(i=0;i<8;i++)
- { respond=1;
- while((!DATA)&&respond++); //當(dāng)總線變?yōu)楦唠娖綍r(shí),等待30us檢測(cè),若保持則為1;若變?yōu)榈蛣t為0;
- delay_us();
- delay_us();
- delay_us();
- if(DATA)
- {temp=1;
- respond=1;
- while((DATA)&&respond++);
- }
- else
- temp=0;
- com_data<<=1;
- com_data|=temp; // 將八位二進(jìn)制的數(shù)移位保存在com_data中
- }
- return(com_data); //返回至函數(shù) receive
- }
- void read_DATA()
- {
- DATA=0;
- delay_ms(18);
-
- DATA=1; //主機(jī)拉低18ms
-
- delay_us();
- delay_us();
- delay_us();
- delay_us(); //DATA總線由上拉電阻拉高 主機(jī)延時(shí)20us
- DATA=1;
-
- if(!DATA) //判斷從機(jī)是否有低電平響應(yīng)信號(hào),如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
- {
- respond=1;
-
- while((!DATA)&& respond++); //判斷從機(jī)發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
- respond=1;
-
- while(DATA && respond++); //判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
-
- RH_temp = receive();
- RL_temp = receive();
- TH_temp = receive();
- TL_temp = receive();
- check = receive(); //數(shù)據(jù)接收狀態(tài)
- DATA=1;
-
- untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
- if(untemp==check) //數(shù)據(jù)校驗(yàn)
- {
- RH_data = RH_temp;
- RL_data = RL_temp;
- TH_data = TH_temp;
- TL_data = TL_temp;
- }
- }
- //濕度部分
- str1[0] = RH_data/10;
- str1[1] = RH_data%10;
- //溫度部分
- str2[0] =TH_data/10;
- str2[1] =TH_data%10;
-
- }
- void lcd_com(uchar com) //命令函數(shù)
- {
- rs=0; //選擇指令寄存器
- P2=com; //把命令字送入P0
- delay(5); //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù)
- en=1;
- delay(5); //使能線電平變化,命令送入1602的8位數(shù)據(jù)口,這點(diǎn)非常重要
- en=0;
- }
- void lcd_dat(uchar dat) //數(shù)據(jù)函數(shù)
- {
- rs=1; //選擇數(shù)據(jù)寄存器
- P2=dat; //把要顯示的數(shù)據(jù)送入P0
- delay(5); //延時(shí)一小會(huì)兒,讓1602準(zhǔn)備接收數(shù)據(jù),也就是檢測(cè)忙信號(hào),這點(diǎn)非常重要。
- en=1; //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
- en=0;
- }
- void lcd_init() //1602液晶初始化函數(shù)
- {
- lcd_com(0x38); //8位數(shù)據(jù),雙列,5*7字形 ,用到功能設(shè)定指令
- lcd_com(0x0c); //開(kāi)啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍,用到顯示開(kāi)關(guān)控制指令
- lcd_com(0x06); //顯示地址遞增,即寫一個(gè)數(shù)據(jù)后,顯示位置右移一位,用到了寫入模式設(shè)置指令
- lcd_com(0x01); //清屏,用到了清屏指令
- }
-
- void lcd_xianshi() //液晶顯示函數(shù)
- {
- uint i;
- lcd_com(0x80);
- for(i=0;i<10;i++)
- lcd_dat(xianshi[i]);
-
-
- lcd_com(0x80+0x0e);//單位是厘米//
- for(i;i<14;i++)
- lcd_dat(xianshi[i]);
- }
- void measuring() //距離測(cè)量函數(shù)
- {
- float time;
- time=TH0*256+TL0;//把計(jì)時(shí)器的的值讀取到time
- time*=12/11.0592;
- distance=time *0.016 ;
-
- }
- void display(uint x) // 測(cè)量結(jié)果顯示函數(shù)
- {
- uint bai,shi,ge;
- bai=x/100;
- shi=(x/10%10); //或shi=x%100/10
- ge=(x%10);
-
-
- lcd_com(0x80+0x09);
- lcd_dat(table[bai]);
- lcd_dat(table[shi]);
- lcd_dat(table[ge]);
-
-
- TL0=0;
- TH0=0;
- }
- void main()
- {
-
- lcd_init(); //液晶初始化
- TMOD=0x01;
- TL0=0;
- TH0=0;
- EA=1; //定時(shí)器初始化
- trig=0;
- echo=1;
-
- while(1)
- {
-
- lcd_xianshi(); //液晶顯示特定字符
- trig=1;
- delay(50);
- trig=0;
-
- while(!echo);
- TR0=1; //echo為高電平時(shí)打開(kāi)計(jì)時(shí)器
- while(echo);
- TR0=0; //echo為低電平時(shí)關(guān)閉計(jì)時(shí)器
-
- measuring() ;
- display(distance);
-
- display2();
- delay_ms(60) ;
-
- }
-
- }
- void display2()
- {
- read_DATA();
- lcd_com(0x80+0x40);
- lcd_dat(table[str1[0]]);
- lcd_dat(table[str1[1]]);
- lcd_com(0x80+0x49);
- lcd_dat(table[str2[0]]);
- lcd_dat(table[str2[1]]);
- }
復(fù)制代碼
所有資料51hei提供下載:
超聲波測(cè)距與溫濕度模塊 1602液晶仿真.zip
(86.46 KB, 下載次數(shù): 214)
2019-8-8 11:13 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|