单片机的课程设计(综合应用实例)【完整版】

上传人:M****1 文档编号:568497175 上传时间:2024-07-24 格式:PPT 页数:122 大小:3.31MB
返回 下载 相关 举报
单片机的课程设计(综合应用实例)【完整版】_第1页
第1页 / 共122页
单片机的课程设计(综合应用实例)【完整版】_第2页
第2页 / 共122页
单片机的课程设计(综合应用实例)【完整版】_第3页
第3页 / 共122页
单片机的课程设计(综合应用实例)【完整版】_第4页
第4页 / 共122页
单片机的课程设计(综合应用实例)【完整版】_第5页
第5页 / 共122页
点击查看更多>>
资源描述

《单片机的课程设计(综合应用实例)【完整版】》由会员分享,可在线阅读,更多相关《单片机的课程设计(综合应用实例)【完整版】(122页珍藏版)》请在金锄头文库上搜索。

1、第第13章章 单片机的课程设计单片机的课程设计(综合应用实例综合应用实例) 13.1 红外接收器件红外接收器件TL1838 近年来随着计算机在社会各领域的渗透,单片机的应用正在不断地走向深入,同时也带动传统的控制、检测等工作日益更新。传统的遥控器大多采用无线电遥控技术,随着科技的进步,红外线遥控技术的进一步成熟,红外遥控也逐步成为了一种被广泛应故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电用的通信和遥控手段。为了方便实用,传统的家庭电器逐渐采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等有害环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。红外遥控的特点是不影

2、响周边环境、不干扰其它电器设备。由于其无法穿透墙壁,路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。红外遥控虽然被广泛应用,但各产商的遥控器不能相互兼容。当今市场上的红外线遥控装置一般采用专用的遥控编码及解码集成电路,但编程灵活性较低,且产品多相互绑定,不能复用,故应用范围有限。而本文采用单片机进行遥控系统的应用设计,遥控装置将同时具有编程灵活、控制范围广、体积小、功耗低、功能强、成本低、可靠性高等特点,因此采用单片机的红外遥控技术具有广阔的发展前景。13.1.1 概述概述 1. 基于单片机的红外遥控系统概述 当今社会科学技术的发展与日俱增,人们生

3、活水平也是日益提高,为了减少人们的工作量,所以对各种家用电器、电子器件的非人工控制的要求越来越高,针对这种情况,设计出一种集成度比较高的控制体系是必然的。现代科技的飞速发展在许多危险、不可近场合也对远程控制提出了越来越高的要求。单片机是指一个集成在一块芯片上的完整计算机系统。尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。同时集成诸如通讯接口、定时器,实时时钟等外围设备。而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。单片机的集成度很高,它体积小、功耗低、控制功能

4、强、扩展灵活、微型化、使用方便等突出特点,尤其耗电少,又可使供电电源体积小、质量轻。所以特别适用于“电脑型产品”,它的应用已深入到工业、农业、国防、科研、教育以及日常生活用品(家电、玩具)等各种领域,几乎很难找到哪个领域没有单片机的踪迹。单片机特别适合把它做到产品的内部,取代部分老式机械、电子零件或元器件。可使产品缩小体积,增强功能,实现不同程度的智能化。 红外线是一种光线,具有普通光的性质,可以以光速直线传播,强度可调,可以通过光学透镜聚焦,可以被不透明物体遮挡等等。特别制造的半导体发光二极管,可以发出特定波长(通常是近红外)的红外线,通过控制二极管的电流可以很方便的改变红外线的强度,以达到

5、调制的目的,因此,在现代电子工程应用中,红外线常常被用做近距离视线范围内的通讯载波。使用红外线做信号载波的优点很多:成本低、传播范围和方向可以控制、不产生电磁辐射干扰,也不受干扰等等。因此被广泛地应用在各种技术领域中。由于红外线为不可见光,因此对环境影响很小,再由红外光波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。最典型的应用就是家电遥控器。红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计家用电器的红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或干扰邻居的家用电

6、器)。同类产品的红外线遥控器,也可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。本设计主要研究并设计一个基于单片机的红外发射及接收系统,实现对温度控制的隔离控制。控制系统主要是由 MCS-51 系列单片机、集成红外发射遥控器、红外接收电路、LCD 显示电路,温度控制电路等部分组成,发射遥控信号经红外接收处理传送给单片机,单片机根据不同的信息码控制温度报警,并完成相应的状态指示(如图13-1)。按键编码和调制红外发射红外接收解码并响应红外遥控器红外接收图图13-1 红外线遥控系统框图红外线遥控系统框图 2. 本设计方案

7、思路 本设计主控芯片采用目前比较通用的MCS-51系列单片机。此类单片机的运算能力强,软件编程灵活,自由度大,市场上比较多见,价格便宜且技术比较成熟容易实现。红外传输利用载波对信号进行调制从而减少信号传输过程中的光波干扰,提高数据传输效率。由遥控器将键盘信息及系统识别码等数据调制在红外载波上经红外发射头发射出去。接收方由红外一体化接收头实现对接收信号的放大解调并还原为数据流,经由单片机解码后对相关IO口进行操作。 3. 研发方向和技术关键 1) 合理设计硬件电路,使各模块功能协调; 2) 红外接收信号的脉冲波形; 3) 红外接收信号的编解码; 4) 单片机对IO口的操作; 4. 主要技术指标

8、1) 遥控最远距离8到10m 2) 工作频率为 38KHz,即红外发射和接收的载频为 38KHz; 4) 接收端可显示受控状态以及输入控制数据。13.1.2 总体设计总体设计 红外遥控系统是集中集光、电于一体的系统。其工作原理是用户按键信号经单片机编码处理后转化为脉冲信号,经由红外发射头发送出去;接收端由红外一体化接收头实现对接收信号的放大解调并还原为数据流,经由单片机解码后对相关IO口进行操作,从而完成整个遥控操作。整个系统主要是由51单片机基本电路、红外接收电路、LCD 显示电路,温度控制电路等部分组成。系统硬件由以下几部分组成:红外数据发射遥控器。红外数据接收则是采用 VS1838B 一

9、体化红外接收头,内部集成红外接收、数据采集、解码的功能,只要在接收端 INT0 检测头信号低电平的到来,就可完成对整个串行的信号进行分析得出当前控制指令的功能。然后根据所得的指令去操作相应的用电器件工作,如图13-2所示。图图13-2 系统总体结构框图系统总体结构框图1. 红外遥控发射部分 红外遥控发射部分为常见的普通遥控器。 2. 红外遥控接收部分红外遥控接收电路框图见图13-3。红外接收端普遍采用价格便宜,性能可靠的一体化红外接收头(VS1838B , 它接收红外信号频率为38KHz ,周期约26s)。它能同时对信号进行放大、检波、整形,得到TTL 电平的编码信号。红外接收头收到信号后单片

