完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
51单片机HC-SR04超声波模块测距仿真,就是把编译通过的程序,在proteus环境下,按设计的硬件原理图,把仿真图画好,调入程序在Proteus仿真环境下进行程序的仿真,来验证程序设计的正确性及各项功能是否达到设计要求,在仿真环境下完成程序的调试工作。通过仿真调试满意后的程序,再烧写到硬件环境下调试,这时,如果硬件工作正常,可以进一步的验证程序的功能及正确性,如果工作不正常,这时可排出软件设计的问题,集中精力排出硬件设计、制作的问题,有针对性的排出,从而可提高设计制作过程中的效率,大大减轻制作工作量,51单片机超声波测距仪制作成功率可以得到100%的保证。 这里与大害分享一关于51单片机HC-SR04超声波模块测距仿真的文章,该文章较好的介绍分析了超声波仿真方面的问题,是一分不可多得的介绍分析超声波仿真方面的好文章。
51单片机超声波测距仿真与分析.pdf
(476.82 KB, 下载次数: 179
)
51单片机超声波测距仿真截图中可以看到,黄色的波形是单片机送给HC-SR04模块TRIG端口高电平信号,绿色的是HC-SR04模块ECHO端送出的高电平,高电平持续的时间就是超声波从发射到返回的时间,图中显示的是1.65毫秒,按照计算公式S=340×t/2计算距离,计算时把速度的单位换算成厘米/微秒。按照图中时间计算的距离值为:S=0.034×(14.70×1000)/2=249.9厘米。 程序:51单片机超声波测距仿真程序实物验证图片。 #include #include #defineuint unsigned int #defineuchar unsigned char ***itrs=P2^0; //1602的数据/指令选择控制线 ***itrw=P2^1; //1602的读写控制线 ***iten=P2^2; //1602的使能控制线 ***ittrig=P2^5; //超声波测距模块Trig ***itecho=P3^2; //超声波测距模块Echo bitflag1; //触发信号标志位// ucharcount; //中断累加变量 long intdistance; //测量所得距离 unsignedchar code table[ ]={"0123456789"}; //定义字符数组显示数字 /*------------------------------------------------ 延时函数 ------------------------------------------------*/ voiddelay(uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } /*------------------------------------------------ 延时函数 ------------------------------------------------*/ voiddelayt(uint x) { uchar j; while(x-- > 0) { for(j = 0;j < 125;j++) { ; } } } /*------------------------------------------------ 1602写命令函数 ------------------------------------------------*/ voidlcd_wcom(uchar com) { rs=0; //选择指令寄存器 rw=0; //选择写 P0=com; //把命令字送入P0 delay(5); //延时一小会儿,让1602准备接收数据 en=1; //使能线电平变化,命令送入1602的8位数据口,这点非常重要 en=0; } /*------------------------------------------------ 1602写数据函数 ------------------------------------------------*/ voidlcd_wdat(uchar dat) { rs=1; //选择数据寄存器 rw=0; //选择写 P0=dat; //把要显示的数据送入P0 delay(5); //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。 en=1; //使能线电平变化,数据送入1602的8位数据口 en=0; } /*------------------------------------------------ 1602初始化函数 ------------------------------------------------*/ voidlcd_init() { lcd_wcom(0x38); //8位数据,双列,5*7字形 ,用到功能设定指令 lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁,用到显示开关控制指令 lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令 lcd_wcom(0x01); //清屏,用到了清屏指令 } /*------------------------------------------------ 1602显示固定字符函数 ------------------------------------------------*/ voidlcd_xianshi() { lcd_wcom(0x80+0x40); lcd_wdat('D'); lcd_wdat('i'); lcd_wdat('s'); lcd_wdat('t'); lcd_wdat('a'); lcd_wdat('n'); lcd_wdat('c'); lcd_wdat('e'); lcd_wdat(':'); lcd_wcom(0x80+0x4c); lcd_wdat('.'); lcd_wcom(0x80+0x4e);//单位是厘米// lcd_wdat('c'); lcd_wdat('m'); } /*------------------------------------------------ 定时器0初始化,用于计算响应信号时间 ------------------------------------------------*/ voidinit_t0() { TMOD=0x01; TL0=0x66; TH0=0xfc; //1ms ET0=1; EA=1; } /*------------------------------------------------ 超声波模块触发信号 ------------------------------------------------*/ voidtrigger() { trig=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); trig=0; } /*------------------------------------------------ 超声波模块相应端口初始化函数 ------------------------------------------------*/ voidinit_measuring() { trig=0; echo=1; count=0; } /*------------------------------------------------ 超声波模块距离测试函数 ------------------------------------------------*/ voidmeasuring() { uchar l; uint h; TR0 = 1; while(echo==1) { ; } TR0 = 0; l = TL0; h = TH0; distance =h*256+l;//计算总时间,单位是微秒 TL0 =0; TH0 =0; delayt(30); distance = 3400* distance / 20000;//原始为:(0.34毫米/us)*时间/2// } /*------------------------------------------------ 超声波模块测量结果显示函数 ------------------------------------------------*/ voiddisplay(uint x) { uchar qian,bai,shi,ge; qian=x/1000; bai=(x/100)%10; shi=(x/10)%10; ge=x%10; lcd_wcom(0x80+0x49);//单位是厘米// lcd_wdat(table[qian]); lcd_wdat(table[bai]); lcd_wdat(table[shi]); lcd_wcom(0x80+0x4d); lcd_wdat(table[ge]); } /*------------------------------------------------ 主函数 ------------------------------------------------*/ voidmain() { lcd_init(); //液晶初始化 init_t0(); //定时器0初始化 init_measuring(); //超声波相应端口初始化 while(1) { lcd_xianshi(); //液晶显示特定字符 trigger(); //触发超声波启动 while(echo==0) //等待回声 { ; } measuring(); //进行距离测量 display(distance); //对测量结果进行显示 init_measuring(); //超声波相应端口初始化 delayt(600); //每次测量间隔60ms } } //……………………………………………中断服务函数…………………………………………………// voidT_0()interrupt 1 { TF0 = 0; TL0 = 0x66; TH0 = 0xfc; count++; if(count==18) { TR0 =0; TL0 = 0x66; TH0 = 0xfc; count = 0; } } |
|
相关推荐
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
657 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
640 浏览 0 评论
753 浏览 1 评论
546 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
910 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11652 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 13:34 , Processed in 0.495691 second(s), Total 66, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号