視頻鏈接: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í)函數(shù),延時(shí)1ms * 輸 入 : c * 輸 出 : 無(wú) * 說(shuō) 名 : 該函數(shù)是在12MHZ晶振下,12分頻單片機(jī)的延時(shí)。 *******************************************************************************/ 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寫入一個(gè)字節(jié)的命令 * 輸 入 : com * 輸 出 : 無(wú) *******************************************************************************/ 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; //寫入時(shí)序 Lcd1602_Delay1ms(5); //保持時(shí)間 LCD1602_E = 0; } /******************************************************************************* * 函 數(shù) 名 : LcdWriteData * 函數(shù)功能 : 向LCD寫入一個(gè)字節(jié)的數(shù)據(jù) * 輸 入 : dat * 輸 出 : 無(wú) *******************************************************************************/ 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; //寫入時(shí)序 Lcd1602_Delay1ms(5); //保持時(shí)間 LCD1602_E = 0; } /******************************************************************************* * 函 數(shù) 名 : LcdInit() * 函數(shù)功能 : 初始化LCD屏 * 輸 入 : 無(wú) * 輸 出 : 無(wú) *******************************************************************************/ void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x38); //開(kāi)顯示 LcdWriteCom(0x0c); //開(kāi)顯示不顯示光標(biāo) LcdWriteCom(0x06); //寫一個(gè)指針加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //設(shè)置數(shù)據(jù)指針起點(diǎn) } //按指定位置顯示一個(gè)字符 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)要顯示第二行時(shí)地址碼+0x40; X |= 0x80; // 算出指令碼 LcdWriteCom(X); //這里不檢測(cè)忙信號(hào),發(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]); //顯示單個(gè)字符 ListLength++; X++; } } } void StartModule() //啟動(dòng)模塊 { Trig=1; //啟動(dòng)一次模塊 _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為零時(shí)等待 TR0=1; //開(kāi)啟計(jì)數(shù) while(Echo); //當(dāng)RX為1計(jì)數(shù)并等待 TR0=0; //關(guān)閉計(jì)數(shù) time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.7)/100; //算出來(lái)是CM DIstance = S; if((S?>=700)||flag==1) //超出測(cè)量范圍顯示“-” { 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中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍 { flag=1; //中斷溢出標(biāo)志 } void Sr04_Init() { TMOD=0x01; //設(shè)T0為方式1,GATE=1; TH0=0; TL0=0; ET0=1; //允許T0中斷 EA=1; //開(kāi)啟總中斷 } 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)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
Proteus
+關(guān)注
關(guān)注
79文章
1692瀏覽量
106575 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41495 -
超聲波測(cè)距
+關(guān)注
關(guān)注
5文章
246瀏覽量
37923
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
超聲波測(cè)距系統(tǒng)設(shè)計(jì)
超聲波測(cè)距系統(tǒng)設(shè)計(jì)由于超聲波指向性強(qiáng),能量消耗緩慢,在介質(zhì)中傳播的距離較遠(yuǎn),因而超聲波經(jīng)常用于距離的測(cè)量,如測(cè)距儀和物位測(cè)量?jī)x等都可以通過(guò)
發(fā)表于 10-15 15:25
超聲波測(cè)距儀研究
根據(jù)聲波反射原理,應(yīng)用單片機(jī)(AT89S52)技術(shù)和UCM40T超聲波傳感器設(shè)計(jì)了一種超聲波測(cè)距儀。硬件部分主要由控制模塊、超聲波發(fā)射模塊、
發(fā)表于 03-04 15:38
超聲波測(cè)距原理
為此,文中嘗試以單片機(jī)AT89S52為核心,利用一對(duì)40 kHz壓電超聲傳感器設(shè)計(jì)一款體積較小、價(jià)格低廉、精度較高、具有溫度補(bǔ)償、實(shí)時(shí)LCD顯示和報(bào)警的超聲波測(cè)距儀。1
發(fā)表于 04-25 11:32
Proteus中的超聲波測(cè)距
本帖最后由 huhaihang 于 2015-4-11 16:21 編輯
求高手幫忙,誰(shuí)會(huì)在Proteus中仿真超聲波測(cè)距?請(qǐng)指教,謝謝!
發(fā)表于 04-11 15:55
基于STM32超聲波測(cè)距設(shè)計(jì)的合集
ARM內(nèi)核芯片STM32F103ZET6的32位嵌入式微處理器與帶有溫度補(bǔ)償?shù)腢S-100超聲波測(cè)距模塊實(shí)現(xiàn)聲波測(cè)距。STM32的串口資源相當(dāng)豐富,能提供5路串口,通過(guò)微處理器的串口實(shí)
發(fā)表于 09-05 16:13
超聲波測(cè)距原理
藍(lán)橋杯單片機(jī)必備知識(shí)-----(9)超聲波測(cè)距超聲波測(cè)距原理:超聲波發(fā)射器向某一方向發(fā)射超聲波,
發(fā)表于 07-19 09:08
超聲波測(cè)距的原理是什么
1、測(cè)距原理超聲波測(cè)距的原理是利用超聲波在空氣中的傳播速度為已知,測(cè)量聲波在發(fā)射后遇到障礙物反射回來(lái)的時(shí)間,根據(jù)發(fā)射和接收的時(shí)間差計(jì)算出發(fā)射
發(fā)表于 12-01 06:56
超聲波測(cè)距原理及簡(jiǎn)介
超聲波測(cè)距原理,超聲波測(cè)距是什么?本文針對(duì)這些內(nèi)容進(jìn)行詳細(xì)地分析闡述。
發(fā)表于 11-07 15:37
?1.1w次閱讀
超聲波測(cè)距
超聲波測(cè)距源文件,詳細(xì)介紹了基于51單片機(jī)的超聲波測(cè)距原理,該文件包含設(shè)計(jì)的源程序。
發(fā)表于 05-20 10:12
?182次下載
超聲波測(cè)距資料(HC-SR04)_TB
超聲波測(cè)距資料(HC-SR04)_TB
超聲波PIC單片機(jī)C程序超聲波測(cè)距51C程序超聲波
發(fā)表于 03-14 15:13
?195次下載
評(píng)論