10、机立即产生中断,开始接收红外信号。接收到的信号经单片机解码得到用户遥控信息并转至IO口执行,同时单片机还完成对处于工作状态的设备进行计数并显示。3. 红外编码标准 通过拆解遥控器知道这个用的编码芯片是PT2221 通过查询得知是NEC编码标准: 此标准下的发射端所发射的一帧码含有一个引导码、8位用户码、8位用户反码,8位键数据码、8位键数据反码。引导码由一个9ms的高电平和4.5ms的低电平组成。当按下持续时间超过108ms时,则发送简码(简码由9ms高电平和2.25ms的低电平组成)来告之接收端是某一个按键一直按着,象电视的音量和频道切换键都有此功能,简码与简码之间相隔是108ms。“1”和

11、“0”的区分采用脉冲位置调制方式(PPM)。 1) 二进制信号的调制二进制信号的调制仍由发送单片机来完成,A是二进制信号的编码波形,B 是频率为38KHz (周期为26s)的连续脉冲,C是经调制后的间断脉冲串(相当于C=AB),用于红外发射二极管发送的波形。2) 二进制信号的解调二进制信号的解调由一体化红外接收头VS1838B来完成,它把接收到的红外信号(图13-4 中波形D)经内部处理并解调复原,在输出脚输出图13-4中波形E,VS1838B 的解调可理解为:在输入有脉冲串时,输出端输出低电平,否则输出高电平。可直接与单片机串行输入口及外中断相联,以实现随时接收遥控信号并产生中断,然后由单片

12、机对编码还原。 3) 二进制信号的解码 二进制信号的解码由接收单片机来完成,它把红外接收头送来的二进制编码波形通过解码,还原出发送端发送的数据。如图13-4,把波形解码还原成原始二进制数据信息101。图图13-4 红外接收头接收及输出波形红外接收头接收及输出波形13.1.3 硬件设计硬件设计 1. 主控芯片AT89C51 AT89C51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4k bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash程序存储器既可在线编程(ISP)也可用传

13、统方法进行编程。 2. 红外发射红外发送器大多是使用Ga、As等材料制成的红外发射二极管,其能够通过的LED电流越大,发射角度越小,产生的发射强度就越大;发射强度越大,红外传输距离就越远,传输距离正比于发射强度的平方根。 通常,红外遥控器将遥控信号(二进制脉冲码)调制在40KHz(周期为26.3ms)的载波上,经缓冲放大后送至红外发光二极管,产生红外信号发射出去。在红外数据发射过程中,由于发送信号时的最大平均电流需几十mA(对应mW级发射功率),所以需要三极管放大后去驱动红外光发射二极管(又称电光二极管)。单片机通过软件编程将调制好的脉冲信号从P3口第6脚(P3.5)将数据输出3. 红外遥控接

14、收电路 本部分电路是该设计中硬件电路的重点部分,系统由红外接收电路,单片机电路,设备驱动电路,状态显示电路组成。一体化红外接收头采用VS1838B,它负责对接收到的红外遥控信号的解调。将调制在40kHz上的红外脉冲信号解调后再输入到AT89C51的INT0(P3.2)引脚,由单片机进行高电平与低电平宽度的测量。遥控信号的还原是通过P3.1输入二进制脉冲码的高电平与低电平及维持时间,当接收头接收信号时,单片机产生中断,并在P3.1口对信号电平进行识别,并还原为原发送数据,这在后面的软件设计中会具体介绍到。数据流通过单片机处理后送驱动控制部分。并通过数码管显示用电设备的个数 1) 红外信号接收电路

15、VS1838B是用于红外遥控接收的小型一体化接收头,它的主要功能包括放大,选频,解调几大部分,要求输入信号需是已经被调制的信号。经过它的接收放大和解调会在输出端直接输出原始信号的反相信号。其不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积和普通的塑封三极管大小一样,从而使电路达到最简化!灵敏度和抗干扰性都非常好。它适合于各种红外线遥控和红外线数据传输,中心频率38.0kHz。接收器对外只有3个引脚,如图13-5所示,从左至右依次为OUT、GND、VCC。红外接收头电路图如图13-6所示,OUT脚(1号脚)与单片机IO口直接相连。图图13-5 VS1838B引

16、脚引脚红外接收头内部放大器的增益很大,很容易引起干扰,依次在接收头的供电脚上必须加上滤波电容。故红外接收部分电路如图13-6所示。图图13-6 红外接收头电路红外接收头电路 2) 控制部分电路 单片机收到红外接收头解调后的信号后,对其进行解码,从中解出控制码,此时系统将转至对具体设备的控制工作。温度检测部分采用DS18B20数字温度传感器,DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测

17、温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。 3) 显示部分 红外遥控系统接收到遥控码并对相关设备操作后,单片机将对正在工作的设备进行计数并通过一个LCD12232显示。13.1.4 制作过程制作过程仿真调试电路如图13-7所示。图图13-7 红外仿真调试电路图红外仿真调试电路图实物制作样品如图13-8所示。 图图13-8 实物制作样品图实物制作样品图 实物演示效果图如图13-9所示。 图图13-9 实物演示效果图实物演示效果图温度控制规则:当前实际温度大于设定最高温度,LED灯发出

18、警告。当前实际温度小于设定最少温度,LED灯发出警告。由于目前的遥控装置大多对某一设备进行单独控制,而在本设计中的红外遥控电路设计了多个控制按键,可以对不同的设备,也可以对同一设备的多个功能进行控制。系统可通过设定发射及接收程序中的识别码及识别反码达到不同遥控器间相互区分,对识别码、识别反码、控制码和控制码反码的判定一方面消除了非遥控信号的红外干扰,另一方面降低了误操作发生的几率。经过测试,设计结果完全达到课题任务要求。 但是本电路也有不完善的地方, 由于时间、水平和经验有限,在信号解码、抗干扰及功耗控制等方面仍有不足之处,有改进的余地。例如设计中可通过增加红外线发射功率进而增加遥控距离,改进

19、信号编码方式以提高数据的传输速度,使用小型单片机以降低功耗等。另外在系统的调试方面,由于时间和设备的原因,只进行了短距离的调试,更多参数有待进一步的调试。在设计过程中,通过大量的查阅资料,认真研究教材,对单片机有了更为深刻的理解,在编写软件时,须仔细的分析硬件电路及所要达到的功能,然后设计程序流程,编写代码。整个过程培养了我的耐性和刻苦钻研的精神。这次设计对于我们组来说,既是一次机遇,又是一次挑战。通过这次的设计,我学到了很多东西。通过自己的实践,增强了动手能力,掌握了系统的分析解决问题的方法。通过实际工程设计也使我了解到书本知识和实际应用的差别。在实际应用中遇到很多的问题,这都需要我对问题进

