单片机主程序:
#include "reg52.h"
#include <intrins.h>
#include<OLED.h>
#include "key.h"
#include"delay.h"
#include"show_num.h"
#include"light.h"
#define uchar unsigned char
#define uint unsigned int
uint key_scan();
void light_time();
void Math_Distance(uint distance);
sbit echo = P2^7;
sbit trig = P2^3;
sbit beep = P2^4;
bit flag = 0; //测量成功标志位全局参定义
uint time_H,time_L; //暂存值,只用来存储定时器的高低八位返回数值
uint time; //时间
uint max=2,min=1; //单位为米
uint cm_table1[2]={0,0};
uint cm_table2[2]={0,0}; //储存距离参数的数组
uint maxnum[2]={0,0};
uint minnum[2]={0,0};
void main()
{
uint distance = 0; //参数:距离
uint save = 0; //参数:(上一次的)距离保存。用于修正错误值
uint i = 5;
beep=0; //蜂鸣器上电后不响
delay(1000);
OLED_Init(); // OLED初始化
OLED_Fill(0x00);
trig = 0; //先关触发信号 //指示灯
while(1)
{
TMOD = 0x10; //开定时器1-> 0001_0000 16位工作方式
TH1 = 0; //定时器高八位初填装值清空
TL1 = 0; //定时器低八位初填装值清空
TF1=0; //T1溢出中断标志位。可自动由硬件至高/清零
ET1 = 0; //T1中断使能
EA = 1; //开总中断
flag = 0; //标志位清0
trig = 1; //给触发信号
delay_20us(); //等那么一小段时间
trig = 0; //关触发信号 ————这样就给了一小段高电平触发信号,以至于不会一直触发
while(!echo); //等待接收端出现高电平(如果是低,那就一直等)
TR1 = 1; //T1运行控制位,开始计时
while(echo); //等待高电平结束(如果是高,那就一直等)
TR1 = 0; //关定时器T1
time_H = TH1; //把T1的高低八位定时数据取出
time_L = TL1; // ↑
if(flag == 0) //如果测距成功
{
time=time_H*256+time_L; //将定时器的高低八位返回值赋给时间参数time
distance = time*0.173; //来回1/2*时间time*声速346(m/s)*0.001(单位换算:mm)
save = distance; //暂存正确的距离值
if(distance > max*1000)
{
beep = 1;
}
if(distance <= max*1000 && distance >= min*1000)
{
beep = 0;
light_time();
}
if(distance < min*1000)
{
beep = 1;
delay(50000);
beep=0;
}
Math_Distance(distance);
}
else if(flag == 1)
{
distance = save;
}
switch(key_scan())
{
case 0:
break;
case 1:
if(max == 10)
{
max = 10;
}
else
{
max++;
}
break;
case 2:
if(max == 0)
{
max = 0;
}
else
{
max--;
}
break;
case 3:
if(min == 10)
{
min = 10;
}
else
{
min++;
}
break;
case 4:
if(min == 0)
{
min = 0;
}
else
{
min--;
}
break;
default:
break;
}
OLED_P6x8Str(0,1,"maximums:");
Show_Number(8,2,maxnum,2);
OLED_P8x16Str(26,2,"m");
OLED_P6x8Str(74,1,"minimums:");
Show_Number(82,2,minnum,2);
OLED_P8x16Str(100,2,"m");
OLED_P8x16Str(28,4,"distance:");
OLED_P8x16Str(78,6,"dm");
Show_Number(32,6,cm_table1,2);
OLED_P6x8Str(50,7,".");
Show_Number(58,6,cm_table2,2);
delay(5000);
}
}
/*******************************************************************************
* 函 数 名 : Math_Distance
*******************************************************************************/
void Math_Distance(uint distance) //距离值数学转换
{
cm_table1[0]=distance/1000;
cm_table1[1]=distance/100;
cm_table2[0]=distance%100/10;
cm_table2[1]=distance%100%10;
maxnum[0]=max/10;
maxnum[1]=max%10;
minnum[0]=min/10;
minnum[1]=min%10;
}
按键检测:
#include"key.h"
#define uchar unsigned char
#define uint unsigned int
sbit A4 = P2^0;
sbit A5 = P3^3;
sbit A6 = P2^1;
sbit A7 = P2^2;
/**********************************
* 函数名: 键值函数
**************************************/
uint key_scan()
{
uint keynum = 0;
if(A4 == 0)
{
keynum = 1;
}
if(A5 == 0)
{
keynum = 2;
}
if(A6 == 0)
{
keynum = 3;
}
if(A7 == 0)
{
keynum = 4;
}
return keynum;
}
|