电压测量程序设计及出租车计费器的设计_第1页
电压测量程序设计及出租车计费器的设计_第2页
电压测量程序设计及出租车计费器的设计_第3页
电压测量程序设计及出租车计费器的设计_第4页
电压测量程序设计及出租车计费器的设计_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

出租车计费器的设计第页共50页广西科技大学

课程设计论文课题名称电压测量程序设计学院电气学院专业测控技术与仪器班级学号姓名指导教师摘要本课程设计是电压测量程序设计,利用实验台上的电压源,经过放大后送到a/d转换成数字信号,计算后在LCD上显示其电压值。主要解决A/D转换,放大电路,数据处理和显示模块。A/D转换用ADC0809,系统用AT单片机,放大电路用OP07同相放大,显示用1602液晶屏显示。关键字:A/D0809,OP07,LCD1602,AT89C52Abstract;Thiscourseisdesignedtomeasurethevoltageprogramming,usingvoltagesourcetestbench,afteramplifiedandsenttothea/dconvertedintodigitalsignals,calculatedontheLCDdisplaythevoltagevalue.MainlytosolvetheA/Dconversion,amplificationcircuit,dataprocessinganddisplaymodule.A/DconversionwithADC0809,thesystemusesATmicrocontroller,amplifyingcircuitwithOP07in-phaseamplifier,With1602LCDscreendisplay.Keyword:A/D0809,OP07,LCD1602,AT89C52目录引言 31.系统设计方案的选择 41.1基于单片机系统及A/D转换芯片的电压表。 41.2.本设计使用的单片机的简介 41.3.本设计使用的1602的简介 41.4.选用的A/D0809简介 41.5.选用的OP07简介……………..52.总体设计方案 53.硬件电路系统模块的设计 53.1单片机系统 53.2输入OP07放大电路 73.3 A/D转换电路 73.4 1602液晶电路 74.系统软件的设计 84.1主程序的设计 84.2A/D转换程序95.系统的调试 105.1硬件调试 105.2软件调试 10总结 11参考文献 11附录1:源程序附录2:电路总图引言数字电压表最初是伺服步进电子管比较式,其优点是准确度比较高,但是采样速度慢,重量达几十公斤,体积大。继之出现了斜波式电压表,它的速度方面稍有提高,但是准确度低,稳定性差,再后来出现了比较式仪表改进逐次渐近式结构,它不仅保持了比较式准确度高的优点,而且速度也有了很大的提高,但它有一缺点是抗干扰能力差,很容易受到外界各种因素的影响。随后,在斜波式的基础上双引伸出阶梯波式,它的唯一的进步是成本降低了,可是准确宽,速以及抗干扰能力都未能提高。而现在,数字电压表的发展已经是非常的成熟,就原理来讲,它从原来的一,二种已发展到多种,在功能上讲,则从测单一参数发展到能测多种参数;从制作元件来看,发展到了集成电路,准确度已经有了很大的提高,精度高达1NV;读数每秒几万次,而相对以前,它的价格也有了降低了很多。目前实现电压数字化测量的方法仍然模-数(A/D)转换的方法。而数字电压表种类繁多,型号新异,目前国际仍未有统一的分类方法。而常用的分类方法有如下几种:按用途来分:有直流数字电压表,交、直流数字电压表,交直流万用表等。按显示位数来分:有4位,5位,6位,7位,8位等。按测量速度来分:有低准确度,中准确度,高准确度等。按测量速度来分:有低速,中速,高速,超高速等。但在日常生活中,数字电压表一般是按照原理不同进行分类的,目前大致分为以下几类:比较式,电压——时间变换式,积分式等。在电量的测量中,电压、电流和频率是最基本的三个被测量。其中,电压量的测量最为经常。而且随着电子技术的发展,更是经常需要测量高精度的电压,所以数字电压表就成为一种必不可少的测量仪器。另外,由于数字式仪器具有读数准确方便、精度高、误差小、灵敏度高和分辨率高、测量速度快等特点而倍受用户青睐,数字式电压表就是基于这种需求而发展起来的,是一种必不可少的电子测量仪表。1.1基于单片机系统及A/D转换芯片的电压表这种方案是利用单片机系统与模数转换芯片、显示模块等的结合构建数字电压表。由于单片机的发展已经成熟,利用单片机系统的软硬件结合,可以组装出许多的应用电路来。此方案的原理是模数(A/D)转换芯片的基准电压端,被测量电压输入端分别输入基准电压和被测电压。模数(A/D)转换芯片将被测量电压输入端所采集到的模拟电压信号转换成相应的数字信号,然后通过对单片机系统进行软件编程,使单片机系统能按规定的时序来采集这些数字信号,通过一定的算法计算出被测量电压的值。最后单片机系统将计算好了的被测电压值按一定的时序送入显示电路模块加以显示。1.2本设计使用的单片机的简介本设计中选用是51系列的AT89C52,它是低电压、低功耗、高性能的CMOS8位单片机,片内含4KB的可反复擦写的只读程序存储器和128B的随机存取数据存储器,32个I/O口线,片内振荡器及时钟电路,并与MCS-51系列单片机兼容。在设计中,单片机起着连接硬件电路与程序运行及存储数据的任务,一方面,它将A/D转换器、显示器等通过I/O口地址线和数据线连接起来;另一方面,它将用户下载的程序通过控制总线控制数据的输入输出,从而实现测电压的功能。1.3本设计使用的1602的简介1602液晶是工业字符型液晶,能够同时显示16*2即32个字符。1602液晶模块内部的字符发生存储器已经存储了160个不同的点阵字符图形,这些字这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码。使用时直接编写软件程序按一定的时序驱动即可。它的特点是显示字迹清楚,价格相对便宜。1.4选用的A/D0809简介AD0809是8位逐次逼近型A/D转换器,它是由一个8路的模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。些A/D转换器是的特点是8位精度,属于并行口,如果输入的模拟量变化大快,必须在输入之前增加采样电路。1.5选用的OP07简介Op07芯片是一种低噪声,非斩波稳零的双极性运算放大器集成电路。由于OP07具有非常低的输入失调电压(对于OP07A最大为25μV),所以OP07在很多应用场合不需要额外的调零措施。OP07同时具有输入偏置电流低(OP07A为±2nA)和开环增益高(对于OP07A为300V/mV)的特点,这种低失调、高开环增益的特性使得OP07特别适用于高增益的测量设备和放大传感器的微弱信号等方面。2.0设计方案根据上述,我们选择单片机与A/D转换芯片结合的方法实现本设计。使用的基本元器件是:AT89C52单片机,ADC0809模数转换芯片,1602液晶显示器,OP07放大电路,电容,电阻,晶振,标准电源等等。设计的基本框图如下:单片机系统模块单片机系统模块1602液晶显示模块输入放大OP07电路模块A/D转换模块图2.13.硬件电路系统模块的设计3.1单片机系统单片机最小系统其原理图如下:图3.1晶振电路如下图:图3.2复位电路如下图:图3.33.2输入电路于输入电路的电压要经过OP07放大电路放大,电路图如下:图3.43.3A/D转换电路ADC0809转换电路如下:图3.53.4显示电路1602液晶显示电路如下:图3.64.系统软件的设计4.1主程序的总体流程图:选择选择ADC0809的转换通道开启A/D转换数据转换液晶显示开始转换是否结束NY设定定时器,提供时钟信号输出转换结果图4.14.2A/D转换程序:设置模拟输入口设置模拟输入口开始启动转换转换完成?NY输出数值处理图4.25.系统的调试完成了系统的硬件设计,制作和软件编程之后,要使系统能够按设计意图正常运行,必须进行系统调试。调试分了硬件和软件调试5.1硬件调试硬件调试的主要任务是排除硬件故障,其中包括设计的错误和工艺性故障等。检查所设计的硬件电路板所有的器件和引脚是否正确,尤其是电源的连接是否正确;检查各总线是否有短路的故障。检查开关/按键是否正常,是否连接正确,为了保护芯片,应先对各插座电位进行检查,确认无误后再插入芯片。将40芯片的仿真插头插入单片机插座进行调试,检查各接口是否满足设计的要求,有正常的程序测试硬件电路的好坏。5.2软件调试软件调试的任务是利用开发工具进行在线仿真调试,发现和纠正程序的错误,同时也能发现硬件的故障。软件调试是一个模块一个模块进行的。首先单独调试各子程序是否能够按照预期的功能,接口电路的控制是否正常。最后调试整个程序。尤其注意的是各模块间能否正确的传递参数。检查液晶显示模块程序。在主程序中调用display()和dislay_zifu()函数,观察在1602液晶上是否能够显示相应的字符。如果不能,则在相关的子程序中设计断点,反复调试直到能够显示。检查按键模块程序。本设计的按键模块程序是用状态机的方法,可以在key_state1状态下加一个任务,如显示一个字符在液晶上。观察是否正确显示。检查A/D转换模块程序。可以在硬件电路的输入端输入已知的几个电压,分别观察液晶上是否显示相应的电压值。检查数据的转换模块程序。可以按硬件电路的按键开关,输入相应的电压,观察液晶显示的电压值是否一致。如果一致。则数据转换的算法正确的。总调试。当相应的各模块环节都正确后,可程序下载到单片机。接上电源运行。再检查所有功能,观察是否能预期的一样。如果一样,说明设计成功完成。总结:这次的课程认识到了我们的动手能力还不够,理论知识也学得不够扎实,还有我们的经验也不够。经过了设计后我们的动手能力得到提高,也进一步巩固了我们的理论知识,同时也增加了一些设计的经验。参考文献:[1]杨毅刚,彭喜元编著,单片机原理与应用设计北京:电子工业出版社。2008.4[2]赵月飞等编著,Protel99SE基础与实例教程北京:机械工业出版社。2009.12[3]姜志海编著,单片机的C语言程序设计与应用北京:电子工业出版社。2011.7[4]史建芳编著,智能仪器设计基础北京:电子工业出版社。2012.9附录1:源程序主程序:#include<reg52.h>#include<intrins.h>#include"LCD1602.h"#include"ADC0809.h"sbitCLOCK=P0^7;externuchardisplay_buffer[][16];voidmain(){ TMOD=0x02; TH0=0x14; TL0=0x00; IE=0x82; TR0=1; Initialize_LCD1602(); delay50us(10); Write_LCD_Command(0x80);//设置显示的初始位置 LCD_Display(display_buffer[0]);//显示"Thevoltageis:" while(1) { adc0809_init(); Refresh_show(); Write_LCD_Command(0xC0);//设置显示的初始位置 LCD_Display(display_buffer[1]);//显示测得的数据 }}voidTimer0_INT()interrupt1{ CLOCK=!CLOCK;}LCD1602头文件:#ifndef__lCD1602_H__#define__LCD1602_H__#include<reg52.h>#definedat_portP0#defineucharunsignedchar#defineuintunsignedint#definedelay4us(){_nop_();_nop_();_nop_();_nop_();}sbitRS=P1^5;//RS=1数据RS=0命令sbitRW=P1^6;//RW=1读取RW=0写入sbitE=P1^7;//E使能信号ucharLCD_Busy_Check();//忙检查voidWrite_LCD_Command(ucharcmd);//向LCD写入命令voidWrite_LCD_Data(uchardat);//向LCD写入一个字节的数据函数voidInitialize_LCD1602();//液晶初始化函数voidLCD_Display(uchar*str);//在LCD上显示字符串#endifLCD1602C源程序:LCD1602.c源程序//液晶控制与显示驱动程序#include<reg52.h>#include<intrins.h>#include<string.h>#include"LCD1602.h"#include"ADC0809.h"//忙检查//ucharLCD_Busy_Check(){ ucharLCD_Status; RS=0; RW=1; E=1; delay4us(); LCD_Status=P3; E=0; returnLCD_Status; }//向LCD写入命令//voidWrite_LCD_Command(ucharcmd){ while((LCD_Busy_Check()&0x80)==0x80);//忙等待 RS=0; RW=0; E=0; P3=cmd; delay4us(); E=1; delay4us(); E=0;}//向LCD写入一个字节的数据函数*/voidWrite_LCD_Data(uchardat){ while((LCD_Busy_Check()&0x80)==0x80); RS=1; RW=0; E=0; P3=dat; delay4us(); E=1; delay4us(); E=0;}//LCD初始化*/voidInitialize_LCD1602()//液晶初始化函数{ Write_LCD_Command(0x38); delay50us(10);//功能设置,数据长度为8位,双行显示,5×7点阵字体 Write_LCD_Command(0x0C); delay50us(10);//显示开,关光标 Write_LCD_Command(0x06); delay50us(10);//字符进入模式:屏幕不动,字符后移 Write_LCD_Command(0x01); delay50us(10);//清屏}//在LCD上显示字符串*/voidLCD_Display(uchar*str){ uchari; for(i=0;i<strlen(str);i++) { Write_LCD_Data(str[i]); delay50us(100); }}ADC0809头文件:#ifndef__ADC0809_H__#define__ADC0809_H__#include<reg52.h>#definedata_portP1#defineucharunsignedchar#defineuintunsignedintsbitSTART=P0^4;sbitEOC=P0^5;sbitOE=P0^6;voiddelay50us(uintm);//延时uintadc0809_init();//AD初始化voidRefresh_show();#endifADC0809C源程序:#include<reg52.h>#include<intrins.h>#include"ADC0809.h"unsignedlongdat_adc0809;uchardisplay_buffer[][16]={ {"Currentvoltage:"}, {"(CH)=0.00V"} };voiddelay50us(uintm){ uintn,k; for(n=m;n>0;n--) for(k=25;k>0;k--);}uintadc0809_init()//AD初始化{ START=0; OE=0; START=1; START=0; while(EOC==0); OE=1; dat_adc0809=P2; OE=0; returndat_adc0809;}voidRefresh_show()//刷新显示{ uintt=dat_adc0809*500.0/255;// display_buffer[1][7]=t/100+'0';//整数位 display_buffer[1][9]=t/10%10+'0';//两个小数位 display_buffer[1][10]=t%10+'0';}附录2:原理图1绪论1.1EDA技术概论 EDA技术就是以计算机为工具,设计者在EDA软件平台上,用硬件描述语言VHDL完成设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。EDA技术的出现,极大地提高了电路设计的效率和可操作性,减轻了设计者的劳动强度。在电子技术设计领域,可编程逻辑器件(如CPLD、FPGA)的应用,已得到广泛的普及,这些器件为数字系统的设计带来了极大的灵活性。这些器件可以通过软件编程而对其硬件结构和工作方式进行重构,从而使得硬件的设计可以如同软件设计那样方便快捷。这一切极大地改变了传统的数字系统设计方法、设计过程和设计观念,促进了EDA技术的迅速发展。1.2硬件描述语言VHDL 1.2.1VHDL简介VHDL全名Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。VHDL语言是一种用于电路设计的高级语言。 它在80年代的后期出现。最初是由美国国防部开发出来供美军用来提高 设计的可靠性和缩减开发周期的一种使用范围较小的设计语言。VHDL翻译成中文就是超高速集成电路硬件描述语言,主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在 FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被 用来设计ASIC。 1.2.2VHDL的流程设计从系统总体要求出发,自上而下地逐步将设计的内容细化,最后完成系统硬件的整体设计。在设计的过程中,对系统自上而下分成三个层次进行设计:第一层次是行为描述。所谓行为描述,实质上就是对整个系统的数学模型的描述。一般来说,对系统进行行为描述的目的是试图在系统设计的初始阶段,通过对系统行为描述的仿真来发现设计中存在的问题。在行为描述阶段,并不真正考虑其实际的操作和算法用何种方法来实现,而是考虑系统的结构及其工作的过程是否能到达系统设计的要求。第二层次是RTL方式描述。这一层次称为寄存器传输描述(又称数据流描述)。如前所述,用行为方式描述的系统结构的程序,其抽象程度高,是很难直接映射到具体逻辑元件结构的。要想得到硬件的具体实现,必须将行为方式描述的VHDL语言程序改写为RTL方式描述的VHDL语言程序。也就是说,系统采用RTL方式描述,才能导出系统的逻辑表达式,才能进行逻辑综合。第三层次是逻辑综合。即利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表)。此时,如果需要,可将逻辑综合的结果以逻辑原理图的方式输出。此后可对综合的结果在门电路级上进行仿真,并检查其时序关系。应用逻辑综合工具产生的门网络表,将其转换成PLD的编程码,即可利用PLD实现硬件电路的设计。由自上而下的设计过程可知,从总体行为设计开始到最终的逻辑综合,每一步都要进行仿真检查,这样有利于尽早发现设计中存在的问题,从而可以大大缩短系统的设计周期。1.3QuartusII软件操作流程双击桌面上QuartusII9.0,打开Quartus软件。新建VHDL文件,开始编写VHDL程序。保存VHDL文件,文件取名要与程序实体名要一致。创建新工程按下“保存”按纽后会出现如下提示。提示是否为此文件建立一个工程,这很重要。然后点击“是”,出现以下窗口,点“Next>”。图1.1新建工程提示 (4)器件的选择继续点“Next>”。然后选择FPGA或CPLD的有关参数,这些参数都是根据目标芯片来选择的,如下图所示。图1.2芯片选择(5)编译编译:选择processing菜单中的startcompilation命令。编译完成的提示如下,点击确定即可。(6)仿真 这时可以进行仿真,首先要建立波形文件,点“File选项中New”,出现如下窗口:图1.3建立波形文件 选择“VectorwaveformFile”点“OK”。出现以下窗口。 图1.4建立波形文件后出现窗口 双击左边的空白处,设定输入输出信号。设定好波形后,保存波形。之后点进行仿真。(7)锁定引脚引脚锁定,如下图操作:引脚的锁定是根据不同的电路和不同功能来确定的,不是一层不变的。选择Assignments菜单下的Pins命令,出现以下窗口,图1.5引脚分配图如果是下载到实验箱上则需连续按“模式选择”按钮选择模式5,再按“系统复位”按钮。进行引脚锁定,查阅附表,分别点“location”选择引脚号。引脚锁定后再编译。如同此前进行过的。编译成功后点确定。(8)下载选择Tools菜单下的Programmer命令,然后在Program/Configure下打上钩选中,点“start”按钮开始下载,“Progress”进度条显示下载进度。成功下载后如图所示:图1.6下载到实验箱界面下载完后就可以在实验箱查看结果。通过上面的步骤分别下载到实验箱中和FPGA中,验证了在仿真中的结果是正确的。2课题设计2.1出租车计费器设计内容 (1)能实现计程与计费功能,计费标准为:按行驶里程收费,分为白天与黑夜。白天收费标准:起步价为6.00元,超过1公里按1元/公里计算,超过3公里多收10块钱的空车返回费用。黑夜收费标准:起步价为8.00元,超过1公里按2元/公里计算,超过3公里多收10块钱的空车返回费用。 (2)能够有对路程清零与对计费停止功能。当无乘客不需要计费时,对路程清零及对价格清零。 (3)实够实现按键控制显示路程、价格及当前车速,当车速超过4Km/h时发出警报。2.2出租车计费器设计方框图 出租车计费器是由输入信号、分频器(供蜂鸣器发生警报提供不同的频率)、路程计数模块、计费模块、控制模块(控制输出显示路程、价格或当前车速)、及译码显示模块(八个七段数码管)。其总体方框图如下所示:输输入信号分频器测速模块车费计数模块车行驶状态译码显示计程模块显示控 制蜂鸣器图2.1总体设计方框图2.3出租车计费器系统各功能模块及模块程序 2.3.1计程与计费模块 计程与计费模块由一个时钟输入端clk与使能端en及复位端rst端与位选端SL[2..0]及显示输出端led[6..0]构成。其en端为‘1’时允许计数,rst为‘1’时计数清零。图2.2计程与计费模块图其仿真图如下所示:图2.3计程与计费模块仿真图其程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitytaxiisport(Clk:instd_logic;daytime :instd_logic;Rst:instd_logic;en:instd_logic;Motor:instd_logic;Display:outstd_logic_vector(6downto0);SEG_SEL:bufferstd_logic_vector(2downto0));endtaxi;architectureoneoftaxiissignalDisp_Temp:integerrange0to15;signalDisp_Decode:std_logic_vector(6downto0);signalMeter1,Meter10,Meter100,Meter1K:integerrange0to9;signalMoney1,Money10,Money100:integerrange0to9;signalOld_Money1:integerrange0to9;beginprocess(Motor)beginif(Rst='0')thenMeter1<=0;Meter10<=0;Meter100<=0;Meter1K<=0;elsif(Motor'eventandMotor='1')thenif(Meter1=9)thenMeter1<=0;if(Meter10=9)thenMeter10<=0;if(Meter100=9)thenMeter100<=0;if(Meter1K=9)thenMeter1K<=0;elseMeter1K<=Meter1K+1;endif;elseMeter100<=Meter100+1;endif;elseMeter10<=Meter10+1;endif;elseMeter1<=Meter1+1;endif;endif;endprocess;process(Clk)beginifen='0'thennull;elsif(Rst='0')thenMoney1<=0;Money10<=0;Money100<=0;elsif(Clk'eventandClk='1')then ifdaytime='0'then--baitianif(Meter1K<1)thenMoney100<=0;Money10<=6;Money1<=0;Old_Money1<=0;elseMoney1<=Meter100;Old_Money1<=Money1;if(Old_Money1=9andMoney1=0)thenif(Money10=9)thenMoney10<=0;if(Money100=9)thenMoney100<=0;elseMoney100<=Money100+1;endif;elseMoney10<=Money10+1;endif;endif;if(Meter1K=3)thenMoney100<=1;Money10<=8;Money1<=0;Old_Money1<=0;if(Meter1K>2)thenMoney1<=Meter100;Old_Money1<=Money1;if(Old_Money1=9andMoney1=0)thenif(Money10=9)thenMoney10<=0;if(Money100=9)thenMoney100<=0;elseMoney100<=Money100+1;endif;elseMoney10<=Money10+1;endif;endif;endif;endif;endif;else--heiyeif(Meter1K<1)thenMoney100<=0;Money10<=8; Money1<=0;Old_Money1<=0;elseMoney1<=Meter100;Old_Money1<=Money1;if(Old_Money1=9andMoney1=0)thenif(Money10=9)thenMoney10<=0;if(Money100=9)thenMoney100<=0;elseMoney100<=Money100+1;endif;elseMoney10<=Money10+1;endif;endif;endif;if(Meter1K=3)thenMoney100<=2;Money10<=2;Money1<=0;Old_Money1<=0;if(Meter1K>2)thenMoney1<=Meter100;Old_Money1<=Money1;if(Old_Money1=9andMoney1=0)thenif(Money10=9)thenMoney10<=0;if(Money100=9)thenMoney100<=0;elseMoney100<=Money100+1;endif;elseMoney10<=Money10+1;endif;endif;endif;endif;endif;endif;endprocess;process(SEG_SEL)begincase(SEG_SEL+1)iswhen"000"=>Disp_Temp<=Meter1K;when"001"=>Disp_Temp<=Meter100;when"010"=>Disp_Temp<=Meter10;when"011"=>Disp_Temp<=Meter1;when"100"=>Disp_Temp<=10;when"101"=>Disp_Temp<=Money100;when"110"=>Disp_Temp<=Money10;when"111"=>Disp_Temp<=Money1;endcase;endprocess;process(Clk)beginif(Clk'eventandClk='1')thenSEG_SEL<=SEG_SEL+1;if(SEG_SEL=9)thenSEG_SEL<="000";elseDisplay<=Disp_Decode;endif;endif;endprocess;process(Disp_Temp)begincaseDisp_Tempiswhen0=>Disp_Decode<="0111111";when1=>Disp_Decode<="0000110";when2=>Disp_Decode<="1011011";when3=>Disp_Decode<="1001111";when4=>Disp_Decode<="1100110";when5=>Disp_Decode<="1101101";when6=>Disp_Decode<="1111101";when7=>Disp_Decode<="0000111";when8=>Disp_Decode<="1111111";when9=>Disp_Decode<="1101111";when10=>Disp_Decode<="1000000";whenothers=>Disp_Decode<="0000000";endcase;endprocess;endone; 2.3.2测速模块 测速模块输入端由Clk及Motor端组成,Clk提供计数脉冲,通过计Motor6秒转的圈数然后乘以10作为一分种出租车的车速,其输出端变由SEL[2..0]及lout7[6..0]组成,前者用于扫描数码管的驱动,后者用于显示转速。图2.4测速模块其仿真图如下所示:图2.5测速模块仿真图其程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityteltclisport(Clk:instd_logic; Motor:instd_logic; SEL:OUTSTD_LOGIC_VECTOR(2DOWNTO0); lout7:outstd_logic_vector(6downto0));endteltcl;architectureoneofteltclissignalclk1hz:std_logic;--1HZ时钟信号;signalcount:std_logic_vector(2downto0);signalclr1:std_logic;signalena1:std_logic;signalload1:std_logic;signalCQ1,CQ2,CQ3,CQ4:std_logic_vector(3downto0);SIGNALCQA:std_logic_vector(15DOWNTO0);SIGNALDOUT:STD_LOGIC_VECTOR(15DOWNTO0);signals:std_logic_vector(2downto0);signallout4:std_logic_vector(3downto0);SIGNALin3,in2,in1,in0:std_logic_vector(3downto0);beginprocess(clk)variablecnttemp:INTEGERRANGE0TO999999;beginIFclk='1'ANDclk'eventTHENIFcnttemp=999999THENcnttemp:=0;ELSEIFcnttemp<500000THENclk1hz<='1';ELSEclk1hz<='0';ENDIF;cnttemp:=cnttemp+1;ENDIF;endif;endprocess;process(Clk1hz)beginif(Clk1hz'eventandClk1hz='1')thencount<=count+1;ifcount<6thenena1<='1';load1<='0';clr1<='0';elsifcount=6thenload1<='1';ena1<='0';clr1<='0';elsifcount=7thenena1<='0';load1<='0';clr1<='1';endif;endif;endprocess;PROCESS(CLK,ENA1)ISBEGINIFCLR1='1'THENCQ1<="0000";elsif(Motor'eventandMotor='1')thenIFENA1='1'THENif(CQ1="1001")thenCQ1<="0000";if(CQ2=9)thenCQ2<="0000";if(CQ3="1001")thenCQ3<="0000";if(CQ4="1001")thenCQ4<="0000";elseCQ4<=CQ4+1;endif;elseCQ3<=CQ3+1;endif;elseCQ2<=CQ2+1;endif;elseCQ1<=CQ1+1;endif;endif;ENDIF;CQA<=(CQ4&CQ3&CQ2&CQ1);endprocess; PROCESS(LOAD1,CQA)ISBEGIN IFLOAD1'EVENTANDLOAD1='1'THENDOUT<=CQA;ENDIF;ENDPROCESS;process(clk)begin IN3<=DOUT(15DOWNTO12); IN2<=DOUT(11DOWNTO8); IN1<=DOUT(7DOWNTO4); IN0<=DOUT(3DOWNTO0);if(clk'eventandclk='1')then if(s="111")then s<="000"; elses<=s+1; endif;endif;sel<=s;endprocess;process(s)begin casesis when"000"=>lout4<="1111"; when"001"=>lout4<="1111"; when"010"=>lout4<=in2; when"011"=>lout4<=in1; when"100"=>lout4<=in0; when"101"=>lout4<="0000"; when"110"=>lout4<="1111"; when"111"=>lout4<="1111"; whenothers=>lout4<="XXXX"; endcase; caselout4is when"0000"=>lout7<="0111111"; when"0001"=>lout7<="0000110"; when"0010"=>lout7<="1011011"; when"0011"=>lout7<="1001111"; when"0100"=>lout7<="1100110"; when"0101"=>lout7<="1101101"; when"0110"=>lout7<="1111101"; when"0111"=>lout7<="0000111"; when"1000"=>lout7<="1111111"; when"1001"=>lout7<="1100111"; when"1010"=>lout7<="0111111"; when"1111"=>lout7<="1000000"; whenothers=>lout7<="XXXXXXX"; endcase;endprocess;endone; 2.3.3报警模块 报警模块输入端由Clk构成,其主要用途在于为蜂呜器提供不同频率,其输出端由spk端构成,其是一个蜂鸣器用于报警。图2.6蜂鸣器模块其仿真图如下:图2.7蜂鸣器模块仿真图其程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityteltclisport(Clk:instd_logic; spk:bufferstd_logic);endteltcl;architectureoneofteltclissignaltone:std_logic_vector(10downto0);signaltone_count:std_logic_vector(10downto0);signaltone_index:integerrange0to15;signalclk10_count:std_logic_vector(17downto0);signaltime:integerrange0to150;signalclk10:std_logic; beginprocess(clk)--generate10hzclocksignalbeginif(clk'eventandclk='1')thenclk10_count<=clk10_count+1;if(clk10_count=16#3fff#)thenclk10<=notclk10;endif;ENDIF;endprocess;process(clk10)beginif(clk10'eventandclk10='1')thenif(time=150)thentime<=0;elsetime<=time+1;endif;endif;endprocess;process(clk10)beginif(clk10'eventandclk10='1')thencasetimeiswhen0=>tone_index<=3;when1=>tone_index<=3;when2=>tone_index<=3;when3=>tone_index<=3;when4=>tone_index<=5;when5=>tone_index<=5;when6=>tone_index<=5;when7=>tone_index<=6;when8=>tone_index<=8;when9=>tone_index<=8;when10=>tone_index<=8;when11=>tone_index<=9;when12=>tone_index<=6;when13=>tone_index<=8;when14=>tone_index<=5;when15=>tone_index<=5;when16=>tone_index<=12;when17=>tone_index<=12;when18=>tone_index<=12;when19=>tone_index<=15;when20=>tone_index<=13;when21=>tone_index<=12;when22=>tone_index<=10;when23=>tone_index<=12;when24=>tone_index<=9;when25=>tone_index<=9;when26=>tone_index<=9;when27=>tone_index<=9;when28=>tone_index<=9;when29=>tone_index<=9;when30=>tone_index<=0;when31=>tone_index<=0;when32=>tone_index<=9;when33=>tone_index<=9;when34=>tone_index<=9;when35=>tone_index<=10;when36=>tone_index<=7;when37=>tone_index<=7;when38=>tone_index<=6;when39=>tone_index<=6;when40=>tone_index<=5;when41=>tone_index<=5;when42=>tone_index<=5;when43=>tone_index<=6;when44=>tone_index<=8;when45=>tone_index<=8;when46=>tone_index<=9;when47=>tone_index<=9;when48=>tone_index<=3;when49=>tone_index<=3;when50=>tone_index<=8;when51=>tone_index<=8;when52=>tone_index<=6;when53=>tone_index<=5;when54=>tone_index<=6;when55=>tone_index<=8;when56=>tone_index<=5;when57=>tone_index<=5;when58=>tone_index<=5;when59=>tone_index<=5;when60=>tone_index<=5;when61=>tone_index<=5;when62=>tone_index<=0;when63=>tone_index<=0;when64=>tone_index<=10;when65=>tone_index<=10;when66=>tone_index<=10;when67=>tone_index<=12;when68=>tone_index<=7;when69=>tone_index<=7;when70=>tone_index<=9;when71=>tone_index<=9;when72=>tone_index<=6;when73=>tone_index<=8;when74=>tone_index<=5;when75=>tone_index<=5;when76=>tone_index<=5;when77=>tone_index<=5;when78=>tone_index<=5;when79=>tone_index<=5;when80=>tone_index<=5;when81=>tone_index<=0;when82=>tone_index<=0;when83=>tone_index<=3;when84=>tone_index<=5;when85=>tone_index<=3;when86=>tone_index<=5;when87=>tone_index<=5;when88=>tone_index<=6;when89=>tone_index<=7;when90=>tone_index<=9;when91=>tone_index<=6;when92=>tone_index<=6;when93=>tone_index<=6;when94=>tone_index<=6;when95=>tone_index<=6;when96=>tone_index<=6;when97=>tone_index<=5;when98=>tone_index<=6;when99=>tone_index<=8;when100=>tone_index<=8;when101=>tone_index<=8;when102=>tone_index<=9;when103=>tone_index<=12;when104=>tone_index<=12;when105=>tone_index<=12;when106=>tone_index<=10;when107=>tone_index<=9;when108=>tone_index<=9;when109=>tone_index<=10;when110=>tone_index<=9;when111=>tone_index<=8;when112=>tone_index<=8;when113=>tone_index<=6;when114=>tone_index<=5;when115=>tone_index<=3;when116=>tone_index<=3;when117=>tone_index<=3;when118=>tone_index<=3;when119=>tone_index<=8;when120=>tone_index<=8;when121=>tone_index<=8;when122=>tone_index<=8;when123=>tone_index<=6;when124=>tone_index<=8;when125=>tone_index<=6;when126=>tone_index<=5;when127=>tone_index<=3;when128=>tone_index<=5;when129=>tone_index<=6;when130=>tone_index<=8;when131=>tone_index<=5;when132=>tone_index<=5;when133=>tone_index<=5;when134=>tone_index<=5;when135=>tone_index<=5;when136=>tone_index<=5;when137=>tone_index<=5;when138=>tone_index<=0;when139=>tone_index<=0;whenothers=>tone_index<=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论