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