20、行具体的分析,并一步一步地去解决它。13.1.5 源程序代码源程序代码#include#include#include 18b20.h#define uchar unsigned char#define uint unsigned int uchar m,k1,k2; uchar c,c1,c2,c3,t1,t2,t3,b;uint temp; uint temp_h=350,temp_l=250;void delay(uchar x); /x*0.14MSvoid display(uchar *tab1,uchar *tab2);void IR_IN();/* IO口定义 */sbit IR

21、IN = P32; /红外接收器数据线sbit LCD_RS = P10; sbit LCD_RW = P11;sbit LCD_EN = P12;sbit led=P13;/1602数据口接P0uchar IRCOM7;uchar cdis1 = 当前温度:-.-;uchar cdis2 = 当前编码:-;uchar cdis21 = 最高报警温度;uchar cdis22 = 35.0 新:-.-;uchar cdis31 = 最低报警温度;uchar cdis32 = 25.0 新:-.-;/*/* */*写指令数据到LCD */*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 *

22、/* */*/void lcd_wcmd(uchar cmd) LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; P0 = cmd; LCD_EN = 1; delay(50); LCD_EN = 0; delay(50); /*/* */*写显示数据到LCD */*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */* */*/void lcd_wdat(uchar dat) LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; LCD_EN = 1; delay(50); LCD_EN = 0; delay(50);/*/*

23、*/* LCD初始化设定 */* */*/void lcd_init() lcd_wcmd(0x30); /16*2显示,5*7点阵,8位数据 lcd_wcmd(0x0c); /显示开,关光标 lcd_wcmd(0x06); /移动光标 lcd_wcmd(0x01); /清除LCD的显示内容/*/* */* 显示函数 */* */*/void display(uchar *tab1,uchar *tab2) lcd_wcmd(0x80); /设置显示位置为第一行的第1个字符 m = 0; while(tab1m != 0) /显示字符 lcd_wdat(tab1m); m+; lcd_wcmd

24、(0x90); /设置显示位置为第二行第1个字符 m = 0; while(tab2m != 0) lcd_wdat(tab2m); /显示字符 m+; /*延时函数*/void delay(unsigned char x) /x*0.14MS uchar i; while(x-) for (i = 0; i=temp_h|temp=temp_l)led=0;else led=1;/else if(temp=tem_tl)/ 默认45度,继电器动作,等到温度降到35,继电器恢复 / led=1;/*红外数据接收和处理*/void IR_IN() interrupt 0 using 0 unsi

25、gned char j,k,N=0; EX0 = 0; delay(15); if (IRIN=1) EX0 =1; return; /确认IR信号出现 while (!IRIN) /等IR变为高电平,跳过9ms的前导低电平 信号。 delay(1);for (j=0;j4;j+) /收集四组数据 for (k=0;k=30) EX0=1; return; /0.14ms计数过长自动离开。 /高电平计数完毕 IRCOMj=IRCOMj 1; /数据最高位补“0” if (N=8) IRCOMj = IRCOMj | 0x80; /数据最高位补“1” N=0; /end for k /end f

26、or j if (IRCOM2!=IRCOM3) EX0=1; return; IRCOM5=IRCOM2 & 0x0F; /取键码的低四位 IRCOM6=IRCOM2 4; /右移4次,高四位变为低四位 if(IRCOM59) IRCOM5=IRCOM5+0x37; else IRCOM5=IRCOM5+0x30; if(IRCOM69) IRCOM6=IRCOM6+0x37; else IRCOM6=IRCOM6+0x30;/* (显示编码之后,测试译码,将编码转变成功能键) */ if(IRCOM5=C & IRCOM6=0) /遥控器中的0按键的编码是0x0C,当接收的编码是0x0c时

27、显示1 c=1;b+;if(b=4)b=0; if(IRCOM6=5 & IRCOM5=E) c=3;b+;if(b=4)b=0; if(IRCOM6=0 & IRCOM5=8) c=4;b+;if(b=4)b=0; if(IRCOM6=1 & IRCOM5=C) c=5;b+;if(b=4)b=0; if(IRCOM6=5 & IRCOM5=A) c=6;b+;if(b=4)b=0; if(IRCOM6=4 & IRCOM5=2) c=7;b+;if(b=4)b=0; if(IRCOM6=5 & IRCOM5=2) c=8;b+;if(b=4)b=0; if(IRCOM6=4 & IRCOM

28、5=A) c=9;b+;if(b=4)b=0; if(IRCOM6=1 & IRCOM5=6) c=0;b+;if(b=4)b=0; / if(IRCOM6=0 & IRCOM5=7) k1+;k2=0; if(IRCOM6=1 & IRCOM5=5) k2+;k1=0; if(IRCOM6=0 & IRCOM5=9) k2=0;k1=0; /* 测试译码end */ cdis210=IRCOM5; cdis29=IRCOM6; if(k10 & k2=0) if(b=1)t1=c;cdis229=c+0x30; if(b=2)t2=c;cdis2210=c+0x30; if(b=3)t3=c

29、;cdis2212=c+0x30;temp_h=t3+t2*10+t1*100;b=0; if(k20 & k1=0) if(b=1)t1=c;cdis329=c+0x30; if(b=2)t2=c;cdis3210=c+0x30; if(b=3)t3=c;cdis3212=c+0x30;temp_l=t3+t2*10+t1*100;b=0; EX0 = 1; /*/main() IRIN=1; /I/O口初始化 lcd_init(); /初始化LCD IE = 0x81; /允许总中断中断,使能 INT0 外部中断TCON = 0x01; /触发方式为脉冲负边沿触发 while(1) /if

30、(k10)b=0;lcd_wcmd(0x01); /清除LCD的显示内容 cdis220=temp_h/100+0x30; /显示十位cdis221=temp_h/10%10+0x30; /显示个位cdis223=temp_h%10+0x30; /显示0.1cdis229=-;cdis2210=-;cdis2212=-; while(1) display(cdis21,cdis22);if(k1=0)break;warr(); if(k20)b=0;lcd_wcmd(0x01); /清除LCD的显示内容cdis320=temp_l/100+0x30; /显示十位cdis321=temp_l/1

31、0%10+0x30; /显示个位cdis323=temp_l%10+0x30; /显示0.1cdis329=-;cdis3210=-;cdis3212=-; while(1) display(cdis31,cdis32);if(k2=0)break;warr(); if(k2=0 & k1=0)lcd_wcmd(0x01); /清除LCD的显示内容while(1)temp=ReadTemperature(); /读温度cdis19=temp%1000/100+0x30; /显示十位cdis110=temp%100/10+0x30; /显示个位cdis112=temp%10+0x30; /显示0

32、.1display(cdis1,cdis2);if(k2!=0 | k1!=0)break;warr(); /end main#include 18b20.h#define uchar unsigned char #define uint unsigned intsbit DATA = P14; /DS18B20接入口/*延时子函数*/void Ddelay(uint num)while(num-) ;/*/*DS18b20设置*/Init_DS18B20() /传感器初始化 uchar x=0; DATA = 1; /DQ复位 Ddelay(10); /稍做延时 DATA = 0; /单片机

