|
倒車?yán)走_(dá),超聲波測(cè)速。
內(nèi)喊源碼和工程圖,通俗易懂。
0.png (59.86 KB, 下載次數(shù): 55)
下載附件
2017-1-8 23:25 上傳
所有資料下載:
超聲波帶報(bào)警 原理圖PCB圖.doc
(61.5 KB, 下載次數(shù): 58)
2017-1-7 01:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
程序.doc
(41.5 KB, 下載次數(shù): 42)
2017-1-7 01:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
下面是部分程序預(yù)覽:
- #include<reg51.h>
- #include<math.h>
- /*定義數(shù)據(jù)類型*/
- #define uint unsigned int
- #define uchar unsigned char
- /*定義系統(tǒng)常數(shù)*/
- long int time; /* 時(shí)間 */
- bit CLflag; /* 測(cè)量標(biāo)志 */
- char cshu; /* 串?dāng)?shù) */
- #define T12us (256-12) /*定時(shí)器設(shè)初值 T=(256-T12us)*12/12MHZ */
- sbit VOLCK=P1^0; /* 發(fā)射 */
- //接收從P3^2口輸入,采用外部中斷方式
- sbit S1=P2^1;
- sbit S2=P2^3;
- sbit S3=P2^5;
- sbit S4=P2^7;
- sbit alam=P3^7; //報(bào)警
- unsigned char number[5]; /* 用于存放距離顯示數(shù)據(jù) */
- unsigned char temp_number[5];
- unsigned char fr_alam; //報(bào)警頻率控制計(jì)數(shù)
- unsigned char icont; //距離計(jì)數(shù)
- char code table[] ={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7}; //數(shù)字0-9的編碼
- //{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
- /* 碼表 0,1,2,3,4,5,6,7,8,9 */
- /* 通用延時(shí)子程序 */
- void delay( int j)
- {
- int i;
- for(i=0;i<j;i++);
- }
- void display(void) /* 顯示5位數(shù)據(jù) */
- {
- 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;
- }
- /* 初始化定時(shí)器,CTC0、CTC1用于定時(shí) */
- void init_CTC(void )
- {
- TMOD = 0x21; /* 設(shè)CTC1工作于模式2 */
- ET0 = 0; /* 不允許CTC0中斷 */
- }
- void init_INT( ) /* 外部中斷初始化為高優(yōu)先級(jí),并開中斷 */
- {
- IP=0x01; /* 置外部中斷INT0優(yōu)先級(jí)為高 */
- TCON=0; /* 設(shè)置外部中斷0的中斷方式為電平觸發(fā) */
- }
- //=========距離與頻率之間的轉(zhuǎn)化==============
- void Distance_Frequency(void)
- {
- //以下語句用于計(jì)算距離與報(bào)警的頻率大小
- if(number[3]>0) //表示距離大于1米時(shí),不報(bào)警
- icont=0;
- else //否則
- {
- if(number[2]>0) //小于1米時(shí),但分米大于0時(shí),報(bào)警頻率與分米的數(shù)據(jù)成正比
- {
- 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 //距離只在厘米時(shí),高頻率輸出報(bào)警
- {
- if(number[1]>0)
- icont=1;
- else
- icont=0;
- }
- }
- }
- void Timetojuli(void) /* 將測(cè)量的時(shí)間轉(zhuǎn)換為距離 */
- {
- 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; /* 毫米 */
- //以下用于控制是否測(cè)到距離,如全為0,表明沒有測(cè)到距離
- if((temp_number[4]!=0)||(temp_number[3]!=0)||(temp_number[2]!=0)||(temp_number[1]!=0))
- {
- number[4]=temp_number[4]; //更新一次數(shù)據(jù)
- number[3]=temp_number[3];
- number[2]=temp_number[2];
- number[1]=temp_number[1];
- number[0]=temp_number[0];
- Distance_Frequency(); //轉(zhuǎn)化一次
- }
- }
- void serve_INT0( ) interrupt 0
- {
- /* 外部中斷0,用于檢測(cè)接收信號(hào) */
- TR0=0; /* 關(guān)閉定時(shí)器0 */
- EX0=0; /* 關(guān)中斷 */
- time=(long)TL0;
- time+=(long)TH0*256;
- Timetojuli(); //更新一次數(shù)據(jù)
- CLflag=1;
- TH0=0;
- TL0=0;
- }
- void CTC0_INT ( ) interrupt 1
- {
- TR0=0;
- ET0=0;
- }
- /* CTC1中斷服務(wù)程序,12.5us 中斷一次,用于發(fā)射 */
- void CTC1_INT ( ) interrupt 3
- {
- VOLCK=~VOLCK;
- cshu++;
- }
- /*主程序*/
- void main()
- {
- init_CTC( ); /* 初始化定時(shí)器 */
- init_INT( ); /* 初始化外部中斷 */
- CLflag=1; /* 測(cè)量標(biāo)志 */
- cshu=0; /* 傳數(shù) */
- 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; /* 定時(shí)器0的初始時(shí)間 */
- VOLCK=0;
- TR1=1; /* 啟動(dòng)定時(shí)器1,發(fā)送信號(hào) */
- while(cshu<20) ; /* 發(fā)10個(gè)脈沖串 */
- TR1=0;
- TR0=1; /* 啟動(dòng)定時(shí)器0,開始記時(shí) */
- EX0=1;
- display(); //調(diào)用顯示
- // Distance_Frequency(); //調(diào)用距離頻率轉(zhuǎn)化程序
- fr_alam++; //程序執(zhí)行次數(shù)加1 用于控制報(bào)警頻率與距離成正比
- if(icont>0) //表示距離控制位達(dá)到報(bào)警時(shí)
- {
- if(fr_alam>=icont)
- {
- fr_alam=0;
- alam=~alam; //蜂鳴器取反一次,即響一聲
- }
- }
- else //不報(bào)警時(shí)
- {
- alam=1;
- }
- }
- }
復(fù)制代碼 |
|