本科学生单片机课程设计报告
题姓学院
目名
号(系)
基于单片机的频率计设计
201218033工程与设计学院应用电子技术教育2012级杨
进
宝
专业、年级指导教师
课程设计成绩评定表
项目
评分依据
电路板焊接工艺功能完整
设计作品
性能指标程序运行可靠
人机交互友好,操作方便内容完整
设计报告
写作规范
设计报告篇幅符合要求
满分[**************]0
得分
实评总分指导教师签名
引言
在设计单片机和数字电路时经常需要测量脉冲个数、脉冲宽度、脉冲周期、脉冲频率等参数,虽然使用逻辑分析仪可以很好地测量这些参数,但其价格昂贵。且实现测量的数字化、自动化、智能化已成为各类仪器仪表设计的方向,这里介绍一种用单片机控制的、全自动、数字显示的测量频率的方法。
频率计是我们在电子电路试验中经常会用到的测量仪器之一,它能将频率用数码管或液晶显示器直接显示出来,给测试带来很大的方便,使结果更加直接;且频率计还能对其它多种物理量进行测量,如机械振动的频率、声音的频率等,都可以先转变成电信号,然后用频率计来测量,研究频率计的设计与制作将会对我们的生活有很大意义。现代的频率计多是用数码管显示的,其结果不明确,表示也不直接,研究液晶显示的频率计对频率计的发展很有意义。
数字频率计是一种用十进制数字显示被测信号频率的数字测量仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器。它的基本功能是测量正弦信号、方波信号、尖脉冲信号及其他各种单位时间内变化的物理量。它被广泛应用于航天、电子、测控等领域。
数字式频率计是基于时间或频率的A/D转换原理,并依赖于数字电路技术发展起来的一种新型的数字测量仪器。由于数字电路的飞速发展,数字频率计的发展也很快。在电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高了系统的可靠性和速度。
纵观现在的数字频率计,其基本原理都是相同的,频率是单位时间(1S)内信号发生周期变化的次数。如果我们能在给定的1S时间内对信号波形计数,并将计数结果显示出来,就能读取被测信号的频率。数字频率计首先必须获得相对稳定与准确的时间,同时将被测信号转换成幅度与波形均能被数字电路识别的脉冲信号,然后通过计数器计算这一段时间间隔内的脉冲个数,将其换算后显示出来。这就是数字频率计的基本原理。但现在的频率计其显示部分都是通过LED数码管显示的,显示内容是BCD码,不直观,若用LCD液晶来显示,会使输出结果更直接,便于观察。正因为如此,所以未来数字频率计的发展必定会向用液晶显示的方向发展。
1绪论
1.1研究背景
在电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高了系统的可靠性和速度。集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路两大类。数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域。测量频率是电子测量技术中最常见的测量之一,不少物理量的测量,如时间、速度等都涉及到或本身可转化为频率的测量。数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波、方波或其它周期性变化的信号,如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器。1.2发展现状
数字频率计发展到现在,有基于CPLD的数字频率计的设计,基于VHDL语言的数字频率计的
设计,还有基于单片机的简易数字频率计等。CPLD是一种新兴的高密度大规模可编程逻辑器件,它具有门阵列的高密度和PLD器件的灵活性和易用性,目前已成为一类主要的可编程器件;可编程器件的最大特点是可通过软件编程对其器件的结构和工作方式进行重构,能随时进行设计调整而满足产品升级,使得硬件的设计可以如软件设计一样方便快捷,从而改变了传统数字系统及用单片机构成的数字系统的设计方法、设计过程及设计概念,使电子设计的技术操作和系统构成在整体上发生了质的飞跃。VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(TheInstituteofElectricalandElectronicsEngineers)的一种工业标准硬件描述语言;相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(ToptoDown)和基于库(LibraryBased)的设计的特点。单片机技术在短短的20余年间已发展成为计算机技术中一个非常有活力的分支,它有自己的技术特征、规范、发展道路和应用环境。
1.3单片机的发展
目前计算机硬件技术向巨型化、微型化和单片化三个方向发展。自1975年美国德克萨斯仪器公司第一块单片机芯片TMS-1000问世以来,在短短的30余年间,单片机技术已发展成为计算机技术中一个非常有活力的分支,它有自己的技术特征、规范、发展道路和应用环境。按单片机的生产技术和应用对象,单片机先后经历了4位机、8位机、16位机、32位机几个有代表性的发展阶段。
单片机与通用微机相比较,在结构、指令设置上均有其独特之处,其主要特点有:
1)单片机的存储器ROM和RAM是严格区分的,ROM称为程序存储器,只存放固定常数及数据。
RAM则为数据存储器,用于工作区及存放用户数据。2)采用面向控制的指令系统。
3)单片机的输入/输出引脚通常是多功能的。4)单片机的外部扩展能力强。
从80年代单片机被引入我国,单片机已广泛地应用于电子设计中。单片机的应用迅速发展,其性价比高,大量的外围接口电路,使基于单片机的电子系统设计方便,周期缩短,而且不断发展。新型单片机支持高级语言,进一步延伸了其发展空间。
2方案论证与选择
2.1方案一基于VHDL语言的频率计的设计
设计的基于VHDL语言频率计的系统原理框图系统原理框图如图2.1所示。
启停信号
小数
开关控制
量程选择
锁存器
1K输出使能
锁存信号
计数器
闸门信号点
译码显示电路
标准信号发生器
时钟
使能
分频器
100Hz或10Hz
闸门信号
计数控制器
待测信号
图2.1设计的基于VHDL语言频率计的系统原理框图
各模块说明如下:
(1)标准信号发生器,开关控制电路。标准信号发生器产生1kHz基准信号。开关控制电路对键盘输入的启停信号进行处理
(2)分频器
当收到使能信号,分频器启动,将标准1kHz信号经3次10分频,得到100Hz,10Hz,1Hz信号。1kHz,100Hz,10Hz信号作为计数器闸门信号来控制计数,以实现不同量程。
(3)计数控制器
计数控制模块将输入的分频信号处理,产生计数闸门信号、计数清零信号和锁存信号。(4)计数器
采用3个十进制计数器级联作为计数模块。闸门信号与待测信号相与作为计数输入。计数结果直接输出给锁存器。
(5)锁存器
每当锁存使能信号来临,锁存器便将锁存结果读入、锁存。锁存器还完成量程选择功能。锁存器还根据当前量程,选择合适的小数点位置输出。
(6)译码显示电路
由于小数点由锁存器输出,故在此仅考虑数码管的7段驱动,7段译码器将计数值译成相应的7段数码驱动值。
2.2方案二基于单片机的频率计的设计
设计的基于单片机频率计的原理框图如图2.2所示。
液
复位电路
AT89C51
晶显示模块1602
被测信号单片机
时钟电路
图2.2设计的基于单片机频率计的原理框图
复位电路采用上电复位方式,每次单片机上电工作时使单片机处于复位状态,即初始状态,为测量频率作好准备。
时钟电路中片内高增益反相放大器通过XTAL1、XTAL2外接作为反馈元件的晶振(呈感性)与电容组成的并联谐振回路构成一个自激振荡器向内部时钟电路提供振荡时钟,由此向单片机提供振荡脉冲。
AT89C51单片机内部具有2个16位的定时器/计数器,并可以在定时或计数溢出时产生中断。将被测信号通过P3.5口送入单片机,将T0设置为定时方式,每50ms产生一次中断,产生20次中断所用时间正好为1S,将T1设置为计数方式,T1的初值设置为0,计65535个脉冲后产生一次溢出中断,在T1中断溢出时对溢出次数进行计数(计数值为N)。1S内T1计的总的脉冲数为65535×N+TH1×256+TL1,这个数值就是被测信号的频率值。
单片机计的脉冲数值经过转换送到液晶显示模块1602,从而显示被测信号的频率,测量结果用十进制表示,很直接。
2.3方案的选择
基于VHDL语言的频率计设计的优点:VHDL语言,对设计的描述具有相对独立性,设计者可以不懂硬件结构,降低了硬件电路设计难度。利用EDA工具maxplusII对源程序进行编译、选配、优化、逻辑综合,自动地把VHDL描述转变成门级电路,进而完成电路分析、纠错、验证、自动布局布线、仿真等各种测试工作。最后通过编程电缆下载数据流,将所设计内容下载到所选中的FPGA器件中,即完成设计工作。这种设计方法减少了电路设计的时间和可能发生的错误,降低了开发成本。
基于VHDL语言的频率计设计的缺点:FPGA大部分是基于SRAM编程,编程数据信息在系统断电时会丢失,每次上电时需从器件的外部存储器或计算机中将编程数据写入,布线结构和逻辑实现复杂,其编程信息需存放在外部存储器上,需外部存储器芯片,且使用方法复杂,保密性差。
基于单片机的频率计的设计的优点:单片机在控制领域中有很多优点,如体积小、成本低、运用灵活、抗干扰能力强,可以方便地实现多机和分布式控制。并且利用单片机设计的频率计原理框图简单,所用元器件少,电路不易出错,其程序存放在内部存储器上,不需要外部存储器芯片,使用方法简单。且单片机便宜、稳定、开发简单、通用性好。
基于单片机的频率计的设计的缺点:所测信号的频率范围窄,若要扩大频率范围需外加分频器。综合比较上述两种方案,选择用单片机来设计频率计,显示部分用液晶显示模块,以使测量结果更加直接、明确。
3基于单片机的液晶显示频率计的设计
3.1系统硬件电路的设计3.1.1单片机的管脚
AT89C51单片机的管脚排部如图3.1
所示。
图3.1AT89C51单片机的管脚排布
主电源引脚
VCC(40脚):接+5V电源正端。VSS(20脚):接+5V电源地端。外接晶体引脚
XTAL1(19脚):接外部石英晶体的一端。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。
XTAL2(18脚):接外部石英晶体的另一端。在单片机内部,它是片内振荡器的反相放大器的输出端。
输入/输出引脚
P0口(39~32脚):P0.0~P0.7统称为P0口,在不接片外存储器与不扩展I/O口时,可作为准双向输入/输出口。
P1口(1~8脚):P1.0~P1.7统称为P1口,可作为准双向输入/输出口使用。
P2口(21~28脚):P2.0~P2.7统称为P2口,一般可作为准双向输入/输出口使用;在接有片外存储器或扩展I/O口且寻址范围超过256字节时,P2口用作高8位地址总线。
P3口(10~17脚):P3.0~P3.7统称为P3口,除作为准双向输入/输出口使用,还可以将每一位用于第二功能。
控制线
ALE/PROG(30脚):地址锁存有效信号输出端。
:片外程序存储器读选通信号输出端,低电平有效。(29脚)
RST/VPD(9脚):RST即为RESET,VPD为备用电源。该引脚为单片机的上电复位或掉电保护端。:EA为片外存储器选用端。该引脚有效(低电平)时,只选用片外程序存储器,EA/VPP(31脚)
否则单片机上电或复位后选用片内程序存储器。3.1.2单片机的外围电路
1)时钟电路
单片机的定时控制功能是用片内的时钟电路和定时电路来完成的,而片内的时钟产生有两种方式:内部时钟方式和外部时钟方式,实际中常应用内部时钟方式。设计的内部时钟方式图如图3.2所示。
XTAL1
30PF
C1
单
片
30PF
机
C2
XTAL2
图3.2设计的内部时钟方式图
电容在22PF~33PF之间选择,起微调作用,在此采用30PF。晶振可采用6MHz或12MHz,但是若用6MHz的晶振,所测频率范围太窄,最高只能测到250KHz,用12MHz的晶振,最高频率可测到500KHz,故在此选用12MHz的晶振。
2)复位电路
单片机的复位电路可采用上电复位或按扭复位,实际中常应用上电复位的方式,设计的上电复位方式图如图3.3所示。
10μF
RST
10K
单片机
图3.3上电复位方式图
3.1.3液晶显示模块1602
液晶显示器(LCD)具有显示信息丰富、功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。LCD型显示器的构成原理很简单,在两片透明绝缘的有机薄膜或者玻璃之间均匀充填着液晶流体,底层透明薄膜上镀有一层导电体,而顶层透明薄膜上则按需要的形状敷有透明的导电电极,当电极通电后,就与下层导电体之间(约10μm)形成一个电场,由于这个电场的作用,其间的液晶体的透光状况就发生了变化,从而对外来光线产生了吸收作用,使人们看见了与电极形状相同的字形显示。
1602采用标准的16脚接口,从该模块的正面看,引脚排列从左向右为:1-16脚,1602的管脚排部如图3.4所示。
1
2
34
5
6
7
8
[**************]
图3.41602的管脚排部
其中:
第1脚:VSS为地电源。第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15~16脚:空脚。
3.1.4硬件电路原理图
设计的系统硬件电路原理图如图3.5所示。
图3.5系统硬件电路原理图
硬件电路图中,单片机的EA管脚必须接高电平,因为接低电平时只选用片外程序存储器,而试验所用的是片内程序存储器。液晶显示器1602的VL管脚必须接一个电位器来调节,因为VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,对比度过弱时,看不到屏幕上显示的数据。
硬件电路中所选用的元器件的规格/型号见附录B。
3.2系统软件的设计
3.2.1定时器/计数器工作方式的设置
定时器/计数器T0、T1都有四种工作方式,可通过程序对TMOD设置选择。TMOD的低四位用于定时器/计数器0,高四位用于定时器/计数器1。TMOD的位定义如图1.1所示。
D7
D6
D5
D4
D3
D2
D1
D0
图3.6TMOD的位定义
C/T:定时或计数功能选择位,当C/T=1时为计数方式;当C/T=0时为定时方式。M1、M0:定时器/计数器工作方式选择位。
GATE:门控位,用于控制定时器/计数器的启动是否受外部中断请求信号的影响。一般情况下GATE=0。
当M1M0=00时,定时器/计数器设定为工作方式0,构成13位定时器/计数器。计数值由下式确定:N=8192-X,式中N为计数值,X是THX、TLX的初值。计数范围为1~8192。
定时时间由下式确定:T=N×Tcy=(8192-X)Tcy,式中Tcy为单片机的机器周期。如果振荡频率为12MHZ,则Tcy=1us,定时范围为1~8192us。
当M1M0=01时,定时器/计数器设定为工作方式1,构成16位定时器/计数器。在方式1时,计数器的计数值由下式确定:N=65536-X,计数范围为1~65536。
定时器的定时时间由下式确定:T=N×Tcy=(65536-X)Tcy,如果振荡频率为12MHZ,则Tcy=1us,定时范围为1~65536us。
当M1M0=10时,定时器/计数器设定为工作方式2。方式2是自动重装初值的8位定时器/计数器。在方式2时,计数器的计数值由下式确定:N=256-X,计数范围为1~256。
定时器的定时时间由下式确定:T=N×Tcy=(256-X)Tcy,如果振荡频率为12MHZ,则Tcy=1us,定时范围为1~256us.
当M1M0=11时,定时器/计数器设定为工作方式3。方式3只适用于定时器/计数器T0。当T0工作在方式3时,TH0和TL0被分成两个独立的8位计数器。方式3下定时器/计数器的定时、计数的范围和定时、计数值的确定同方式2。
在试验中需将T0设置为定时方式,将T1设置为计数方式;定时器T0定时50ms,即50000us,需选用工作方式1,即M1M0=01,因此,在编制程序时,将TMOD的高四位设为0101,低四位设为0001。
3.2.2定时器/计数器开启/关闭的设置
定时器/计数器的开启和关闭可通过控制寄存器TCON来设置,TCON的位定义如图3.7所示。
D7
D6
D5
D4
D3
D2
D1
D0
TF1TR1TF0TR0IE1IT1IE0IT0
图3.7TCON的位定义
TF0(TF1):T0(T1)定时器/计数器溢出中断标志位。当T0(T1)计数溢出时,由硬件置位,并在允许中断的情况下,向CPU发出中断请求信号,CPU响应中断转向中断服务程序时,由硬件自动将该位清零。
TR0(TR1):T0(T1)运行控制位。当TR0(TR1)=1时启动T0(T1);TR0(TR1)=0时关闭T0(T1)。该位由软件进行设置。
TCON的低四位与外部中断有关。
编写程序时,若需启动T0(T1),通过指令SETB
TR0或SETB
TR1将TR0(TR1)设为1,需关
闭T0(T1),通过指令CLRTR0或CLRTR1将TR0(TR1)设为0。3.2.3中断的设置
所谓中断是指CPU对系统中或系统外发生的某个事件的一种响应过程,即CPU暂时停止现行程序的执行,而自动转去执行预先安排好的处理该事件的服务子程序。当处理结束后,再返回到被暂停程序的断点处,继续执行原来的程序。实现这种中断功能的硬件系统和软件系统统称为中断系统。
试验中涉及到的T0或T1的中断,中断的控制可通过中断允许寄存器IE来设置。IE的位定义如图3.8所示。
D7EA
D6
D5ET2
D4ES
D3ETI
D2EX1
D1ET0
D0EX0
—
图3.8IE的位定义
EA:中断允许总控位。EA=0,屏蔽所有的中断请求;EA=1,开放中断。EA的作用是使中断允许形成两级控制。即各中断源首先受EA位的控制;其次还要受各中断源自己的中断允许总控位控制。
ET2:定时器/计数器T2的溢出中断允许位,只用于52子系列。
ES:串行口中断允许位。ES=0,禁止串行口中断;ES=1允许串行口中断。
ET1:定时器/计数器T1的溢出中断允许位。ET1=0,禁止T1中断;ET1=1,允许T1中断。EX1:外部中断1的中断允许位。EX1=0,禁止外部中断1中断;EX1=1,允许外部中断1中断。
ET0:定时器/计数器T0的溢出中断允许位。ET0=0,禁止T0中断;ET0=1,允许T0中断。EX0:外部中断0的中断允许位。EX0=0,禁止外部中断0中断;ET0=1,允许外部中断0中断。试验中需开中断允许总控位,需允许定时器T0和T1中断,因此在编程时使EA=1,使ET0=1且ET1=1。
中断源有多种,每个中断源的优先级可通过中断优先级寄存器IP进行设置并管理。IP的位定义如图3.9所示。
D7
D6
D5
D4
D3
D2
D1
D0
—PT2PSPT1PX1PT0PX0
图3.9IP的位定义
PT2:定时器/计数器T2的中断优先级控制位。PS:串行口的中断优先级控制位。
PT1:定时器/计数器T1的中断优先级控制位。PX1:外部中断INT1的中断优先级控制位。PT0:定时器/计数器T0的中断优先级控制位PX0:外部中断INT0的中断优先级控制位。
试验中为提高测量结果的准确度,需要将T1的中断设置为优先,通过指令SETB3.2.4液晶显示模块1602内部的控制指令
1602液晶模块内部的控制器共有11条指令,控制指令表如表3.1所示:
表3.1控制指令表
PT1来实现。
指令RS[1**********]
R/W[1**********]
E[1**********]
D700000001BF
D60000001
D5000001
D400001DL
D30001S/CN
D2001DR/LF
D101I/DC**
D01*SB**
清显示光标返回置输入模式显示开/关控制光标或字符移位置功能
置字符发生存储器地址置数据存储器地址读忙标志或地址
写数到CGRAM或DDRAM从CGRAM或DDRAM读数
字符发生存储器地址(AGG)
显示数据存储器地址(ADD)计数器地址(AC)
要写的数读出的数据
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL:高电平时为8位总线,低电平时为4位总线)。
指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。
指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。指令11:读数据。
在对液晶显示模块1602写入指令或写入数据前,需要进行初始化,如清屏幕,光标返回到00H位置,开显示,将液晶模块设置为双行显示等。编程时,要根据表3.1来编制程序,通过对RS、RW、D0-D7设置不同的高低电平来实现不同的功能。3.3系统软件设计中的主要流程图
设计的主程序和T0中断服务子程序的流程图如图3.10所示。设计的数据处理子程序和T1中断子程序的流程图如图3.11所示。
T0中断服务子程序
主程序
开始
中断
设置SP指针地址
关闭T0定时器
89C51的初始化
重新赋初值
LCD的初始化
TIMCOUNT加1
设置T0、T1的工作方式
P1.4取反产生自测信号
开启T0、T1
TIMCOUNT=20?
延时120MS
关闭T1计数器
三字节二进制整数转换成四字节BCD码
TIMCOUNT清零
将数值存入存储单元
ASCⅡ码的转换及结果显示在1602上
T1存储空间清零
2AH单元清零
开启T1、T0定时器/计数器
中断返回
图3.10设计的主程序和T0
数据处理子程序T1中断服务子程序
开始开始
清出口单元2AH单元地址加1
三字节二进制数据带进位依次左移一位
中断返回
十进制调整
保存出口单元调整后的数据
原数据左移24次?
N
Y
子程序返回
图3.11设计的数据处理子程序和T1中断服务子程序的流程图
3.4系统软件设计中的主要子程序3.4.1T1计数器中断服务子程序
根据图3.11中的T1中断服务子程序流程图设计的T1计数器中断服务子程序如下。TIMER1:
INCRETI
3.4.2T0定时器中断服务子程序
根据图3.10中的T0中断服务子程序流程图设计的T0定时器中断服务子程序如下。TIMER_INT:CLRMOVMOVINCMOVCPLCJNECLRMOVMOVMOVMOVMOVMOVMOVSETBSETBRETI
TR0TL0,TH0,
TIMER_LTIMER_H2AH
TIMCOUNTA,P1.4A,TR1
TIMCOUNT,#00H;INT_L,INT_H,INT_G,TH1,TL1,2AH,TR1TR0
TL1TH12AH#00H#00H#00H#20H,T_ENDTIMCOUNT
3.4.3数据处理子程序
根据图3.11中的数据处理子程序流程图设计的数据处理子程序如下。SBIN_SBCD:
CLRAMOVT_G,AMOVT_H,AMOVT_M,AMOVT_S,AMOVR5,INT_GMOVR7,INT_LMOVR6,INT_HMOVR2,#24
CLR
C
SBIN_SBCD1:
MOVA,R7
RLCAMOVR7,AMOVA,R6
RLCAMOVR6,AMOVA,R5
RLCAMOVR5,AMOVA,T_SADDCA,T_S
DAAMOVT_S,AMOVA,T_MADDCA,T_M
DAAMOVT_M,AMOVA,T_HADDCA,
T_H
DA
A
MOV
MOV
ADDDC
DA
MOV
MOV
DA
MOV
DJNZ
POP
RETT_H,A,A,AT_G,A,AT_G,R2,PSWAAT_HT_HT_GASBIN_SBCD1
总的源程序见附录A
3.5程序的编译、仿真
3.5.1在Keil环境下的程序编写
1)建立一个新工程
单击Project菜单,在弹出的下拉菜单中选中NewProject选项,然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51如下图所示,然后点击保存.保存新工程的界面图如图3.12所示。
图3.12保存新工程的界面图
完成上述步骤后会出现一对话框,选择需要的单片机型号,然后点击确定。
2)建立一个新的文件
单击“File”菜单,再在下拉菜单中单击“New”选项,此时光标在编辑窗口里闪烁,这时可以键入应用程序了,但应首先保存空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名为(.asm),然后单击“保存”按扭。回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上击右键,添加文件的界面图如图3.13所示。
图3.13添加文件的界面图
然后单击“AddFiletoGroup‘SourceGroup1’”,选中要添加的文件,然后单击“Add”
3)输入源程序,进行编译、仿真
输入源程序后,单击“project”按钮下的“Build
3.14所示。project,translate”按钮,程序无错误时界面图如图
图3.14程序无错误时的界面图
4)单击“Project”菜单,再在下拉菜单中单击"options
频率的界面图如图3.15所示。
fortarget'target1',出现选择晶振
图3.15选择晶振频率的界面图
把晶振频率改为12.0,且选中“Use
HEX文件的界面图如图3.16所示:On-chipROM”,然后单击“output"选项,出现可选择生成
图3.16选择生成HEX文件的界面图
单击图3.7中的“CreateHEXFile”选项,使程序编译后产生HEX代码。
3.5.2在PROTEUS环境下的仿真结果
当输入信号频率为1Hz
时的显示结果
当输入信号频率为500KHz时的显示结果
3.6电路的调试
把程序烧录到单片机后,在面包板上按原理图连接好,却没有出现想要的功能,按顺序检查:
1)电路图的连接,经检查发现单片机的31管脚没有接高电平,这在软件实现时也没有接,被默认为是高电平,但在硬件中,若不接高电平,该管脚为片外程序存储器选用端,就无法读取单片机内的程序,所以未能实现所需功能。
2)31管脚接上高电平时,液晶显示器1602仍未能显示所测频率,推测可能是电位器的调节问题,在适当的调节接入电阻值后,1602显示了所测的频率。
3)把1602所显示的频率与实际的频率相比较,发现误差较大,经思考发现在编写程序时对定时器的定时50ms有误差,没有考虑到定时器与计数器的关闭不是同时的,而有一定的时间差,这个时间差是因执行每一条指令时引起的。然后在程序中把定时时间适当的缩小到49.985ms,发现误差会变小,能达到要求。
检查无误后,接通电源,LCD能显示频率,显示范围是1~500KHz,用信号发生器检测,误差不超过2Hz。组装的频率计实物图如图3.17
所示。
图3.17组装的频率计实物图
基于AT89C51单片机的液晶显示频率计包括单片机控制模块和液晶显示模块,调试后的频率计可测量方波、正弦波、脉冲信号等波形,测量最高频率为500KHz,误差为2Hz。本设计的创新点是:显示部分采用液晶显示模块1602,显示结果直接且能显示多行多位,功耗小,使用寿命长。本设计的不足之处是:测量频率范围窄,需要进一步扩展。
从选择课题到课程设计的顺利结束,老师和同学给予了我热心的帮助,在这里请接受我诚挚的谢意。
首先,要特别感谢我的指导教师聂翔副主任,从查找资料到设计结束,聂老师都给予了我悉心的指导和帮助。在设计与调试过程中,聂老师渊博的理论知识和丰富的实际经验给了我许多启发式的指点,还有他严谨的治学态度和认真的工作精神,也使我受益匪浅。
其次,还要感谢我们这个小组的其他两位同学,他们在资料的查阅、整理和设计的过程中给予了我极大的帮助,正因为有了他们的参与,我们这个团队才能顺利地完成课程设计的各项任务。除此之外,还要感谢班上其他帮助过我的同学,感谢他们在整个过程中给予我们的鼓励与帮助。
最后,要感谢电信工程系电子教研室的老师,他们为我们的课程设计提供了良好的实验环境,全天时的实验室开放方便了大家的硬件和软件调试。电信系和实验室的指导老师对我们进行的不厌其烦的辅导修改以及必要的批评指正,对设计的成功给予了很大的帮助。
再次衷心的感谢每一位指导并帮助过我的老师和同学。
参考文献
[1]贵国庆.1602液晶显示频率计[J].电子制作,2006,149(8):26-27.
[2]陆容.液晶显示器(LCD)显示驱动原理及其应用[J].电子制作,2005,134(5):58-59.
[3]李建忠.单片机原理及应用[M].西安电子科技大学出版社,2002,3-40.
[5]何立民.MCS-51系列单片机应用系统设计[M].北京航空航天大学出版社,1995,30-34.
[6]吴海州,王文理.基于VHDL语言的数字频率计设计[J].现代电子技术,2002,138(7):19-21.
[7]SongPan,GuodongWang.VHDLApplicationCourse[M].Chengdu:UniversityofElectronicScienceandTechnologyPress,2000,15-20.
[8]WanjieSong,PingLuo,ShunjunWu.CPLDTechnologyandApplication[M].Xipan:XipanUniversityofElectronicScienceandTechnologyPress,2000,27-30.
附录A
源程序:
BEEPBITP3.7
LCD_RS
LCD_RW
LCD_EN
LCD_X
TIMER_H
TIMER_L
TIMCOUNT
INT_G
INT_H
INT_L
T_S
T_M
T_H
T_GBITP2.0BITP2.1BITP2.2EQU3FHEQUEQUEQUEQUEQUEQUEQUEQUEQUEQU30H31H32H35H34H33H36H37H38H39H;LCD地址变量;定时器高位字节单元;定时器低位字节单元;时间中断数;中断计数缓冲单元高地址;中断计数缓冲单元中地址;中断计数缓冲单元低地址;数据显示低位;数据显示中位;数据显示高位;数据显示最高位
;----------------------------------------------------------
ORG0000H
JMPMAIN
ORG000BH
JMPTIMER_INT
ORG
JMP
ORG001BHTIMER10030H;定时器T0中断服务程序;定时器T1中断服务程序;主程序开始
;----------------------------------------------------------MAIN:
MOVSP,#60H
LCALLPRO_SET
CALLSET_LCD;设置SP指针;初始化
LCALLTIM_T0
;-----------------------------------------------------------;LCD1602是慢速显示器件,故100MS显示一次。
;-----------------------------------------------------------
MAIN1:
MOVR5,40
MAIN2:
ACALL
DJNZ
ACALL
CALLDELAY1R5,MAIN2SBIN_SBCDCONV;3ms
JMPMAIN1
;------------------------------------------------------------
;T1计数器中断服务子程序
;计T1计数器溢出次数
;------------------------------------------------------------
TIMER1:
INC2AH
RETI
;------------------------------------------------------------
;初始化程序
;------------------------------------------------------------
PRO_SET:MOVA,#00H
MOVB,#00H
MOV2AH,A
MOVP0,#0FFH
MOVP1,#0FFH
MOVP2,#0FFH
MOVINT_H,#00H
MOVINT_L,#00H
MOV
MOV
MOV
MOV
MOVINT_G,#00HT_S,#00HT_H,#00HT_M,#00HT_G,#00H
MOVTIMCOUNT,#00H
MOVTIMER_H,#3CH;理论上定时50MS(3CB0H),实际定时49.985MS(3CBFH)较合适MOVTIMER_L,#0BFH;
CLRBEEPSETBRET
P3.5
;P3.5端口置输入状态;T1(TIMER1的外部输入脚)
;-----------------------------------------------------;LCD初始化设置
;-----------------------------------------------------SET_LCD:
CLRCALLCALLMOVMOVCALLMOVMOVCALLRET
;-----------------------------------------------------INFO1:INFO2:
DBDB
"072cairuigang",0"Freq:
HZ",0
;LCD第一行显示信息;LCD第二行显示信息
LCD_ENINIT_LCDDELAY1DPTR,#INFO1A,#1LCD_SHOWDPTR,#INFO2A,#2LCD_SHOW
;指针指到显示信息2;显示在第二行;指针指到显示信息1;显示在第一行;初始化LCD
;-----------------------------------------------------;LCD接口初始化;8位I/O控制
;-----------------------------------------------------INIT_LCD:
MOVCALLCALLMOVCALLCALLMOVCALLCALLMOV
A,#38HWCOMDELAY1A,#38HWCOMDELAY1A,#38HWCOMDELAY1A,#0CH
;开显示,关光标,
31
;双列显示,字形5*7点阵
;双列显示,字形5*7点阵
;双列显示,字形5*7点阵
CALLMOVCALLCALLRET
DELAY1A,#01HWCOMDELAY1
;清除LCD显示屏
;----------------------------------------------------LCD_SHOW:
;在LCD的第一行或第二行显示信息字符
CJNE
LINE1:
MOVCALLCALLMOVCALLJMP
LINE2:
MOVCALLCALLMOVCALL
FILL:
CLRMOVCCJNERET
LC1:
CALLINCJMPRET
A
A,#1,LINE2A,#80HWCOMCLR_LINEA,#80HWCOMFILLA,#0C0HWCOMCLR_LINEA,#0C0HWCOM
;判断是否为第一行;设置LCD的第一行地址;写入命令
;清除该行字符数据;设置LCD的第一行地址;写入命令
;设置LCD的第二行地址;写入命令
;清除该行字符数据;设置LCD的第二行地址
;填入字符
A,@A+DPTRA,#0,LC1
;由消息区取出字符;判断是否为结束码
WDATADPTRFILL
;写入数据;指针加1;继续填入字符
;---------------------------------------------------CLR_LINE:
MOV
CL1:
MOVCALLDJNZ
R0,#24A,#''WDATAR0,CL1
32
;清除该行LCD的字符
;-----------------------------------------------------;写指令、数据使能子程序
;-----------------------------------------------------ENABLE:
CLRLCD_RSCLRLCD_RWSETBLCD_ENCALL
DELAY0
;写指令使能
;RS=L,LCD_RW=L,D0-D7=指令码,E=高脉冲
CLRLCD_ENRET
ENABLE1:
SETBCLRSETBCALLCLRRET
DELAY0:
MOVDJNZRET
;----------------------------------------------------;写入命令子程序
;----------------------------------------------------WCOM:
MOVCALLRET
;----------------------------------------------------;写入数据子程序
;----------------------------------------------------WDATA:
MOVCALLRET
33
;写数据使能
LCD_RSLCD_RWLCD_ENDELAY0LCD_EN
;RS=H,RW=L,D0-D7=数据,E=高脉冲
R7,#250R7,$
;延时500微秒
;以8位控制方式将命令写至LCD
P0,AENABLE
;写入命令
;以8位控制方式将数据写至LCD
P0,AENABLE1
;写入数据
;---------------------------------------------------;在LCD第二行显示字符;A=ASCDATA,B=LINEXPOS
;---------------------------------------------------LCDP2:
PUSHMOVADDCALLPOPCALLRET
;-------------------------------------------------------;ASCII转换并在第二行显示数字子程序
;-------------------------------------------------------CONV:
;MOVMOV
A,T_GLCD_X,#6
;设置位置
ACCA,BA,#0C0HWCOMACCWDATA
;在LCD的第二行显示字符;
;设置显示地址
;设置LCD的第二行地址;写入命令;由堆栈取出A;写入数据
;CALLSHOW_DIG2MOV;INCCALLMOVINCCALLMOVINCCALLRET
;----------------------------------------------------SHOW_DIG2:
MOVDIVADDPUSHMOV
B,#16ABA,#30HBB,LCD_X
34
A,T_HLCD_XSHOW_DIG2A,T_MLCD_XSHOW_DIG2A,T_SLCD_XSHOW_DIG2
;加载小时数据;显示数据;加载分钟数据;设置位置;显示数据;加载秒数数据;设置位置;显示数据
CALLPOPMOVADDINCMOVCALLRET
B
LCDP2
A,BA,#30HLCD_XB,LCD_XLCDP2
;-----------------------------------------------------DELAY1:
MOV
D2:
MOVDJNZDJNZRET
;-----------------定时器设置
------------------------R6,#15R7,#100R7,$R6,D2
;延时3MS
;设置定时器0工作在定时方式1,定时器1工作在计数方式1;---------------------------------------------------------TIM_T0:
MOVTMOD,#51HMOVTH0,TIMER_HMOVTL0,TIMER_LMOVMOVMOVSETBSETBSETBRET
;--------------------------------------------------------;定时器0中断服务程序
;--------------------------------------------------------TIMER_INT:
CLRTR0
MOVTL0,TIMER_LMOVTH0,TIMER_H
;关闭定时器;重新赋初值
;
35
;设置定时初值高位;设置定时初值低位;清T1计数器
TH1,#00HTL1,#00HIE,#8AHPT1TR1TR0
;开中断总允许,允许T0溢出中断
;定时器开始工作
INCTIMCOUNTMOVA,TIMCOUNTCPL
P1.4
;定时1S,时间单位;查看数量值;产生自测信号;如果没有到1S返回;关闭计数器T1;到1S则清零;取出计数值低位;取出计数值高位;取出溢出计数值位
CJNEA,#20,T_ENDCLR
TR1
MOVTIMCOUNT,#00HMOVINT_L,TL1MOVINT_H,TH1MOVINT_G,2AHMOVMOVMOVSETB
T_END:
TH1,#00HTL1,#00H2AH,#00HTR1
SETBTR0RETI
;重新开始定时操作
;---------------------------------------------------------------;三字节二进制整数转换成四字节BCD码子程序
;二进制数从低位到高位分别存放在INT_L、INT_H、INT_G单元中;BCD码从低位到高位分别存放在T_S、T_M、T_H、T_G单元中
;---------------------------------------------------------------SBIN_SBCD:
PUSHPSWSETBPSW.3CLRPSW.4CLRAMOVT_G,AMOVT_H,AMOVT_M,AMOVT_S,AMOVMOVMOVMOVCLR
HH1:
36
;设置当前寄存器
;清累加器
;清除出口单元,准备转换
R5,INT_GR7,INT_LR6,INT_HR2,#24C
;设置二进制数起始地址
MOVA,R7RLCAMOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R5RLCAMOV
R5,A
MOVA,T_SADDCA,T_SDAAMOVT_S,AMOVA,T_MADDCA,T_MDAAMOVT_M,AMOVA,T_HADDCA,T_HDA
A
MOVT_H,AMOVA,T_GADDCA,T_GDA
A
MOVT_G,ADJNZR2,HH1POPPSW
RETEND
37
;得到低位数据;累加;十进制调整;保存数据;得到第二位数据;累加;十进制调整;保存结果;得到第三位;累加
;保存;得到第四位;累加
;
附录B
元器件清单:
元器件名称单片机瓷片电容电解电容晶振金属膜电阻电位器液晶显示屏
规格/型号AT89S5130PF/63V10μF/25V12MHz10K/10K/1602
数量1pc2pc1pc1pc1pc1pc1pc
1W41W2
38
本科学生单片机课程设计报告
题姓学院
目名
号(系)
基于单片机的频率计设计
201218033工程与设计学院应用电子技术教育2012级杨
进
宝
专业、年级指导教师
课程设计成绩评定表
项目
评分依据
电路板焊接工艺功能完整
设计作品
性能指标程序运行可靠
人机交互友好,操作方便内容完整
设计报告
写作规范
设计报告篇幅符合要求
满分[**************]0
得分
实评总分指导教师签名
引言
在设计单片机和数字电路时经常需要测量脉冲个数、脉冲宽度、脉冲周期、脉冲频率等参数,虽然使用逻辑分析仪可以很好地测量这些参数,但其价格昂贵。且实现测量的数字化、自动化、智能化已成为各类仪器仪表设计的方向,这里介绍一种用单片机控制的、全自动、数字显示的测量频率的方法。
频率计是我们在电子电路试验中经常会用到的测量仪器之一,它能将频率用数码管或液晶显示器直接显示出来,给测试带来很大的方便,使结果更加直接;且频率计还能对其它多种物理量进行测量,如机械振动的频率、声音的频率等,都可以先转变成电信号,然后用频率计来测量,研究频率计的设计与制作将会对我们的生活有很大意义。现代的频率计多是用数码管显示的,其结果不明确,表示也不直接,研究液晶显示的频率计对频率计的发展很有意义。
数字频率计是一种用十进制数字显示被测信号频率的数字测量仪器,被测信号可以是正弦波,方波或其它周期性变化的信号。如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器。它的基本功能是测量正弦信号、方波信号、尖脉冲信号及其他各种单位时间内变化的物理量。它被广泛应用于航天、电子、测控等领域。
数字式频率计是基于时间或频率的A/D转换原理,并依赖于数字电路技术发展起来的一种新型的数字测量仪器。由于数字电路的飞速发展,数字频率计的发展也很快。在电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高了系统的可靠性和速度。
纵观现在的数字频率计,其基本原理都是相同的,频率是单位时间(1S)内信号发生周期变化的次数。如果我们能在给定的1S时间内对信号波形计数,并将计数结果显示出来,就能读取被测信号的频率。数字频率计首先必须获得相对稳定与准确的时间,同时将被测信号转换成幅度与波形均能被数字电路识别的脉冲信号,然后通过计数器计算这一段时间间隔内的脉冲个数,将其换算后显示出来。这就是数字频率计的基本原理。但现在的频率计其显示部分都是通过LED数码管显示的,显示内容是BCD码,不直观,若用LCD液晶来显示,会使输出结果更直接,便于观察。正因为如此,所以未来数字频率计的发展必定会向用液晶显示的方向发展。
1绪论
1.1研究背景
在电子系统非常广泛的应用领域内,到处可见到处理离散信息的数字电路。数字电路制造工业的进步,使得系统设计人员能在更小的空间内实现更多的功能,从而提高了系统的可靠性和速度。集成电路的类型很多,从大的方面可以分为模拟电路和数字集成电路两大类。数字集成电路广泛用于计算机、控制与测量系统,以及其它电子设备中。一般说来,数字系统中运行的电信号,其大小往往并不改变,但在实践分布上却有着严格的要求,这是数字电路的一个特点。数字集成电路作为电子技术最重要的基础产品之一,已广泛地深入到各个应用领域。测量频率是电子测量技术中最常见的测量之一,不少物理量的测量,如时间、速度等都涉及到或本身可转化为频率的测量。数字频率计是用数字显示被测信号频率的仪器,被测信号可以是正弦波、方波或其它周期性变化的信号,如配以适当的传感器,可以对多种物理量进行测试,比如机械振动的频率,转速,声音的频率以及产品的计件等等。因此,数字频率计是一种应用很广泛的仪器。1.2发展现状
数字频率计发展到现在,有基于CPLD的数字频率计的设计,基于VHDL语言的数字频率计的
设计,还有基于单片机的简易数字频率计等。CPLD是一种新兴的高密度大规模可编程逻辑器件,它具有门阵列的高密度和PLD器件的灵活性和易用性,目前已成为一类主要的可编程器件;可编程器件的最大特点是可通过软件编程对其器件的结构和工作方式进行重构,能随时进行设计调整而满足产品升级,使得硬件的设计可以如软件设计一样方便快捷,从而改变了传统数字系统及用单片机构成的数字系统的设计方法、设计过程及设计概念,使电子设计的技术操作和系统构成在整体上发生了质的飞跃。VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,超高速集成电路硬件描述语言)诞生于1982年,是由美国国防部开发的一种快速设计电路的工具,目前已经成为IEEE(TheInstituteofElectricalandElectronicsEngineers)的一种工业标准硬件描述语言;相比传统的电路系统的设计方法,VHDL具有多层次描述系统硬件功能的能力,支持自顶向下(ToptoDown)和基于库(LibraryBased)的设计的特点。单片机技术在短短的20余年间已发展成为计算机技术中一个非常有活力的分支,它有自己的技术特征、规范、发展道路和应用环境。
1.3单片机的发展
目前计算机硬件技术向巨型化、微型化和单片化三个方向发展。自1975年美国德克萨斯仪器公司第一块单片机芯片TMS-1000问世以来,在短短的30余年间,单片机技术已发展成为计算机技术中一个非常有活力的分支,它有自己的技术特征、规范、发展道路和应用环境。按单片机的生产技术和应用对象,单片机先后经历了4位机、8位机、16位机、32位机几个有代表性的发展阶段。
单片机与通用微机相比较,在结构、指令设置上均有其独特之处,其主要特点有:
1)单片机的存储器ROM和RAM是严格区分的,ROM称为程序存储器,只存放固定常数及数据。
RAM则为数据存储器,用于工作区及存放用户数据。2)采用面向控制的指令系统。
3)单片机的输入/输出引脚通常是多功能的。4)单片机的外部扩展能力强。
从80年代单片机被引入我国,单片机已广泛地应用于电子设计中。单片机的应用迅速发展,其性价比高,大量的外围接口电路,使基于单片机的电子系统设计方便,周期缩短,而且不断发展。新型单片机支持高级语言,进一步延伸了其发展空间。
2方案论证与选择
2.1方案一基于VHDL语言的频率计的设计
设计的基于VHDL语言频率计的系统原理框图系统原理框图如图2.1所示。
启停信号
小数
开关控制
量程选择
锁存器
1K输出使能
锁存信号
计数器
闸门信号点
译码显示电路
标准信号发生器
时钟
使能
分频器
100Hz或10Hz
闸门信号
计数控制器
待测信号
图2.1设计的基于VHDL语言频率计的系统原理框图
各模块说明如下:
(1)标准信号发生器,开关控制电路。标准信号发生器产生1kHz基准信号。开关控制电路对键盘输入的启停信号进行处理
(2)分频器
当收到使能信号,分频器启动,将标准1kHz信号经3次10分频,得到100Hz,10Hz,1Hz信号。1kHz,100Hz,10Hz信号作为计数器闸门信号来控制计数,以实现不同量程。
(3)计数控制器
计数控制模块将输入的分频信号处理,产生计数闸门信号、计数清零信号和锁存信号。(4)计数器
采用3个十进制计数器级联作为计数模块。闸门信号与待测信号相与作为计数输入。计数结果直接输出给锁存器。
(5)锁存器
每当锁存使能信号来临,锁存器便将锁存结果读入、锁存。锁存器还完成量程选择功能。锁存器还根据当前量程,选择合适的小数点位置输出。
(6)译码显示电路
由于小数点由锁存器输出,故在此仅考虑数码管的7段驱动,7段译码器将计数值译成相应的7段数码驱动值。
2.2方案二基于单片机的频率计的设计
设计的基于单片机频率计的原理框图如图2.2所示。
液
复位电路
AT89C51
晶显示模块1602
被测信号单片机
时钟电路
图2.2设计的基于单片机频率计的原理框图
复位电路采用上电复位方式,每次单片机上电工作时使单片机处于复位状态,即初始状态,为测量频率作好准备。
时钟电路中片内高增益反相放大器通过XTAL1、XTAL2外接作为反馈元件的晶振(呈感性)与电容组成的并联谐振回路构成一个自激振荡器向内部时钟电路提供振荡时钟,由此向单片机提供振荡脉冲。
AT89C51单片机内部具有2个16位的定时器/计数器,并可以在定时或计数溢出时产生中断。将被测信号通过P3.5口送入单片机,将T0设置为定时方式,每50ms产生一次中断,产生20次中断所用时间正好为1S,将T1设置为计数方式,T1的初值设置为0,计65535个脉冲后产生一次溢出中断,在T1中断溢出时对溢出次数进行计数(计数值为N)。1S内T1计的总的脉冲数为65535×N+TH1×256+TL1,这个数值就是被测信号的频率值。
单片机计的脉冲数值经过转换送到液晶显示模块1602,从而显示被测信号的频率,测量结果用十进制表示,很直接。
2.3方案的选择
基于VHDL语言的频率计设计的优点:VHDL语言,对设计的描述具有相对独立性,设计者可以不懂硬件结构,降低了硬件电路设计难度。利用EDA工具maxplusII对源程序进行编译、选配、优化、逻辑综合,自动地把VHDL描述转变成门级电路,进而完成电路分析、纠错、验证、自动布局布线、仿真等各种测试工作。最后通过编程电缆下载数据流,将所设计内容下载到所选中的FPGA器件中,即完成设计工作。这种设计方法减少了电路设计的时间和可能发生的错误,降低了开发成本。
基于VHDL语言的频率计设计的缺点:FPGA大部分是基于SRAM编程,编程数据信息在系统断电时会丢失,每次上电时需从器件的外部存储器或计算机中将编程数据写入,布线结构和逻辑实现复杂,其编程信息需存放在外部存储器上,需外部存储器芯片,且使用方法复杂,保密性差。
基于单片机的频率计的设计的优点:单片机在控制领域中有很多优点,如体积小、成本低、运用灵活、抗干扰能力强,可以方便地实现多机和分布式控制。并且利用单片机设计的频率计原理框图简单,所用元器件少,电路不易出错,其程序存放在内部存储器上,不需要外部存储器芯片,使用方法简单。且单片机便宜、稳定、开发简单、通用性好。
基于单片机的频率计的设计的缺点:所测信号的频率范围窄,若要扩大频率范围需外加分频器。综合比较上述两种方案,选择用单片机来设计频率计,显示部分用液晶显示模块,以使测量结果更加直接、明确。
3基于单片机的液晶显示频率计的设计
3.1系统硬件电路的设计3.1.1单片机的管脚
AT89C51单片机的管脚排部如图3.1
所示。
图3.1AT89C51单片机的管脚排布
主电源引脚
VCC(40脚):接+5V电源正端。VSS(20脚):接+5V电源地端。外接晶体引脚
XTAL1(19脚):接外部石英晶体的一端。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。
XTAL2(18脚):接外部石英晶体的另一端。在单片机内部,它是片内振荡器的反相放大器的输出端。
输入/输出引脚
P0口(39~32脚):P0.0~P0.7统称为P0口,在不接片外存储器与不扩展I/O口时,可作为准双向输入/输出口。
P1口(1~8脚):P1.0~P1.7统称为P1口,可作为准双向输入/输出口使用。
P2口(21~28脚):P2.0~P2.7统称为P2口,一般可作为准双向输入/输出口使用;在接有片外存储器或扩展I/O口且寻址范围超过256字节时,P2口用作高8位地址总线。
P3口(10~17脚):P3.0~P3.7统称为P3口,除作为准双向输入/输出口使用,还可以将每一位用于第二功能。
控制线
ALE/PROG(30脚):地址锁存有效信号输出端。
:片外程序存储器读选通信号输出端,低电平有效。(29脚)
RST/VPD(9脚):RST即为RESET,VPD为备用电源。该引脚为单片机的上电复位或掉电保护端。:EA为片外存储器选用端。该引脚有效(低电平)时,只选用片外程序存储器,EA/VPP(31脚)
否则单片机上电或复位后选用片内程序存储器。3.1.2单片机的外围电路
1)时钟电路
单片机的定时控制功能是用片内的时钟电路和定时电路来完成的,而片内的时钟产生有两种方式:内部时钟方式和外部时钟方式,实际中常应用内部时钟方式。设计的内部时钟方式图如图3.2所示。
XTAL1
30PF
C1
单
片
30PF
机
C2
XTAL2
图3.2设计的内部时钟方式图
电容在22PF~33PF之间选择,起微调作用,在此采用30PF。晶振可采用6MHz或12MHz,但是若用6MHz的晶振,所测频率范围太窄,最高只能测到250KHz,用12MHz的晶振,最高频率可测到500KHz,故在此选用12MHz的晶振。
2)复位电路
单片机的复位电路可采用上电复位或按扭复位,实际中常应用上电复位的方式,设计的上电复位方式图如图3.3所示。
10μF
RST
10K
单片机
图3.3上电复位方式图
3.1.3液晶显示模块1602
液晶显示器(LCD)具有显示信息丰富、功耗低、体积小、重量轻、超薄等许多其他显示器无法比拟的优点,近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。LCD型显示器的构成原理很简单,在两片透明绝缘的有机薄膜或者玻璃之间均匀充填着液晶流体,底层透明薄膜上镀有一层导电体,而顶层透明薄膜上则按需要的形状敷有透明的导电电极,当电极通电后,就与下层导电体之间(约10μm)形成一个电场,由于这个电场的作用,其间的液晶体的透光状况就发生了变化,从而对外来光线产生了吸收作用,使人们看见了与电极形状相同的字形显示。
1602采用标准的16脚接口,从该模块的正面看,引脚排列从左向右为:1-16脚,1602的管脚排部如图3.4所示。
1
2
34
5
6
7
8
[**************]
图3.41602的管脚排部
其中:
第1脚:VSS为地电源。第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。第15~16脚:空脚。
3.1.4硬件电路原理图
设计的系统硬件电路原理图如图3.5所示。
图3.5系统硬件电路原理图
硬件电路图中,单片机的EA管脚必须接高电平,因为接低电平时只选用片外程序存储器,而试验所用的是片内程序存储器。液晶显示器1602的VL管脚必须接一个电位器来调节,因为VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,对比度过弱时,看不到屏幕上显示的数据。
硬件电路中所选用的元器件的规格/型号见附录B。
3.2系统软件的设计
3.2.1定时器/计数器工作方式的设置
定时器/计数器T0、T1都有四种工作方式,可通过程序对TMOD设置选择。TMOD的低四位用于定时器/计数器0,高四位用于定时器/计数器1。TMOD的位定义如图1.1所示。
D7
D6
D5
D4
D3
D2
D1
D0
图3.6TMOD的位定义
C/T:定时或计数功能选择位,当C/T=1时为计数方式;当C/T=0时为定时方式。M1、M0:定时器/计数器工作方式选择位。
GATE:门控位,用于控制定时器/计数器的启动是否受外部中断请求信号的影响。一般情况下GATE=0。
当M1M0=00时,定时器/计数器设定为工作方式0,构成13位定时器/计数器。计数值由下式确定:N=8192-X,式中N为计数值,X是THX、TLX的初值。计数范围为1~8192。
定时时间由下式确定:T=N×Tcy=(8192-X)Tcy,式中Tcy为单片机的机器周期。如果振荡频率为12MHZ,则Tcy=1us,定时范围为1~8192us。
当M1M0=01时,定时器/计数器设定为工作方式1,构成16位定时器/计数器。在方式1时,计数器的计数值由下式确定:N=65536-X,计数范围为1~65536。
定时器的定时时间由下式确定:T=N×Tcy=(65536-X)Tcy,如果振荡频率为12MHZ,则Tcy=1us,定时范围为1~65536us。
当M1M0=10时,定时器/计数器设定为工作方式2。方式2是自动重装初值的8位定时器/计数器。在方式2时,计数器的计数值由下式确定:N=256-X,计数范围为1~256。
定时器的定时时间由下式确定:T=N×Tcy=(256-X)Tcy,如果振荡频率为12MHZ,则Tcy=1us,定时范围为1~256us.
当M1M0=11时,定时器/计数器设定为工作方式3。方式3只适用于定时器/计数器T0。当T0工作在方式3时,TH0和TL0被分成两个独立的8位计数器。方式3下定时器/计数器的定时、计数的范围和定时、计数值的确定同方式2。
在试验中需将T0设置为定时方式,将T1设置为计数方式;定时器T0定时50ms,即50000us,需选用工作方式1,即M1M0=01,因此,在编制程序时,将TMOD的高四位设为0101,低四位设为0001。
3.2.2定时器/计数器开启/关闭的设置
定时器/计数器的开启和关闭可通过控制寄存器TCON来设置,TCON的位定义如图3.7所示。
D7
D6
D5
D4
D3
D2
D1
D0
TF1TR1TF0TR0IE1IT1IE0IT0
图3.7TCON的位定义
TF0(TF1):T0(T1)定时器/计数器溢出中断标志位。当T0(T1)计数溢出时,由硬件置位,并在允许中断的情况下,向CPU发出中断请求信号,CPU响应中断转向中断服务程序时,由硬件自动将该位清零。
TR0(TR1):T0(T1)运行控制位。当TR0(TR1)=1时启动T0(T1);TR0(TR1)=0时关闭T0(T1)。该位由软件进行设置。
TCON的低四位与外部中断有关。
编写程序时,若需启动T0(T1),通过指令SETB
TR0或SETB
TR1将TR0(TR1)设为1,需关
闭T0(T1),通过指令CLRTR0或CLRTR1将TR0(TR1)设为0。3.2.3中断的设置
所谓中断是指CPU对系统中或系统外发生的某个事件的一种响应过程,即CPU暂时停止现行程序的执行,而自动转去执行预先安排好的处理该事件的服务子程序。当处理结束后,再返回到被暂停程序的断点处,继续执行原来的程序。实现这种中断功能的硬件系统和软件系统统称为中断系统。
试验中涉及到的T0或T1的中断,中断的控制可通过中断允许寄存器IE来设置。IE的位定义如图3.8所示。
D7EA
D6
D5ET2
D4ES
D3ETI
D2EX1
D1ET0
D0EX0
—
图3.8IE的位定义
EA:中断允许总控位。EA=0,屏蔽所有的中断请求;EA=1,开放中断。EA的作用是使中断允许形成两级控制。即各中断源首先受EA位的控制;其次还要受各中断源自己的中断允许总控位控制。
ET2:定时器/计数器T2的溢出中断允许位,只用于52子系列。
ES:串行口中断允许位。ES=0,禁止串行口中断;ES=1允许串行口中断。
ET1:定时器/计数器T1的溢出中断允许位。ET1=0,禁止T1中断;ET1=1,允许T1中断。EX1:外部中断1的中断允许位。EX1=0,禁止外部中断1中断;EX1=1,允许外部中断1中断。
ET0:定时器/计数器T0的溢出中断允许位。ET0=0,禁止T0中断;ET0=1,允许T0中断。EX0:外部中断0的中断允许位。EX0=0,禁止外部中断0中断;ET0=1,允许外部中断0中断。试验中需开中断允许总控位,需允许定时器T0和T1中断,因此在编程时使EA=1,使ET0=1且ET1=1。
中断源有多种,每个中断源的优先级可通过中断优先级寄存器IP进行设置并管理。IP的位定义如图3.9所示。
D7
D6
D5
D4
D3
D2
D1
D0
—PT2PSPT1PX1PT0PX0
图3.9IP的位定义
PT2:定时器/计数器T2的中断优先级控制位。PS:串行口的中断优先级控制位。
PT1:定时器/计数器T1的中断优先级控制位。PX1:外部中断INT1的中断优先级控制位。PT0:定时器/计数器T0的中断优先级控制位PX0:外部中断INT0的中断优先级控制位。
试验中为提高测量结果的准确度,需要将T1的中断设置为优先,通过指令SETB3.2.4液晶显示模块1602内部的控制指令
1602液晶模块内部的控制器共有11条指令,控制指令表如表3.1所示:
表3.1控制指令表
PT1来实现。
指令RS[1**********]
R/W[1**********]
E[1**********]
D700000001BF
D60000001
D5000001
D400001DL
D30001S/CN
D2001DR/LF
D101I/DC**
D01*SB**
清显示光标返回置输入模式显示开/关控制光标或字符移位置功能
置字符发生存储器地址置数据存储器地址读忙标志或地址
写数到CGRAM或DDRAM从CGRAM或DDRAM读数
字符发生存储器地址(AGG)
显示数据存储器地址(ADD)计数器地址(AC)
要写的数读出的数据
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置。指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符(有些模块是DL:高电平时为8位总线,低电平时为4位总线)。
指令7:字符发生器RAM地址设置。指令8:DDRAM地址设置。
指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。指令11:读数据。
在对液晶显示模块1602写入指令或写入数据前,需要进行初始化,如清屏幕,光标返回到00H位置,开显示,将液晶模块设置为双行显示等。编程时,要根据表3.1来编制程序,通过对RS、RW、D0-D7设置不同的高低电平来实现不同的功能。3.3系统软件设计中的主要流程图
设计的主程序和T0中断服务子程序的流程图如图3.10所示。设计的数据处理子程序和T1中断子程序的流程图如图3.11所示。
T0中断服务子程序
主程序
开始
中断
设置SP指针地址
关闭T0定时器
89C51的初始化
重新赋初值
LCD的初始化
TIMCOUNT加1
设置T0、T1的工作方式
P1.4取反产生自测信号
开启T0、T1
TIMCOUNT=20?
延时120MS
关闭T1计数器
三字节二进制整数转换成四字节BCD码
TIMCOUNT清零
将数值存入存储单元
ASCⅡ码的转换及结果显示在1602上
T1存储空间清零
2AH单元清零
开启T1、T0定时器/计数器
中断返回
图3.10设计的主程序和T0
数据处理子程序T1中断服务子程序
开始开始
清出口单元2AH单元地址加1
三字节二进制数据带进位依次左移一位
中断返回
十进制调整
保存出口单元调整后的数据
原数据左移24次?
N
Y
子程序返回
图3.11设计的数据处理子程序和T1中断服务子程序的流程图
3.4系统软件设计中的主要子程序3.4.1T1计数器中断服务子程序
根据图3.11中的T1中断服务子程序流程图设计的T1计数器中断服务子程序如下。TIMER1:
INCRETI
3.4.2T0定时器中断服务子程序
根据图3.10中的T0中断服务子程序流程图设计的T0定时器中断服务子程序如下。TIMER_INT:CLRMOVMOVINCMOVCPLCJNECLRMOVMOVMOVMOVMOVMOVMOVSETBSETBRETI
TR0TL0,TH0,
TIMER_LTIMER_H2AH
TIMCOUNTA,P1.4A,TR1
TIMCOUNT,#00H;INT_L,INT_H,INT_G,TH1,TL1,2AH,TR1TR0
TL1TH12AH#00H#00H#00H#20H,T_ENDTIMCOUNT
3.4.3数据处理子程序
根据图3.11中的数据处理子程序流程图设计的数据处理子程序如下。SBIN_SBCD:
CLRAMOVT_G,AMOVT_H,AMOVT_M,AMOVT_S,AMOVR5,INT_GMOVR7,INT_LMOVR6,INT_HMOVR2,#24
CLR
C
SBIN_SBCD1:
MOVA,R7
RLCAMOVR7,AMOVA,R6
RLCAMOVR6,AMOVA,R5
RLCAMOVR5,AMOVA,T_SADDCA,T_S
DAAMOVT_S,AMOVA,T_MADDCA,T_M
DAAMOVT_M,AMOVA,T_HADDCA,
T_H
DA
A
MOV
MOV
ADDDC
DA
MOV
MOV
DA
MOV
DJNZ
POP
RETT_H,A,A,AT_G,A,AT_G,R2,PSWAAT_HT_HT_GASBIN_SBCD1
总的源程序见附录A
3.5程序的编译、仿真
3.5.1在Keil环境下的程序编写
1)建立一个新工程
单击Project菜单,在弹出的下拉菜单中选中NewProject选项,然后选择你要保存的路径,输入工程文件的名字,比如保存到C51目录里,工程文件的名字为C51如下图所示,然后点击保存.保存新工程的界面图如图3.12所示。
图3.12保存新工程的界面图
完成上述步骤后会出现一对话框,选择需要的单片机型号,然后点击确定。
2)建立一个新的文件
单击“File”菜单,再在下拉菜单中单击“New”选项,此时光标在编辑窗口里闪烁,这时可以键入应用程序了,但应首先保存空白的文件,单击菜单上的“File”,在下拉菜单中选中“SaveAs”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,同时,必须键入正确的扩展名。注意,如果用C语言编写程序,则扩展名为(.c);如果用汇编语言编写程序,则扩展名为(.asm),然后单击“保存”按扭。回到编辑界面后,单击“Target1”前面的“+”号,然后在“SourceGroup1”上击右键,添加文件的界面图如图3.13所示。
图3.13添加文件的界面图
然后单击“AddFiletoGroup‘SourceGroup1’”,选中要添加的文件,然后单击“Add”
3)输入源程序,进行编译、仿真
输入源程序后,单击“project”按钮下的“Build
3.14所示。project,translate”按钮,程序无错误时界面图如图
图3.14程序无错误时的界面图
4)单击“Project”菜单,再在下拉菜单中单击"options
频率的界面图如图3.15所示。
fortarget'target1',出现选择晶振
图3.15选择晶振频率的界面图
把晶振频率改为12.0,且选中“Use
HEX文件的界面图如图3.16所示:On-chipROM”,然后单击“output"选项,出现可选择生成
图3.16选择生成HEX文件的界面图
单击图3.7中的“CreateHEXFile”选项,使程序编译后产生HEX代码。
3.5.2在PROTEUS环境下的仿真结果
当输入信号频率为1Hz
时的显示结果
当输入信号频率为500KHz时的显示结果
3.6电路的调试
把程序烧录到单片机后,在面包板上按原理图连接好,却没有出现想要的功能,按顺序检查:
1)电路图的连接,经检查发现单片机的31管脚没有接高电平,这在软件实现时也没有接,被默认为是高电平,但在硬件中,若不接高电平,该管脚为片外程序存储器选用端,就无法读取单片机内的程序,所以未能实现所需功能。
2)31管脚接上高电平时,液晶显示器1602仍未能显示所测频率,推测可能是电位器的调节问题,在适当的调节接入电阻值后,1602显示了所测的频率。
3)把1602所显示的频率与实际的频率相比较,发现误差较大,经思考发现在编写程序时对定时器的定时50ms有误差,没有考虑到定时器与计数器的关闭不是同时的,而有一定的时间差,这个时间差是因执行每一条指令时引起的。然后在程序中把定时时间适当的缩小到49.985ms,发现误差会变小,能达到要求。
检查无误后,接通电源,LCD能显示频率,显示范围是1~500KHz,用信号发生器检测,误差不超过2Hz。组装的频率计实物图如图3.17
所示。
图3.17组装的频率计实物图
基于AT89C51单片机的液晶显示频率计包括单片机控制模块和液晶显示模块,调试后的频率计可测量方波、正弦波、脉冲信号等波形,测量最高频率为500KHz,误差为2Hz。本设计的创新点是:显示部分采用液晶显示模块1602,显示结果直接且能显示多行多位,功耗小,使用寿命长。本设计的不足之处是:测量频率范围窄,需要进一步扩展。
从选择课题到课程设计的顺利结束,老师和同学给予了我热心的帮助,在这里请接受我诚挚的谢意。
首先,要特别感谢我的指导教师聂翔副主任,从查找资料到设计结束,聂老师都给予了我悉心的指导和帮助。在设计与调试过程中,聂老师渊博的理论知识和丰富的实际经验给了我许多启发式的指点,还有他严谨的治学态度和认真的工作精神,也使我受益匪浅。
其次,还要感谢我们这个小组的其他两位同学,他们在资料的查阅、整理和设计的过程中给予了我极大的帮助,正因为有了他们的参与,我们这个团队才能顺利地完成课程设计的各项任务。除此之外,还要感谢班上其他帮助过我的同学,感谢他们在整个过程中给予我们的鼓励与帮助。
最后,要感谢电信工程系电子教研室的老师,他们为我们的课程设计提供了良好的实验环境,全天时的实验室开放方便了大家的硬件和软件调试。电信系和实验室的指导老师对我们进行的不厌其烦的辅导修改以及必要的批评指正,对设计的成功给予了很大的帮助。
再次衷心的感谢每一位指导并帮助过我的老师和同学。
参考文献
[1]贵国庆.1602液晶显示频率计[J].电子制作,2006,149(8):26-27.
[2]陆容.液晶显示器(LCD)显示驱动原理及其应用[J].电子制作,2005,134(5):58-59.
[3]李建忠.单片机原理及应用[M].西安电子科技大学出版社,2002,3-40.
[5]何立民.MCS-51系列单片机应用系统设计[M].北京航空航天大学出版社,1995,30-34.
[6]吴海州,王文理.基于VHDL语言的数字频率计设计[J].现代电子技术,2002,138(7):19-21.
[7]SongPan,GuodongWang.VHDLApplicationCourse[M].Chengdu:UniversityofElectronicScienceandTechnologyPress,2000,15-20.
[8]WanjieSong,PingLuo,ShunjunWu.CPLDTechnologyandApplication[M].Xipan:XipanUniversityofElectronicScienceandTechnologyPress,2000,27-30.
附录A
源程序:
BEEPBITP3.7
LCD_RS
LCD_RW
LCD_EN
LCD_X
TIMER_H
TIMER_L
TIMCOUNT
INT_G
INT_H
INT_L
T_S
T_M
T_H
T_GBITP2.0BITP2.1BITP2.2EQU3FHEQUEQUEQUEQUEQUEQUEQUEQUEQUEQU30H31H32H35H34H33H36H37H38H39H;LCD地址变量;定时器高位字节单元;定时器低位字节单元;时间中断数;中断计数缓冲单元高地址;中断计数缓冲单元中地址;中断计数缓冲单元低地址;数据显示低位;数据显示中位;数据显示高位;数据显示最高位
;----------------------------------------------------------
ORG0000H
JMPMAIN
ORG000BH
JMPTIMER_INT
ORG
JMP
ORG001BHTIMER10030H;定时器T0中断服务程序;定时器T1中断服务程序;主程序开始
;----------------------------------------------------------MAIN:
MOVSP,#60H
LCALLPRO_SET
CALLSET_LCD;设置SP指针;初始化
LCALLTIM_T0
;-----------------------------------------------------------;LCD1602是慢速显示器件,故100MS显示一次。
;-----------------------------------------------------------
MAIN1:
MOVR5,40
MAIN2:
ACALL
DJNZ
ACALL
CALLDELAY1R5,MAIN2SBIN_SBCDCONV;3ms
JMPMAIN1
;------------------------------------------------------------
;T1计数器中断服务子程序
;计T1计数器溢出次数
;------------------------------------------------------------
TIMER1:
INC2AH
RETI
;------------------------------------------------------------
;初始化程序
;------------------------------------------------------------
PRO_SET:MOVA,#00H
MOVB,#00H
MOV2AH,A
MOVP0,#0FFH
MOVP1,#0FFH
MOVP2,#0FFH
MOVINT_H,#00H
MOVINT_L,#00H
MOV
MOV
MOV
MOV
MOVINT_G,#00HT_S,#00HT_H,#00HT_M,#00HT_G,#00H
MOVTIMCOUNT,#00H
MOVTIMER_H,#3CH;理论上定时50MS(3CB0H),实际定时49.985MS(3CBFH)较合适MOVTIMER_L,#0BFH;
CLRBEEPSETBRET
P3.5
;P3.5端口置输入状态;T1(TIMER1的外部输入脚)
;-----------------------------------------------------;LCD初始化设置
;-----------------------------------------------------SET_LCD:
CLRCALLCALLMOVMOVCALLMOVMOVCALLRET
;-----------------------------------------------------INFO1:INFO2:
DBDB
"072cairuigang",0"Freq:
HZ",0
;LCD第一行显示信息;LCD第二行显示信息
LCD_ENINIT_LCDDELAY1DPTR,#INFO1A,#1LCD_SHOWDPTR,#INFO2A,#2LCD_SHOW
;指针指到显示信息2;显示在第二行;指针指到显示信息1;显示在第一行;初始化LCD
;-----------------------------------------------------;LCD接口初始化;8位I/O控制
;-----------------------------------------------------INIT_LCD:
MOVCALLCALLMOVCALLCALLMOVCALLCALLMOV
A,#38HWCOMDELAY1A,#38HWCOMDELAY1A,#38HWCOMDELAY1A,#0CH
;开显示,关光标,
31
;双列显示,字形5*7点阵
;双列显示,字形5*7点阵
;双列显示,字形5*7点阵
CALLMOVCALLCALLRET
DELAY1A,#01HWCOMDELAY1
;清除LCD显示屏
;----------------------------------------------------LCD_SHOW:
;在LCD的第一行或第二行显示信息字符
CJNE
LINE1:
MOVCALLCALLMOVCALLJMP
LINE2:
MOVCALLCALLMOVCALL
FILL:
CLRMOVCCJNERET
LC1:
CALLINCJMPRET
A
A,#1,LINE2A,#80HWCOMCLR_LINEA,#80HWCOMFILLA,#0C0HWCOMCLR_LINEA,#0C0HWCOM
;判断是否为第一行;设置LCD的第一行地址;写入命令
;清除该行字符数据;设置LCD的第一行地址;写入命令
;设置LCD的第二行地址;写入命令
;清除该行字符数据;设置LCD的第二行地址
;填入字符
A,@A+DPTRA,#0,LC1
;由消息区取出字符;判断是否为结束码
WDATADPTRFILL
;写入数据;指针加1;继续填入字符
;---------------------------------------------------CLR_LINE:
MOV
CL1:
MOVCALLDJNZ
R0,#24A,#''WDATAR0,CL1
32
;清除该行LCD的字符
;-----------------------------------------------------;写指令、数据使能子程序
;-----------------------------------------------------ENABLE:
CLRLCD_RSCLRLCD_RWSETBLCD_ENCALL
DELAY0
;写指令使能
;RS=L,LCD_RW=L,D0-D7=指令码,E=高脉冲
CLRLCD_ENRET
ENABLE1:
SETBCLRSETBCALLCLRRET
DELAY0:
MOVDJNZRET
;----------------------------------------------------;写入命令子程序
;----------------------------------------------------WCOM:
MOVCALLRET
;----------------------------------------------------;写入数据子程序
;----------------------------------------------------WDATA:
MOVCALLRET
33
;写数据使能
LCD_RSLCD_RWLCD_ENDELAY0LCD_EN
;RS=H,RW=L,D0-D7=数据,E=高脉冲
R7,#250R7,$
;延时500微秒
;以8位控制方式将命令写至LCD
P0,AENABLE
;写入命令
;以8位控制方式将数据写至LCD
P0,AENABLE1
;写入数据
;---------------------------------------------------;在LCD第二行显示字符;A=ASCDATA,B=LINEXPOS
;---------------------------------------------------LCDP2:
PUSHMOVADDCALLPOPCALLRET
;-------------------------------------------------------;ASCII转换并在第二行显示数字子程序
;-------------------------------------------------------CONV:
;MOVMOV
A,T_GLCD_X,#6
;设置位置
ACCA,BA,#0C0HWCOMACCWDATA
;在LCD的第二行显示字符;
;设置显示地址
;设置LCD的第二行地址;写入命令;由堆栈取出A;写入数据
;CALLSHOW_DIG2MOV;INCCALLMOVINCCALLMOVINCCALLRET
;----------------------------------------------------SHOW_DIG2:
MOVDIVADDPUSHMOV
B,#16ABA,#30HBB,LCD_X
34
A,T_HLCD_XSHOW_DIG2A,T_MLCD_XSHOW_DIG2A,T_SLCD_XSHOW_DIG2
;加载小时数据;显示数据;加载分钟数据;设置位置;显示数据;加载秒数数据;设置位置;显示数据
CALLPOPMOVADDINCMOVCALLRET
B
LCDP2
A,BA,#30HLCD_XB,LCD_XLCDP2
;-----------------------------------------------------DELAY1:
MOV
D2:
MOVDJNZDJNZRET
;-----------------定时器设置
------------------------R6,#15R7,#100R7,$R6,D2
;延时3MS
;设置定时器0工作在定时方式1,定时器1工作在计数方式1;---------------------------------------------------------TIM_T0:
MOVTMOD,#51HMOVTH0,TIMER_HMOVTL0,TIMER_LMOVMOVMOVSETBSETBSETBRET
;--------------------------------------------------------;定时器0中断服务程序
;--------------------------------------------------------TIMER_INT:
CLRTR0
MOVTL0,TIMER_LMOVTH0,TIMER_H
;关闭定时器;重新赋初值
;
35
;设置定时初值高位;设置定时初值低位;清T1计数器
TH1,#00HTL1,#00HIE,#8AHPT1TR1TR0
;开中断总允许,允许T0溢出中断
;定时器开始工作
INCTIMCOUNTMOVA,TIMCOUNTCPL
P1.4
;定时1S,时间单位;查看数量值;产生自测信号;如果没有到1S返回;关闭计数器T1;到1S则清零;取出计数值低位;取出计数值高位;取出溢出计数值位
CJNEA,#20,T_ENDCLR
TR1
MOVTIMCOUNT,#00HMOVINT_L,TL1MOVINT_H,TH1MOVINT_G,2AHMOVMOVMOVSETB
T_END:
TH1,#00HTL1,#00H2AH,#00HTR1
SETBTR0RETI
;重新开始定时操作
;---------------------------------------------------------------;三字节二进制整数转换成四字节BCD码子程序
;二进制数从低位到高位分别存放在INT_L、INT_H、INT_G单元中;BCD码从低位到高位分别存放在T_S、T_M、T_H、T_G单元中
;---------------------------------------------------------------SBIN_SBCD:
PUSHPSWSETBPSW.3CLRPSW.4CLRAMOVT_G,AMOVT_H,AMOVT_M,AMOVT_S,AMOVMOVMOVMOVCLR
HH1:
36
;设置当前寄存器
;清累加器
;清除出口单元,准备转换
R5,INT_GR7,INT_LR6,INT_HR2,#24C
;设置二进制数起始地址
MOVA,R7RLCAMOVR7,AMOVA,R6RLCAMOVR6,AMOVA,R5RLCAMOV
R5,A
MOVA,T_SADDCA,T_SDAAMOVT_S,AMOVA,T_MADDCA,T_MDAAMOVT_M,AMOVA,T_HADDCA,T_HDA
A
MOVT_H,AMOVA,T_GADDCA,T_GDA
A
MOVT_G,ADJNZR2,HH1POPPSW
RETEND
37
;得到低位数据;累加;十进制调整;保存数据;得到第二位数据;累加;十进制调整;保存结果;得到第三位;累加
;保存;得到第四位;累加
;
附录B
元器件清单:
元器件名称单片机瓷片电容电解电容晶振金属膜电阻电位器液晶显示屏
规格/型号AT89S5130PF/63V10μF/25V12MHz10K/10K/1602
数量1pc2pc1pc1pc1pc1pc1pc
1W41W2
38