33、将DQ拉低 Ddelay(80); /精确延时 大于 480us /450 DATA = 1; /拉高总线 Ddelay(20); x=DATA; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 Ddelay(30);/读一个字节ReadOneChar()uchar i=0;uchar dat = 0;for (i=8;i0;i-) DATA = 0; / 给脉冲信号 dat=1; DATA = 1; / 给脉冲信号 if(DATA) dat|=0x80; Ddelay(8); return(dat);/写一个字节WriteOneChar(unsigned char dat) uch

34、ar i=0; for (i=8; i0; i-) DATA = 0; DATA = dat&0x01; Ddelay(10); DATA = 1; dat=1; Ddelay(8);/读取温度int ReadTemperature()uchar a=0;uchar b=0;int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读

35、取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();/低位b=ReadOneChar();/高位t=b;t=8;t=t|a;t=t*0.625; return(t);/*/13.2 超声波测距超声波测距 随着我国经济与社会的发展,交通安全日益成为人们不能忽视的问题。由于人口的大幅增长,机动车辆的大量增加,使得路况越来越复杂,车辆和行人所面临的危机也越来越大。根据中国汽车协会发布的数据,随着中国经济的高速发展和居民生活水平的不断提高,居民拥有汽车的数量已经有爆炸性上涨的趋势。随着汽车保有量的迅速增加以及城市市区的密集化, 目前公路上、停车场上的汽车越来越多, 交通也越

36、来越拥挤,使得出现越来越多的交通事故,严重威胁着人民群众的生命和财产安全。 由于道路空间的有限性,驾车穿行、拐弯、倒车等总次数不断增长,但是汽车驾驶员视野又是非常有限,故而碰撞和拖挂的事故时有发生,夜间因为视野的原因,使得撞车事故更为频发。因此汽车迫切的需要一种能够实时测距,并且能够给驾驶员提供警示的器件,汽车防撞报警器的研究有着很重要的现实意义和应用价值。如何利用现代高科技,开发出一种可用于汽车上的防撞报警器,具有很重要的现实意义。这种报警系统应该能够实时的测量车辆之间的距离,并且将所测得的数据显示在表盘上,以便于驾驶员根据路况进行判断。而且一旦车辆之间的距离超过了警戒距离,报警器应该立即采

37、取警示措施,即采取蜂鸣器响,LED灯亮的形式对驾驶员发送警告敦促驾驶员立即采取应变措施,能够有效的解除驾驶员停车和起动车辆时前后左右探视所引起的困扰,并帮助驾驶员克服视野不足以及操纵困难的矛盾,大大的提高了行车出行安全性。该系统的硬件部分主要有单片机模块,超声波测距模块,1602显示模块和报警模块。软件部分利用C语言编程,严格定义了单片机和各部分电路的接口。并且将软件分成几个模块编写,极大的降低了难度和减少了时间。主要有超声波发射程序,距离计算程序,1602显示程序等,通过主程序来分别调用以完成测距和报警的目标。通过对报警系统的研究设计,进一步熟悉单片机系统的原理和应用,对C语言程序开发流程有

38、更透彻的理解,并且在将程序与报警器硬件结合起来的过程中,强化了动手能力,强化了理论结合实际的能力,培养了独立思考和独立解决问题的能力。13.2.1 系统设计与分析系统设计与分析 1. 超声波的测距原理 超声波是人耳听不到的一种声波,是一种频率高于20KHz的声波。通常频率高于20KHz的超声波不仅波长短、方向性好、能够成射线定向传播、纵向分辨率比较高、对色彩和光照度不敏感、对外界光线和电磁场不敏感,碰到界面就会有显著反射,而且能在有灰尘、烟雾、有毒等各种环境中稳定工作。它方向性好,穿透能力强,易于获得较集中的声能在水中传播距离远,可用于测距,测速,清洗,焊接,碎石、杀菌消毒等。在医学、军事、工

39、业、农业上有很多的应用。 因此在本设计中采用超声波发射器来实现测距的功能,经综合比较,基于超声波的汽车防撞报警系统的设计中,采用的是超声波频率为40KHz的超声波传感器。 2. 超声波发射器及其原理 超声波发射器一般可以分为两大类:一 类是用电气方式产生超声波,一类是用机械方式产生超声波。电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。超声波传感器是利用超声波的特性研制出的传感器,它必须能够发射超声波和接收超声波。具备这种功能的装置就是超声波传感器,习惯上称为超声波换能器,或者超声探头。超声波

40、传感器主要制造材料有压电晶体及镍铁铝合金两类。这这类传感器适用于测距、遥控、防盗等用途。超声波应用有三种基本类型,透射型-用于遥控器,防盗报警器、自动门、接近开关等;分离式反射型-用于测距、液位或料位;反射型-用于材料探伤、测厚等。这里主要应用了超声波的测距功能,通过超声波来计算障碍物与小车之间的距离。 目前较为常用的是压电式超声波发生器。 压电式超声波发生器实际上是利用压电晶体的谐振来工作的。超声波发生器内部结构如下图13-10所示,它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其产生的频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之,如果

41、两电极间未外加电压,当共振板接收到超声波 时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。超声波实物正面图以及发射器原理图如图13-10所示。图图13-10 超声波实物正面图以及发射器原理图超声波实物正面图以及发射器原理图3. 声波测距算法设计 声波测距算法原理如图13-11所示。图图13-11 声波测距算法原理声波测距算法原理 通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离了。超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。(超声波在空气中

42、的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2)在实际使用中,超声波的声速会受到温度的影响,因此常常需要使用温度补偿模块,通过温度传感器测得外界的温度,再根据温度求得对应的声速值。在实际的运算中,要采用温度补偿后的温度值。 但是,在对测量精度要求不高的情况下,温度补偿模块可以忽略,声速确定后,只要测得超声波往返的时间,可以根据公式计算出距离,这就是超声波测距的原理。超声波测距原理图如图13-12所示。 图图13-12 超声波测距原理图超声波测距原理图4. 模块设计与原理系统设计原理框图如图13-13所示。图图13-13 系统设计原

43、理框图系统设计原理框图 全部模块都由STC89C52单片机控制整合,单片机在此处相当于一个微型计算机的功能,通过输入和输出的端口与传感器和显示器等外部端口交换信息,从而控制内部的操作能够按照流程实现功能。 在C语言软件设计上,首先启动超声波发生模块,定义超声波发生接口为TX,然后驱动器推动探头产生超声波。发射的超声波在空气中传播,当遇到障碍物的时候发生反射回来,被超声波的接受探头所感知,在C语言设计程序中用RX表示超声波接收端。当接受到超声波反射信号时候,RX=1,此时定时器中断,根据时间计算公式求出时间,再根据距离计算模块算出距离大小。当障碍物的距离没有超出测量范围时,所测数据可以通过经C语

44、言显示程序控制显示在LCD屏幕上,并通过判定程序程序(用if、else来实现)决定是否LED亮,蜂鸣器响,从而成功的实现防撞报警的功能。由系统软件控制把距离数据送到显示器进行显示。测试系统功能流程如下三个步骤:1) 当距离在一个可测距离4cm到50cm时,LCD1602显示距离,显示橙色灯。如图13-14所示。图图13-14 可测距离可测距离4cm到到50cm 2)我们模拟若距离小于预先设置的4cm时,进行声光报警。如图13-15所示。 图图13-15 距离小于预先设置的距离小于预先设置的4cm 3)当距离大于50cm时,LCD显示Satay,并且闪绿灯。如图13-16所示。 图图13-16

45、距离大于距离大于50cm5. 超声波发射部分的设计 本系统主要由单片机系统及显示电路、超声波发射电路和超声波检测接收电路三部分组成。采用STC89C52来实现对CX20106A红外接收芯片的控制,单片机通过P2.3.引脚经反相器来控制超声波的发送。 测距系统中的超声波传感器采用的是陶瓷传感器,它的工作电压是40kHz的脉冲信号。超声波发射器包括超声波反射电路与超声波发射控制电路两个部分,超声波探头的型号为CSB40T。超声波接收端口设置为P2.4,当接收到超声波返回信号时,RX置1从而中断计数器。 通过输出引脚输入到驱动器,经过驱动器驱动探头后可以产生超声波,这种方法方便快捷能够极大的节省时间

46、。输出端采用两个反向器并联,用以提高驱动能力。上拉电阻 R10、R20一方面可以提高反向器74LS04输出高电平的驱动能力,另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡的时间。 6. 超声波接收电路的设计 超声波接收器的设计,大致分为三个部分,分别是超声波接受探头、信号放大电路和波形变换电路三个部分,按照测距的原理,单片机需要的只是第一个回波的时刻,接收电路的设计可以采用通用电路才实现。因为超声波模块电路设计的成熟,超声波的接收电路可以采用现成的电路模块来节约时间和提高效率。目前较为通用的是采用CX20106A的集成电路,集成电路可以有效的节省空间,并且实践证明这种集成电路是目前较为

47、成熟和可靠地设计。13.2.2 系统硬件的设计系统硬件的设计 系统的硬件部分的设计主要包括单片机系统,以及1602液晶显示器分和超声波接收器、超声波发射器三个部分组成。单片机采用STC89C52系列。采用12MHZ高精度的晶振,从而获得精确的时钟频率,有效的减少测量误差。C语言程序控制启动模块,产生超声波,由P2.3端口输出,超声波接收电路的输入返回信号对外中断进行控制。P2.4端口用来接收超声波,P0端口用来向LCM传输数据,可以用C语言定义为 LCD_Data,P3.0和P1口分别连接蜂鸣器和LCD报警电路。显示电路采用较为简便的1602液晶显示器,1602是指显示的内容为16*2,即可以

48、显示两行,每行16个字符。1062的RS、RW、E口分别与单片机的P2.5、P2.6、P2.7连接。系统电路图如图13-17所示。图图13-17 系统电路图系统电路图1. 单片机选择与说明 单片机种类很多,本系统采用的是STC89C52单片,及其相同系列的芯片皆可。根据本系统需要实现的功能,按照节约成本和节约开发时间的原则,选择功耗低、性能高的STC89C52单片机。 2. 各模块电路的设计 该系统的硬件部分由STC89C52单片机主控,包含USB电源模块,复位电路模块,LCD显示电路模块,声光报警模块。单片机采用STC89C52或其兼容系列,采用12MHz高精度的晶振,以获得较稳定的时钟频率

49、,减小测量误差。单片机使用P2.3端口输出超声波,使用P2.4接收超声波,系统由USB提供全部电源,再由晶振发出信号整个系统开始工作,此时单片机由程序控制对超声波发射器发出信号,然后由超声波接收器接收到的信号传入单片机进行处理。USB电源供电电路如图13-18所示。图图13-18 USB电源供电电路电源供电电路此电源模块为整个系统提供一个比较稳定的供电来源,是系统能够顺利的运行实现其功能,此USB提供的是510%的直流电源。图图13-19 蜂鸣器报警电路蜂鸣器报警电路蜂鸣器报警电路图如图13-19所示。 LCD显示电路图如图13-20所示。 图图13-20 LCD显示电路显示电路 图13-20

50、采用的是1602LCD显示器,此显示模块比LED显示模块更加丰富,显示内容更加完善,使显示的数据让人一目了然,增加倒车防撞系统的直观的数据显示效果。所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。 超声波测距报警器仿真电路图如图13-21所示。图图13-21 超声波测距报警器仿真电路超声波测距报警器仿真电路 本章介绍了STC89C52单片机系列的引脚和其对应的功能,并且给出了单片机的接口和各部分的电路连接情况。在C语言程序中,可以通过#define来定义单片机与各个模块的接口。超声波测距模块选择了超声波传感器作为测距的工具,并且给出了各部分的电路连接图,使得每部分的结构与

51、功能一目了然。从而奠定了倒车防撞系统的硬件基础,下一章将详细的介绍单片机的C语言源程序设计。13.2.3 系统软件部分的设计系统软件部分的设计 1. 软件部分设计分析 在汽车倒车防撞系统的设计中,我采用了C语言来进行编程。首先利用C语言的宏定义#define语句来定义各个管脚的连接,将每个管脚表示成为便于理解的字符,在程序中可以直接对字符进行赋值,以实现对单片机输出端口的控制。 根据各个部分功能的不同,可以将整个过程划分为若干个模块。每个模块都是实现一定功能并且相互独立的程序段,这种方法叫做模块程序设计法,利用模块的办法设计倒车报警系统,能够简化开发流程,并且使逻辑过程更加一目了然。对于特定的

52、模块,可以直接将已经发展的很完善的模块程序加以使用,不用再对于各个部分重新设计。例如对超声波发射启动模块的设计,对LCM读写数据和指令控制的模块设计等等。 超声波测距报警器的C语言程序主要有以下几个部分(模块)组成,第一个部分是主程序部分,即是通过C语言的主函数来实现,主程序部分统领各个部分的分工与合作,调用各个模块以实现测距和报警的功能;第二个部分是超声波发生程序,第三个部分是超声波接收程序,第四个部分是距离计算子程序。 2. 主程序设计 图图13-22 主程序主程序 设计流程图设计流程图 主程序的实现步骤如下: 1) 主程序首先对系统环境进行初始化,设置定时器T0的工作模式, 2) 调用超

53、声波发送子程序发出超声波脉冲,同时计数器开始计时。 3) 当接受到返回超声波信号时,将计数器T0中断,读取计数时间。 4) 根据读取时间和Count计算距离子程序来计算障碍物距离并显示。 5) 根据障碍物距离判断是否报警,利用if、else语句实现。主程序清单如下:/*/void main(void) speak=0; P1=0xff; Delay400Ms(); /启动等待,等LCD进入工作状态 LCDInit(); /LCD初始化 Delay400Ms(); DisplayListChar(0, 0, uctech);/显示第0行 DisplayListChar(0, 1, net); /

