|
單片機主程序:
#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; //測量成功標(biāo)志位全局參定義
uint time_H,time_L; //暫存值,只用來存儲定時器的高低八位返回數(shù)值
uint time; //時間
uint max=2,min=1; //單位為米
uint cm_table1[2]={0,0};
uint cm_table2[2]={0,0}; //儲存距離參數(shù)的數(shù)組
uint maxnum[2]={0,0};
uint minnum[2]={0,0};
void main()
{
uint distance = 0; //參數(shù):距離
uint save = 0; //參數(shù):(上一次的)距離保存。用于修正錯誤值
uint i = 5;
beep=0; //蜂鳴器上電后不響
delay(1000);
OLED_Init(); // OLED初始化
OLED_Fill(0x00);
trig = 0; //先關(guān)觸發(fā)信號 //指示燈
while(1)
{
TMOD = 0x10; //開定時器1-> 0001_0000 16位工作方式
TH1 = 0; //定時器高八位初填裝值清空
TL1 = 0; //定時器低八位初填裝值清空
TF1=0; //T1溢出中斷標(biāo)志位。可自動由硬件至高/清零
ET1 = 0; //T1中斷使能
EA = 1; //開總中斷
flag = 0; //標(biāo)志位清0
trig = 1; //給觸發(fā)信號
delay_20us(); //等那么一小段時間
trig = 0; //關(guān)觸發(fā)信號 ————這樣就給了一小段高電平觸發(fā)信號,以至于不會一直觸發(fā)
while(!echo); //等待接收端出現(xiàn)高電平(如果是低,那就一直等)
TR1 = 1; //T1運行控制位,開始計時
while(echo); //等待高電平結(jié)束(如果是高,那就一直等)
TR1 = 0; //關(guān)定時器T1
time_H = TH1; //把T1的高低八位定時數(shù)據(jù)取出
time_L = TL1; // ↑
if(flag == 0) //如果測距成功
{
time=time_H*256+time_L; //將定時器的高低八位返回值賦給時間參數(shù)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);
}
}
/*******************************************************************************
* 函 數(shù) 名 : Math_Distance
*******************************************************************************/
void Math_Distance(uint distance) //距離值數(shù)學(xué)轉(zhuǎn)換
{
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;
/**********************************
* 函數(shù)名: 鍵值函數(shù)
**************************************/
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;
}
|
|