標(biāo)題:
超聲波測(cè)距單片機(jī)源碼
[打印本頁]
作者:
jlqiu
時(shí)間:
2017-6-2 10:36
標(biāo)題:
超聲波測(cè)距單片機(jī)源碼
超聲波測(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)返回,通過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; //開使能端
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; //開使能端
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); //開顯示,不顯光標(biāo)
write_com(0x06); //顯示一個(gè)字符后,地址指針加1且光標(biāo)加1
write_com(0x01); //清屏
write_com(0x80+0x01); //從第一行0X10地址位開始顯示
}
/***********************************************/
/**********計(jì)算距離函數(shù)*******************************/
void count(void)
{
time=TH0*256+TL0; //檢測(cè)所需時(shí)間
TH0=0;
TL0=0;
s=time/58;// 計(jì)算距離,算出來的單位是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; // 開啟總中斷
}
/***********************************************/
/**********顯示函數(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; //開啟計(jì)數(shù)
while(Echo); //當(dāng)接收為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
count(); //計(jì)算距離
Display(); // 顯示距離,以M為單位
delay(500); //延時(shí)80MS
}
}
復(fù)制代碼
作者:
jlqiu
時(shí)間:
2017-6-2 13:35
歡迎大家來討論
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1