54、显示第1行 ReadDataLCD(); /测试用句无意义 Delay400Ms(); DisplayListChar(0, 1, Cls); while(1) key1(); key2(); key3(); xianshi(); 3. 超声波发射子程序 P1.3与超声波的发射端连接,通过单片机产生脉冲信号经过发射端驱动电路,使超声波探头产生超声波。在C语言中可以将超声波发射定义为StartModule的函数,设定TX=1,即将1值赋给TX端口时,模块启动一次,随后利用延时函数nop构成完整的启动模块子程序。超声波发射程序程序清单如下:/*/void StartModule() /启动模块 T

55、X=1; /启动一次模块大约10us的方波 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; 4. 超声波接收子程序P1.4端口与超声波接收端相连,用#define定义为RX,在软件程序的设计中,需要利用P1.4作为接收端来控制定时器的开启与关断,从而能够得出

56、超声波在空气中传播的时间。对于定时器的开启与关断,可以通过while语句来实现,通过while语句能够很好的将RX的状态与定时器的状态联系起来,用while语句表示,当RX的值为0时,TR0=1,即是开启计时器计数。当超声波返回被接收模块所接收的时候,TR1=0,此时计数器关断,则可以根据计数器的时间差来求得超声波在空气中传播的时间。超声波接收端RX用来启动和关断定时器,部分程序如下: while(!RX); /当RX为零时等待 TR0=1; /开启计数 while(RX);/当RX为1计数并等待 TR0=0;/关闭计数 Conut();/计算 delayms(20);/80MS 5. 距离计

57、算子程序 启动发射电路的时候同时启动单片机内部定时器T0,利用定时器的计数功能记录超声波的发射时间和反射波的接收时间。当收到超声波反射时,利用while语句中断计时器计数,时间根据T0计时器的高位TH0和低位TL0的读数来计算,time=TH0*256+TL0;求出时间之后,再根据时间计算障碍物的距离,S=(time*1.7)/100; 因为分母是100,所以求出来的结果单位是厘米。/*/void Conut(void)/计算距离 time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.72)/100; 6. 报警判断子程序若距离在一个可测距离4cm到50cm时,L

