不懂的咨詢我
單片機源程序如下:
- ///////////////////////////////////////////////////////////////
- //Project : 數字循環顯示.c
- //版本 : V1.0
- //作者 : 源動力
- //說明 :本函數只適用于南陽理工學院電子系51開發板。
- //用法 : 直接下載到51單片機
- //功能 :和超聲波模塊HC-SR04相連,檢測距離
- //接口說明:超聲波接口 —51開發板
- // Trig — P1^0
- // Echo — P3^2
- ///////////////////////////////////////////////////////////////
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit D1=P2^7; //控制數碼管亮滅,為低電平時滅
- sbit D2=P1^7; //控制全體二極管的熄滅, 573LE使能端
- sbit send=P1^0;
- sbit receive=P3^2;
- uchar code table[]={0x81,0x42,0x23,0x14};
- uchar code table1[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
- //二進制1000等于十六進制8,此時數碼管只有第1位顯
- uchar code table2[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49};
- //二進制1000等于十六進制8,此時數碼管只有第2位顯
- uchar code table3[]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29};
- //二進制1000等于十六進制8,此時數碼管只有第3位顯
- uchar code table4[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
- //二進制1000等于十六進制8,此時數碼管只有第4位顯
- uchar code table1234[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9};
- //二進制1111等于十六進制f;此時數碼管全顯
- uint num,a=0;
- uint outcomeH=0,outcomeL=0;
- unsigned long distance_data;
- uint temp_data[4];
- uint succeed_flag;
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=1141;y>0;y--);
- }
- void delay_20us()
- {
- uchar bt ;
- for(bt=0;bt<100;bt++);
- }
- void ExternalInterrupt_Init()
- {
-
- //TCON=0x00; //設定外部中斷觸發方式為低電平觸發方式 兩種設置方式一樣
- IT0=0; //設定外部中斷觸發方式為低電平觸發方式
- }
- void Timer0_Init()
- {
- TMOD=0x11;//設置定時器0和1為工作方式1
- TH0=0;//對定時器高八位清零
- TL0=0;//對定時器低八位清零
- TF0=0;//定時計數器溢出標志位清零
- ET0=1;//開定時器0中斷
- TH1=0;//對定時器高八位清零
- TL1=0;//對定時器低八位清零
- TF1=0;//定時計數器溢出標志位清零
- ET1=1;//開定時器0中斷
-
-
- }
- void AllInterrupt_Init()
- {
- IP=0x01;//外部中斷0設置為高優先級,其他所有中斷為低優先級
-
- }
- void UT_Init() //初始化超聲波發射和接收引腳
- {
- send=0;
- receive=0;
- }
- void Send()
- {
- send=1;
- delay_20us();
- send=0;
- }
- void conversion()
- {
- uint ge_data,shi_data,bai_data,qian_data;
- distance_data=outcomeH;
- distance_data <<=8;
- distance_data=(distance_data | outcomeL);
- //distance_data*=(90*12); //這是往返兩個路程的時間
- //distance_data現在單位為us
- /*distance_data*=(170); //(340/2=170) distance_data現在單位為微米
- distance_data=distance_data/1000; //distance_data現在單位為毫米 */
- distance_data*=12; //因為定時器默認為12分頻
- distance_data/=58; //微秒的單位除以58等于厘米
-
-
- qian_data=distance_data/1000;
- distance_data=distance_data%1000; //取余運算
- bai_data=distance_data/100 ;
- distance_data=distance_data%100; //取余運算
- shi_data=distance_data/10 ;
- distance_data=distance_data%10; //取余運算
- ge_data=distance_data;
- temp_data[0]=qian_data;
- temp_data[1]=bai_data;
- temp_data[2]=shi_data;
- temp_data[3]=ge_data;
- }
- void display()
- {
-
- conversion();
- P0=table1[temp_data[0]];
- delay(1);
- P0=table2[temp_data[1]];
- delay(1);
- P0=table3[temp_data[2]];
- delay(1);
- P0=table4[temp_data[3]];
- //delay(1);
- }
- void display1()
- {
-
- //conversion();
- P0=table1[temp_data[0]];
- delay(1);
- P0=table2[temp_data[1]];
- delay(1);
- P0=table3[temp_data[2]];
- delay(1);
- P0=table4[temp_data[3]];
- //delay(1);
- }
- void main()
- {
- succeed_flag=0;
- D2=0;
- D1=1;
-
- EA=0; //先關閉總中斷
- UT_Init(); //初始化超聲波發射和接收引腳
- ExternalInterrupt_Init(); //外部中斷初始化
- Timer0_Init(); //初始化定時器0
- AllInterrupt_Init();
-
- while(1)
- {
-
-
- TR0=1;//啟動定時器0
- TR1=0;//關閉定時器1
- EX0=0;//關閉外部中斷0
- EA=1;//打開總中斷
- if(a==2)
- {
-
- EA=0; //先關閉總中斷
- Send(); //發送脈沖信號
- _nop_();
- while(receive==0); //等待Echo回波引腳變高電平
-
- TH1=0;//對定時器高八位清零
- TL1=0;//對定時器低八位清零
- TF1=0;//定時計數器溢出標志位清零
-
- TR1=1;//啟動定時器1
- TR0=1;//啟動定時器0
- EX0=1;//打開外部中斷0
- EA=1;//打開總中斷
- //display1();
- while(TH1 < 30);//等待測量的結果(可用中斷實現) //當TH1=60時,則為5.733米 30則為2.913米
- a=0;
- }
-
- }
- }
- void exter0() interrupt 1 //1為定時器0中斷
- {
- //EA=0;
- //P0=table1234[1];
- TH0=0; //定時器0清零
- TL0=0; //定時器0清零
- TF0=0; //定時計數器溢出標志位清零
- display1();
- a++;
-
- }
- void dingshi1() interrupt 3 //3為定時器1中斷
- {
-
- TH1=0; //定時器0清零
- TL1=0; //定時器0清零
- TF1=0; //定時計數器溢出標志位清零
- }
- void exter1() interrupt 0 //0為外部中斷
- {
- outcomeH =TH1; //取出定時器的值
- outcomeL =TL1; //取出定時器的值
- succeed_flag=1; //至成功測量的標志
- //TH0=0;
- //TL0=0;
- EX0=0;//關閉外部中斷0
- display();
- }
復制代碼
所有資料51hei提供下載:
源動力超聲波傳感器程序.rar
(18.89 KB, 下載次數: 11)
2018-9-13 09:46 上傳
點擊文件名下載附件
全部程序
|