资源描述
基于探测用途多功能小车的设计摘要:这是一个基于80C52单片机 温度传感器 超声波测距模块的一个智能小车系统。该系统能准确无误的测出温度和距离障碍物的距离,并且可以自动避障,显示温度距离。具有方便,实用性价比高的特点,经过在实践中的应用,有一定的推广价值。关键字:80C52单片机 温度传感器 超声波测距模块 智能小车系统引言:随着电子技术的飞速发展,越来越多的单片机技术的广泛使用已经应用于人们的 社会生产实践,人类的生活发生了根本性的改变。由于在现代生产实践中,从事某些生产作业的人员会遇到各种各样的问题以及一些安全隐患,基于此,本设计初步构想,希望通过设计该小车的设计,以及通过其所实现的功能能够在将来的生产实践中得到有效合理的利用,从而满足和实现社会的需求。一、方案的选择与器件的选用本设计是基于STC89C52单片机进行的,多功能小车基于STC89C52并且通过利用超声波测距模块用来实现绕开障碍物和通过温度传感器模块用以实现探测环境温度的功能,同时以1602液晶显示屏来达到探测距离和温度的精确测量,并且在距离以及温度在达到一定的范围时,还能通过蜂鸣发生器和指示灯发出报警信号,提醒我们来避开一些危险,从而有效解决了人们生产实践中所遇到的各种难题。譬如:在生产作业的工作中,通过距离的探测,能够提醒相关工作人员躲避风险,通过温度的测量,能够提醒人们何时进行相关操作等。总而言之,该设计的广泛使用能够指导和解决人们的各种生产实践所遇到的问题。一、具体实现的的功能: 利用超声波探测器来测量距离障碍物的距离,同时并将测得的具体数值在液晶显示屏上精确的显示出来,当距离小于10cm时,蜂鸣器会发声,且会进行自动转向已实现避障。 基于温度传感器用以测量周围环境的温度,同时并将测得的具体数值在液晶显示屏上精确的显示出来,当环境温度高于25C,LED灯会发光。二、主要单元电路的设计l 单片机主控制模块的设计STC89C52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,每一条I/O线都能独立地作输出或输入。单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻够上电复位电路,20引脚为接地端,40引脚为电源端。l 应用电路模块的设计。1602显示模块的电路图: 蜂鸣器模块的电路图: 温度显示器模块的电路图:l 应用程序的设计接线:模块TRIG接 P2.6 ECH0 接P2.7 注:AT89x51使用12M或11.0592M晶振,实测使用11.0592M=*/#include /器件配置文件#include #include 18b20.h#define RX P2_7#define TX P2_6sbit LCD_RS = P20;sbit LCD_RW = P21;sbit LCD_EN = P22;sbit feng=P11;sbit deng=P10;sbit P36=P36;sbit P35=P35;sbit P34=P34;sbit P33=P33;sbit P27=P27; #define LCD_Data P0/*函数功能:测试LCD忙碌状态入口参数:出口参数:result*/bit LCD_Busy()bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delay_ms(5);/此处延时特别重要 (必不可少)result = (bit)(LCD_Data & 0x80);delay_ms(5);LCD_EN = 0;return result;/*函数功能:写指令数据到LCD子程序入口参数:要写入的指令出口参数:*/void LCD_Write_Command(unsigned char cmd)while(LCD_Busy(); /判断LCD是否忙碌LCD_RS = 0;LCD_RW = 0;LCD_EN = 1;LCD_Data = cmd;delay_ms(5);LCD_EN = 0;/*函数功能:写入显示数据到LCD子程序入口参数:要写入的数据出口参数:*/void LCD_Write_Data(unsigned char dat)while(LCD_Busy(); /判断LCD是否忙碌LCD_RS = 1;LCD_RW = 0;LCD_EN = 1;LCD_Data = dat;delay_ms(5);LCD_EN = 0;/*函数功能:设定显示位置子程序入口参数:pos出口参数:*/void LCD_Position(unsigned char pos)LCD_Write_Command(pos|0x80);/*函数功能:LCD初始化子程序入口参数:出口参数:*/void LCD_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坐标值,显示的字符数据出口参数:*/void LCD_Display_Bmp(unsigned char x,unsigned char y,unsigned char *mytab)unsigned char i=0;LCD_Write_Command(0x40); /写CGRAMfor (i=0;i8;i+)LCD_Write_Data(mytabi); if(y=0) LCD_Position(x); else LCD_Position(x+0x40);/设置显示位置LCD_Write_Data(0);/*函数功能:显示字符串程序备注1:0=x=15备注2:0=y= 1*/void LCD_Display(unsigned char x,unsigned char y,unsigned char *words)unsigned char i=0;if(y=0)LCD_Position(x); /设置显示位置else LCD_Position(x+0x40);while(wordsi != 0)LCD_Write_Data(wordsi); /显示字符i+;/*函数功能:显示一个ASCII码程序备注1:0=x=15备注2:0=y=700)|flag=1) /超出测量范围显示“-” flag=0; LCD_Display_Char(0, 1, ASCII11); LCD_Display_Char(1, 1, ASCII10);/显示点 LCD_Display_Char(2, 1, ASCII11); LCD_Display_Char(3, 1, ASCII11); LCD_Display_Char(4, 1, ASCII12);/显示M else disbuff0=S%1000/100; disbuff1=S%1000%100/10; disbuff2=S%1000%10 %10; LCD_Display_Char(0, 1, ASCIIdisbuff0); LCD_Display_Char(1, 1, ASCII10);/显示点 LCD_Display_Char(2, 1, ASCIIdisbuff1); LCD_Display_Char(3, 1, ASCIIdisbuff2); LCD_Display_Char(4, 1, ASCII12);/显示M /*/ void zd0() interrupt 1 /T0中断用来计数器溢出,超过测距范围 TL0=0; TH0=0;flag=1; /中断溢出标志 /*/ void StartModule() /启动模块 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; void main(void)unsigned int j,k;LCD_Init(); / 初始化LCDLCD_Display(0,0,51090210 Jlu);LCD_Display_Char(15,1,0x43);/0x43对应ASCII码为CLCD_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_data0; k=temp_data1;k=k250)deng=0;else deng=1;if(S10)feng=0;else feng=1;/P27=1; / P33=0;P34=1;P35=0;P36=1;/ while(1) if(S=10) P33=1;P34=0; elseP33=0;P34=1; 三、总结我们制作这次设计一切都是从零开始,从最简单的画流程图起步。在整个过程当中,遇到很多困难,由于时间紧迫,起步时间较晚,还有其他一些财力方面的原因,本来打算实现的烟雾探测和小车的寻迹等其他功能未能实现,虽然有些遗憾,但是在整个设计过程中,我们充分发挥人的主观能动性,学会了自主学习,学到了许多课本上学不到的知识。较好的完成了设计,初步达到了预期的目的,部分实现了最初的设想。我们由此得出:对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同学讨论,理清了思路,反而得心应手。在此次设计中,知道了凡事要有一颗不畏困难、积极进取、勇于探索的精神,不要想着走捷径,一步一脚印。同时也练就了我们的耐心、细心、恒心,无论如何,此次课程设计中学到了很多很多东西,这才是最重要的。总之,此次电子设使我们的能力得到了全方位的提高,使得我的操作能力和专业技能都有了很大的提高,从而为将来的进一步学习和工作奠定了良好的基础。
展开阅读全文