欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
我的倒車雷達,超聲波測距(含源碼,工程圖)
[打印本頁]
作者:
銘銘之中
時間:
2017-1-7 01:02
標題:
我的倒車雷達,超聲波測距(含源碼,工程圖)
倒車雷達,超聲波測速。
內喊源碼和工程圖,通俗易懂。
0.png
(59.86 KB, 下載次數: 55)
下載附件
2017-1-8 23:25 上傳
所有資料下載:
超聲波帶報警 原理圖PCB圖.doc
(61.5 KB, 下載次數: 58)
2017-1-7 01:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
程序.doc
(41.5 KB, 下載次數: 42)
2017-1-7 01:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
下面是部分程序預覽:
#include<reg51.h>
#include<math.h>
/*定義數據類型*/
#define uint unsigned int
#define uchar unsigned char
/*定義系統常數*/
long int time; /* 時間 */
bit CLflag; /* 測量標志 */
char cshu; /* 串數 */
#define T12us (256-12) /*定時器設初值 T=(256-T12us)*12/12MHZ */
sbit VOLCK=P1^0; /* 發射 */
//接收從P3^2口輸入,采用外部中斷方式
sbit S1=P2^1;
sbit S2=P2^3;
sbit S3=P2^5;
sbit S4=P2^7;
sbit alam=P3^7; //報警
unsigned char number[5]; /* 用于存放距離顯示數據 */
unsigned char temp_number[5];
unsigned char fr_alam; //報警頻率控制計數
unsigned char icont; //距離計數
char code table[] ={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7}; //數字0-9的編碼
//{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
/* 碼表 0,1,2,3,4,5,6,7,8,9 */
/* 通用延時子程序 */
void delay( int j)
{
int i;
for(i=0;i<j;i++);
}
void display(void) /* 顯示5位數據 */
{
P0=~table[number[4]];
S1=0;
delay(200);
S1=1;
P0=~(table[number[3]]|0x20);
S2=0;
delay(200);
S2=1;
P0=~table[number[2]];
S3=0;
delay(200);
S3=1;
P0=~table[number[1]];
S4=0;
delay(200);
S4=1;
}
/* 初始化定時器,CTC0、CTC1用于定時 */
void init_CTC(void )
{
TMOD = 0x21; /* 設CTC1工作于模式2 */
ET0 = 0; /* 不允許CTC0中斷 */
}
void init_INT( ) /* 外部中斷初始化為高優先級,并開中斷 */
{
IP=0x01; /* 置外部中斷INT0優先級為高 */
TCON=0; /* 設置外部中斷0的中斷方式為電平觸發 */
}
//=========距離與頻率之間的轉化==============
void Distance_Frequency(void)
{
//以下語句用于計算距離與報警的頻率大小
if(number[3]>0) //表示距離大于1米時,不報警
icont=0;
else //否則
{
if(number[2]>0) //小于1米時,但分米大于0時,報警頻率與分米的數據成正比
{
switch(number[2])
{
case 9: icont=9; break;
case 8: icont=8; break;
case 7: icont=7; break;
case 6: icont=6; break;
case 5: icont=5; break;
case 4: icont=4; break;
case 3: icont=3; break;
case 2: icont=2; break;
case 1: icont=1; break;
default: break;
}
}
else //距離只在厘米時,高頻率輸出報警
{
if(number[1]>0)
icont=1;
else
icont=0;
}
}
}
void Timetojuli(void) /* 將測量的時間轉換為距離 */
{
long i;
i=(long)time*170;
temp_number[4]=i/10000000; /* 十米 */
i=i-temp_number[4]*10000000;
temp_number[3]=i/1000000; /* 米 */
i=i-temp_number[3]*1000000;
temp_number[2]=i/100000; /* 分米 */
i=i-temp_number[2]*100000;
temp_number[1]=i/10000; /* 厘米 */
i=i-(long)temp_number[1]*10000;
temp_number[0]=i/1000; /* 毫米 */
//以下用于控制是否測到距離,如全為0,表明沒有測到距離
if((temp_number[4]!=0)||(temp_number[3]!=0)||(temp_number[2]!=0)||(temp_number[1]!=0))
{
number[4]=temp_number[4]; //更新一次數據
number[3]=temp_number[3];
number[2]=temp_number[2];
number[1]=temp_number[1];
number[0]=temp_number[0];
Distance_Frequency(); //轉化一次
}
}
void serve_INT0( ) interrupt 0
{
/* 外部中斷0,用于檢測接收信號 */
TR0=0; /* 關閉定時器0 */
EX0=0; /* 關中斷 */
time=(long)TL0;
time+=(long)TH0*256;
Timetojuli(); //更新一次數據
CLflag=1;
TH0=0;
TL0=0;
}
void CTC0_INT ( ) interrupt 1
{
TR0=0;
ET0=0;
}
/* CTC1中斷服務程序,12.5us 中斷一次,用于發射 */
void CTC1_INT ( ) interrupt 3
{
VOLCK=~VOLCK;
cshu++;
}
/*主程序*/
void main()
{
init_CTC( ); /* 初始化定時器 */
init_INT( ); /* 初始化外部中斷 */
CLflag=1; /* 測量標志 */
cshu=0; /* 傳數 */
IE=0x80; /* 開中斷 */
ET1=1; ET0=1;
TR1=0; TR0=0;
TL1=T12us; TH1=T12us;
while(1)
{
CLflag=0;
cshu=0;
EX0=0;
TH1=T12us;
TL1=T12us;
TL0 = 0; TH0 = 0; /* 定時器0的初始時間 */
VOLCK=0;
TR1=1; /* 啟動定時器1,發送信號 */
while(cshu<20) ; /* 發10個脈沖串 */
TR1=0;
TR0=1; /* 啟動定時器0,開始記時 */
EX0=1;
display(); //調用顯示
// Distance_Frequency(); //調用距離頻率轉化程序
fr_alam++; //程序執行次數加1 用于控制報警頻率與距離成正比
if(icont>0) //表示距離控制位達到報警時
{
if(fr_alam>=icont)
{
fr_alam=0;
alam=~alam; //蜂鳴器取反一次,即響一聲
}
}
else //不報警時
{
alam=1;
}
}
}
復制代碼
作者:
duanxin
時間:
2017-9-21 11:34
沒有仿真的原理圖呀
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1