視頻鏈接:https://www.bilibili.com/video/BV1ik4y1677Q
#include #include #define uchar unsigned char #define uint unsigned int #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^2; sbit LCD1602_RW=P2^1; sbit LCD1602_RS=P2^0; sbit Trig = P1^0; sbit Echo = P1^1; unsigned long S=0; bit flag =0; unsigned int DIstance,time; /******************************************************************************* * 函 數(shù) 名 : Lcd1602_Delay1ms * 函數(shù)功能 : 延時函數(shù),延時1ms * 輸 入 : c * 輸 出 : 無 * 說 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時。 *******************************************************************************/ void Lcd1602_Delay1ms(uint c) //誤差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 數(shù) 名 : LcdWriteCom * 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令 * 輸 入 : com * 輸 出 : 無 *******************************************************************************/ void LcdWriteCom(uchar com) //寫入命令 { LCD1602_E = 0; //使能 LCD1602_RS = 0; //選擇發(fā)送命令 LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = com; //放入命令 Lcd1602_Delay1ms(1); //等待數(shù)據(jù)穩(wěn)定 LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); //保持時間 LCD1602_E = 0; } /******************************************************************************* * 函 數(shù) 名 : LcdWriteData * 函數(shù)功能 : 向LCD寫入一個字節(jié)的數(shù)據(jù) * 輸 入 : dat * 輸 出 : 無 *******************************************************************************/ void LcdWriteData(uchar dat) //寫入數(shù)據(jù) { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //選擇輸入數(shù)據(jù) LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = dat; //寫入數(shù)據(jù) Lcd1602_Delay1ms(1); LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); //保持時間 LCD1602_E = 0; } /******************************************************************************* * 函 數(shù) 名 : LcdInit() * 函數(shù)功能 : 初始化LCD屏 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x38); //開顯示 LcdWriteCom(0x0c); //開顯示不顯示光標(biāo) LcdWriteCom(0x06); //寫一個指針加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn) } //按指定位置顯示一個字符 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //當(dāng)要顯示第二行時地址碼+0x40; X |= 0x80; // 算出指令碼 LcdWriteCom(X); //這里不檢測忙信號,發(fā)送地址碼 LcdWriteData(DData); } //按指定位置顯示一串字符 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) { unsigned char ListLength; ListLength = 0; Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>=0x20) //若到達(dá)字串尾則退出 { if (X <= 0xF) //X坐標(biāo)應(yīng)小于0xF { DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符 ListLength++; X++; } } } void StartModule() //啟動模塊 { Trig=1; //啟動一次模塊 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0; } void Conut(void) { StartModule(); while(!Echo); //當(dāng)RX為零時等待 TR0=1; //開啟計數(shù) while(Echo); //當(dāng)RX為1計數(shù)并等待 TR0=0; //關(guān)閉計數(shù) time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100; //算出來是CM DIstance = S; if((S?>=700)||flag==1) //超出測量范圍顯示“-” { flag=0; DisplayOneChar(0, 1, '0'); DisplayOneChar(1, 1, '.'); //顯示點(diǎn) DisplayOneChar(2, 1, '0'); DisplayOneChar(3, 1, '0'); DisplayOneChar(4, 1, 'M'); //顯示M } else { DisplayOneChar(0, 1, (char)(S/100+'0')); DisplayOneChar(1, 1, '.'); //顯示點(diǎn) DisplayOneChar(2, 1, (char)(S/10%10+'0')); DisplayOneChar(3, 1, (char)(S%10+'0')); DisplayOneChar(4, 1, 'M'); //顯示M } } void zd0() interrupt 1 //T0中斷用來計數(shù)器溢出,超過測距范圍 { flag=1; //中斷溢出標(biāo)志 } void Sr04_Init() { TMOD=0x01; //設(shè)T0為方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允許T0中斷 EA=1; //開啟總中斷 } void main() { Sr04_Init(); LcdInit(); DisplayListChar(0,0,"Welcome"); while(1) { Conut(); } }
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
Proteus
+關(guān)注
關(guān)注
79文章
1692瀏覽量
106799 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41725 -
超聲波測距
+關(guān)注
關(guān)注
5文章
246瀏覽量
37988
發(fā)布評論請先 登錄
相關(guān)推薦
超聲波測距系統(tǒng)設(shè)計
超聲波測距系統(tǒng)設(shè)計由于超聲波指向性強(qiáng),能量消耗緩慢,在介質(zhì)中傳播的距離較遠(yuǎn),因而超聲波經(jīng)常用于距離的測量,如測距儀和物位測量儀等都可以通過
發(fā)表于 10-15 15:25
超聲波測距儀研究
根據(jù)聲波反射原理,應(yīng)用單片機(jī)(AT89S52)技術(shù)和UCM40T超聲波傳感器設(shè)計了一種超聲波測距儀。硬件部分主要由控制模塊、超聲波發(fā)射模塊、
發(fā)表于 03-04 15:38
超聲波測距原理
為此,文中嘗試以單片機(jī)AT89S52為核心,利用一對40 kHz壓電超聲傳感器設(shè)計一款體積較小、價格低廉、精度較高、具有溫度補(bǔ)償、實(shí)時LCD顯示和報警的超聲波測距儀。1
發(fā)表于 04-25 11:32
Proteus中的超聲波測距
本帖最后由 huhaihang 于 2015-4-11 16:21 編輯
求高手幫忙,誰會在Proteus中仿真超聲波測距?請指教,謝謝!
發(fā)表于 04-11 15:55
基于STM32超聲波測距設(shè)計的合集
ARM內(nèi)核芯片STM32F103ZET6的32位嵌入式微處理器與帶有溫度補(bǔ)償?shù)腢S-100超聲波測距模塊實(shí)現(xiàn)聲波測距。STM32的串口資源相當(dāng)豐富,能提供5路串口,通過微處理器的串口實(shí)
發(fā)表于 09-05 16:13
超聲波測距的原理是什么
1、測距原理超聲波測距的原理是利用超聲波在空氣中的傳播速度為已知,測量聲波在發(fā)射后遇到障礙物反射回來的時間,根據(jù)發(fā)射和接收的時間差計算出發(fā)射
發(fā)表于 12-01 06:56
評論