0 前言
??
這兩年開始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。
為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天要分享的是
?? 畢業(yè)設(shè)計(jì) 基于單片機(jī)的導(dǎo)盲拐杖設(shè)計(jì)(源碼+硬件+論文)
??學(xué)長這里給一個(gè)題目綜合評分(每項(xiàng)滿分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):4分
?? 項(xiàng)目分享:文章來源:http://www.zghlxwxcb.cn/news/detail-449240.html
https://gitee.com/sinonfin/sharing文章來源地址http://www.zghlxwxcb.cn/news/detail-449240.html
1 主要功能
本設(shè)計(jì)模仿蝙蝠的超聲應(yīng)用能力和原理,在研究現(xiàn)有的電子式超聲波測距系統(tǒng)的基礎(chǔ)上,應(yīng)用回聲定位的原理,通過傳感器發(fā)送超聲波,然后獲得并分析障礙物的回波信息,研制的一套超聲波導(dǎo)盲系統(tǒng)[11]。系統(tǒng)采用STC89C52RC單片機(jī)作為控制器,利用超聲測距的原理,設(shè)計(jì)了一種超聲波導(dǎo)盲裝置,該裝置可以對盲人前方道路上的障礙物進(jìn)行距離探測并把障礙物距離信息轉(zhuǎn)換成語音提示,盲人可以根據(jù)提示音,避讓障礙同時(shí)達(dá)到導(dǎo)盲作用。該系統(tǒng)具有硬件結(jié)構(gòu)簡單、工作可靠、測量誤差小等特點(diǎn)。
主要的設(shè)計(jì)有:
主機(jī)功能
- 超聲波測距測試距離并且顯示;
- 可以按鍵設(shè)置報(bào)警距離,在閾值內(nèi)可以發(fā)出語音播報(bào)和震動(dòng)提示盲人如何行走;
- 按鍵按下可以播報(bào)當(dāng)前時(shí)間,時(shí)鐘ds1302獲取;
- 整點(diǎn)報(bào)時(shí);
- 具有g(shù)ps定位系統(tǒng),并可以通過sim800模塊發(fā)送經(jīng)緯坐標(biāo)到家人手機(jī)上;
- 手機(jī)號(hào)可以自行設(shè)置;
- dht11檢測濕度,當(dāng)濕度過高時(shí),發(fā)出語音提示;
- 角度傳感器檢測角度,判斷是否摔倒,如果摔倒發(fā)送短信到預(yù)設(shè)手機(jī)號(hào)。
從機(jī)為藍(lán)牙耳機(jī)
- 接受主機(jī)發(fā)送的提示信號(hào);
- 播放相應(yīng)狀態(tài)下的語音。
2 硬件設(shè)計(jì)(原理圖)
該系統(tǒng)由單片機(jī)、超聲波發(fā)射接收電路、液晶顯示電路、聲光報(bào)警模塊、溫濕度采集模塊,GPS定位模塊、短信SIM800模塊、時(shí)鐘模塊、藍(lán)牙模塊以及運(yùn)動(dòng)軸模塊組成,控制核心為單片機(jī)。單片機(jī)在接收到傳感器的信息后,將傳感器的信號(hào)轉(zhuǎn)換為距離信息,通過語音播報(bào)或振動(dòng)提示。
3 核心軟件設(shè)計(jì)
本次設(shè)計(jì)采用是以單片機(jī)為主控核心,C語言為編程語言,所以采用的軟件設(shè)計(jì)平臺(tái),我采用了Keil為主要的編譯平臺(tái)。該平臺(tái)是美國Keil Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、鏈接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境將這些部分組合在一起。運(yùn)行Keil軟件需要WIN系列操作系統(tǒng)。
傳感器對盲人拐杖狀態(tài)的判定以及對周圍環(huán)境的判定。
從機(jī)部分將通過語音播報(bào)模塊做出相應(yīng)的語音播報(bào)
本次按鍵模塊需要軟件邏輯設(shè)計(jì)實(shí)現(xiàn)對經(jīng)緯度的顯示、時(shí)間正點(diǎn)播報(bào)、時(shí)間設(shè)定以及安全距離設(shè)定。
超聲波電機(jī)振動(dòng)警報(bào)模塊檢測到有障礙物在安全距離內(nèi)時(shí)也會(huì)發(fā)出語音警報(bào),同時(shí)主機(jī)的聲光報(bào)警系統(tǒng)也會(huì)發(fā)出響聲警報(bào)。
為了避免盲人摔倒的意外發(fā)生,使用了MPU6050角度運(yùn)動(dòng)傳感器,當(dāng)盲人出了什么意外的時(shí)候,通過SIM800模塊向盲人家屬傳遞盲人摔倒的信息。
關(guān)鍵代碼
#include "main.h"
#include "uart.h"
#include"lcd.h"
#include"ds1302.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <INTRINS.H>
sbit key_1 = P1 ^ 0; //按鍵
sbit key_2 = P1 ^ 1; //按鍵
sbit key_3 = P1 ^ 2; //按鍵
sbit key_4 = P1 ^ 3; //按鍵
sbit sw = P3 ^ 4; //串口切換
sbit ele = P3 ^ 6; //電機(jī)
sbit DHT11 = P3^7 ; //dht11引腳定義
sbit buz = P2^0 ; //聲光報(bào)警
sbit RX_1 = P1 ^ 6; //超聲波模塊
sbit TX_1 = P1 ^ 7; //超聲波模塊
unsigned int time_juli=0;
bit flag =0;
int juli_a = 0;
bit chao_flag = 0; //超聲波標(biāo)量
int juli_down = 300; //小于距離
int X_mpu6050 = 0;
int Y_mpu6050 = 0;
char zf[3];
unsigned char hour=0,min=0;sec=0; //定義uchar類型變量 時(shí) 分 秒
unsigned char warCount=0;//摔倒計(jì)數(shù)
//unsigned char num=0;
int weidu_A = 0; //維度顯示A、B、C度分秒
int weidu_B = 0;
int weidu_C = 0;
int jingdu_A = 0; //精度顯示A、B、C度分秒
int jingdu_B = 0;
int jingdu_C = 0;
unsigned char user_number[11]= {0x31,0x33,0x31,0x30,0x30,0x32,0x36,0x31,0x30,0x36,0x39};//手機(jī)號(hào)
unsigned char humiDown=0;//濕度下限
bit showMode=0;//0-正常顯示數(shù)據(jù) 1-顯示gps
unsigned char count = 0;
int i=0; //用于for循環(huán)
unsigned char U8FLAG,k;
unsigned char U8count,U8temp;
unsigned char U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char U8comdata;
unsigned char dht11_temp = 0; //dht11溫度
unsigned char dht11_humi = 0; //dht11濕度
void Delay10ms(unsigned int c) //誤差 0us
{
unsigned char a, b;
//--c已經(jīng)在傳遞過來的時(shí)候已經(jīng)賦值了,所以在for語句第一句就不用賦值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void beep()
{
buz=0;
Delay10ms(20);
buz=1;
Delay10ms(20);
}
//
//****************************************
// 定義51單片機(jī)端口
//****************************************
sbit SCL=P3^2; //IIC時(shí)鐘引腳定義
sbit SDA=P3^3; //IIC數(shù)據(jù)引腳定義
//****************************************
// 定義MPU6050內(nèi)部地址
//****************************************
#define SMPLRT_DIV 0x19 //陀螺儀采樣率,典型值:0x07(125Hz)
#define CONFIG 0x1A //低通濾波頻率,典型值:0x06(5Hz)
#define GYRO_CONFIG 0x1B //陀螺儀自檢及測量范圍,典型值:0x18(不自檢,2000deg/s)
#define ACCEL_CONFIG 0x1C //加速計(jì)自檢、測量范圍及高通濾波頻率,典型值:0x01(不自檢,2G,5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B //電源管理,典型值:0x00(正常啟用)
#define WHO_AM_I 0x75 //IIC地址寄存器(默認(rèn)數(shù)值0x68,只讀)
#define SlaveAddress 0xD0 //IIC寫入時(shí)的地址字節(jié)數(shù)據(jù),+1為讀取
//****************************************
//延時(shí)
//****************************************
//void delay(unsigned int k)
//{
// unsigned int i,j;
// for(i=0;i<k;i++)
// {
// for(j=0;j<121;j++);
// }
//}
//**************************************
//延時(shí)5微秒(STC90C52RC@12M)
//不同的工作環(huán)境,需要調(diào)整此函數(shù)
//當(dāng)改用1T的MCU時(shí),請調(diào)整此延時(shí)函數(shù)
//**************************************
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//**************************************
//I2C起始信號(hào)
//**************************************
void I2C_Start()
{
SDA = 1; //拉高數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 0; //產(chǎn)生下降沿
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
}
//**************************************
//I2C停止信號(hào)
//**************************************
void I2C_Stop()
{
SDA = 0; //拉低數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 1; //產(chǎn)生上升沿
Delay5us(); //延時(shí)
}
//**************************************
//I2C發(fā)送應(yīng)答信號(hào)
//入口參數(shù):ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(bit ack)
{
SDA = ack; //寫應(yīng)答信號(hào)
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
//**************************************
//I2C接收應(yīng)答信號(hào)
//**************************************
bit I2C_RecvACK()
{
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
CY = SDA; //讀應(yīng)答信號(hào)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
return CY;
}
//**************************************
//向I2C總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
//**************************************
void I2C_SendByte(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat <<= 1; //移出數(shù)據(jù)的最高位
SDA = CY; //送數(shù)據(jù)口
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
I2C_RecvACK();
}
//**************************************
//從I2C總線接收一個(gè)字節(jié)數(shù)據(jù)
//**************************************
uchar I2C_RecvByte()
{
uchar i;
uchar dat = 0;
SDA = 1; //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat <<= 1;
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
dat |= SDA; //讀數(shù)據(jù)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
return dat;
}
//**************************************
//向I2C設(shè)備寫入一個(gè)字節(jié)數(shù)據(jù)
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
{
I2C_Start(); //起始信號(hào)
I2C_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫信號(hào)
I2C_SendByte(REG_Address); //內(nèi)部寄存器地址,
I2C_SendByte(REG_data); //內(nèi)部寄存器數(shù)據(jù),
I2C_Stop(); //發(fā)送停止信號(hào)
}
//**************************************
//從I2C設(shè)備讀取一個(gè)字節(jié)數(shù)據(jù)
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
{
uchar REG_data;
I2C_Start(); //起始信號(hào)
I2C_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫信號(hào)
I2C_SendByte(REG_Address); //發(fā)送存儲(chǔ)單元地址,從0開始
I2C_Start(); //起始信號(hào)
I2C_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)
REG_data=I2C_RecvByte(); //讀出寄存器數(shù)據(jù)
I2C_SendACK(1); //接收應(yīng)答信號(hào)
I2C_Stop(); //停止信號(hào)
return REG_data;
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
Single_WriteI2C(PWR_MGMT_1, 0x00); //解除休眠狀態(tài)
Single_WriteI2C(SMPLRT_DIV, 0x07);
Single_WriteI2C(CONFIG, 0x06);
Single_WriteI2C(GYRO_CONFIG, 0x18);
Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
//**************************************
//合成數(shù)據(jù)
//**************************************
int GetData(uchar REG_Address)
{
uchar H,L;
H=Single_ReadI2C(REG_Address);
L=Single_ReadI2C(REG_Address+1);
return (H<<8)+L; //合成數(shù)據(jù)
}
void Delay(unsigned int j)
{
unsigned char i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
unsigned char i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DHT11)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(DHT11)U8temp=1;
U8FLAG=2;
while((DHT11)&&U8FLAG++);
//超時(shí)則跳出for循環(huán)
if(U8FLAG==1)break;
//判斷數(shù)據(jù)位是0還是1
// 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
void get_dht11(void)
{
//主機(jī)拉低18ms
DHT11=0;
Delay(180);
DHT11=1;
//總線由上拉電阻拉高 主機(jī)延時(shí)20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
DHT11=1;
//判斷從機(jī)是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
if(!DHT11) //T !
{
U8FLAG=2;
//判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
while((!DHT11)&&U8FLAG++);
U8FLAG=2;
//判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while((DHT11)&&U8FLAG++);
//數(shù)據(jù)接收狀態(tài)
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DHT11=1;
//數(shù)據(jù)校驗(yàn)
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
dht11_temp = U8T_data_H;
dht11_humi = U8RH_data_H;
U8checkdata=U8checkdata_temp;
}
//fi
}//fi
}
///
/********************************************************/
void StartModule_1() //T1中斷用來掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
{
TX_1=1; //800MS 啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX_1=0;
}
/*****************測距函數(shù)*******************/
/********************************************************/
void Conut_1(void)
{
// float a;
time_juli=TH0*256+TL0;
TH0=0;
TL0=0;
//溫度補(bǔ)償
juli_a=time_juli*1.87/10; //算出來是mM 11。0592M晶振
if(flag==1) //超出測量
{
flag=0;
juli_a = 0;
}
}
void read_juli()
{
chao_flag = 1; //開始獲取
//獲取距離
StartModule_1(); //計(jì)算
while(!RX_1); //當(dāng)RX為零時(shí)等待
TH0=0;
TL0=0;
// TR0=1; //開啟計(jì)數(shù)
while(RX_1); //當(dāng)RX為1計(jì)數(shù)并等待
// TR0=0; //關(guān)閉計(jì)數(shù)
Conut_1();
chao_flag = 0; //停止獲取
}
void Uart1Send(uchar c)
{
SBUF=c;
while(!TI);//等待發(fā)送完成信號(hào)(TI=1)出現(xiàn)
TI=0;
}
//串行口連續(xù)發(fā)送char型數(shù)組,遇到終止號(hào)/0將停止
void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待發(fā)送完成信號(hào)(TI=1)出現(xiàn)
TI=0;
str++;
}
}
void Uart_1Sends_B(uchar *str)
{
char i=0;
LCD_Write_Com(0xc0);
LCD_Write_Data(user_number[0]);
LCD_Write_Data(user_number[1]);
LCD_Write_Data(user_number[2]);
LCD_Write_Data(user_number[3]);
LCD_Write_Data(user_number[4]);
LCD_Write_Data(user_number[5]);
LCD_Write_Data(user_number[6]);
LCD_Write_Data(user_number[7]);
LCD_Write_Data(user_number[8]);
LCD_Write_Data(user_number[9]);
LCD_Write_Data(user_number[10]);
while(*str!='\0')
{
if(i==12)
SBUF = user_number[0];
else if(i==16)
SBUF = user_number[1];
else if(i==20)
SBUF = user_number[2];
else if(i==24)
SBUF = user_number[3];
else if(i==28)
SBUF = user_number[4];
else if(i==32)
SBUF = user_number[5];
else if(i==36)
SBUF = user_number[6];
else if(i==40)
SBUF = user_number[7];
else if(i==44)
SBUF = user_number[8];
else if(i==48)
SBUF = user_number[9];
else if(i==52)
SBUF = user_number[10];
else
SBUF=*str;
while(!TI);//等待發(fā)送完成信號(hào)(TI=1)出現(xiàn)
TI=0;
str++;
i++;
}
}
//轉(zhuǎn)換數(shù)據(jù)
void switch_data(uchar a)
{
switch(a)
{
case 0: UartPrintf("0030"); break;
case 1: UartPrintf("0031"); break;
case 2: UartPrintf("0032"); break;
case 3: UartPrintf("0033"); break;
case 4: UartPrintf("0034"); break;
case 5: UartPrintf("0035"); break;
case 6: UartPrintf("0036"); break;
case 7: UartPrintf("0037"); break;
case 8: UartPrintf("0038"); break;
case 9: UartPrintf("0039"); break;
default: UartPrintf("002E");break;
}
}
void sendMes()
{
Uart1Sends("AT+CMGF=1\r\n");
Delay10ms(300);//延時(shí)2秒
Uart1Sends("AT+CSCS=\"UCS2\"\r\n");
Delay10ms(300);//延時(shí)2秒
Uart1Sends("AT+CSCA?\r\n");
Delay10ms(300);//延時(shí)2秒
Uart1Sends("AT+CSMP=17,167,0,24\r\n");
Delay10ms(300);//延時(shí)2秒
Uart_1Sends_B("AT+CMGS=\"00310033003300330033003300330039003200340033\"\r\n");//此處修改為對
Delay10ms(300);//延時(shí)2秒
Uart1Sends("970089815E2E52A9FF0C00670070007357506807FF1A");
//發(fā)送gps坐標(biāo)
//維度
UartPrintf("7EF45EA6");
switch_data(weidu_A%100/10);
switch_data(weidu_A%10);
//度
UartPrintf("5EA6");
switch_data(weidu_B%100/10);
switch_data(weidu_B%10);
//分
UartPrintf("5206");
switch_data(weidu_C%100/10);
switch_data(weidu_C%10);
//秒
UartPrintf("79D20020");
//經(jīng)度
UartPrintf("7ECF5EA6");
switch_data(jingdu_A/100);
switch_data(jingdu_A%100/10);
switch_data(jingdu_A%10);
//度
UartPrintf("5EA6");
switch_data(jingdu_B%100/10);
switch_data(jingdu_B%10);
//分
UartPrintf("5206");
switch_data(jingdu_C%100/10);
switch_data(jingdu_C%10);
//秒
UartPrintf("79D20020");
Delay10ms(300);//延時(shí)2秒
Uart1Send(0x1a);
Delay10ms(300);//延時(shí)2秒
}
//輸入手機(jī)號(hào)
void inputTel()
{
}
void checkWar()
{
//檢測距離
if(juli_a<juli_down)
{
//發(fā)送播報(bào)信息
Uart1Send(0xee);//字頭
Uart1Send(0x03);//指令
Uart1Send(0x00);
Uart1Send(0x00);
ele=0;
beep();
beep();
beep();
ele=1;
Delay10ms(30);
}
//整點(diǎn)報(bào)時(shí)
if((min==0)&&(sec<2))
{
//發(fā)送播報(bào)信息
Uart1Send(0xee);//字頭
Uart1Send(0x00);//指令
Uart1Send(hour);
Uart1Send(0x00);
beep();
Delay10ms(30);
}
4 實(shí)現(xiàn)效果
5 最后
包含內(nèi)容
?? 項(xiàng)目分享:
https://gitee.com/sinonfin/sharing
到了這里,關(guān)于畢業(yè)設(shè)計(jì) 基于單片機(jī)的導(dǎo)盲拐杖設(shè)計(jì)(源碼+硬件+論文)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!