标题:
超声波仿真加单片机源程序 需8.6版本的proteus
[打印本页]
作者:
a105865094
时间:
2017-12-2 16:06
标题:
超声波仿真加单片机源程序 需8.6版本的proteus
仿真需要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
作者:
admin
时间:
2017-12-3 00:43
好资料,51黑有你更精彩!!!
作者:
l6931639
时间:
2018-1-30 09:41
哈哈,我终于找到这个超声波模块了
作者:
XIONG111
时间:
2018-5-22 10:11
怎么下载不了
作者:
圆周
时间:
2019-6-10 09:35
那个圈是怎么放置的
作者:
duan19981103
时间:
2019-12-3 17:59
厉害
作者:
lry345
时间:
2020-10-8 20:22
仿真中为什么显示不了距离
作者:
wifingtta
时间:
2023-2-25 13:00
用8.9运行,可以运行,程序也没有问题,感谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1