《多功能小車的設計》由會員分享,可在線閱讀,更多相關《多功能小車的設計(11頁珍藏版)》請在裝配圖網上搜索。
1、基于探測用途多功能小車的設計
摘要:
這是一個基于80C52單片機 溫度傳感器 超聲波測距模塊的一個智能小車系統(tǒng)。該系統(tǒng)能準確無誤的測出溫度和距離障礙物的距離,并且可以自動避障,顯示溫度距離。具有方便,實用性價比高的特點,經過在實踐中的應用,有一定的推廣價值。
關鍵字:
80C52單片機 溫度傳感器 超聲波測距模塊 智能小車系統(tǒng)
引言:
隨著電子技術的飛速發(fā)展,越來越多的單片機技術的廣泛使用已經應用于人們的 社會生產實踐,人類的生活發(fā)生了根本性的改變。由于在現(xiàn)代生產實踐中,從事某些生產作業(yè)的人員會遇到各種各樣的問題以及一些安全隱患,基于此,本設計初步構想,希望通過設計該小車的設計,
2、以及通過其所實現(xiàn)的功能能夠在將來的生產實踐中得到有效合理的利用,從而滿足和實現(xiàn)社會的需求。
一、方案的選擇與器件的選用
本設計是基于STC89C52單片機進行的,多功能小車基于STC89C52并且通過利用超聲波測距模塊用來實現(xiàn)繞開障礙物和通過溫度傳感器模塊用以實現(xiàn)探測環(huán)境溫度的功能,同時以1602液晶顯示屏來達到探測距離和溫度的精確測量,并且在距離以及溫度在達到一定的范圍時,還能通過蜂鳴發(fā)生器和指示燈發(fā)出報警信號,提醒我們來避開一些危險,從而有效解決了人們生產實踐中所遇到的各種難題。譬如:在生產作業(yè)的工作中,通過距離的探測,能夠提醒相關工作人員躲避風險,通過溫度的測量,能夠提醒人們何時進行
3、相關操作等。
總而言之,該設計的廣泛使用能夠指導和解決人們的各種生產實踐所遇到的問題。
一、具體實現(xiàn)的的功能:
利用超聲波探測器來測量距離障礙物的距離,同時并將測得的具體數(shù)值在液晶顯示屏上精確的顯示出來,當距離小于10cm時,蜂鳴器會發(fā)聲,且會進行自動轉向已實現(xiàn)避障。
基于溫度傳感器用以測量周圍環(huán)境的溫度,同時并將測得的具體數(shù)值在液晶顯示屏上精確的顯示出來,當環(huán)境溫度高于25?C,LED燈會發(fā)光。
二、主要單元電路的設計
l 單片機主控制模塊的設計
STC89C52單片機為40引腳雙列直插芯片,有四個I/O口P0,P1,P2,P3,每一條I/O線都能獨立地作輸出或輸入。
4、
單片機的最小系統(tǒng)如下圖所示,18引腳和19引腳接時鐘電路,XTAL1接外部晶振和微調電容的一端,在片內它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調電容的另一端,在片內它是振蕩器倒相放大器的輸出。第9引腳為復位輸入端,接上電容,電阻夠上電復位電路,20引腳為接地端,40引腳為電源端。
l 應用電路模塊的設計。
1602顯示模塊的電路圖:
蜂鳴器模塊的電路圖:
溫度顯示器模塊的電路圖:
l 應用程序的設計
接線:模塊TRIG接 P2.6 ECH0 接P2.7
[注:AT89x51使用12M或11.0592M晶振,實測使用
5、11.0592M]
=============================================================*/
#include //器件配置文件
#include
#include "18b20.h"
#define RX P2_7
#define TX P2_6
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit feng=P1^1;
sbit deng=P1^0;
sbit P36=P3^6;
6、sbit P35=P3^5;
sbit P34=P3^4;
sbit P33=P3^3;
sbit P27=P2^7;
#define LCD_Data P0
/******************************************
函數(shù)功能:測試LCD忙碌狀態(tài)
入口參數(shù):
出口參數(shù):result
*******************************************/
bit LCD_Busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
7、 delay_ms(5); //此處延時特別重要 (必不可少)
result = (bit)(LCD_Data & 0x80);
delay_ms(5);
LCD_EN = 0;
return result;
}
/******************************************
函數(shù)功能:寫指令數(shù)據到LCD子程序
入口參數(shù):要寫入的指令
出口參數(shù):
*******************************************/
void LCD_Write_Command(unsigned char cmd)
{
whil
8、e(LCD_Busy()); //判斷LCD是否忙碌
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
LCD_Data = cmd;
delay_ms(5);
LCD_EN = 0;
}
/******************************************
函數(shù)功能:寫入顯示數(shù)據到LCD子程序
入口參數(shù):要寫入的數(shù)據
出口參數(shù):
*******************************************/
void LCD_Write_Data(unsigned char dat)
{
w
9、hile(LCD_Busy()); //判斷LCD是否忙碌
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
LCD_Data = dat;
delay_ms(5);
LCD_EN = 0;
}
/******************************************
函數(shù)功能:設定顯示位置子程序
入口參數(shù):pos
出口參數(shù):
*******************************************/
void LCD_Position(unsigned char pos)
{
LCD_
10、Write_Command(pos|0x80);
}
/******************************************
函數(shù)功能:LCD初始化子程序
入口參數(shù):
出口參數(shù):
*******************************************/
void LCD_Init()
{
delay_ms(15);
LCD_Write_Command(0x38); //顯示模式設置
delay_ms(5);
LCD_Write_Command(0x38); //顯示模式設置
delay_ms(5);
11、
LCD_Write_Command(0x38); //顯示模式設置
delay_ms(5);
LCD_Write_Command(0x0c); //顯示光標設置,開顯示
delay_ms(5);
LCD_Write_Command(0x06); //顯示光標移動(右移)
delay_ms(5);
LCD_Write_Command(0x01); //清屏
delay_ms(5);
}
/******************************************
函數(shù)功能:顯示自定義字符
入
12、口參數(shù):x坐標值,y坐標值,顯示的字符數(shù)據
出口參數(shù):
*******************************************/
void LCD_Display_Bmp(unsigned char x,unsigned char y,unsigned char *mytab)
{
unsigned char i=0;
LCD_Write_Command(0x40); //寫CGRAM
for (i=0;i<8;i++)
LCD_Write_Data(mytab[i]);
if(y==0) LCD_Position(x)
13、;
else LCD_Position(x+0x40);//設置顯示位置
LCD_Write_Data(0);
}
/*******************************************
函數(shù)功能:顯示字符串程序
備注1:0<=x<=15
備注2:0<=y<= 1
*******************************************/
void LCD_Display(unsigned char x,unsigned char y,unsigned char *words)
{
unsigned cha
14、r i=0;
if(y==0)LCD_Position(x); //設置顯示位置
else LCD_Position(x+0x40);
while(words[i] != \0)
{
LCD_Write_Data(words[i]); //顯示字符
i++;
}
}
/*******************************************
函數(shù)功能:顯示一個ASCII碼程序
備注1:0<=x<=15
備注2:0<=y<= 1
****************************************
15、***/
void LCD_Display_Char(unsigned char x,unsigned char y,unsigned char word)
{
unsigned char i=0;
if(y==0)LCD_Position(x); //設置顯示位置
else LCD_Position(x+0x40);
LCD_Write_Data(word); //顯示字符
}
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
unsigne
16、d char code mcustudio[] ={"jilin university"};
unsigned char code email[] = {"hhhhhhhh"};
unsigned char code Cls[] = {" "};
unsigned char code ASCII[15] = {0,1,2,3,4,5,6,7,8,9,.,-,M};
static unsigned char DisNum = 0; //顯示用指針
unsigned int time=0;
un
17、signed long S=0;
bit flag =0;
unsigned char disbuff[4] ={ 0,0,0,0,};
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來是CM
if((S>=700)||flag==1) //超出測量范圍顯示“-”
{
flag=0;
LCD_Display_Char(0, 1, ASCII[11]);
LCD_Dis
18、play_Char(1, 1, ASCII[10]); //顯示點
LCD_Display_Char(2, 1, ASCII[11]);
LCD_Display_Char(3, 1, ASCII[11]);
LCD_Display_Char(4, 1, ASCII[12]); //顯示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
LCD_Display_Char(0, 1, ASCII[disbu
19、ff[0]]);
LCD_Display_Char(1, 1, ASCII[10]); //顯示點
LCD_Display_Char(2, 1, ASCII[disbuff[1]]);
LCD_Display_Char(3, 1, ASCII[disbuff[2]]);
LCD_Display_Char(4, 1, ASCII[12]); //顯示M
}
}
/********************************************************/
void zd0() interrupt 1 //T0中斷
20、用來計數(shù)器溢出,超過測距范圍
{TL0=0;
TH0=0;
flag=1; //中斷溢出標志
}
/********************************************************/
void StartModule() //啟動模塊
{
TX=1; //啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
21、
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
void main(void)
{unsigned int j,k;
LCD_Init(); // 初始化LCD
22、
LCD_Display(0,0,"51090210 Jlu");
LCD_Display_Char(15,1,0x43); //0x43對應ASCII碼為"C"
LCD_Display_Bmp(14,1,tab);
while(1){
TMOD=0x01; //設T0為方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //允許T0中斷
EA=1; //開啟總中斷
while(1)
{
StartModule();
whi
23、le(!RX); //當RX為零時等待
TR0=1; //開啟計數(shù)
while(RX); //當RX為1計數(shù)并等待
TR0=0; //關閉計數(shù)
Conut(); //計算
Read_Temperature();
j=temp_data[0];
k=temp_data[1];
k=k<<8; //開始計算實際溫度
j|=k;
j*=0.625;
LCD_Display_Char(10,1,j/100 + 0x30);//加上0x30轉換為ASCII碼
L
24、CD_Display_Char(11,1,j%100/10 + 0x30);
LCD_Display(12,1,".");
LCD_Display_Char(13,1,j%10 + 0x30);
if(j>250){deng=0;}
else deng=1;
if(S<10)feng=0;
else feng=1;
}
}
}
// P27=1; //
P33=0;P34=1;
P35=0;P36=1;//
while(1){ if(S<=10)
{P33=1;P34=0;}
else{P33=0;
25、P34=1;}
}
}
三、總結
我們制作這次設計一切都是從零開始,從最簡單的畫流程圖起步。在整個過程當中,遇到很多困難,由于時間緊迫,起步時間較晚,還有其他一些財力方面的原因,本來打算實現(xiàn)的煙霧探測和小車的尋跡等其他功能未能實現(xiàn),雖然有些遺憾,但是在整個設計過程中,我們充分發(fā)揮人的主觀能動性,學會了自主學習,學到了許多課本上學不到的知識。較好的完成了設計,初步達到了預期的目的,部分實現(xiàn)了最初的設想。我們由此得出:對電路的設計、布局要先有一個好的構思,才顯得電路板美觀、大方。程序編寫中,由于思路不清晰,開始時遇到了很多的問題,經過靜下心來思考,和同學討論,理清了思路,反而得心應手。在此次設計中,知道了凡事要有一顆不畏困難、積極進取、勇于探索的精神,不要想著走捷徑,一步一腳印。同時也練就了我們的耐心、細心、恒心,無論如何,此次課程設計中學到了很多很多東西,這才是最重要的??傊舜坞娮釉O使我們的能力得到了全方位的提高,使得我的操作能力和專業(yè)技能都有了很大的提高,從而為將來的進一步學習和工作奠定了良好的基礎。