多功能小车的设计.docx
《多功能小车的设计.docx》由会员分享,可在线阅读,更多相关《多功能小车的设计.docx(14页珍藏版)》请在冰点文库上搜索。
多功能小车的设计
基于探测用途多功能小车的设计
摘要:
这是一个基于80C52单片机温度传感器超声波测距模块的一个智能小车系统。
该系统能准确无误的测出温度和距离障碍物的距离,并且可以自动避障,显示温度距离。
具有方便,实用性价比高的特点,经过在实践中的应用,有一定的推广价值。
关键字:
80C52单片机温度传感器超声波测距模块智能小车系统
引言:
随着电子技术的飞速发展,越来越多的单片机技术的广泛使用已经应用于人们的社会生产实践,人类的生活发生了根本性的改变。
由于在现代生产实践中,从事某些生产作业的人员会遇到各种各样的问题以及一些安全隐患,基于此,本设计初步构想,希望通过设计该小车的设计,以及通过其所实现的功能能够在将来的生产实践中得到有效合理的利用,从而满足和实现社会的需求。
一、方案的选择与器件的选用
本设计是基于STC89C52单片机进行的,多功能小车基于STC89C52并且通过利用超声波测距模块用来实现绕开障碍物和通过温度传感器模块用以实现探测环境温度的功能,同时以1602液晶显示屏来达到探测距离和温度的精确测量,并且在距离以及温度在达到一定的范围时,还能通过蜂鸣发生器和指示灯发出报警信号,提醒我们来避开一些危险,从而有效解决了人们生产实践中所遇到的各种难题。
譬如:
在生产作业的工作中,通过距离的探测,能够提醒相关工作人员躲避风险,通过温度的测量,能够提醒人们何时进行相关操作等。
总而言之,该设计的广泛使用能够指导和解决人们的各种生产实践所遇到的问题。
一、具体实现的的功能:
Ø利用超声波探测器来测量距离障碍物的距离,同时并将测得的具体数值在液晶显示屏上精确的显示出来,当距离小于10cm时,蜂鸣器会发声,且会进行自动转向已实现避障。
Ø基于温度传感器用以测量周围环境的温度,同时并将测得的具体数值在液晶显示屏上精确的显示出来,当环境温度高于25︒C,LED灯会发光。
二、主要单元电路的设计
●单片机主控制模块的设计
STC89C52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,每一条I/O线都能独立地作输出或输入。
单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。
第9引脚为复位输入端,接上电容,电阻够上电复位电路,20引脚为接地端,40引脚为电源端。
●应用电路模块的设计。
1602显示模块的电路图:
蜂鸣器模块的电路图:
温度显示器模块的电路图:
●应用程序的设计
接线:
模块TRIG接P2.6ECH0接P2.7
[注:
AT89x51使用12M或11.0592M晶振,实测使用11.0592M]
=============================================================*/
#include//器件配置文件
#include
#include"18b20.h"
#defineRXP2_7
#defineTXP2_6
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
sbitfeng=P1^1;
sbitdeng=P1^0;
sbitP36=P3^6;
sbitP35=P3^5;
sbitP34=P3^4;
sbitP33=P3^3;
sbitP27=P2^7;
#defineLCD_DataP0
/******************************************
函数功能:
测试LCD忙碌状态
入口参数:
出口参数:
result
*******************************************/
bitLCD_Busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delay_ms(5);//此处延时特别重要(必不可少)
result=(bit)(LCD_Data&0x80);
delay_ms(5);
LCD_EN=0;
returnresult;
}
/******************************************
函数功能:
写指令数据到LCD子程序
入口参数:
要写入的指令
出口参数:
*******************************************/
voidLCD_Write_Command(unsignedcharcmd)
{
while(LCD_Busy());//判断LCD是否忙碌
LCD_RS=0;
LCD_RW=0;
LCD_EN=1;
LCD_Data=cmd;
delay_ms(5);
LCD_EN=0;
}
/******************************************
函数功能:
写入显示数据到LCD子程序
入口参数:
要写入的数据
出口参数:
*******************************************/
voidLCD_Write_Data(unsignedchardat)
{
while(LCD_Busy());//判断LCD是否忙碌
LCD_RS=1;
LCD_RW=0;
LCD_EN=1;
LCD_Data=dat;
delay_ms(5);
LCD_EN=0;
}
/******************************************
函数功能:
设定显示位置子程序
入口参数:
pos
出口参数:
*******************************************/
voidLCD_Position(unsignedcharpos)
{
LCD_Write_Command(pos|0x80);
}
/******************************************
函数功能:
LCD初始化子程序
入口参数:
出口参数:
*******************************************/
voidLCD_Init()
{
delay_ms(15);
LCD_Write_Command(0x38);//显示模式设置
delay_ms(5);
LCD_Write_Command(0x38);//显示模式设置
delay_ms(5);
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);
}
/******************************************
函数功能:
显示自定义字符
入口参数:
x坐标值,y坐标值,显示的字符数据
出口参数:
*******************************************/
voidLCD_Display_Bmp(unsignedcharx,unsignedchary,unsignedchar*mytab)
{
unsignedchari=0;
LCD_Write_Command(0x40);//写CGRAM
for(i=0;i<8;i++)
LCD_Write_Data(mytab[i]);
if(y==0)LCD_Position(x);
elseLCD_Position(x+0x40);//设置显示位置
LCD_Write_Data(0);
}
/*******************************************
函数功能:
显示字符串程序
备注1:
0<=x<=15
备注2:
0<=y<=1
*******************************************/
voidLCD_Display(unsignedcharx,unsignedchary,unsignedchar*words)
{
unsignedchari=0;
if(y==0)LCD_Position(x);//设置显示位置
elseLCD_Position(x+0x40);
while(words[i]!
='\0')
{
LCD_Write_Data(words[i]);//显示字符
i++;
}
}
/*******************************************
函数功能:
显示一个ASCII码程序
备注1:
0<=x<=15
备注2:
0<=y<=1
*******************************************/
voidLCD_Display_Char(unsignedcharx,unsignedchary,unsignedcharword)
{
unsignedchari=0;
if(y==0)LCD_Position(x);//设置显示位置
elseLCD_Position(x+0x40);
LCD_Write_Data(word);//显示字符
}
unsignedcharReadDataLCM(void);
unsignedcharReadStatusLCM(void);
unsignedcharcodemcustudio[]={"jilinuniversity"};
unsignedcharcodeemail[]={"hhhhhhhh"};
unsignedcharcodeCls[]={""};
unsignedcharcodeASCII[15]={'0','1','2','3','4','5','6','7','8','9','.','-','M'};
staticunsignedcharDisNum=0;//显示用指针
unsignedinttime=0;
unsignedlongS=0;
bitflag=0;
unsignedchardisbuff[4]={0,0,0,0,};
voidConut(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_Display_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[disbuff[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
}
}
/********************************************************/
voidzd0()interrupt1//T0中断用来计数器溢出,超过测距范围
{TL0=0;
TH0=0;
flag=1;//中断溢出标志
}
/********************************************************/
voidStartModule()//启动模块
{
TX=1;//启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
voidmain(void)
{unsignedintj,k;
LCD_Init();//初始化LCD
LCD_Display(0,0,"51090210Jlu");
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();
while(!
RX);//当RX为零时等待
TR0=1;//开启计数
while(RX);//当RX为1计数并等待
TR0=0;//关闭计数
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码
LCD_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;}
elsedeng=1;
if(S<10)feng=0;
elsefeng=1;
}
}
}
//P27=1;//
P33=0;P34=1;
P35=0;P36=1;//
while
(1){if(S<=10)
{P33=1;P34=0;}
else{P33=0;P34=1;}
}
}
三、总结
我们制作这次设计一切都是从零开始,从最简单的画流程图起步。
在整个过程当中,遇到很多困难,由于时间紧迫,起步时间较晚,还有其他一些财力方面的原因,本来打算实现的烟雾探测和小车的寻迹等其他功能未能实现,虽然有些遗憾,但是在整个设计过程中,我们充分发挥人的主观能动性,学会了自主学习,学到了许多课本上学不到的知识。
较好的完成了设计,初步达到了预期的目的,部分实现了最初的设想。
我们由此得出:
对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。
程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同学讨论,理清了思路,反而得心应手。
在此次设计中,知道了凡事要有一颗不畏困难、积极进取、勇于探索的精神,不要想着走捷径,一步一脚印。
同时也练就了我们的耐心、细心、恒心,无论如何,此次课程设计中学到了很多很多东西,这才是最重要的。
总之,此次电子设使我们的能力得到了全方位的提高,使得我的操作能力和专业技能都有了很大的提高,从而为将来的进一步学习和工作奠定了良好的基础。
(注:
专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。
可复制、编制,期待你的好评与关注)