目录
摘要
STC89C52是STC系列单片机里应用比较广泛的一款,在自动控制领域里享有很高的价值,以其易用性和多功能性受到了广大电子设计爱好者的好评。本次设计主要是利用STC89C52单片机、超声波传感器完成测距报警系统的制作,以STC89C52为主控芯片,利用超声波对距离的检测,将前方物体的距离探测出来,然后单片机处理运算,与设定的报警距离值进行比较判断,当测得距离小于设定值时,STC89C52发出指令控制蜂鸣器报警。
关键词:超声波传感器 STC89C52
一、硬件方案
采用单片机+HC-SR04超声波传感器+数码管+按键+蜂鸣器而成。
二、设计功能
1. 单片机型号:STC89C52/51、AT89C52/51、AT89S52/51 可通用。
2.产品自带单片机上电复位电路、手动复位电路(复位按键)、晶振电路(给单片机提供时钟周期)。
3.数码管显示超声波测到的距离。
4.当超声波测出的距离小于设定的距离时就会使得蜂鸣器报警。
5.可设置 报警距离,按下设置键后 就可以再按 加减键 就可以修改报警距离并具有掉电保存功能。
6.HC-SR04超声波传感器模块测距,测量范围:2cm--5m。
三、成品实物图
四、原理图
五、PCB图
六、程序源码
部分代码:
/******************小延时函数*****************/
void delay()
{
_nop_(); //执行一条_nop_()指令就是1us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************超声波测距程序*****************************/
void send_wave()
{
c_send = 1; //10us的高电平触发
delay();
c_send = 0;
TH0 = 0; //给定时器0清零
TL0 = 0;
TR0 = 0; //关定时器0定时
while(!c_recive); //当c_recive为零时等待
TR0=1;
while(c_recive) //当c_recive为1计数并等待
{
flag_time0 = TH0 * 256 + TL0;
if((flag_time0 > 40000)) //当超声波超过测量范围时,显示3个888
{
TR0 = 0;
flag_csb_juli = 2;
distance = 888;
break ;
}
else
{
flag_csb_juli = 1;
}
}
if(flag_csb_juli == 1)
{
TR0=0; //关定时器0定时
distance =flag_time0; //读出定时器0的时间
distance *= 0.017; // 0.017 = 340M / 2 = 170M = 0.017M 算出来是米
if((distance > 600)) //距离 = 速度 * 时间
{
distance = 888; //如果大于6m就超出超声波的量程
}
}
}
/*********************定时器0、定时器1初始化******************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X11; //定时器0、定时器1工作方式1
ET0 = 0; //关定时器0中断
TR0 = 1; //允许定时器0定时
ET1 = 1; //开定时器1中断
TR1 = 1; //允许定时器1定时
}
/***************主函数*****************/
void main()
{
beep = 0; //开机叫一声
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
time_init(); //定时器初始化程序
while(1)
{
flag_300ms ++; //加1
if(flag_300ms >= 300)
{
flag_300ms = 0;
send_wave(); //测距离函数
if(menu_1 == 0)
{
dis_smg[0] = smg_du[distance % 10]; //显示距离
dis_smg[1] = smg_du[distance / 10 % 10];
dis_smg[2] = smg_du[distance / 100 % 10] & 0xdf; ;
dis_smg[3] = 0xff; //不显示
}
clock_h_l(); //报警函数
}
资料包括:
需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。