|
#include<reg52.h>
#include<intrins.h> //包涵了_nop_()函數(shù)聲明
typedef unsigned int unint;
typedef unsigned char unchar;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit dula = P2^6;
sbit wela = P2^7;
//TRIG 為控制端
sbit TRIG = P1^6; //超聲波的 TRIG端 插在了P1.6口
//ECHO 為接收端
sbit ECHO = P1^7; //超聲波的 ECHO端 插在了P1.7口
/*還有vcc,gnd 就直接插在了單片機(jī) vcc 和gnd 端口了
*也可以將其插在I/O引腳中 將插 vcc的引腳置高電平,gnd置低電平*/
unchar flag = 0; //標(biāo)志定時(shí)器是否溢出
void delayed(unsigned int x); //延時(shí)xmS
void delay_50us(); // 延時(shí)20ms
void init_time(); //初始化定時(shí)器的函數(shù)
void display(int num); //數(shù)碼管顯示函數(shù)
void main()
{
int x; //用到就知道干什么用了
//寫(xiě)程序時(shí)也不用急著將所有變量都定義了 用到一個(gè)定義一個(gè)
unint time_data,out_TH0,out_TL0;
TRIG = 0; // 先給控制端初始化為0
while(1)
{
/*超聲波傳感器的使用方法:
控制口發(fā)一個(gè)10US 以上的高電平,就可以在接收口等待高電平輸出.
一有輸出就可以開(kāi)定時(shí)器計(jì)時(shí),當(dāng)此口變?yōu)榈碗娖綍r(shí)就可以讀定時(shí)器的,
此時(shí)就為此次測(cè)距的時(shí)間,方可算出距離.如此不斷的周期測(cè),
就可以達(dá)到你移動(dòng)測(cè)量的值了*/
init_time(); //初始化定時(shí)器
flag = 0; //置溢出標(biāo)志位為0
//控制口發(fā)一個(gè)10US 以上的高電平
TRIG = 1;
delay_50us();
TRIG = 0;
//等待接收端出現(xiàn)高電平
while(!ECHO);
TR0 = 1; //啟動(dòng)計(jì)時(shí)器 開(kāi)始計(jì)時(shí)
while(ECHO); //等待高電平結(jié)束
TR0 = 0; //關(guān)閉低電平
out_TH0 = TH0; //取定時(shí)器的值
out_TL0 = TL0;
out_TH0 <<= 8; //右移8位
time_data = out_TH0 | out_TL0; //合并為16位的值
time_data /= 58/10; // 微秒/58 = 厘米
/* 為什么微秒/58 = 厘米
* Y米 = (X秒 * 344) 2
* X秒 = (2 * Y米) / 344
* X秒 = 0.0058*Y米
* 厘米 = 微秒/58 */
if(flag == 1) //如果定時(shí)器溢出 則超出超聲波測(cè)量范圍
{
display(-1);
}
else
{
for(x =5; x >=0; x--)//加此循環(huán)只是為了將結(jié)果在數(shù)碼管上停留時(shí)間長(zhǎng)點(diǎn)便于觀察
{
display(time_data);
}
}
}
}
void timer0() interrupt 1 //中斷函數(shù)
{
flag=1; //溢出標(biāo)志位置1
}
void delayed(unsigned int x) //延時(shí)xmS
{
unsigned int i,j;
for(i = x; i > 0; i--)
{
for(j = 113; j >0; j--);
}
}
void init_time()
{
TMOD = 0x01; //選擇定時(shí)器0工作 工作方式為方式1
TH0 = 0; //裝初值0
TL0 = 0;
TF0 = 0; //中斷溢出標(biāo)志位
ET0 = 1; //開(kāi)定時(shí)器中斷
EA = 1; // 開(kāi)總中斷
}
void display(int num) //顯示函數(shù)
{
if(num == -1) //當(dāng)超出范圍 顯示999
{
dula = 1;
P0 = table[6];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xc0;
wela=1;
P0 = 0xf7;
wela = 0;
}
else //顯示到前三個(gè)數(shù)碼管上 因?yàn)闇y(cè)距范圍為2-400cm 故3位即可
{
unchar t;
t = num / 1000; //取百位
dula = 1;
P0 = table[t];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfe;
wela = 0;
delayed(10);
t = num / 100; //取百位
dula = 1;
P0 = table[t];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfd;
wela = 0;
delayed(10);
t = num/10%10; //取十位
dula = 1;
P0 = table[t];
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xfb;
wela = 0;
delayed(10);
t = num %10;
dula = 1;
P0 = table[t]; //取個(gè)位
dula = 0;
P0 = 0xff;
wela = 1;
P0 = 0xf7;
wela = 0;
delayed(10);
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
|
-
QQ圖片20180928182358.jpg
(397.39 KB, 下載次數(shù): 48)
下載附件
2018-9-28 18:24 上傳
此仿真為
-
-
cj.rar
2018-9-28 18:18 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
17.45 KB, 下載次數(shù): 49, 下載積分: 黑幣 -5
評(píng)分
-
查看全部評(píng)分
|