|
其實(shí)超聲波賊簡單,只是難者不會(huì),會(huì)者不難而已。
核心就是先讓Trig產(chǎn)生10+us的高電平,然后等待echo的出現(xiàn)高電平,開啟定時(shí)器進(jìn)行計(jì)數(shù),完了關(guān)閉計(jì)數(shù)。計(jì)數(shù)對應(yīng)的時(shí)間就是往返的時(shí)間。
乘以聲速除以2就是距離。
不多說了,看代碼一切理解。
- #include <stdio.h>
- #include <reg51.h>
- #include <intrins.h>
- sbit echo = P2 ^ 1;//超聲波測距的數(shù)據(jù)返回端口
- sbit trig = P2 ^ 0;//起始控制端口
- unsigned char flag = 0;
- unsigned int time=0;//計(jì)數(shù)
- float length;//返回距離
- unsigned char str[12];
- extern void InitLcd1602();
- extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
- void LcdFullClear();
- void FloatToStr(unsigned char *str, float dat)
- {
- unsigned int H, L;
- signed char i = 0;
- unsigned char buf[12] = {0};
- H = (unsigned int)dat;
- L = dat*100-H*100;
- do { //先轉(zhuǎn)換為低位在前的十進(jìn)制數(shù)組
- buf[i++] = H % 10;
- H /= 10;
- } while (H > 0);
- while (i-- > 0) //將數(shù)組值轉(zhuǎn)換為ASCII碼反向拷貝到接收指針上
- {
- *str++ = buf[i] + '0';
- }
- *str++ = '.';
- *str++ = L/10 + '0';
- *str++ = L%10 + '0';
- *str = '\0';
- }
- void Init()//用于初始化設(shè)置定時(shí)器和串口波特率
- {
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = 0xFD;//串口設(shè)置
- TI = 1;
- TR1 = 1; //開啟定時(shí)器
- TMOD = 0x21; //設(shè)T0為方式1
- TH0 = 0;
- TL0 = 0;
- TR0 = 0;//定時(shí)器初始關(guān)閉
- ET0 = 1; //允許T0中斷
-
- EA = 1; //開啟總中斷
-
- }
- void start_10() //10us+的起始信號(hào)
- {
- int i;
- trig = 1;
- for (i = 0; i <= 13; i++)
- {
- _nop_();
- }
- trig = 0; //重新拉回低電平
- }
- void Count(void)//用于將時(shí)間換算成長度
- {
- unsigned char str[12];
-
- time = TH0 * 256 + TL0;
- TH0 = 0;
- TL0 = 0;
- length = (time * 1.87)/100; //算出來是CM
- if(!flag)
- {
- //printf("%f\n",length);
- FloatToStr(str, length);
- LcdShowStr(2,0, str);
- }
- else
- {
- flag = 0;
- //printf("error\n");
- LcdShowStr(2,0, "error");
- }
- }
- void Delay500ms() //@11.0592MHz
- {
- unsigned char i, j, k;
- i = 22;
- j = 3;
- k = 227;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Scan()
- {
- start_10();
- while (!echo); //當(dāng)RX為零時(shí)等待
- TR0 = 1; //開啟計(jì)數(shù)
- while (echo); //當(dāng)RX為1計(jì)數(shù)并等待
- TR0 = 0; //關(guān)閉計(jì)數(shù)
- Count();//計(jì)算出距離
- Delay500ms();
- LcdFullClear();
- }
- void main()
- {
- Init();//定時(shí)器初始化
- InitLcd1602();
- while(1)
- {
- Scan();
- }
- }
- void Timer0() interrupt 1
- {
- flag = 1;
- }
復(fù)制代碼
|
評分
-
查看全部評分
|