同时规定,对应于表1中的标称频率在发送时,DTMF信号的频率偏差不应当超过1.5%,每位数字的信号极限时长应该大于40ms,而接收设备对2%的偏差应能可靠地接收,对30ms~40ms时长的信号可以正常地接收。
与单音编码不同,DTMF信号是采用8中取2的方式,从高低两个音组中各取一个音频复合而成来代表0-9十个号码和其他功能码,再加上这8个音频信号的各频率间不存在谐波关系,大大减少了虚假信号的干扰,因而DTMF信号工作可靠性特别是抗干扰能力很强。
1.2DTMF信号的应用
DTMF信号即双音多频信号,最先用于程控电话交换系统来代替号盘脉冲信号。
如图1:
主叫用户摘机按键拨号后,电话号码所对应的DTMF信号通过电话线传到程控交换机中的DTMF接受电路,交换机中的微机识别被叫电话号码后,接通主被叫用户实现双方通话。
DTMF信号还用于自动控制系统,如果把DTMF的发送电路用于主控系统,接受电路用于被控系统,就可以方便地组成有线或无线通信系统,如图2所示,其通道数视需要而定,16通道以内每通道只需编一位号码即可,若需要更多通道,则可象电话号码编号一样编为两位或两位以上的号码。
2.系统硬件设计
2.1系统硬件的总体实现
为使产生的DTMF信号频率误差尽可能小,我们对该系统的硬件电路作了精心设计。
图3是基于单片机的DTMF信号的合成的硬件图:
图3系统的硬件图
该系统的硬件设计按实现的功能来分,可分为以下3个部分。
单片机与键盘的接口电路,实现按键信号的产生的功能,AT89C51根据读进来的键码来实现相应的键功能向P0口发按键对应的DTMF信号,数摸转换器与单片机的接口电路主要来实现把P0口发出的数字信号转换为模拟信号,最后通过RC低通滤波器把信号中的高频成分滤去。
其中,AT89C51单片机是整个电路的核心,它控制其他模块来完成各种复杂的操作。
在本章下面几个小节中将根据图3的硬件设计电路,对各个模块电路进行详细的设计与分析。
2.2中央控制器——AT89C51
AT89C51是由美国Atmel公司生产的至今为止世界上最新型的高性能八位单片机之一。
2.2.1AT89C51的特点
AT89C51具有以下几个特点:
·AT89C51与MCS-51系列的单片机在指令系统和引脚上完全兼容;
·片内有4k字节在线可重复编程快擦写程序存储器;
·全静态工作,工作范围:
0Hz~24MHz;
·三级程序存储器加密;
·128×8位内部RAM;
·32位双向输入输出线;
·两个十六位定时器/计数器
·五个中断源,两级中断优先级;
·一个全双工的异步串行口;
·间歇和掉电两种工作方式。
2.2.2AT89C51的功能描述
AT89C51是一种低损耗、高性能、CMOS八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。
它与MCA-51系列单片机在指令系统和引脚上完全兼容,不仅可完全代替MCS-51系列单片机,而且能使系统具有许多MCS-51系列产品没有的功能。
AT89C51可构成真正的单片机最小应用系统,缩小系统体积,增加系统的可靠性,降低系统的成本。
只要程序长度小于4K,四个I/O口全部提供给用户。
可用5V电压编程,而且擦写时间仅需10毫秒,仅为8751/87C51的擦除时间的百分之一,与8751/87C51的12V电压擦写相比,不易损坏器件,没有两种电源的要求,改写时不拔下芯片,适合许多嵌入式控制领域。
工作电压范围宽(2.7V~6V),全静态工作,工作频率宽在0Hz~24MHz之间,比8751/87C51等51系列的6MHz~12MHz更具有灵活性,系统能快能慢。
AT89C51芯片提供三级程序存储器加密,提供了方便灵活而可靠的硬加密手段,能完全保证程序或系统不被仿制。
P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。
2.2.3AT89C51引脚功能
AT89C51单片机为40引脚芯片见附录1。
1.口线:
P0、P1、P2、P3共四个八位口。
▪P0口是三态双向口,通称数据总线口,因为只有该口能直接用于对外部存储器的读/写操作。
P0口也用以输出外部存储器的低8位地址。
由于是分时输出,故应在外部加锁存器将此地址数据锁存,地址锁存信号用ALE。
▪P1口是专门供用户使用的I/O口,是准双向口。
▪P2口是从系统扩展时作高8位地址线用。
不扩展外部存储器时,P2口也可以作为用户I/O口线使用,P2口也是准双向口。
▪P3口是双功能口,该口的每一位均可独立地定义为第一I/O功能或第二I/O功能。
作为第一功能使用时操作同P1口。
P3口的第二功能如表2所示。
2.控制口线:
PSEN(片外选取控制)、ALE(地址锁存控制)、EA(片外存储器选择)、RESET(复位控制);
3.电源及时钟:
VCC、VSS、XTAL1、XTAL2 操作方法。
表2P3口的第二功能
2.2.4操作方法
1.程序存储器加密。
AT89C51芯片程序存储器有三级硬件加密,能够有效地保证系统不被仿制和软件不被复制,加密等级设置见附录2。
2.工作模式。
AT89C51有间歇和掉电两种工作模式。
间歇模式是由软件来设置的,当外围器件仍然处于工作状态时,CPU可根据工作情况适时地进入睡眠状态,内部RAM和所有特殊的寄存器值将保持不变。
这种状态可被任何一个中断所终止或通过硬件复位。
掉电模式是VCC电压低于电源下限,振荡器停止振动,CPU停止执行指令。
该芯片内RAM和特殊功能寄存器值保持不变,直到掉电模式被终止。
只有VCC电压恢复到正常工作范围而且在振荡器稳定振荡后,通过硬件复位掉电模式可被终止。
2.3数摸转换器——DAC0832
在电子技术的很多应用场合往往需要把数字量转换成模拟量,称为数/模转换器(D/A转换器,简称DAC)。
完成这种转换的线路有多种,特别是单片大规模集成D/A转换器问世,为实现上述的转换提供了极大的方便。
使用者可借助于手册提供的器件性能指标及典型应用电路,即可正确使用这些器件。
本系统将采用大规模集成电路DAC0832实现D/A转换。
DAC0832是采用CMOS工艺制成的单片电流输出型8位数/模转换器。
图4是DAC0832的逻辑框图及引脚排列。
图4DAC0832单片D/A转换器逻辑框图和引脚排列
器件的核心部分采用倒T型电阻网络的8位D/A转换器,它是由倒T型R-2R电阻网络、模拟开关、运算放大器和参考电压VREF四部分组成。
DAC0832各引脚含义如下:
CS为片选信号,CS与ILE(输入寄存器允许信号)合起来可对写信号WR1是否起作用进行控制。
WR1写信号用以将8位数字量D7D6D5…输入并锁存于DAC0832内部的输入寄存器中,WR写信号与传送控制信号XFER同时有效,则将输入寄存器的数字量再传送到8位D/A寄存器锁存起来。
这时8位D/A转换器就开始工作。
IOUT1和IOUT2为输出电流,其中IOUT1是D/A寄存器内容为全1时输出电流为最大;当D/A寄存器内容为零时输出电流为0。
IOUT2为一常数与IOUT1之差,即IOUT1+IOUT2=常数。
AGND和DGND分别为模拟量地和数字量地,它们应共地。
VREF精度尽可能高一些。
V是电源电压,其值可在+5V到+15V。
R为反馈电阻,由于片内已具备反馈电阻,故可以与外接运算放大器的输出端短接。
DAC0832输出的是电流,要转换为电压,还必须经过一个外接的运算放大器,电路如图5所示。
图5电流转换为电压电路
图5中
、
、
接地为低电平,ILE为高电平,DAC0832处于直通的工作状态。
输入数字量(D0~D7)通过输入锁存器,数据寄存器直接传送到DAC,输出相应模拟量。
运放的输出电压为
…
)
由上式可见,输出电压VO与输入的数字量成正比,这就实现了从数字量到模拟量的转换。
2.4单片机与键盘的接口电路
图6是单片机与键盘的接口电路。
单片机的串行口在方式0下工作,作为同步移位寄存器使用,这时以RXD端作为数据移位的出口,而TXD端提供移位时钟脉冲。
在无键按下的情况下p1.0,p1.1读进来的是高电平,当有键按下时,p1.0或p1.1端将会变为低电平。
图6单片机与键盘的接口电路
2.5AT89C51与DACO832的接口电路
图7是AT89C51与DACO832的接口电路。
在这里P0口是做为输入口使用的,由于通路中已有输出锁存器,因此数据输出可以与外设直接相连,无需再加数据锁存器电路。
但是由于输出电路是漏极开路电路,必须外接上拉电阻才能有高电平输出。
DAC0832是处于直通状态,P3.6把第一写信号,第二写信号,数据传送信号拉为低电平。
图7AT89C51与DACO832的接口电路
2.6RC低通滤波器
由于从DAC0832出来的DTMF信号含有丰富的高频成分,信号波形是阶梯型的需要经过一个低通滤波器,使信号变得光滑与准确。
图8是简单的RC低通滤波器。
图8RC低通滤波器
由图8我们可以知道:
ωc=1/(RC)称为截止角频率,相应地fc=ωc/(2π)=1/(2πRC)称为截止频率。
构成DTMF信号的8个音频的最高频率1633(由表1可知),因此,我选择了6.8k的电阻和0.01uf的电容,使截止频率为2341hz。
3.系统软件设计
系统的软件设计主要分为单片机与键盘接口程序,DTMF信号产生程序设计,单片机与D/A接口程序设计。
下面,就整体设计以及每个单元功能模块分别进行详细说明。
3.1系统程序设计
图9是系统的程序流程图。
图9系统的程序流程图
3.2单片机与键盘接口程序设计
图10单片机与键盘程序流程图
图10是键程序流程图,主要分为键扫描,去抖动,键码计算,等待键释放等。
3.2.1键扫描
如图11所示,键盘的行线一端经电阻接+5V电源,另一端接单片机的输入口线。
各列线的一端接单片机的输出口线,另一端悬空。
为判定有没有键被按下,可先经输出口向所有列线输出低电平,然后再输入各行线的状态。
若行线状态皆为高电平,则表明无键按下;若行线状态中有低电平,则表明有键被按下。
接下来就要确定被按键的位置。
先使输出端口输出0FEH,然后输入行线状态,测试行线状态中是否有低电平的。
如果没有低电平,再输出0FDH,当出现行线有低电平时,则闭合键找到,此次扫描结束。
3.2.2去抖动
当扫描表明有键被按下之后,紧接着应进行去抖动处理。
因为常用键盘的键实际上就是一个机械开关结构,当被按下的时,由于机械触点的弹性及电压突跳等原因,在触点闭合或断开的瞬间会出现电压抖动。
一般为5到10ms。
为保证键扫描的正确,需进行抖动处理。
在这里我采用了软件延时的方法,延时时间为10ms。
3.2.3键码计算
被按下来的键确定下来后,接下来的工作是计算闭合键的键码,因为有了键码,才好通过转移指令把程序执行转移到闭合键所对应的功能子程序中。
下面是计算键码的公式:
键码=行首号+列号
3.2.4等待键释放
等待键释放是为了保证键的一次闭合仅进行一次处理,这里我是通过等待来实现的。
3.3产生DTMF信号的程序设计
3.3.1函数y=C*sin(ωt)+C的数据表分析
正弦函数y=C*sin(ωt)的波形如图12。
CPU对不同时间所对应的相位进行计算得出相应的数据,经DAC转换后产生正弦波;也可先通过计算得出一个周期的数据,制作一个表格,CPU按特定的时间间隔即采样周期查表得到对应的数据,经DAC转换后产生正弦波。
但前者需要编写复杂的计算正弦波函数的程序,占用相当的程序存储空间,计算时间长,降低了CPU的效率,很难保证正弦波频率的精度。
查表程序非常简单,占用硬件资源也非常少,频率精度和谐波系数取决于采样周期和表格的大小。
查表方法产生正弦波先计算出正弦波一个周期的数据,作为产生波形的数据表。
采样周期足够小和表格足够大,就可保证正弦波的精度。
为了数据表足够大,尽量占用较小的程序存储空间,实际只需制作0°到90°的数据表格,经过简单的运算即可得到一个周期的数据,又可减少3/4数据表存储空间。
Y=C*sin(ωt)对应的电信号为交流信号,须经电平提升为直流电才能满足CPU的输出特性,函数Y=C*sin(ωt)+C符合要求。
对该函数经数学分析或图形观察,会得出以下结论:
(1)相位为0°~90°时,计算出的数据分布为由0到C。
用0°到90°的数据表,经DA转换后可产生函数Y=C*sin(ωt)在0°到90°范围内的波形。
每次读出的数据加C,经DA转换后可产生函数Y=C*sin(ωt)+C在0°到90°范围内的波形。
图12y=63*sin(t)的波形
(2)相位为90°~180°时,于0°~90°的图形左右对称,通过相反的方向,即由后向前读0°到90°的数据表,每次读出的数据加C,经DA转换后可产生该函数在90°到180°范围内的波形。
(3)相位为180°~270°时,于0°~90°的图形上下对称,对应数据绝对值相等,符号相反。
读数据表的方向与0°~90°相同,每次读出的数据符号取反再加C,经DA转换后可产生该函数在180°到270°范围内的波形。
(4)相位为270°~360°时,于180°~270°的图形左右对称,通过相反的方向,即由后向前读0°到90°的数据表,每次读出的数据符号取反再加C,经DA转换后可产生该函数在270°到360°范围内的波形。
3.3.2函数Y=C*sin(ωt)+C的频率计算
Y=C*sin(ωt)+C的相位由0°起,每增加一个单位(即角度增量)计算出一个数据,如δ=1°,共可得到360个数据,由此制作一个大小为包含360个数据的数据表。
角度增量δ决定了数据表的大小,一个周期数据表的大小为360/δ。
实际只需制作0°到90°的数据表,大小为S=90/δ,由于起点也是一个数据,表格实际大小比S多1个单元。
CPU每隔恒定的时间间隔(即采样周期Tc),由数据表的第一个数据起,按特定的步长N,读下一个数据,送DA转换器。
N=1时每读一个数据,表格指针前进一步,即读出相邻的下一个数据,表格大小/步长=S/N=90步后,即可产生函数1/4周期的波形,4S/N=360步后,即可产生一个周期的波形。
如采样周期Tc=10μs,得:
周期=360Tc,频率=1/360Tc=278Hz。
CPU由第一个数据起,N=2时每读一个数据,表格指针前进两步,即间隔一个数据读一个数据,4S/N=360/2=180步后即可产生一个周期的波形周期=180Tc,频率=1/180Tc=556Hz。
同理,由第一个数据起,按不同的步长N读下一个数据,4S/N步后即可产生函数一个周期的波形,周期=4TcS/N,频率=N/4TcS。
表格大小S=90/δ、步长N和采样周期Tc决定了频率,即频率f=N/4TcS=Nδ/360Tc。
由指定的频率反过来推得步长N=360fTc/δ。
根据香侬定理,正弦波一个周期内的采样次数必须大于2,才可反应原函数的频率特性,一般要求采样次数要大于5。
对一个特定频率的正弦函数,合理选择步长N和采样周期Tc,很易满足这一条件。
3.3.3DTMF波形振幅的计算
函数Y=C*sin(ωt),振幅为C,对应交流电信号的峰峰值为2C。
为满足CPU的输出特性,电平提升为直流电后的函数为Y=C*sin(ωt)+C,最大值为2C,最小值为0。
DTMF信号是由两个频率不同、幅度相同的正弦波叠加而成,YDTMF=C*sin(ω1t)+C*sin(ω2t)+2C,它的最大值是4C,最小值为0。
而8位DA转换电路所能表达的最大值为28-1=2