|
超聲波測(cè)距源碼
超聲波測(cè)距源碼.docx
(12.91 KB, 下載次數(shù): 4)
2017-6-2 10:34 上傳
點(diǎn)擊文件名下載附件
源碼 下載積分: 黑幣 -5
- /**************************************************************************/
- *********采用IO口TRIG觸發(fā)測(cè)距,給至少10us的高電平信號(hào); (2)模塊自動(dòng)發(fā)送8個(gè)40khz
- 的方波,自動(dòng)檢測(cè)是否有信號(hào)返回; (3)有信號(hào)返回,通過(guò)IO口ECHO輸出一個(gè)高電平,
- 高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。*****************************/
- #include"reg52.h"
- #include"intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};// 顯示段碼值0123456789
- sbit lcden=P3^4; //定義LCD使能端
- sbit lcdrs=P3^5; //定義LCD讀寫端
- sbit dula=P2^6; //數(shù)碼管段先端
- sbit wela=P2^7; //數(shù)碼管位先端
- /***********************************************/
- /**********超聲波檢測(cè)引腳和變量定義*******************************/
- sbit Trig=P2^4;// 定義HC-SR04發(fā)送端
- sbit Echo=P2^5;//定義HC-SR04接收端
- uint gewei='0'; //測(cè)量距離的個(gè)位
- uint shiwei='0'; // 測(cè)量距離的十位
- uint baiwei='0'; //測(cè)量距離的百位
- uint s,time,flag;
- /***********************************************/
- /**********延時(shí)MS函數(shù)*******************************/
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /***********************************************/
- /**********延時(shí)uS函數(shù)*******************************/
- void delay_uS(uint z)
- {
- while(z--);
- }
- /***********************************************/
- /**********寫命令*******************************/
- void write_com(uchar com)
- {
- lcdrs=0; //寫命令信號(hào)
- P0=com; //寫命令字
- delay(5); //延時(shí)
- lcden=1; //開(kāi)使能端
- delay(5);
- lcden=0;
- }
- /***********************************************/
- /**********寫數(shù)據(jù)*******************************/
- void write_data(uchar date)
- {
- lcdrs=1; //寫數(shù)據(jù)信號(hào)
- P0=date; //寫數(shù)據(jù)
- delay(5); //延時(shí)
- lcden=1; //開(kāi)使能端
- delay(5);
- lcden=0;
- }
- /**********************************************/
- /***********************************************/
- /**********LCD1602初始化函數(shù)*******************************/
- void init()
- {
- dula=0;
- wela=0;
- lcden=0;
- write_com(0x38); //設(shè)置16X2顯示,5X7點(diǎn)陣顯示
- write_com(0x0c); //開(kāi)顯示,不顯光標(biāo)
- write_com(0x06); //顯示一個(gè)字符后,地址指針加1且光標(biāo)加1
- write_com(0x01); //清屏
- write_com(0x80+0x01); //從第一行0X10地址位開(kāi)始顯示
- }
- /***********************************************/
- /**********計(jì)算距離函數(shù)*******************************/
- void count(void)
- {
- time=TH0*256+TL0; //檢測(cè)所需時(shí)間
- TH0=0;
- TL0=0;
- s=time/58;// 計(jì)算距離,算出來(lái)的單位是CM
- gewei=table[s%1000];
- shiwei=table[s%1000/100];
- baiwei=table[s%1000%100%10];
- }
- /***********************************************/
- /**********T0中斷函數(shù)*******************************/
- void Time0() interrupt 1 //T0中斷用作計(jì)數(shù)器溢出,超出測(cè)距范圍
- {
- flag=1; //中斷溢出標(biāo)志
- }
- /***********************************************/
- /**********啟動(dòng)模塊函數(shù)*******************************/
- void startmodle(void) //啟動(dòng)檢測(cè)模塊
- {
- Trig=1; //啟動(dòng)一次檢測(cè)模塊
- delay_uS(20);
- Trig=0; //停止向檢測(cè)模塊Trig端發(fā)送高電平
- }
- /***********************************************/
- /**********中斷初始化函數(shù)*******************************/
- void InterruptInit(void) //中斷初始化
- {
- TMOD=0x01; //高T0工作方式為方式1,GATE=1
- TH0=0;
- TL0=0;
- ET0=1; //允許T0中斷
- EA=1; // 開(kāi)啟總中斷
- }
- /***********************************************/
- /**********顯示函數(shù)*******************************/
- void Display(void)
- {
- write_com(0x80+0x02);
- write_data(baiwei);
- write_com(0x80+0x03);
- write_data('.');
- write_com(0x80+0x04);
- write_data(shiwei);
- write_com(0x80+0x05);
- write_data(gewei);
- write_com(0x80+0x06);
- write_data('M');
- }
- /***********************************************/
- /**********主函數(shù)*******************************/
- void main(void)
- {
- init(); //初始化LCD1602
- while(1)
- {
- InterruptInit(); //中斷初始化
- startmodle(); // 啟動(dòng)檢測(cè)模塊
- while(!Echo); //當(dāng)接收為零時(shí)等待
- TR0=1; //開(kāi)啟計(jì)數(shù)
- while(Echo); //當(dāng)接收為1計(jì)數(shù)并等待
- TR0=0; //關(guān)閉計(jì)數(shù)
- count(); //計(jì)算距離
- Display(); // 顯示距離,以M為單位
- delay(500); //延時(shí)80MS
- }
- }
復(fù)制代碼
|
|