【Proteus仿真】51单片机+超声波测距+ 带报警按键可调

【Proteus仿真】51单片机+超声波测距+ 带报警按键可调


  • Proteus仿真
    在这里插入图片描述

Proteus仿真bug说明

在主程序while循环里面,在测量超声波返回信号时,有时候会收不到返回信号,代码会一直开在 while(!RX);这里,不是代码问题,是Proteus仿真器件的问题,只有停止仿真,然后再启动运行仿真试一试看,直到有测量值出现才正常。目前不知道是不是只在这个8.12版本出现的,好像以前在8.9版本上没有遇到过。

1
2
3
4
5
6
7
8
9
10
11
void  StartModule() 		         //启动模块
{
TX=1;//触发引脚发出11us的触发信号(至少10us)
NOP();NOP();NOP();NOP();NOP();
TX=0;
while(!RX);//当RX为零时等待
TR0=1; //开启计数
while(RX); //当RX为1计数并等待
TR0=0; //关闭计数
}

主程序代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//#include <STC89C5xRC.H>
#include <reg51.h>
#include "LCD1602.h"
#include "hcsro4.h"
sbit Key_Up = P2^3; //上调报警时间按键
sbit Key_Down = P2^4;//下调报警时间按键
//#define Busy 0x80 //用于检测LCM状态字中的Busy标识

uchar Set_Distance = 30;
void keyscan();
void Delay10us();
void main()
{
// delay\_ms(500);
uchar i=0;
TMOD=0x01; //设T0为方式1,GATE=1;
TH0=0;
TL0=0; //设定时器0初值为0;
ET0=1; //允许T0中断
TR0=0;//关闭定时器
EA=1; //开启总中断
BEEP=1;
LCD1602\_Init(); //初始化LCD1602
LCD1602\_write\_com(0x01); //清屏指令
while(1)
{
LCD1602\_set\_position(0,2); //指针设置到第二行第1列
LCD1602\_prints("Set\_Dis: ");
LCD1602\_set\_position(0,10);
LCD1602\_printc(Set_Distance/10 + 0x30);//显示报警距离十位
LCD1602\_printc(Set_Distance%10 + 0x30);//显示报警距离个位
/\* 下面两行是用来调试时,检测bug启用的\*/
LCD1602\_set\_position(0,15);
LCD1602\_printc(i + 0x30);//在第一行15位置显示一个字符
/\*在Proteus仿真时,RX如果不能跳变,容易卡在这里\*/
StartModule(); //启动模块

Conut(); //计算距离
if(S < Set_Distance) //距离小于30cm时,蜂鸣器报警,发光二极管闪
{
delay\_ms(S);//距离作为 延时参数,距离障碍物越近,报警频率越高
BEEP=0;
LED=1;
delay\_ms(S);
BEEP=1;
LED=0;
}
else
{
BEEP=1;
}
keyscan();
i++;
i %= 245;
}
}

void Timer0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}

void keyscan(){
if(Key_Up==0)//上调报警距离
{
delay\_ms(120);
if(Key_Up==0){
Set_Distance++;
}
}
if(Key_Down==0)//下调报警距离
{
delay\_ms(120);
if(Key_Down==0)
Set_Distance--;
}

}



程序源码和仿真资源

本示例基于Proteus8.12平台。

1
2
3
链接:https://pan.baidu.com/s/1aGcJk2fkecGIhOMhpJdCLQ 
提取码:yk06


往往都是事情改变人,人却改变不了事情。电影-《无间道》