频率计报告课程设计doc.docx
《频率计报告课程设计doc.docx》由会员分享,可在线阅读,更多相关《频率计报告课程设计doc.docx(20页珍藏版)》请在冰豆网上搜索。
频率计报告课程设计doc
数字频率计
内容提要:
本系统以单片机为控制核心,由信号发生模块、单片机最小系统模块、显示模块组成。
测量时,将被测信号送给单片机,通过程序控制计数,所得结果由单片机P0口和P2驱动LED数码管显示频率值。
信号发生电路由电容充放电再经非门整形得到一个频率为7100Hz的矩形波信号,作为测试信号送入单片机的P3.4口,再由单片机检测与计算,送入数码管显示。
该频率计具有电路结构简单、成本低、测量方便、精度较高等特点,适合测量低频信号。
关键字:
单片机数码管动态扫描定时器二十进制转换
一、系统功能论述
1、本次设计的意义
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此频率计在教学、科研、测量仪器、工业控制等方面都有较广泛的应用。
测量频率的方法有多种,其中电子计数测量频率具有精度高、使用方便、测量迅速,以及便于实现测量自动化等优点,是频率测量的重要手段之一。
本设计就是用计数的方法,以单片机AT89C51为控制核心,充分利用其软硬件资源,设计并制作了频率计的计数、显示部分。
它能精确测量低频信号的频率,这就是本次设计的意义。
2、系统功能
题目技术指标要求如下:
输入脉冲幅度:
0—5V
频率测量范围:
100—100000Hz
测量精度:
±1%
显示方式:
四位数字显示
根据题目要求分析如下:
由于使用电源电压最大不超过5V,而且经74LS00接成的非门整形,所以第一个要求必能满足。
信号发生电路要产生频率范围为100—100000Hz的矩形波信号,根据公式只要使电阻电容满足一定的要求即可。
测量精度±1%,由于正负1误差的存在,所以最小频率不得低于100Hz,上限频率可以扩大,但也不是无限扩大,根据后面的计算待测信号的频率测量范围可扩大为100—50000Hz。
另外显示方式为四位数字显示,所以要将测量频率划分为两段为100——9999Hz和10000——50000Hz。
前面一段四位数码管就可以显示了,但后面一段不够显示,就必须进行处理,去掉最后一位,在次高位上加一个小数点,以10000Hz为例,处理后就是10.00,单位变为KHz。
本系统功能就是测量频率,并满足上述指标要求。
3,系统结构框图
图1系统结构框图
4,工作分配
此次课程设计我主要负责软件的编写与调试。
第一个星期主要是收集资料、焊街电路板和熟悉LCA51仿真软件的使用。
电路板的焊接工作主要由我同伴负责,电路板的调试是由我们共同完成的,然后共同熟悉软件。
第二个星期,我负责写程序,并且各自练习编写一些小程序。
经过两个星期的努力,我们终于完成了数字频率计的设计。
二、硬件电路设计
1,硬件电路图
图2硬件管脚图
1)其具体连接方法如下:
P3.4口(即T0)接输入脉冲信号。
XTAL1与XTAL2管脚接两个20pF电容和12MHz晶振构成时钟电路。
RST管脚接510Ω电阻,10μF电容及复位开关构成人工复位电路。
P2.4—P2.1接驱动7407的四个输入端,四个输出端接数码管的位选通端。
P0.0—P0.7接数码管的段选线。
2)元件参数如下
R1=R2=510Ω,C1=C2=10uf,C3=C4=20pf。
一片74ls00接成非门使用,用于整形。
一片7407用于驱动数码管。
四个共阴极数码管,一个8路排阻,阻值为330Ω。
2,各模块电路的实现及其功能
1)信号发生模块
参考图2可知,利用电容的充放电,产生近似矩形波的波形,再经非门整形,就可以得到标准的矩形波,若波形不够标准,可多接入几个非门。
频率计算公式为:
f=1/2.2*R2*C2
(1)
上述取R2=510Ω,C2=10uf,计算得到f=8900Hz,但由于元件本身并不标准,且有较大误差,以及接入电路后存在的一些干扰,从示波器实测得到的频率为7100Hz。
2)单片机系统模块
选择单片机是因为有编程灵活、易调试的特点,而且它的引脚较多,利于电路的设计。
它内部集成了CPU,RAM,ROM,定时器/计数器和多功能I/0口等一台计算机所需的基本功能部件。
晶振由外部接入,各个并行口可直接使用,故直接接数码管的段选线,使得硬件设计易于实现,且简化了程序。
单片机的主要功能就是定时一秒钟,统计被测信号的周期个数,在转换、存储、送给单片机的并行口和驱动7407。
3)数码管显示模块
LED显示器采用动态显示方式。
显示时将所有位的段选线相应的并联在一起,由一个8位I/O口即P0口控制,形成段选线的多路复用。
驱动器7407连接位选部分,由P2.4—p2.1口控制。
由于各位的段选线并联,段选码的输出对各位来说都是相同的。
同一时刻,如果各个位选线都处于选通状态的话,四位的LED将显示相同的字符。
要各位LDE能够显示出与本位相应的显示字符,就须采用扫描显示方式。
即在同一时刻,只让某一位的位选线处于选通状态,而其他各位的位选线处于关闭状态,同时,段选线上输出相应位要显示字型码,这样同一时刻,四位LED中只有选通的那一位显示出字符,而其他三位则是熄灭的。
而在下一刻,只让下一位的位选线处于选通状态,而其他各位的位选线处于关闭状态,在段选线上输出相应位将要显示字符的字符码。
这样循环下去,就可以使各位显示出将要显示的字符,虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其他各位熄灭,但由于人眼有视觉残留现象,只要每位显示间隔足够短,则可造成多位同时亮的效果。
所以数码管的作用就是动态显示频率值。
三、软件设计
1、测频工作原理
1)工作方式选择
对一秒钟内的输入脉冲进行计数,计数的个数即为频率。
由此可见首先要实现一秒定时。
在采用12MHz的晶体振荡器的情况下,一秒的定时已超过了定时器可提供的最大定时值。
为了实现一秒的定时,采用定时和计数相结合的方法实现。
选用定时器T1作定时器,工作于方式1产生5ms的定时,再用软件计数方式对它计数200次,就可得到一秒的定时。
而将T0设为计数器工作方式,工作于方式1,所以待测输入信号从P3.4(定时器T0外部计数脉冲输入线)输入。
2)定时器和计数器的初值计算
将定时器/计数器的方式寄存器TMOD,用软件赋初值15H,即00010101B。
这时定时器/计数器1作为定时器,则方式选择位C/T设为0,采用工作方式1,即16位定时器;定时器/计数器0作为计数器,则方式选择位C/T设为1,也采用工作方式1,最大可计到65536。
计数器的初值必然设为0,重要的就是计算定时器T1的初值。
计算定时器T1初值:
设计数初值为X,定时时间为5000us。
根据公式:
X=65536—T*fosc/12
(2)
式中T为定时时间,fosc为晶振频率。
本设计采用12MHz的晶振。
则X=65536—5000*12/12=60536,所以计数初值为60536,用十六进制表示EC78H。
则把ECH赋给TH1,把78H赋给TL1。
3)待测信号频率范围计算及占空比要求
当定时器/计数器T0设定为计数方式时,其计数脉冲的来源是T0端口的外部事件。
内部硬件在每个机器周期采样外部引脚的状态,当一个机器周期采样到高电平,接着的下一个机器周期采样到低电平时计数器加1,也就是说在外部输入电平发生负跳变时加1。
计算机需用两个机器周期来识别1次计数,因而最大计数速率为振荡频率的1/24。
在采用12MHz晶振的情况下,单片机最大计数速度为0.5MHz即500kHz。
所以将待测信号的测量频率范围扩展为100—50000Hz。
另外,此处对外部事件计数脉冲的占空比(即脉冲的持续宽度)无特殊要求,但必须保证所给出的高电平在其改变之前至少被采样1次,即至少保持1个完整的机器周期。
2、计数所得数据处理
1)二进制—十进制转换
单片机采集得到的数据是二进制数,要送入数码管显示,就必须转换为十进制。
转换原理如下:
一个整数的二进制表达式为:
(3)
根据多项式计算方法可改写为:
初值:
B=0;i=m-1
(4)
(5)
结束条件:
i<0。
由这个公式可见,我们只要分别对部分和按十进制数运算方法进行乘2和加bi的运算,就可得到十进制的转换结果,但转换结果是压缩的BCD码。
2)压缩BCD码转换成非压缩BCD码
压缩BCD码R4R5R6,以R5为例,首先赋给A,再将A的低四位清零,高四位保持不变,然后将高低四位调换,就得到了压缩BCD码的高四位,同理再将R5赋给A,A的高四位清零,低四位保持不变,就得到了压缩BCD码的低四位。
以此类推,逐个转换为非压缩BCD码。
3)数码管显示
从图2中可看出,P0.0—P0.7对应的分别是数码管的b、a、f、g、e、d、c、h,所以字型码和字符码的对应关系,如表1所示。
表1
字符码
字型码
字符码
字型码
0
77H
0.
F7H
1
41H
1.
C1H
2
3BH
2.
BBH
3
6BH
3.
EBH
4
4DH
4.
CDH
5
6EH
5.
EEH
6
7EH
6.
FEH
7
43H
7.
C3H
8
7FH
8.
FFH
9
6FH
9.
EFH
共有四个数码管,用扫描的方式显示,每一个时刻只选通一个数码管。
P2.4—P2.1分别驱动一个数码管,所以驱动电路的字型码为EFH、F7H、FBH、FDH。
定时器每中断一次,就显示一位数码管,但这短暂的时间人眼是无法识别的,所以人眼看到的是静态显示。
3、软件程序框图
1)主程序框图
主程序中包含初始化,二十进制转换程序和压缩BCD码转换成非压缩BCD码程序。
其中二十进制转换程序和压缩BCD码转换成非压缩BCD码程序是循环调用的。
图3主程序框图
2)数码管显示的调用函数框图
当频率低于10KHz时,调用函数有四个,QIANW调用函数、BAIW调用函数、SHIW调用函数、GEW调用函数,分别对应数码管的从左到右四位。
当频率不低于10KHz时,调用函数也有四个,QIANW1调用函数、BAIW1调用函数、SHIW1调用函数、GEW1调用函数,分别对应数码管的从左到右四位。
TAB和TAB1是供查表用的。
TAB:
DB77H,41H,3BH,6BH,4DH,6EH,7EH,43H,7FH,6FH
TAB1:
DB0F7H,0C1H,0BBH,0EBH,0CDH,0EEH,0FEH,0C3H,0FFH,0EFH
图4频率低于10KHz时的数码管显示调用框图
图5频率不低于10KHz时的数码管显示调用框图
3)中断函数结构框图
动态扫描显示时间是由定时器1决定的,每中断一次,则显示一个数码管,依次从左往右显示。
中断函数主要负责调用显示程序和存储计数得到的频率值。
图6中断函数结构框图
四,软件源程序代码
数字频率计的程序和解释说明如下:
ORG0000H;程序复位入口地址
AJMPMAIN
ORG001BH;计时器T0的中断入口
AJMPPTF0;跳转到中断程序中
ORG0033H;主程序入口地址
MAIN:
MOVSP,#60H
MOVTH1,#0ECH
MOVTL1,#78H;定时5MS
SETBEA;开放CPU中断
SETBET1;开放定时器中断
MOVTH0,#0
MOVTL0,#0;给计数器T0赋初值0
MOVTMOD,#15H;计时器T1工作在方式1定时模式,计数器T0工作在方式1计数模式
MOV30H,#0C8H;循环200次,共定时1S
MOV40H,#0;用于判断显示数码管哪一位
SETBTR0;启动计数器0
SETBTR1;启动定时器1
LOOP1:
ACALLZHUANH;将二进制数转换为压缩BCD码
ACALLCHAIF;将压缩BCD码转换为非压缩BCD码
AJMPLOOP1;循环处理计数器T0采集得到的数据
PTF0:
MOVTH1,#0ECH
MOVTL1,#78H;给定时器T1重新赋值
INC40H;数码管判断位加1
MOVA,50H
CJNEA,#00H,DAY;判断50H单元是否为零,若为0继续往下执行,若不为0,则跳转到子程序DAY中
MOVA,40H;每5ms显示一位,从最高位开始,到最低位时,返回高位
CJNEA,#1,LOP1
ACALLQIANW
AJMPTIAO
LOP1:
CJNEA,#2,LOP2
ACALLBAIW
AJMPTIAO
LOP2:
CJNEA,#3,LOP3
ACALLSHIW
AJMPTIAO
LOP3:
ACALLGEW
MOV40H,#0
AJMPTIAO
DAY:
MOVA,40H
CJNEA,#1,LP1
ACALLQIANW1
AJMPTIAO
LP1:
CJNEA,#2,LP2
ACALLBAIW1
AJMPTIAO
LP2:
CJNEA,#3,LP3
ACALLSHIW1
AJMPTIAO
LP3:
ACALLGEW1
MOV40H,#0
TIAO:
DJNZ30H,PTFR;判断是否到1S
MOV20H,TH0
MOV21H,TL0;将计数器T0中的数转移到20H,21H中
MOVTH0,#0
MOVTL0,#0;将计数器T0重新赋0
MOV30H,#0C8H
PTFR:
RETI
ZHUANH:
MOVR2,20H;将计数得到的值存入R2和R3中
MOVR3,21H
CLRA
MOVR4,A;将R4、R5、R6清零
MOVR5,A
MOVR6,A
MOVR7,#16
LOOP:
CLRC;将16位二进制数逐位左移一位,移得的数据放入进位C中
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVA,R6;(R4R5R6)+(R4R5R6)+C=(R4R5R6)*2+C
ADDCA,R6
DAA
MOVR6,A
MOVA,R5
ADDCA,R5
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
DJNZR7,LOOP
RET
CHAIF:
MOVA,R5;将压缩BCD码R4R5R6转换为非压缩BCD码,从高到低依次放于50H、51H、52H、53H、54H
ANLA,#0F0H
SWAPA
MOV51H,A
MOVA,R5
ANLA,#0FH
MOV52H,A
MOVA,R6
ANLA,#0F0H
SWAPA
MOV53H,A
MOVA,R6
ANLA,#0FH
MOV54H,A
MOV50H,R4
RET
QIANW:
MOVA,51H;频率不超过10KHZ时,以HZ为单位,四位显示,最高位为千位,以此类推
MOVDPTR,#TAB;千位上显示51H单元中的内容
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0EFH
RET
BAIW:
MOVA,52H;百位上显示52H单元中的内容
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H
RET
SHIW:
MOVA,53H;十位上显示53H单元中的内容
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FBH
RET
GEW:
MOVA,54H;个位上显示54H单元中的内容
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FDH
RET
QIANW1:
MOVA,50H;频率大于10KHZ时,小数点放千位,以KHZ为单位,省去个位,以四位显示
MOVDPTR,#TAB;千位上显示50H单元中的内容
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0EFH
RET
BAIW1:
MOVA,51H;百位上显示51H单元中的内容和显示小数点
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H
RET
SHIW1:
MOVA,52H;十位上显示52H单元中的内容
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FBH
RET
GEW1:
MOVA,53H;个位上显示53H单元中的内容
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FDH
RET
TAB:
DB77H,41H,3BH,6BH,4DH,6EH,7EH,43H,7FH,6FH;0—9
TAB1:
DB0F7H,0C1H,0BBH,0EBH,0CDH,0EEH,0FEH,0C3H,0FFH,0EFH;0.—9.
NOP
END
五、调试与结果分析
1、硬件调试
焊好电路后,首先检查是否有虚焊,如果没有,再上电检测。
电源接好后,第一步检测各芯片是否得电;第二步检测信号源是否产生信号、信号是否标准以及频率是多大;第三步检测数码管是否管用以及连线是否正确。
第一步和第二步很简单,只要用万用表和示波器直接观测即可,重点是第三步。
首先检测数码管的好坏,由于P2.4—P2.1控制数码管的位选线,P0.0—P0.7接数码管的段选线,而且数码管是共阴的,所以只要将+5V电源的地分别接P2.4—P2.1口,若数码管显示8和小数点,说明是好的,四个都检测完后就检查数码管的接线。
首先+5V电源的地接P2.4口,电源的正端接一个1KΩ的电阻,分别点触P0.0—P0.7,若点触到哪一个口,相对应的二极管熄灭,说明连线是正确的。
检测完一个数码管,然后用相同的方法检测完四个数码管。
2、软件调试
本次设计采用的单片机是AEDK51HB仿真机,它具有使用方便灵活,易于调试等特点。
所使用的编程软件是LCA51,操作步骤较为简单。
首先打开LCA51软件,测试串口,然后新建文件,在内部编程,编完程序,保存就可以了,后缀名为.ASM。
接下来就是编译,若有错误,就点击错误提示,找到错误的地方,进行修改,修改完直到没有警告和错误时,在仿真机电源/运行的指示灯为绿色的情况下,点击确定。
下载完成以后,点击全速运行,观察检测结果。
一开始并不熟悉此软件,想当然的把频率计的程序全部写进去,但并没有得到想要的结果,由于程序太长,又不知道具体是哪出错,所以比较难检查。
后来在老师的指导下,我们先编写一些小程序来熟悉此软件,并达到熟练使用的效果。
然后将总程序分为四个部分分别检测。
步骤如下:
a)第一步先编数码管显示程序,看看数码管能不能从0显示到9,每一位都亮,如果对了,再编写测频的显示程序。
利用动态扫描法,逐位显示。
b)第二步编写压缩BCD码拆为非压缩BCD码的程序,编好后可以先设定几个压缩BCD码,利用观察项来观察显示结果对不对,如果不对,就修改程序,改对以后再进行第三步。
c)第三步将二进制—十进制转换程序加到第二步所得程序前面,先给定一个16位的二进制数,比如04B0H,转换为十进制数就是1200,观察拆分后单元内容是不是00H、01H、02H、00H、00H,如果正确说明第三步对了,若有错误,则肯定是转换程序有问题,修改正确以后,剩下的就是总程序的初始化和中断函数了。
d)第四步,初始化程序很简单,主要是中断函数。
调用主程序,若没有结果显示,先查看初始化有没有问题,再看中断函数,如果觉得有不对的地方,不妨改一下,在仿真看看,是否能测出结果,就这样一步一步调下去,还可以利用单步跟踪观察。
我的程序问题就出在中断函数,因为存储单元没有用对。
3、测量结果误差分析
测量结果与理论计算存在较大的差距,但与示波器的观测结果很相近。
究其原因我认为有以下几点:
1)使用的信号发生电路的电阻和电容值,与标称值相差较大。
2)电源波动很大,使得波形不稳定。
3)原理上存在±1误差。
由于该设计是在计数门限时间一秒内的频率信号脉冲数,所以定时开始时的第一个脉冲和定时时间到时的最后一个脉冲信号是否被记录,存在随机性。
4)晶振的准确度会影响一秒定时的准确度,从而引起测量结果误差。
5)当电路整合在一起时,由于后级电路的影响,存在系统误差。
6)定时一秒钟,是由定时器和计数共同完成的,定时5ms,计数200次,由于定时时间短,时间累加存在较大的误差。
但由于硬件电路的要求,必须使用动态显示,且只有一个定时器可供使用,所以定时时间不能变长。
4、测量结果误差补偿方法
根据以上分析,由于晶振、电阻、电容无法改变,所以我们采用软件的方法来补偿误差。
就是多次测量求平均值,我们采用的是8次相加,然后求平均值。
其程序如下:
MOV41H,#9
MOV22H,#0
MOV23H,#0
MOV24H,#0
DJNZ41H,JIAF;判断是否采集满8次
MOV41H,#9;重新赋值
AJMPYIWEI;采集满8次,跳转到除8程序,即右移3位
JIAf:
MOVA,24H;(24H)+(21H)赋给24H
ADDA,21H
MOV24H,A
MOVA,23H;(23H)+(20H)赋给23H
ADDCA,20H
MOV23H,A
MOVA,22H;(22H)+C赋给22H
ADDCA,#0
MOV22H,A
AJMPPTFR
YIWEI:
MOV25H,#3;22H23H24H连续三个单元,带进位位右3次
WWW:
MOVA,22H
RRCA
MOV22H,A
MOVA,23H
RRCA
MOV23H,A
MOVA,24H
RRCA
MOV24H,A
DJNZ25H,WWW
MOV26H,23H
MOV27H,24H
MOV22H,#0
MOV23H,#0
MOV24H,#0
PTFR:
RETI
此程序放在中断函数内,在定时满一秒钟后的地方。
而初值的设定放在主程序的初始化中。
从程序中可看出此时测量结果保存在26H、27H两个连续单元内,所以转换程序中MOVR2,20H;MOVR3,21H两条指令变为MOVR2,26H;MOVR3,27H。
其他地方基本不需要改动。
5、测量结果
根据示波器读出的频率为7100Hz,用单片机检测并由数码管显示的频率范围为7055—7143Hz,其误差在±1%范围内。
所以满足此项要求,其他项要求也已经满足。
六,课程设计体会
经过两个星期的练习,我觉得我的编程能力有了很大的提高,对单片机也有了更加深刻的了解。
能够快速的编写一些小程序,对于比较复杂一点的程序,我也知道该如何简化,分步进行编写,不但编起来简单,而且易于检查。
这次课程设计尽管只有两周的时间,