仿真需要8.6版本的仿真proteus
超聲波仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
捕獲.JPG (60.52 KB, 下載次數: 109)
下載附件
2017-12-2 16:04 上傳
51單片機源程序:
- #include <REGX52.H>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define smgport P0
- uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- uchar code smg_we[]={0xfe,0xfd,0xfb,0xf7};
- uchar dis_smg[4] ={0x40,0x40,0x40,0x40};
- sbit smg_w=P2^1;
- sbit smg_d=P2^0;
- sbit ECHO=P3^2;
- sbit TR=P3^3; //觸發信號
- uchar Flag;//測量標志位0.5秒觸發一次
- /**************************************************
- 10us延時
- **************************************************/
- void Delay10Us(void)
- {
- _nop_();_nop_();
- _nop_();_nop_();
- _nop_();_nop_();
- _nop_();_nop_();
- }
- /**************************************************
- 數碼位選函數
- **************************************************/
- void smg_we_switch(uchar i)
- {
- smgport=smg_we[i];
- smg_w=1;
- //smgport=smg_we[i];
- smg_w=0;
- }
- void smg_d_switch(uchar dat)
- {
- smgport=dat;
- smg_d=1;
- smg_d=0;//所存
- }
- /**************************************************
- 關閉顯示用于消隱
- **************************************************/
- void smgalloff(void)
- {
- smgport=0;
- smg_d=1;
- smg_d=0;
- smgport=0xff;
- smg_w=1;
- smg_w=0;
- }
- /**************************************************
- 數碼管顯示
- **************************************************/
- void smgDis(void)
- {
- static uchar i=0;
- smgalloff();
- smg_d_switch(dis_smg[i]);
- smg_we_switch(i);
- if(++i==4)i=0;
- }
- /**************************************************
- 距離測量
- **************************************************/
- void Measure(void)
- {
- uchar Err; //錯誤標記
- unsigned long distance,pTime;//距離,時間變量
- Err=0;
- TR=1; //TR保持10us高電平觸發模塊測距
- Delay10Us();
- TR=0;
- TH0=0;
- TL0=0;
- while(ECHO==0);//等待ECHO變為高
- TR0=1; //啟動定時器,外部高電平觸發
- while(ECHO==1)//等待超聲波回應獲超時
- {
- pTime=TH0*256+TL0;
- if(pTime>40000)//時間超時
- {
- Err=1;
- break;
- }
- }
- TR0=0;//關閉定時器
- pTime=TH0*256+TL0; //獲取時間
- if(pTime<59)//測量距離小于2cm
- {
- Err=1;
- }
- if(Err==0)
- {
- distance=(pTime*173)/10000;//;pTime*346/1000000/2=pTime*0.0173 仿真的環境溫度為25度346m/s
- if(distance>400)//仿真有效值只到331CM
- {
- Err=1;
- }
- else
- {
- dis_smg[0]=0;
- dis_smg[1]=smg_du[distance/100]; //分離千位
- dis_smg[2]=smg_du[(distance/10)%10];//分離百位
- dis_smg[3]=smg_du[distance%10]; //分離個位
- return;
- }
- }
- dis_smg[0]=0; //錯誤時數碼管顯示Err
- dis_smg[1]=0x79;
- dis_smg[2]=0x50;
- dis_smg[3]=0x50;
- }
- /**************************************************
- 定時器0初始化
- **************************************************/
- void Timer0Init(void)
- {
- TMOD|=0x09;//工作于16位模式,只有P32和TR0同時為1時開始計數
- }
- /**************************************************
- 定時器1初始化
- **************************************************/
- void Timer1Init(void)
- {
- TMOD|=0x10;//定時器1工作在方式1
- TH1 = (65536-2000)/256;
- TL1 = (65536-2000)%256; //2ms
- TR1=1;
- ET1=1;
- EA=1;
- }
- void main(void)
- {
- TR=0; //關閉觸發
- smgalloff();
- Timer0Init();//定時器0初始化
- Timer1Init();//定時器1初始化
- while(1)
- {
- if(Flag)//每500ms測量一次
- {
- Flag=0;
- Measure();//測量
- }
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (5.69 KB, 下載次數: 95)
下載附件
2017-12-3 00:42 上傳
全部資料51hei下載地址:
單片機超聲波仿真.zip
(106.37 KB, 下載次數: 226)
2017-12-2 16:05 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|