目录
功能要求
(1)用单片机实现;
(2)用C语言编程;
(3)硬件电路板布局合理;
(4)用数码管显示器显示;
(5)距离测量范围是:10cm----100cm;
(6)误差小于8%;
(7)超过测距量程并报警;
(8)通过按键调节测距范围。
一、材料准备
工具:
电烙铁、万用表、STC烧写器、5V电源、PC机、Keil uVision5、AltiumDesigner 13.3.4、stc-isp程序烧写软件(可到STC官方网站下载:http://www.stcmcu.com/index.htm)等。
可能涉及到的元器件:
- 最小系统:STC89C52RC单片机x1、12MHz有源晶振x1、10uF电解电容x1、22pFx2、10KΩ排阻x1、10KΩx1、
- 数码管显示电路:四位共阴数码管x1、74HC573x1、220Ω电阻x8
- 报警电路:5V有源蜂鸣器x1、S8550三极管x1、1KΩx1
- 测距电路:HC-SR04超声波模块x1
- 键盘输入:轻触开关x3
- 其他原件:100mil插针若干、LEDx1、自锁开关x1
二、硬件设计
1、单片机最小系统电路
如图1所示,是单片机最小系统电路图。学过51单片机的人都知道单片机最小系统包括:晶振电路、复位电路、单片机芯片和电源,这里作大概讲解即可,想了解详细电路原理请另查资料。晶振电路是为单片机提供时钟源;复位电路是为了让单片机从头到尾重新执行一遍程序,为了方便调试笔者采用按键复位方式;单片机芯片采用国产的STC单片机,型号为STC89C52RC(注:可以选择其他型号,譬如STC89、STC90、STC12等等),代码是完全兼容的,不必过多地担心,只是单片机内部资源不同而已;电源电路很简单,采用普通5V供电即可,为了方便调试建议加一个总电源开关,开关类型根据个人喜欢随便选。
图1 单片机最小系统电路图
图1中的J2是程序下载接口,接法很简单,单片机的串口P3.0和P3.1口引出即可;RP1是P0口的上拉排阻。
2、数码管显示电路
如图2所示
图2 数码管显示电路图
3、按键电路
如图3所示
图3 按键电路图
4、HC-SR04超声波模块电路
如图4所示
图4 超声波测距电路图
5、报警电路
如图5所示
图5 报警电路图
6、硬件测试
三、程序设计
1、搭建工程
头文件common.h:
#ifndef __COMMON_H__
#define __COMMON_H__
//头文件包含
#include <reg52.h> //提供单片机寄存器地址
#include <intrins.h> //提供_nop_()函数
#endif
2、数码管显示模块程序设计
程序如下:
头文件dig.h
#ifndef __DIG_H__
#define __DIG_H__
//头文件包含
#include "common.h"
//管脚定义
#define digDuan P0 //数码管段控制端口,高电平有效
sbit digWei1 = P2^4; //第1位数码管控制端口,低电平有效
sbit digWei2 = P2^5; //第2位数码管控制端口,低电平有效
sbit digWei3 = P2^6; //第3位数码管控制端口,低电平有效
sbit digWei4 = P2^7; //第4位数码管控制端口,低电平有效
//函数声明
void dig_scan(unsigned int *dat); //数码管扫描
#endif
源文件dis.c
#include "dig.h"
/*
* 数码管扫描
* *dat:以数组的方式传值,使用的时候直接填入数组名即可
*/
void dig_scan(unsigned int *dat)
{
static unsigned char i = 0; //循环变量
/* 数码管扫描处理 */
digDuan = 0x00; //消隐
digWei1 = 1;
digWei2 = 1;
digWei3 = 1;
digWei4 = 1;
switch(i)
{
case 0:
{
digWei1 = 0; //选通第1位数码管
digDuan = dat[0]; //显示第1位数码管的内容
break;
}
case 1:
{
digWei2 = 0; //选通第2位数码管
digDuan = dat[1]; //显示第2位数码管的内容
break;
}
case 2:
{
digWei3 = 0; //选通第3位数码管
digDuan = dat[2] + 0x80; //显示第3位数码管的内容,顺便也显示小数点
break;
}
case 3:
{
digWei4 = 0; //选通第4位数码管
digDuan = dat[3]; //显示第4位数码管的内容
break;
}
default: break;
}
++i; //数码管位选变量循环
if(i >= 4)
i = 0;
}
3、超声波测距模块程序设计
程序如下:
头文件HC-SR04.h:
#ifndef __HC_SR04_H__
#define __HC_SR04_H__
#include "common.h"
//引脚定义
sbit Ttig = P1^3; //触发信号控制端口
sbit Echo = P1^4; //回响信号接收端口
//函数声明
void start_ranging(void);
#endif
源程序文件HC-SR04.c:
#include "HC-SR04.h"
/* 启动超声波程序 */
void start_ranging(void)
{
Ttig = 1; //启动一次模块
_nop_(); //延时一段时间,至少10us以上
_nop_