《单片机课程设计——基于LCD显示的速度表.doc》由会员分享,可在线阅读,更多相关《单片机课程设计——基于LCD显示的速度表.doc(28页珍藏版)》请在三一办公上搜索。
1、目 录1 前言12 总体方案设计22.1 方案比较22.2 方案论证32.3 方案选择33 硬件设计43.1各单元模块功能介绍及电路设计43.1.1 单片机最小系统43.1.2 LCD显示电路53.1.3 按键电路的设计53.1.4 报警电路63.1.5 串口通信接口模块63.1.6 电源电路73.2 特殊器件的介绍73.2.1 单片机介绍83.2.2 LCD显示器103.3各单元模块的连接124 软件设计144.1 软件设计原理144.2 软件设计流程图144.3 软件实现144.3.1 按键扫描模块144.3.2中断测频154.3.3 1602显示165 系统调试206 结论217 总结与
2、体会227.1 设计小结227.2 设计收获体会227.3 设计改进227.4谢辞228 参考文献23附录1:软件设计流程图24附录2:原理图25附录3:PCB图26附录4:实物图271 前言 在当今时代里,汽车是最普通的交通运输工具,然而人们往往忽略高速行驶所带来的危险后果。每年由于司机的超速行驶而产生的交通事故很多,因此造成的直接和间接经济损失更是无法估量,然而很多因超速行驶而造成事故的肇事者不是想开很快,而是他们根本没有意识到自己在超速行驶,因此在交通事故发生之后大都感到后悔。但是如果在他们的汽车上安装汽车的速度显示及超速报警器,在很大程度上可以提醒司机适当放慢车速,以确保能及时避免发生
3、此类事故。我们设计的限速路段超速自动提示和报警系统与安全气囊等设施相比,更为主动有效,将可能产生的交通事故防患于未燃,它与警察用的雷达测速等防止司机超速装置相比,显得实用有效,司机可以在不同路段根据不同情况设定不同的最高限速值,主动自觉地有效限制车速。本身设计主要是计算汽车在一秒内轮子的转动圈数即转动频率,但考虑本设计的实际情况,为使电路简单,仅以转动频率来模拟汽车的速度,并将计得的速度通过LCD显示出来,速度显示每1秒钟刷新一次,并在实时速度超过设置的报警速度时发出报警声。司机可以根据不同的情况需要设计来设置合适的报警速度,以使司机能在合适的速度范围内安全行驶。在实时检测系统中单片机是一个核
4、心部件,此设计就是采用的8052单片机对机动车的超速行驶进行灯光报警。系统结构简单,可靠性高,操作方便,可广泛用于摩托车、汽车等机动车辆的速度监控。该电路只要由单片机最小系统、按键模块、LCD显示模块组成。单片机可以产生计数脉冲,来计算1秒钟内转动的圈数,通过计算可得到其实时速度,并在LCD上显示出来。按键模块设有暂停/开始键,设置报警速度时的加速、减速键,模拟轮子转速频率的加速、减速键。在设计中一般考虑一下几点:遵循从整体到局部的设计原则,把复杂难处理的问题划分为若干个简单的、较易处理的问题,分别加以解决,在组合起来完成较复杂的功能。为获得较高的性价比,设计不应盲目的追求复杂高级的方案,在满
5、足性能指标的前提下,采用尽可能简单的方案,用尽可能少的元器件,能得到更高的性价比。在满足指标的前提下,保证尽可能高的平均无故障时间、无故障率、无失效率、平均寿命,也是设计的一个很重要的考虑因素。2 总体方案设计2.1 方案比较 方案一:采用数字芯片,用555定时器组成的多谐振荡器产生方波信号,将产生的波形整形后输入计数器,对波形脉冲进行加计数,记录产生脉冲的个数,最后通过译码器和数码管对模拟的速度进行显示。其原理框图如图2-1所示:555定时器组成的多谐振荡电路整形电路LED显示计数器译码器 图2-1 数字芯片实现框图 方案二:基于现场可编程门阵列FPGA,通过EDA技术,采用Verilog
6、HDL硬件语言描述。用分频器产生方波脉冲,用下降沿触发加一计数,将计数结果在数码管中显示。其原理框图如图2-2所示:分频器产生方波脉冲计数器LED显示 图2-2 FPGA实现框图 方案三:基于单片机,通过C语言编程控制各模块的相互作用,实现速度测试功能的设计。程序设计思想为:1、单片机内部产生模拟时钟脉冲;2、利用外部中断对产生的时钟脉冲技术; 3、按键功能实现人机交互功能,人为设置参数;4、将计数结果和设置的参数送入LCD中显示出来。其原理框图如图23所示:单片机产生时钟脉冲外部中断对脉冲进行计数按键功能设置LCD显示 图2-3 单片机实现框图2.2 方案论证 方案一采用数字芯片实现设计要求
7、,设计中使用的分离元件电路较多,元件内部延时很大,不容忽视,这就要求精密的计算,工作量大,而且增加了硬件调试的时间,过程繁琐;此外各元件受外部环境影响较大,电路设计出来实物的稳定性较差。方案二基于现场可编程门阵列FPGA,使用Verilog HDL硬件描述语言,需要很清楚的了解此语言的用法,其中的计数器模块采用自底向上的设计方式,这种设计方法就如同一砖一瓦建造金字塔,不仅效率低,成本高,而且容易出错;另外,FPGA器件是基于SRAM结构的,由于SRAM的易失性,每次加电时,配置数据都必须重新构造,过程比较冗杂;在FPGA中的多路信号的电平值发生变化时,在信号改变的瞬间,组合逻辑的输出有先后顺序
8、,并不是同时变化,往往会出现一些不正确的毛刺,会产生毛刺,可能对输入有危害。方案三采用单片机技术,这种技术现在已经很成熟了,一方面单片机有极高的性能价格比,体积小,重量轻,抗干扰能力强,环境要求不高等特点,另一方面利用C语言编程的可移植性和易读性,开发较为容易,利用程序实现各个功能模块的相互配合,实现的设计产品灵活性好,可靠性好。2.3 方案选择 由于现在系统开发市场的突飞猛进,设计的自动化程度越来越高,设计的复杂性也越来越强,人们对能简化电路设计、低研究成本、低故障、高实时、高可靠、高稳定的性能的设计理念和设计方法更加青睐,结合本设计的要求及综合以上比较的情况,我们选择了基于单片机设计的方案
9、。3 硬件设计本设计主要采用了单片机最小系统、按键模块、LCD显示模块,单片机是本设计的核心部件,主要用于实时速度的测量,总路程的计算并在LCD上显示出来,还有是否超速的检测。若检测到超速还应该报警提示,本设计采用蜂鸣器实现报警功能。3.1各单元模块功能介绍及电路设计3.1.1 单片机最小系统图3-1 单片机最小系统 本设计最小系统的核心部件是89C52单片机,各管脚的连接如图3-1所示,P0端口的管脚接有上拉电阻。复位电路的S22为复位按键,可使单片机复位。复位是单片机的初始化操作,只要给RESET引脚加上2个机器周期以上的高电平信号,就可使单片机复位。复位的主要功能是把PC初始化为0000
10、H,使单片机从0000H单元开始执行程序。除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态,为摆脱死锁状态,也需按复位键重新启动。89C52的CPU工作频率采用12MHZ,方便系统对技术脉冲进行快速的处理,以灵敏的显示出实时速度,高效地实现对速度的检测。89C52的输入、输出引脚具有32根I/O口线,可以连接LCD显示器、按键电路、串口通信接口、液晶显示接口等各种外部器件,用以控制电路的各个模块的运行。89C52具有低功耗和低电压工作模式的特点,可以利用电池对系统供电。3.1.2 LCD显示电路图3-2 LCD液晶显示接口液晶显示口主要由两个单排插座组成,分别为单列
11、20管脚和单列16管脚的插座,可将LCD显示器接插在上面,也可根据需要取下LCD显示器。各个管脚的连接如图所示,是单片机对LCD显示的控制。而本设计采用为16*2的LCD显示器,第一排显示报警速度值和总路程值,第二排显示实时速度值。3.1.3 按键电路的设计图3-3 按键电路按键电路是本设计一个重要的组成部分,它能在设备启动后,司机根不同的路面情况设置当前需要的报警速度,。图中的S18按键是暂停/开始按键:按下S18则屏幕上的数字包括实时速度都停止不动,在“暂停”情况下按其他的按键是无效的,再按下S18键屏幕上的实时速度就有变动了,只有在“开始”情况下其它的按键按下才有效。S19:模拟的实时速
12、度加操作键,本实验中因为条件限制,只能由有单片机产生脉冲模拟汽车的速度,而为了能清楚的看到设计结果,需要改变汽车的模拟速度,S19键就是对模拟速度进行加操作的按键。S20、S21:报警速度的加、减操作键,司机可以根据不同的路面情况和其它的一些信息来设置所需要的报警速度,使报警器有更大的实用性。 3.1.4 报警电路图3-4蜂鸣器报警电路报警电路采用三级管驱动蜂鸣器报警,当INT1为高电平时蜂鸣器发出报警声,表示所测的实时速度超过了报警速度,提示司机该减速行驶了。3.1.5 串口通信接口模块图3-5 串口通信接口电路 本设计核心芯片是单片机,为单机写好程序后,要烧写到单片机内就需要串口通信接口起
13、连接作用,将程序由电脑烧写到单片机里。图中J1为串口的接口,用来连接电脑的输出端口,IC1中的管脚10 TXD、管脚9 RXD用来连接单片机的管脚P3.6 WR、管脚P3.7 RD,完成程序从电脑到单片机的读写功能。 3.1.6 电源电路图3-6 电源电路 如图所示为电源电路,为整个电路提供电源。此电路采用的是USB接口供电方式。J16即为USB插孔。图中S1为电源开关键,手动给整个电路上电。3.2 特殊器件的介绍 本设计中用到了89C52单片机和LCD显示器。单片机是本设计的核心芯片,控制着整个电路的功能更,而程序的功能由烧写到单片机里的程序来实现。LCD是显示部分的核心部件,可以显示报警速
14、度、总路程、实时速度,以便司机更好地掌握速度的加减。下面对着两种器件进行一些简单的介绍。3.2.1 单片机介绍图3-7 89C51单片机封装引脚图管脚说明: VCC:供电电压。 GND:接地。 P0 口:P0 口为一个 8 位漏级开路双向 I/O 口,每脚可吸收 8TTL 门电流。当 P1 口的管脚第一次写 1 时,被定义为高阻输入。P0 能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在 FIASH 编程时,P0 口作为原码输入口,当 FIASH 进行校验时,P0 输出原码,此时 P0 外部必须被拉高。 P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口,P1
15、口缓冲器能接收输出 4TTL 门电流。P1 口管脚写入 1 后,被内部上拉为高,可用作输入,P1 口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在 FLASH 编程和校验时,P1 口作为第八位地址接收。 P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接收,输出 4 个 TTL 门电流,当 P2 口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据存储器进行存取时,P2 口输出地址的高八位。在给出地址“1”时,它利用
16、内部上拉优势,当对外部八位地址数据存储器进行读写时,P2 口输出其特殊功能寄存器的内容。P2 口在 FLASH 编程和校验时接收高八位地址信号和控制信号。 P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口,可接收输出 4个 TTL 门电流。当 P3 口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的缘故。 P3 口也可作为 AT89C51 的一些特殊功能口,如表 1 所示: 表 1 P3 各端口引脚与复用功能表 端口引脚 复用功能 P3.0 RXD串行输入口) P3.1 TXD串行输出口) P3.2 I
17、NT0外部中断 0) P3.3 INT1外部中断 1) P3.4 T0定时器 0 的外部输入) P3.5 T1定时器 1 的外部输入) P3.6 WR外部数据存储器写选通)。由于89C51的片内程序存储器只有4KB,本设计中根据所编写的程序的大小,选择了89C52,有8KB的片内程序存储空间。也更实用。其它方面,89C51与89C52的区别不大,用法相同。单片机的功能特性:8位CPU,4kbytes 程序存储器(ROM) (52为8K) 256bytes的数据存储器(RAM) (52有384bytes的RAM) 32条I/O口线111条指令,大部分为单字节指令 21个专用寄存器 2个可编程定时
18、/计数器5个中断源,2个优先级(52有6个) 一个全双工串行通信口 外部数据存储器寻址空间为64kB 外部程序存储器寻址空间为64kB 逻辑操作位寻址功能双列直插40PinDIP封装 单一+5V电源供电 CPU:由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器; RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据; ROM:用以存放程序、一些原始数据和表格; I/O口:四个8位并行I/O口,既可用作输入,也可用作输出; T/C:两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式; 五个中断源的中断控制系统; 一个全双工UART(通用异步接收发送
19、器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信; 片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。最高振荡频率为12M。3.2.2 LCD显示器图3-8 LCD显示器结构图引脚接口说明如下表:编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16 BLK背光源负极表3-1 LCD显示器各引脚的说明表1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表3
20、-1所示:第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据
21、线。第15脚:背光源正极。第16脚:背光源负极。1602LCD液晶模块内部的控制器共有11条控制指令,如表3-2所示:序号指令RSR/WD7D6D5D4D3D2D1D01清显示00000000012光标返回000000001*3置输入模式00000001I/DS4显示开/关控制0000001DCB5光标或字符移位000001S/CR/L*6置功能00001DLNF*7置字符发生存贮器地址0001字符发生存贮器地址8置数据存贮器地址001显示数据存贮器地址9读忙标志或地址01BF计数器地址10写数到CGRAM或DDRAM)10要写的数据内容11从CGRAM或DDRAM读数11读出的数据内容表3-
22、2 控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。指令5:光标或显示移位 S/C:高电平时移动显示的文字,
23、低电平时移动光标。指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。指令11:读数据。3.3各单元模块的连接 单片机最小系统串口通信接口模块LCD显示模块电源模块为整个电路供电按键控制模块报警电路模块图3-9 各模块的连接框图图3-9为整个系统的各个模块之间的连接关系,如图所示:
24、 电源是整个电路的基本部分,必须先给整个电路供电才能让电路工作。 串口通信接口模块将电脑与单片机连接起来,程序就是通过串口通信接口烧写到单片机的,这是使用单片机必不可少的一个部分。 按键控制模块输入一些信息到单片机内,使单片机内的报警速度、模拟汽车速度发生更改,司机就是通过按键模块来设置自己需要的报警速度的。 而单片机是整个系统最核心的部分,控制整个电路的程序就在单片机内部,而程序通过对各个管脚的控制,来实现相关的功能。 LCD模块能显示报警速度、总路程、实时速度,使整个系统的功能更直观的显示出来。 报警模块是在实时速度超过了报警速度是才工作的,单片机控制报警模块中的蜂鸣器发出声音,提示司机当
25、前速度已经超过了报警速度,该适当减速了。4 软件设计4.1 软件设计原理 本设计由单片机定时器T0产生方波信号,可以由按键控制产生的频率,将产生的方波经P1.0口输出。将P1.0的方波信号输入单片机外部中断0,由方波下降沿触发中断程序,每中断一次,n0就加1,即记录下方波下降沿的数目。定时器T1产生1秒的定时,定时一到,就开始从新赋初值。一秒内n0的值相当于车轮转动的圈数,与车轮的周长的乘积,也就是这一秒的平均速度speed了。在经过单位变化,转化为Km/h,连同车速最大值max和路程经LCD显示出来。若speed大于所设定车速的最大值max,将自动报警。而按键功能实现人机交互,按键1增大车速
26、的最大值max,每按下并松开一次,最大值加1;按键2减小车速的最大值max,每按下并松开一次,最大值减1;按键3通过改变定时器T0的初值,产生不同频率的方波信号,并随按键次数增加,频率越大,相当于人为增加了车速,但最多增加至200Km/h;按键4则实现暂停和开始功能。 4.2 软件设计流程图软件设计流程图见附录1:4.3 软件实现设计主程序如下:void main()initial_int(); LCD_Initial(); while(1) getkey(); speed=n2; if(n2max) P00=0; else P00=1; show_time(); Delay1ms(40);
27、4.3.1 按键扫描模块void getkey() if(P14!=1) max=max+1;while(P14!=1); else if(P15!=1)max=max-1;while(P15!=1); else if(P16!=1)n3=n3+1; if(n3=1) x1=x1+0xCF; y1=y1+0x2C; else if(n3=2) x1=x1+0x18; y1=y1+0x5A; else if(n3=3) x1=x1+0x08; y1=y1+0x23; else if(n3=4) x1=x1+0x04; y1=y1+0x12; else if(n3=5) x1=x1+0x03; y
28、1=y1+0x7f; if(n3=6) x1=0x00; y1=0x00; n3=0;while(P16!=1); else if(P17!=1)TR1=!TR1;while(P17!=1); 4.3.2中断测频void initial_int() x1=0x00;/0x00; y1=0x00;/0x00; TMOD=0X11; TH0=x1; TL0=y1; TH1=0X3c; TL1=0Xb0; IT0=1; EX0=1; ET0=1; ET1=1; PT1=1; PX0=0; PT0=0; TR0=1; TR1=1; EA=1; void int_1() interrupt 1 TH0=
29、x1; TL0=y1; P10=!P10;void int_2() interrupt 0 /中断,计数脉冲次数 n0=n0+1;void int_3() interrupt 3 TH1=0X3c; TL1=0XB0; n1=n1+1; if(n1=20) s=s+n2*10/36;if(s9999) s=0;n2=n0; n0=1;n1=0; 4.3.3 1602显示unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();while(DBPort&0xA0); LcdEn=0;return DBPort;void
30、 LCD_Write(bit style, unsigned char input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();void LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0x38); LCD_Write(LC
31、D_COMMAND,0x38);LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40); void Print(u
32、nsigned char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;void maxtoStr() maxString0 =max/100+0; maxString1 =(max%100)/10+0; maxString2 =(max%100)%10+0;void speedToStr() /将速度数据转换成液晶显示字符放到数组 speedString; speedString0 =speed/100+0; speedString1 =(speed%100)/10+0; speedString2 =(speed%100)%10+0;voi
33、d stoStr() sString0 =s/1000+0; sString1 =(s%1000)/100+0; sString2 =(s%1000)%100/10+0; sString3 =(s%1000)%100%10+0; void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j=0;j9999) s=0;n2=n0;n0=1;n1=0; T0初值x1=0x00;y1=0x00;工作方式为方式1T0中断程序:void int_1() interrupt 1 TH0=x1; TL0=y1; P10=!P10;开始初始化T0,T1