58、CD1602显示距离,显示橙色灯。若距离小于预先设置的4cm时,LCD显示Danger,进行声光报警。当距离大于50cm时,LCD显示Satety,并且闪绿灯。 部分源程序如下: if(SLarge) /超出测量范围显示Satety flag=0; speak=1; P1=0xf3; delayms(10); speak=0; P1=0xff; DisplayOneChar(10, 1, S); DisplayOneChar(11, 1,a); DisplayOneChar(12, 1, t); DisplayOneChar(13, 1, e); DisplayOneChar(14, 1, t

59、); DisplayOneChar(15, 1, y); if(S=Small&S=Large)/检测距离 speak=0; P1=0x3f; disbuff0=(long)S%1000/100; disbuff1=(long)S%1000%100/10; disbuff2=(long)S%1000%100%10; disbuff3= (long)(S-(long)S)*10)%10; DisplayOneChar(9, 1, ASCIIdisbuff0); DisplayOneChar(10, 1, ASCIIdisbuff1); DisplayOneChar(11, 1,ASCIIdisb

60、uff2 ); DisplayOneChar(12, 1,ASCII10 ); DisplayOneChar(13, 1,ASCIIdisbuff3 ); DisplayOneChar(14, 1, ASCII13); DisplayOneChar(15, 1, ASCII12); 7. LCM的部分程序 在汽车防撞报警器的设计中,采用P0端口与LCD数据输入相连,并且并联一个排阻,以提高电路的安全性和可靠性。在软件设计中,首先利用#define宏定义将P0端口定义为 LCM_Data,即使LCD模块数据输入端口的意思。然后再通过赋值给 LCM_Data以达到对P0端口的控制。在P2端口的电路

61、连接中,P2.5连接LCD的信号控制线RS,P2.6连接信号的控制线RW,P2.7与信号控制线E口相连。在软件设计中,首先利用#define语句定义好接口,将P2.5定义为RS,P2.6定义为RW,将P2.7定义为E,便于直接在C程序中直接操作RS/RW/E接口,以分别实现对LCD信号控制线的控制。要实现读/写数据,读/写指令,可以根据对RS/RW/E的赋值来实现对LCD寄存器的选择。例如写数据的子函数程序如下:/写数据void WriteDataLCD(unsigned char WDLCD) ReadStatusLCD(); /检测忙 LCD_Data = WDLCD; LCD_RS =

62、1; LCD_RW = 0; LCD_E = 0; /若晶振速度太高可以在这后加小的延时 LCD_E = 0; /延时 Delay5Ms(); /不加延时通不过PROTEUS仿真 LCD_E = 1; 8. 实物的测试 经过Keil软件对程序进行编译和连接之后,生成拓展名为.HEX的文件,将STC89C52单片机插入编程器插座内,通过编程器将程序烧写到单片机内。然后接通USB电源,打开开关按钮,LCD屏幕上显示的是我和合作人的名字简写,下面一行显示的是“Supersonic”。 在进行测试的过程中,当障碍物接近4厘米以内的时候,系统的蜂鸣器开始响,LED灯也同时亮。说明能够正常运行和实现功能,

63、在一定程度上起到了防撞报警的作用。反复进行测试实验,发现了该报警器仍然存在一些问题,所测距离并不十分精确。分析其原因应该是:第一,该报警器没有温度补偿模块,直接采用常温下的声速作为运算数据,忽略了温度对超声波传播速度的影响。第二,该报警器的超声波测距模块只有一个超声波发射探头,超声波的反射很容易受到物体的形状和位置的干扰。第三,单片机的传输过程和计算过程也会占用一定的时间,并且产生一定的误差,导致接收时间不够精准,运算结果也不够精确。测量实际效果图如图13-23所示。 图图13-23 测量实际效果图测量实际效果图13.2.4 制作总结制作总结 我刚选这个课程设计的时候,心里对超声波测距充满着好

