程序代碼
51hei瀏覽器截圖2020120.png (187.17 KB, 下載次數: 39)
下載附件
2020-12-2 18:20 上傳
仿真圖
51hei瀏覽器截圖20201202181224.png (191.68 KB, 下載次數: 47)
下載附件
2020-12-2 18:20 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- /*********************宏定義************************/
- #define uchar unsigned char
- #define uint unsigned int
- /************位定義*****************************/
- sbit Trig=P3^7; //超聲波模塊觸發位
- sbit LEDRED=P1^0;
- sbit LEDGREEN=P1^2;
- sbit speaker=P1^7;
- sbit person=P1^6;
- sbit TLED= P1^5;
- /************全局變量聲明***********************/
- uint H,T; //定義全局變量,H--距離,T--時間
- /***********共陰數碼管段碼表********************/
- uchar a_code[]={ //共陰數碼管編碼0~9
- 0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f,
- /*0x77,0x7c,0x39,0x5e,0x79,
- 0x71*/};
- /***************延時函數************************/
- void delay(uint z) //*1ms延時函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*************超聲波模塊啟動函數**************/
- void start()
- {
-
- Trig=1; //拉高觸發信號,啟動超聲波模塊發射超聲波
- _nop_(); //延時10us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- Trig=0; //拉低觸發信號
- }
- /*****************數碼管顯示函數*****************/
- void display(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
- {
- P2=0xfe;
- P0=a_code[a];
- delay(5);
- P2=0xfd;
- P0=a_code[b];
- delay(5);
- P2=0xfb;
- P0=a_code[c];
- delay(5);
- P2=0xf7;
- P0=a_code[d];
- delay(5);
- }
- /*****************主函數*************************/
- void main()
- {
- Trig=0;
- LEDRED=1;
- LEDGREEN=1;
- speaker=0;
- EA=1;
- TMOD=0x19;//定時器0工作模式:
- /*GATE=1(由外部中斷0引腳及TR0共同啟動定時器0)
- C/T=0(定時模式)
- M1M0=01(16位定時)*/
- TH1=64580/256;
- TL1=65480%256;
- ET1=1;
- TR0=1; //啟動定時器0
- EX0=1; //開外部中斷0
- IT0=1; //外部中斷0設置為下降沿觸發方式
- while(1)
- {
- start(); //調用超聲波模塊啟動函數
- display(H/1000,H%1000/100,H%1000%100/10,H%10); //調用數碼管顯示函數
- if(person==1)
- {
- TLED=1;
- if(H<=25)
- {
- LEDRED=0;
- LEDGREEN=1;
- TR1=1;
- }
- else
- {
- LEDRED=1;
- LEDGREEN=0;
- TR1=0;
- }
- }
- else
- {
- TLED=0;
- LEDRED=1;
- LEDGREEN=1;
- TR1=0;
- }
- }
- }
- /***************外部中斷0函數************************
- 回響輸出端高電平寬度測量(上升沿到來時啟動定時器0開始計時,
- 下降沿到來進入外部中斷,關閉定時器0,停止計時,計算距離
- ********************************************************/
- void int0() interrupt 0
- {
- TR0=0; //關閉定時器0
- EX0=0; //關閉外部中斷0
- T=(TH0*256+TL0);//計算超聲波傳輸時間,CPU采用12M時鐘,則計算的單位為us
- TH0=0; //定時器清0
- TL0=0;
- H=T*0.017; //計算距離,單位cm(注意:不能用H=(T*17)/1000,這樣變成取整了)
- H=H+2;
- TR0=1; //開啟定時器0
- EX0=1; //開啟外部中斷0
- }
- void time1() interrupt 3
- {
- TR1=0;
- TH1=65480/256;
- TL1=65480%256;
- speaker=~speaker;
- TR1=1;
- }
復制代碼
|