功能介绍:
0.本系统采用STC89C52作为单片机
1.导盲仗的上部和底部分别设置超声波传感器,利用超声波测距原理分别测得盲人面部和脚底离障碍物的距离,并将障碍信息通过语音播报传递给盲人
2.导盲杖设有光照传感器,利用光敏电阻测量环境光照,光照强度小于某个阈值时,自动打开导盲杖的照明LED灯带。以便引起行人及车辆注意。
3.在导盲杖的底部安装积水探测传感器,来检测积水,如果有积水则进行蜂鸣器报警,进而提醒盲人躲避积水。
4.导盲杖设有温度传感器,按键可语音播报当前温度,为盲人增添衣物提供参考。
5.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
PCB:
主程序:
#include "main.h"
sbit TRIG_1 = P2^4;
sbit ECHO_1 = P2^5;
sbit TRIG_2 = P1^1;
sbit ECHO_2 = P1^0;
float f_distance1 = 0;
float f_distance2 = 0;
int tempBuf = 0;
float temperature;
bit refreshFlag = 0;
bit sendFlag = 0;
unsigned int lightValue;
unsigned int waterValue;
char dis[32];
void main()
{
BUZZER = ON;
LED = ON;
DelayS(1);
BUZZER = OFF;
LED = OFF;
TRIG_1 = 0;
TRIG_2 = 0;
Timer0_Init();
Timer1_Init();
UART_Init();
DS18B20_Start();
DS18B20_GetTemp(&tempBuf);
temperature = (float)tempBuf * 0.0625;
while (1)
{
if (refreshFlag == 1)
{
refreshFlag = 0;
Measuring();
TR1 = 0;
if (f_distance1 <= 1500)
{
UART_SendStr("注意前方障碍物\r\n", 16);
DelayS(3);
}
if (f_distance2 <= 1500)
{
UART_SendStr("注意脚下障碍物\r\n", 16);
DelayS(3);
}
TR1 = 1;
if (lightValue < 40)
{
LED = ON;
}
else
{
LED = OFF;
}
if (waterValue > 10)
{
BUZZER = ON;
}
else
{
BUZZER = OFF;
}
}
if (KEY_TEMP == 0)
{
DelayMs(20);
if (KEY_TEMP == 0)
{
TR1 = 0;
DS18B20_Start();
DS18B20_GetTemp(&tempBuf);
temperature = (float)tempBuf * 0.0625;
sprintf(dis, "当前温度%4.1f摄氏度\r\n", temperature);
UART_SendStr(dis, 20);
DelayS(2);
TR1 = 1;
}
while (!KEY_TEMP)
;
}
}
}
void Timer0_Init(void)
{
TMOD |= 0x01;
TH0 = 0;
TL0 = 0;
EA = 1;
ET0 = 1;
TR0 = 0;
}
void Timer0_Interrupt(void) interrupt 1
{
}
void Timer1_Init(void)
{
TMOD |= 0x10;
TH1 = (65536 - 9216) / 256;
TL1 = (65536 - 9216) % 256;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void Timer1_Interrupt(void) interrupt 3
{
static unsigned int time50ms = 0;
TL1 = 0x00;
TH1 = 0x4C;
time50ms++;
if (time50ms > 20)
{
refreshFlag = 1;
time50ms = 0;
}
}
void Measuring(void)
{
static long cnt = 0;
TR1 = 0;
TRIG_1 = 1;
DelayUs10x(1);
TRIG_1 = 0;
while (!ECHO_1)
;
TR0 = 1;
while (ECHO_1)
;
TR0 = 0;
cnt = (long)(TH0 * 256 + TL0);
TH0 = 0;
TL0 = 0;
f_distance1 = (float)cnt * 17 / 100.0 * 1.102;
cnt = 0;
TRIG_2 = 1;
DelayUs10x(1);
TRIG_2 = 0;
while (!ECHO_2)
;
TR0 = 1;
while (ECHO_2)
;
TR0 = 0;
cnt = (long)(TH0 * 256 + TL0);
TH0 = 0;
TL0 = 0;
f_distance2 = (float)cnt * 17 / 100.0 * 1.102;
cnt = 0;
TR1 = 1;
lightValue = 100 - 100 * ReadADC(AIN0_GND) / 255;
waterValue = 100 - 100 * ReadADC(AIN1_GND) / 255;
}
void UART_Init(void)
{
SCON = 0x50;
TH2 = 0xFF;
TL2 = 0xDB;
RCAP2H = 0xFF;
RCAP2L = 0xDB;
TCLK = 1;
RCLK = 1;
C_T2 = 0;
EXEN2 = 0;
TR2 = 1;
ES = 1;
EA = 1;
}
void UART_SendByte(unsigned char dat)
{
unsigned char time_out;
time_out = 0;
SBUF = dat;
while ((!TI) && (time_out < 100))
{
time_out++;
DelayUs10x(2);
}
TI = 0;
}
void UART_SendStr(unsigned char *s, unsigned char length)
{
unsigned char num;
num = 0x00;
while (num < length)
{
UART_SendByte(*s);
s++;
num++;
}
}
void UART_Interrupt(void) interrupt 4
{
if (RI)
{
RI = 0;
}
}
仿真演示视频:
https://www.bilibili.com/video/BV1EY4y1578X/
实物演示视频:
https://www.bilibili.com/video/BV1HY4y1675F/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)