64、奇,之前也看 过有其他人做过这些模块,但我自己并没有真正地去做过成品,带着好奇的心里我选择了超声波测距仪这个课程设计,也开始了我的两周的课程设计生活。 刚开始的时候我想了许多的方案,也查找了许多资料。进过一系列的谈论和老师的指导下,最终确立了方案。方案出来我,我就着手准备元件的选择和购买,超声波模块是一个很重要的元件,我查询了许多型号,发现HC-SR04这个型号的模块相对其他的有一定的优势,结合以前我自己做过的模块我就首先做了一些仿真,并且最终把实物做了出来,实现了初步的功能,但并不完善。 在调试过程中,我发现显示有一定的误差,分析可能是精度取值不够精确,经过一系列的分析后,我设定了一个取精度

65、程序,是算法更加完善。 13.2.5 元件表元件表13.2.6 C语言源程序语言源程序#include #include #includesbit LCD_RS=P25; /RS寄存器选择;高电平选数据;低电平选指令;sbit LCD_RW=P26; /读写信号线;高电平读操作;低电平写操作;sbit LCD_E=P27; /E使能端sbit RX=P24;sbit TX=P23;sbit speak=P30;sbit KEY1=P20;sbit KEY2=P21;sbit quding=P22;#define LCD_Data P0 /液晶数据D7-D0#define Busy 0x80 /

66、用于检测LCD状态字中的Busy标识 unsigned int time=0,c=0,n;float Small=4.0,Large=50.0;/设定最小距离和最大距离double S=0;bit flag =0;unsigned long disbuff4;void WriteDataLCD(unsigned char WDLCD);/写数据void WriteCommandLCD(unsigned char WCLCD,BuysC);/写指令unsigned char ReadDataLCD(void);/读数据unsigned char ReadStatusLCD(void);/读状态v

67、oid LCDInit(void);/LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);/显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);/显示一串字符void Conut(void);void xianshi();void Delay5Ms(void);void StartModule();void delayms(unsigned int ms);voi

68、d Delay400Ms(void);unsigned char code uctech = Supersonic ;unsigned char code net = Start ;unsigned char code Cls = ;unsigned char code Cls0 =Distance: ;unsigned char code Cls1=Short: ;unsigned char code Cls2=Long: ;unsigned char code ASCII =0,1,2,3,4,5,6,7,8,9,.,-,M,C;/写数据void WriteDataLCD(unsigned

69、 char WDLCD) ReadStatusLCD(); /检测忙 LCD_Data = WDLCD; LCD_RS = 1; LCD_RW = 0; LCD_E = 0; /若晶振速度太高可以在这后加小的延时 LCD_E = 0; /延时 Delay5Ms(); /不加延时通不过PROTEUS仿真 LCD_E = 1;/写指令void WriteCommandLCD(unsigned char WCLCD,BuysC) /BuysC为0时忽略忙检测 if (BuysC) ReadStatusLCD(); /根据需要检测忙 LCD_Data = WCLCD; LCD_RS = 0; LCD_

70、RW = 0; LCD_E = 0; LCD_E = 0; Delay5Ms(); LCD_E = 1; /读数据unsigned char ReadDataLCD(void) LCD_RS = 1; LCD_RW = 1; LCD_E = 0; LCD_E = 0; Delay5Ms(); LCD_E = 1; return(LCD_Data);/读状态unsigned char ReadStatusLCD(void) LCD_Data = 0xFF; LCD_RS = 0; LCD_RW = 1; LCD_E = 0; LCD_E = 0; Delay5Ms(); LCD_E = 1; w

71、hile (LCD_Data & Busy); /检测忙信号 return(LCD_Data);void LCDInit(void) /LCD初始化 LCD_Data = 0; WriteCommandLCD(0x38,0); /三次显示模式设置,不检测忙信号 Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,1); /显示模式设置,开始要求每次检测忙信号 WriteCommandLCD(0x08,1); /关闭显示 WriteCo

72、mmandLCD(0x01,1); /显示清屏 WriteCommandLCD(0x06,1); / 显示光标移动设置 WriteCommandLCD(0x0c,1); / 显示开及光标设置/按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) Y &= 0x01; X &= 0x0F; /限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; /当要显示第二行时地址码+0x40; X |= 0x80; / 算出指令码 WriteCommandLCD(X, 0);

73、 /这里不检测忙信号,发送地址码 WriteDataLCD(DData);/按指定位置显示一串字符/指向数组的指针:int a10; int *p; p=&a0,p指向a0,是因为将a0的地址赋给了pvoid DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) unsigned char ListLength; ListLength = 0; Y=Y&0x01; /行标志符号,第0行,或者第1行; X=X&0x0F; /限制X不能大于15,0-15显示16个字符 while (ListLeng

74、th=0x0F) /若到达字串尾则退出 if (X=0x0F) /X坐标应小于0x0F DisplayOneChar(X, Y, DDataListLength); /显示单个字符 ListLength+; X+; /5ms延时void Delay5Ms(void) unsigned int TempCyc =100; while(TempCyc-);void StartModule() /启动模块 TX=1; /启动一次模块大约10us的方波 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _no

75、p_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; /延时void Delay400Ms(void) unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA-) TempCycB=7552; while(TempCycB-); void delayms(unsigned int ms)unsigned char i=10,j;for(

76、;ms;ms-)while(-i)j=10;while(-j);/键盘扫描void key1() if(quding=0) delayms(1); if(quding=0) speak=0; P1=0xff;while(quding=0); c+; if(c=3) c=0; /键盘扫描void key2() if(c=1) if(KEY1=0) delayms(1); if(KEY1=0) while(KEY1=0) n+; if(n=100) break; Small=Small+0.1; if(KEY2=0) delayms(1); if(KEY2=0) n+; if(n=100) bre

77、ak; Small=Small-0.1; /键盘扫描void key3() if(c=2) if(KEY1=0) delayms(1); if(KEY1=0) while(KEY1=0) n+; if(n=100) break; Large=Large+0.1; if(KEY2=0) delayms(1); if(KEY2=0) while(KEY2=0) n+; if(n=100) break; Large=Large-0.1; void Conut(void)/计算距离 time=TH0*256+TL0; TH0=0; TL0=0; S=(time*1.72)/100; /算出来是CM i

78、f(SLarge) /超出测量范围显示Satety flag=0; speak=1; P1=0xf3; delayms(10); speak=0; P1=0xff; DisplayOneChar(10, 1, S); DisplayOneChar(11, 1,a); DisplayOneChar(12, 1, t); DisplayOneChar(13, 1, e); DisplayOneChar(14, 1, t); DisplayOneChar(15, 1, y); if(S=Small&S=Large)/检测距离 speak=0; P1=0x3f; disbuff0=(long)S%10

79、00/100; disbuff1=(long)S%1000%100/10; disbuff2=(long)S%1000%100%10; disbuff3= (long)(S-(long)S)*10)%10; DisplayOneChar(9, 1, ASCIIdisbuff0); DisplayOneChar(10, 1, ASCIIdisbuff1); DisplayOneChar(11, 1,ASCIIdisbuff2 ); DisplayOneChar(12, 1,ASCII10 ); DisplayOneChar(13, 1,ASCIIdisbuff3 ); DisplayOneCha

