仿真需要8.6版本的仿真proteus
超聲波仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51單片機(jī)源程序:
- #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; //觸發(fā)信號(hào)
- uchar Flag;//測(cè)量標(biāo)志位0.5秒觸發(fā)一次
- /**************************************************
- 10us延時(shí)
- **************************************************/
- void Delay10Us(void)
- {
- _nop_();_nop_();
- _nop_();_nop_();
- _nop_();_nop_();
- _nop_();_nop_();
- }
- /**************************************************
- 數(shù)碼位選函數(shù)
- **************************************************/
- 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;//所存
- }
- /**************************************************
- 關(guān)閉顯示用于消隱
- **************************************************/
- void smgalloff(void)
- {
- smgport=0;
- smg_d=1;
- smg_d=0;
- smgport=0xff;
- smg_w=1;
- smg_w=0;
- }
- /**************************************************
- 數(shù)碼管顯示
- **************************************************/
- void smgDis(void)
- {
- static uchar i=0;
- smgalloff();
- smg_d_switch(dis_smg[i]);
- smg_we_switch(i);
- if(++i==4)i=0;
- }
- /**************************************************
- 距離測(cè)量
- **************************************************/
- void Measure(void)
- {
- uchar Err; //錯(cuò)誤標(biāo)記
- unsigned long distance,pTime;//距離,時(shí)間變量
- Err=0;
- TR=1; //TR保持10us高電平觸發(fā)模塊測(cè)距
- Delay10Us();
- TR=0;
- TH0=0;
- TL0=0;
- while(ECHO==0);//等待ECHO變?yōu)楦?br />
- TR0=1; //啟動(dòng)定時(shí)器,外部高電平觸發(fā)
- while(ECHO==1)//等待超聲波回應(yīng)獲超時(shí)
- {
- pTime=TH0*256+TL0;
- if(pTime>40000)//時(shí)間超時(shí)
- {
- Err=1;
- break;
- }
- }
- TR0=0;//關(guān)閉定時(shí)器
- pTime=TH0*256+TL0; //獲取時(shí)間
- if(pTime<59)//測(cè)量距離小于2cm
- {
- Err=1;
- }
- if(Err==0)
- {
- distance=(pTime*173)/10000;//;pTime*346/1000000/2=pTime*0.0173 仿真的環(huán)境溫度為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]; //分離個(gè)位
- return;
- }
- }
- dis_smg[0]=0; //錯(cuò)誤時(shí)數(shù)碼管顯示Err
- dis_smg[1]=0x79;
- dis_smg[2]=0x50;
- dis_smg[3]=0x50;
- }
- /**************************************************
- 定時(shí)器0初始化
- **************************************************/
- void Timer0Init(void)
- {
- TMOD|=0x09;//工作于16位模式,只有P32和TR0同時(shí)為1時(shí)開始計(jì)數(shù)
- }
- /**************************************************
- 定時(shí)器1初始化
- **************************************************/
- void Timer1Init(void)
- {
- TMOD|=0x10;//定時(shí)器1工作在方式1
- TH1 = (65536-2000)/256;
- TL1 = (65536-2000)%256; //2ms
- TR1=1;
- ET1=1;
- EA=1;
- }
- void main(void)
- {
- TR=0; //關(guān)閉觸發(fā)
- smgalloff();
- Timer0Init();//定時(shí)器0初始化
- Timer1Init();//定時(shí)器1初始化
- while(1)
- {
- if(Flag)//每500ms測(cè)量一次
- {
- Flag=0;
- Measure();//測(cè)量
- }
- …………
- …………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
全部資料51hei下載地址:
單片機(jī)超聲波仿真.zip
(106.37 KB, 下載次數(shù): 226)
2017-12-2 16:05 上傳
點(diǎn)擊文件名下載附件
|