仿真需要8.6版本的仿真proteus
超声波仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
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黑下载附件…………
复制代码
全部资料51hei下载地址:
单片机超声波仿真.zip
(106.37 KB, 下载次数: 226)
|