80、r(14, 1, ASCII13); DisplayOneChar(15, 1, ASCII12); void xianshi()/手动调节最少距离和最大距离显示 if(c=1) DisplayListChar(0, 0, uctech); DisplayListChar(0, 1, Cls1); disbuff0=(long)Small%1000/100; disbuff1=(long)Small%1000%100/10; disbuff2=(long)Small%1000%100%10; disbuff3= (long)(Small-(long)Small)*10)%10; Display

81、OneChar(9, 1, ASCIIdisbuff0); DisplayOneChar(10, 1, ASCIIdisbuff1); DisplayOneChar(11, 1,ASCIIdisbuff2 ); DisplayOneChar(12, 1,ASCII10 ); DisplayOneChar(13, 1,ASCIIdisbuff3 ); DisplayOneChar(14, 1, ASCII13); DisplayOneChar(15, 1, ASCII12); if(c=2) DisplayListChar(0, 0, uctech); DisplayListChar(0, 1,

82、 Cls2); disbuff0=(long)Large%1000/100; disbuff1=(long)Large%1000%100/10; disbuff2=(long)Large%1000%100%10; disbuff3= (long)(Large-(long)Large)*10)%10; DisplayOneChar(9, 1, ASCIIdisbuff0); DisplayOneChar(10, 1, ASCIIdisbuff1); DisplayOneChar(11, 1,ASCIIdisbuff2 ); DisplayOneChar(12, 1,ASCII10 ); Disp

83、layOneChar(13, 1,ASCIIdisbuff3 ); DisplayOneChar(14, 1, ASCII13); DisplayOneChar(15, 1, ASCII12); if(c=0) DisplayListChar(0, 0, uctech);/显示第0行 DisplayListChar(0, 1, Cls0); TMOD=0x01; /设T0为方式1,GATE=1; TH0=0; TL0=0; ET0=1; /允许T0中断 EA=1; StartModule(); while(!RX);/当RX为零时等待 TR0=1; /开启计数 while(RX);/当RX为1

84、计数并等待 TR0=0;/关闭计数 Conut();/计算 delayms(20);/延时 void zd0() interrupt 1 /T0中断 flag=1; /中断溢出标志 void main(void) speak=0; P1=0xff; Delay400Ms(); /启动等待,等LCD进入工作状态 LCDInit(); /LCD初始化 Delay400Ms(); DisplayListChar(0, 0, uctech);/显示第0行 DisplayListChar(0, 1, net); /显示第1行 ReadDataLCD(); /测试用句无意义 Delay400Ms(); D

85、isplayListChar(0, 1, Cls); while(1) key1(); key2(); key3(); xianshi(); 13.3 基本单元制作基本单元制作(ISP烧写模式或烧写模式或USB烧写模式烧写模式) 13.3.1 单片机基本单元制作单片机基本单元制作ISP烧写模式烧写模式 1. 单片机基本单元制作ISP烧写模式电路图,如图13-24所示。图图13-24 单片机基本单元制作单片机基本单元制作ISP烧写模式烧写模式 2. 工作原理说明 RS-232C接口是EIA(美国电子工业协会)1969年修订RS-232C标准。RS-232C定义了数据终端设备(DTE)与数据通信设

86、备(DCE)之间的物理接口标准。 1) 机械特性 RS-232C接口规定使用25针连接器,连接器的尺寸及每个插针的排列位置都有明确的定义。(阳头)2) 功能特性 3. 元件清单 51单片机芯片及活动IC座各1个 MAX232芯片及IC座各1个 12MH晶振1个 电解电容10uF 1个 非极性瓷片电容30pF 2个 非极性瓷片电容104 5个 点触开关1个 自锁开关1个 发光LED灯1个 电阻500、10K各1个 带专用串口的万能板1块 母串口(DB9母) 1个 USB方口1个 带USB的方口电源线1条(建议网上购买)带USB的公串口线1条(建议网上买专用) 4. 源程序代码 功能:一个灯在做秒

87、闪烁 #include/头文件#define uint unsigned int/宏定义sbit led=P10;/声明单片机P1口的第一位void delay();/声明延时子函数void main()/主函数while(1)/大循环led=0;/点亮led灯delay();/调用延时函数led=1;/熄灭led灯delay();/调用延时函数void delay()/延时函数体uint i,j;for(i=500;i0;i-)for(j=110;j0;j-);13.3.2 单片机基本单元制作单片机基本单元制作USB烧写模式烧写模式1. 单片机基本单元制作USB烧写模式电路图,如图13-24

88、所示。 2. 工作原理说明 PL2303是Prolific公司生产的一种高度集成的RS232-USB接口转换器,可提供一个RS232全双工异步串行通信装置与USB功能接口便利联接的解决方案。该器件内置USB功能控制器、USB收发器、振荡器和带有全部调制解调器控制信号的UART,只需外接几只电容就可实现USB信号与RS232信号的转换,能够方便嵌入到手持设备。该器件作为USBRS232双向转换器,一方面从主机接收USB数据并将其转换为RS232信息流格式发送给外设;另一方面从RS232外设接收数据转换为USB数据格式传送回主机。PL2303的高兼容驱动可在大多操作系统上模拟成传统COM端口,并允

89、许基于COM端口应用可方便地转换成USB接口应用,通讯波特率高达6 Mbs。在工作模式和休眠模式时都具有功耗低,是嵌入式系统手持设备的理想选择。该器件具有以下特征:完全兼容USBl1协议;可调节的35 V输出电压,满足3 V、33 V和5 V不同应用需求;支持完整的RS232接口,可编程设置的波特率:75 bs6 Mbs,并为外部串行接口提供电源;512字节可调的双向数据缓存;支持默认的ROM和外部EEPROM存储设备配置信息,具有I2C总线接口,支持从外部MODEM信号远程唤醒。将PL2303的TXD(PINl)和RXD(PIN5)分别与单片机上的串口(TXD和RXD)连接,DM、DP与计算

90、机的USB接口连接,再加上其他外围元件,就可实现单片机与计算机之间的通讯。PL2303支持默认ROM和外部EEPROM 2种不同的存储方法,可存储包括PID(Pinduct ID),VID(Vendor ID)和器件收发器控制和状态等信息,如果不希望采用默认的设置,则需外扩一个EEPROM(如ST公司的M24C02)。3. 元件清单 51单片机芯片及活动IC座各1个 PL2303芯片及IC座各1个 12MH晶振2个 电解电容10uF 1个 非极性瓷片电容30pF 4个 非极性瓷片电容104 5个 点触开关1个 自锁开关1个 发光LED灯1个 电阻若干 USB接口1个 USB线1条 万能板1块温馨提示:本PPT课件下载后,即可编辑修改,也可直接使用。(希望本课件对您有所帮助)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号