|
超聲波測距顯示程序
- #include <reg52.h>
- #include <intrins.h>
- #include <math.h>
- /************************************宏定義************************************/
- #define VELOCITY_30C 3495 //30攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
- #define VELOCITY_23C 3453 //23攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
- #define uchar unsigned char
- #define uint unsigned int
- /************************************位定義************************************/
- sbit LED = P1^4; //危險距離指示燈
- sbit rs = P3^5; //LCD顯示器重置端
- sbit lcden = P3^4; //LCD顯示器使能端
- sbit INPUT = P3^6; //回聲接收端口 echo
- sbit OUTPUT = P3^7; //超聲觸發端口trig
- sbit ds = P1^0; //溫度傳感器通訊
- sbit Ztai=P1^1; //電機運行狀態傳輸通道1 U5,P2.5
- sbit Cju=P1^2; //測距狀態傳輸通道2 U5,P2.4
- sbit warn=P1^3; //連接至U5 P3.2 INT_0
- /********************************定義變量和數組********************************/
- uchar table1[]="There's no echo.";
- uchar table2[]="system online^_^";
- uchar table3[]="Distance:";
- uchar count;
- long int distance=0; //距離變量
- uint Di; //報警距離
- /***********************************函數聲明***********************************/
- extern void initLCD();
- extern void write_date(uchar date);
- extern void write_com(uchar com);
- extern void delay(uint x);
- /******************************************************************************/
- void delay(uint x)
- {
- uint a,b;
- for(a = x;a > 0;a--)
- {
- for(b = 10;b > 0;b--)
- {
- ;
- }
- }
- }
- void delayt(uint x)
- {
- uchar j;
- while(x-- > 0)
- {
- for(j = 0;j < 125;j++)
- {
- ;
- }
- }
- }
- void write_com(uchar com)
- {
- P2 = com;
- rs = 0;
- lcden = 0;
- delay(10);
- lcden = 1;
- delay(10);
- lcden = 0;
- }
- void write_date(uchar date)
- {
- P2 = date;
- rs = 1;
- lcden = 0;
- delay(10);
- lcden = 1;
- delay(10);
- lcden = 0;
- }
- void writeString(uchar * str, uchar length)
- {
- uchar i;
- for(i = 0; i < length; i++)
- {
- write_date(str[i]);
- }
- }
- void initLCD(void)
- {
- write_com(0x38);
- delay(20);
- write_com(0x0f);
- delay(20);
- write_com(0x06);
- delay(20);
- write_com(0x01);
- delay(20);
- }
- /*********溫度傳感器**************/
- void dsInit()
- {
-
- unsigned int i;
- ds = 0;
- i = 100;
- while(i>0) i--;
- ds = 1;
- i = 4;
- while(i>0) i--;
- }
- void dsWait()
- {
- unsigned int i;
- while(ds);
- while(~ds);
- i = 4;
- while(i > 0) i--;
- }
- bit readBit()
- {
- unsigned int i;
- bit b;
- ds = 0;
- i++;
- ds = 1;
- i++; i++;
- b = ds;
- i = 8;
- while(i>0) i--;
- return b;
- }
- unsigned char readByte()
- {
- unsigned int i;
- unsigned char j, dat;
- dat = 0;
- for(i=0; i<8; i++)
- {
- j = readBit();
-
- dat = (j << 7) | (dat >> 1);
- }
- return dat;
- }
- void writeByte(unsigned char dat)
- {
- unsigned int i;
- unsigned char j;
- bit b;
- for(j = 0; j < 8; j++)
- {
- b = dat & 0x01;
- dat >>= 1;
-
- if(b)
- {
- ds = 0; i++; i++;
- ds = 1;
- i = 8; while(i>0) i--;
- }
- else
- {
- ds = 0;
- i = 8; while(i>0) i--;
- ds = 1;
- i++; i++;
- }
- }
- }
- void sendChangeCmd() //發出改變指令
- {
- dsInit();
- dsWait();
- delayt(1);
- writeByte(0xcc);
- writeByte(0x44);
- }
- void sendReadCmd() //發出讀取指令
- {
- dsInit();
- dsWait();
- delayt(1);
- writeByte(0xcc);
- writeByte(0xbe);
- }
- int getTmpValue()
- {
- unsigned int tmpvalue;
- int value;
- float t;
- unsigned char low, high;
- sendReadCmd();
-
- low = readByte();
- high = readByte();
-
- tmpvalue = high;
- tmpvalue <<= 8;
- tmpvalue |= low;
- value = tmpvalue;
- t = value * 0.0625;
- value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
- return value;
- }
- void display1(int v)
- {
- unsigned char Count;
- unsigned char datas[] = {0, 0, 0, 0, 0};
- unsigned int tmp = abs(v);
- datas[0] = tmp / 10000;
- datas[1] = tmp % 10000 / 1000;
- datas[2] = tmp % 1000 / 100;
- datas[3] = tmp % 100 / 10;
- datas[4] = tmp % 10;
- write_com(0xc0);
- if(v < 0)
- {
- writeString("- ", 2);
- }
- else
- {
- writeString("+ ", 2);
- }
- if(datas[0] != 0)
- {
- write_date('0'+datas[0]);
- }
- for(Count = 1; Count != 5; Count++)
- {
- write_date('0'+datas[Count]);
- if(Count == 2)
- {
- write_date('.');
- }
- }
- write_date('A'+2); //"c"的ASCII
- }
- /*********************************/
- void Init_MCU(void)
- {
- TMOD=0x11; //定時器0,1初始化,設置為16位自動重裝模式
- TL0=0x66;
- TH0=0xfc; //1ms
- EA=1; //總中斷使能
- ET0=1; //開定時器0
- }
- void Init_Parameter(void) //I/O口初始化
- {
- OUTPUT =1;
- INPUT = 1;
- count = 0;
- distance = 0;
- }
- void display_char(uchar *point,uchar address) //顯示字符串函數,寫入的字符串的地址指針 1602顯示對應的地址
- {
- uchar i;
- write_com(0x80 + address);
- for(i = 0;i < 16; i++)
- {
- write_date(*point);
- point++;
- }
- }
- void display(int number,uchar address) //顯示數字,number寫入的數據,address地址
- {
- uchar b,c,d,e;
- b= (number / 1000);
- c= (number / 100) % 10;
- d= (number / 10) % 10;
- e= number % 10;
- Di=b*100+c*10+d; //獲得警報距離
-
- write_com(0x80 + address);
- write_date(b + 48);
- write_date(c + 48);
- write_date(d + 48);
- write_date(46); //小數點的ASCII
- write_date(e + 48);
- write_date(99); //"c"的ASCII
- write_date(109); //"m"的ASCII
- if(Di<20) //發出警報
- {
- if(Di==0)//提示為假警報
- {
- LED=1;
- warn=1;
- Cju=1; //關閉中斷控制
- }
- if(Di!=0)
- {
- LED=0;
- warn=0; //開啟中斷控制
- Cju=0;
- }
- }
- if(Di>=20)
- {
- LED=1;
- warn=1;
- Cju=1; //關閉中斷控制
- }
- }
- void Trig_SuperSonic(void) //發出聲波
- {
- OUTPUT = 1;
- delayt(1);
- OUTPUT = 0;
- }
- void Measure_Distance(void)
- {
- uchar l;
- uint h,y;
- TR0 = 1;
- while(INPUT)
- {
- ;
- }
- TR0 = 0;
- l = TL0;
- h = TH0;
- y = (h << 8) + l;
- y = y - 0xfc66;//us部分
- distance = y + 1000 * count;//計算總時間
- TL0 = 0x66;
- TH0 = 0xfc;
- delayt(30);
- distance = VELOCITY_30C * distance / 20000; //單位是cm
- }
- void main(void)
- {
- initLCD();
- Init_MCU();
- Init_Parameter();
- display_char(table2,0x00);
- sendChangeCmd();
- delayt(1000); //溫度轉換時間需要750ms以上
- write_com(0xc0);
- display1(getTmpValue());
- while(1)
- {
- //電機運轉的時候不測距
- if(Ztai==1)
- {
- Trig_SuperSonic(); //觸發超聲波發射
- while(INPUT == 0) //等待回聲
- {
- ;
- }
- Measure_Distance(); //計算脈寬并轉換為距離
- display(distance,0x49); //顯示距離
- Init_Parameter(); //參數重新初始化
- delayt(100); //延時,兩次發射之間要至少有10ms間隔
- }
- if(Ztai==0)
- {
- ;
- }
- }
- }
- /********************************中斷程序*****************************************/
- void Timer0 (void) interrupt 1 //回收超聲波回聲
- {
- TF0 = 0;
- TL0 = 0x66;
- TH0 = 0xfc;
- count++;
- if(count == 18)//超聲波回聲脈寬最多18ms
- {
- TR0 =0;
- TL0 = 0x66;
- TH0 = 0xfc;
- count = 0;
- }
- }
復制代碼
|
-
-
超聲波測距顯示.zip
2018-6-23 10:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
60.31 KB, 下載次數: 4, 下載積分: 黑幣 -5
評分
-
查看全部評分
|