单片机频率计实验报告.docx
- 文档编号:8667415
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:25
- 大小:378.30KB
单片机频率计实验报告.docx
《单片机频率计实验报告.docx》由会员分享,可在线阅读,更多相关《单片机频率计实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
单片机频率计实验报告
单片机频率计实验报告
单片机课程设计报告
基于AT89C51的数字频率计
学院名称:
电气信息工程学院
专业:
班级:
姓名:
学号:
指导老师:
设计时间:
2014年3月
二.设计要求..........................................1
2.1技术要求
2.2LED数码显示
3.1功能指标
3.2硬件电路设计
3.3软件程序设计
5.1流程图
5.2子程序
六.总程序设计........................................12
七.系统调试及结果分析..................................16
7.1硬件调试
7.2软件调试
7.3结果分析
八.注意事项.............................................17
十.参考文献.............................................18
附录:
元件清单
概述:
0
0
0
1
1
1
1
1
1
3EH
1
0
0
0
0
0
1
1
0
06H
2
0
1
0
1
1
0
1
1
5BH
3
0
1
0
0
1
1
1
1
4FH
4
0
1
1
0
0
1
1
0
66H
5
0
1
1
0
1
1
0
1
6DH
6
0
1
1
0
1
1
0
1
7DH
7
0
0
0
0
0
1
1
1
07H
8
0
1
1
1
1
1
1
1
7FH
9
0
1
1
0
1
1
1
1
6FH
该电路采用AT89C51单片机最小化应用,采用共阴7段LED数码管显示器,P3.4口引入脉冲信号,P2.0至p2.3口作为列扫描输出,P0口输出段码数据,采用12Mhz晶振,可提高计数的精确度。
三.频率计设计原理
对一秒钟内的输入脉冲进行计数,计数的个数即为频率。
可设置T1为定时器工作方式,定时时间为1秒。
开中断。
而将T0设为计数器工作方式,待测输入脉冲从P3.4输入。
起计数初值清零,即TH0TL0=0000H。
在一秒定时到时,在T1的中断服务程序中,读取TH0TL0中的计数值到内存中的频率单元。
并随后清零TH0TL0,以便下次读数。
读到的计数值即为频率值,经二——十进制转换子程序为十进制,并拆为非压缩BCD码后送显示缓冲区显示。
设计框图
3.1功能指标
(1)输入脉冲幅度:
0-5V
(2)频率测量范围:
100-10000HZ
(3)测量精度:
±1%
(4)显示方式:
四位数字显示
对一秒钟内的输入脉冲进行计数,计数的个数即为频率。
3.2硬件电路设计
上网查找关于51单片机的引脚图,以及74LS07的引脚图,共阴极数码管的显示方式。
a.单片机引脚图
1.VCC——运行时加+5V
2.GND——接地
3.XTAL1——振荡器反相放大器及内部时钟发生器的输入端
4.XTAL2——振荡器反相放大器的输出端
自激振荡器
5.RST——复位输入,高电平有效,在晶振工作时,在RST引脚上作用2个机器周期以上的高电平,将使单片机复位。
WDT溢出将使该引脚输出高电平,设置SFTAUXR的DISRTO位(地址8EH)可打开或关闭该功能。
DISRTO位缺省为RESET输出高电平打开状态。
6.P端口——P1、P2、P3口是一组带内部上拉电阻的8位双向I/O口。
P0口没有内接上拉电阻,故需要外部接上一排阻充当P0口的上拉电阻。
可以用P口接按键来实现外加功能。
(P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0(外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(计时器0外部输入)
P3.5T1(计时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
)
b.74LS07驱动器
六驱动器(OC高压输出)74LS07
74LS07具有稳压驱动作用,可以通过74LS07驱动器来驱动四位数码管。
c.七段数码管
所使用的数码管为共阴极,使用时将四个数码管的公共端通过74LS07连接到单片机对应的P2口,从而用P2口来点亮相应的数码管,即P2口输出为低电平时,对应的数码管点亮;将其他段选信号脚接到P0口,当P0口部分端输出为高电平时,则点亮相应的字段。
3.3软件程序设计
对于定时器服务子程序,设置TH1=0F0HTL1=60H,从而产生5ms的脉冲,循环200次,实现定时1秒的目的。
MOVSP,#60H;设置堆栈指针
MOVTMOD,#15H;定时器T1工作在方式1定时模式,计数器T0工作在方式1计数模式
MOVTH1,#0ECH;T1置计数初值,定时5mS
MOVTL1,#78H
SETBEA;CPU开中断
SETBET1;允许定时器/计数器T1中断
MOVTH0,#0
MOVTL0,#0;给计数器T0赋初值0
MOV30H,#200;循环200次200*5=1S定时1S
MOV33H,#0;用于判断显示数码管哪一位
SETBTR1;启动定时器1
SETBTR0;启动计数器0
字库的选择,根据端选引脚(abcdefg)与P0口连接情况进行汇编,若hcdegfab依次与P0.7—-P0.0相连,则0可表示为:
77H。
为了焊接的方便,现将引脚连接如下:
P0.0
P0.1
P0.2
P0.3
P0.4
P0.5
P0.6
P0.7
P2.0
P2.1
P2.2
P2.3
a
b
c
d
e
f
g
h
1
2
3
4
可以得到相应的字库为(加h位):
0
1
2
3
4
5
6
7
8
9
0BFH
86H
0DBH
0CFH
0E6H
0EDH
0FDH
87H
0FFH
0EFH
四.单片机的硬件连接图
(1)电路原理图如下
电路连接原理图
(2)硬件安装图如下
五.流程图
a.主程序流程图
ORG0000H;程序复位入口地址
AJMPMAIN;转移到主程序
ORG001BH;定时器T1的中断入口
AJMPPFRO;跳转到中断程序中
ORG0022H;主程序入口地址
MAIN:
MOVSP,#60H;设置堆栈指针
MOVTMOD,#15H;定时器T1工作在方式1定时模式,计数器T0工作在方式1计数模式
MOVTH1,#0ECH;T1置计数初值,定时5mS
MOVTL1,#78H
SETBEA;CPU开中断
SETBET1;允许定时器/计数器T1中断
MOVTH0,#0
MOVTL0,#0;给计数器T0赋初值0
MOV30H,#200;循环200次200*5=1S定时1S
MOV33H,#0;用于判断显示数码管哪一位
SETBTR1;启动定时器1
SETBTR0;启动计数器0
LOOP:
ACALLBCD;将二进制数转换为压缩BCD码
ACALLNBCD;将压缩BCD码转换为非压缩BCD码
AJMPLOOP;循环处理计数器T0采集得到的数据
PFRO:
MOVTH1,#0ECH;中断程序
b.定时器1中断服务程序
MOVTL1,#78H;给定时器T1重新赋值
INC33H;数码管判断位加1
MOVA,40H;非压缩BCD码最高位
CJNEA,#0,WANW;判断40H单元是否为零,若为0继续往下执行,若不为0,则跳转到子程序WANW中
MOVA,33H;每5ms显示一位,从最高位开始,到最低位时,返回高位
CJNEA,#1,LOP1;判断40H单元是否为1,若为
1继续往下执行,若不为1,则跳转到子程序LOP1中
ACALLQIAW;千位
AJMPDSHI
LOP1:
CJNEA,#2,LOP2
ACALLBAIW;百位
AJMPDSHI
LOP2:
CJNEA,#3,LOP3
ACALLSHIW;十位
AJMPDSHI
LOP3:
ACALLGEEW;个位
MOV33H,#0
AJMPDSHI
DSHI:
DJNZ30H,FHUI;判断是否到1S
MOV20H,TH0
MOV21H,TL0;将计数器T0中的数转移到20H,21H中
MOVTH0,#0
MOVTL0,#0;将计数器T0重新赋0
MOV30H,#200
FHUI:
RETI
c.二进制转换为压缩BCD码
BCD:
MOVR2,20H;将计数得到的值存入R2和R3中
MOVR3,21H
CLRA
MOVR4,#0;将R4、R5、R6清零
MOVR5,#0
MOVR6,#0
MOVR7,#16
LOP:
CLRC;将16位二进制数逐位左移一位,移得的数据放入进位C中
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVA,R6
ADDCA,R6
DAA
MOVR6,A
MOVA,R5
ADDCA,R5
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
DJNZR7,LOP
RET
d.压缩BCD码转换为非压缩BCD码
NBCD:
MOVA,R5
;将压缩BCD码R4R5R6转换为非压缩BCD码,
从高到低依次放于40H、41H、42H、43H、44H
ANLA,#0F0H
SWAPA
MOV41H,A
MOVA,R5
ANLA,#0FH
MOV42H,A
MOVA,R6
ANLA,#0F0H
SWAPA
MOV43H,A
MOVA,R6
ANLA,#0FH
MOV44H,A
MOV40H,R4
RET
e.显示子程序(以10K位为例)
WANW:
MOVA,33H;10KHZ
CJNEA,#1,LOOP1
ACALLQIAW1
AJMPDSHI
LOOP1:
CJNEA,#2,LOOP2
ACALLBAIW1
AJMPDSHI
LOOP2:
CJNEA,#3,LOOP3
ACALLSHIW1
AJMPDSHI
LOOP3:
ACALLGEEW1
MOV33H,#0
AJMPDSHI
六.总程序设计
ORG0000H;程序复位入口地址
AJMPMAIN;转移到主程序
ORG001BH;定时器T1的中断入口
AJMPPFRO;跳转到中断程序中
ORG0022H;主程序入口地址
MAIN:
MOVSP,#60H;设置堆栈指针
MOVTMOD,#15H;定时器T1工作在方式1定时模式,计数器T0工作在方式1计数模式
MOVTH1,#0ECH;T1置计数初值,定时5mS
MOVTL1,#78H
SETBEA;CPU开中断
SETBET1;允许定时器/计数器T1中断
MOVTH0,#0
MOVTL0,#0;给计数器T0赋初值0
MOV30H,#200;循环200次200*5=1S定时1S
MOV33H,#0;用于判断显示数码管哪一位
SETBTR1;启动定时器1
SETBTR0;启动计数器0
LOOP:
ACALLBCD;将二进制数转换为压缩BCD码
ACALLNBCD;将压缩BCD码转换为非压缩BCD码
AJMPLOOP;循环处理计数器T0采集得到的数据
PFRO:
MOVTH1,#0ECH;中断程序
MOVTL1,#78H;给定时器T1重新赋值
INC33H;数码管判断位加1
MOVA,40H;非压缩BCD码最高位
CJNEA,#0,WANW;判断40H单元是否为零,若为0继续往下执行,若不为0,则跳转到子程序WANW中
MOVA,33H;每5ms显示一位,从最高位开始,到最低位时,返回高位
CJNEA,#1,LOP1;判断40H单元是否为1,若为1继续往下执行,若不为1,则跳转到子程序LOP1中
ACALLQIAW;千位
AJMPDSHI
LOP1:
CJNEA,#2,LOP2
ACALLBAIW;百位
AJMPDSHI
LOP2:
CJNEA,#3,LOP3
ACALLSHIW;十位
AJMPDSHI
LOP3:
ACALLGEEW;个位
MOV33H,#0
AJMPDSHI
WANW:
MOVA,33H;10KHZ
CJNEA,#1,LOOP1
ACALLQIAW1
AJMPDSHI
LOOP1:
CJNEA,#2,LOOP2
ACALLBAIW1
AJMPDSHI
LOOP2:
CJNEA,#3,LOOP3
ACALLSHIW1
AJMPDSHI
LOOP3:
ACALLGEEW1
MOV33H,#0
AJMPDSHI
DSHI:
DJNZ30H,FHUI;判断是否到1S
MOV20H,TH0
MOV21H,TL0;将计数器T0中的数转移到20H,21H中
MOVTH0,#0
MOVTL0,#0;将计数器T0重新赋0
MOV30H,#200
FHUI:
RETI
BCD:
MOVR2,20H;将计数得到的值存入R2和R3中
MOVR3,21H
CLRA
MOVR4,#0;将R4、R5、R6清零
MOVR5,#0
MOVR6,#0
MOVR7,#16
LOP:
CLRC;将16位二进制数逐位左移一位,移得的数据放入进位C中
MOVA,R3
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVA,R6
ADDCA,R6
DAA
MOVR6,A
MOVA,R5
ADDCA,R5
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
DJNZR7,LOP
RET
NBCD:
MOVA,R5;将压缩BCD码R4R5R6转换为非压缩BCD码,从高到低依次放于40H、41H、42H、43H、44H
ANLA,#0F0H
SWAPA
MOV41H,A
MOVA,R5
ANLA,#0FH
MOV42H,A
MOVA,R6
ANLA,#0F0H
SWAPA
MOV43H,A
MOVA,R6
ANLA,#0FH
MOV44H,A
MOV40H,R4
RET
QIAW:
MOVA,41H;频率不超过10KHZ时,以HZ为单位,四位显示,最高位为千位,以此类推
MOVDPTR,#TAB2;千位上显示41H单元中的内容
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H
RET
BAIW:
MOVA,42H;百位上显示42H单元中的内容
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FBH
RET
SHIW:
MOVA,43H;十位上显示43H单元中的内容
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FDH
RET
GEEW:
MOVA,44H;个位上显示44H单元中的内容,显示小数点,表示可测量频率小于10KHZ
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FEH
RET
QIAW1:
MOVA,40H;频率大于10KHZ时,小数点放千位,以KHZ为单位
MOVDPTR,#TAB1;千位上显示40H单元中的内容
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0EFH
RET
BAIW1:
MOVA,41H;百位上显示41H单元中的内容和显示小数点
MOVDPTR,#TAB2
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0F7H
RET
SHIW1:
MOVA,42H;十位上显示42H单元中的内容
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FBH
RET
GEEW1:
MOVA,43H;个位上显示43H单元中的内容
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVP0,A
MOVP2,#0FDH
RET
TAB1:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;GFEDCBA
TAB2:
DB0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH;HGFEDCBA
END
七.系统调试及结果分析
7.1硬件调试
硬件电路板焊接好以后,先用万用表测试电路中有无虚焊短接之处,将所有的电源及地线测量一下,看有无遗漏。
测试无误后,将板子通电,用万用表检测电源和地线之间是否是5V电压,测量无误后,进行静态调试。
取两根线一端接地,另一端接P2.0~P2.3口中的一个口,若对应数码管亮,再用另一根导线,其中一端接地,另一端与P0.0~P0.7依次接触,看数码管各段的亮灭情况,从而判断每个数码管各段的好坏及电路的是否正确。
若有异常显示,则需查找对应接线。
通电后,将示波器一端接地,另一端接P3.4口,看波形是否为方波。
(周期T大约为6.7ms)
7.2软件调试
将编好的子程序进行编译仿真,并进行调试。
若有错误显示,则需一一改正后,再进行调试。
将所有子程序仿真完毕后,在调试总程序,进行仿真,通过仿真头连接到电路板上进行调试。
7.3结果分析
1.故障分析:
问题1:
无方波显示
解决办法:
查看是否是连接的到T0(14管教),如连接正常,则查看电路是否有漏焊或虚焊。
问题2:
数码管不亮
解决办法:
查看硬件电路发现数码管的公共端没有接,用电烙铁全部连起来
问题3:
用程序驱动数码管发现出现乱码
解决办法:
先查看程序是否编码错误,若无错误,查找焊接。
由于焊接电路时,数码管7段显示没有按照顺序接,P2口也没按顺序接,然后调整程序和电路板。
2.误差分析
由原理图可知频率的理论值f=1/(2.2RC)=189.6HZ,由示波器读出来的值为149.1HZ。
有数码管读出来的值148到153之间变化。
由于单片机的计数的速率限制会存在误差,测得是瞬时频率,所以数码管或跳动。
可能是产生信号源的电路所产生的脉冲不稳定,导致结果有误差。
还有可能硬件电路焊接的问题,焊锡的多少,导线的长短有关。
还有误差来源有可能来自振荡电路,12MHZ的晶振准确度不够。
从而引起结果误差。
八.注意事项
1.在焊接电路板之前,先画好硬件原理图,在电路板上面排版,使得元器件都合理分布,芯片朝一个方向,同时使仿真头不会挡住数码管。
2.焊接器件时,应遵循由小及大,由埃及高的原则排列,同时焊的时候焊管座,不要插芯片。
3.焊接完一个模块都要用万用表检测电路是否出现短接,如果出现短路,需要检测出现短路的地方。
4.电路板及访真机接电源操作时,要注意正负极,不要带电操作,以免造成元器件和仿真机的损坏。
(本实验黑为正极,红为负极)
5.在使用仿真头的时候,应把所有的引脚全部对齐后再均匀用力按下,不要压断或者压弯引脚,取下仿真头是应用起子或者镊子,从两边撬开,待引脚连接松动后,两边同时用力,轻轻拔出,并给仿真头安上保护套。
九.心得体会
虽然这门课修过公选,但时隔一年本就不大熟的知识更加淡漠,完成整体设计颇费周折。
在这过程中书到用时方恨少,天下还是好人多——同学和老师的帮助给了我莫大的动力。
,我相信这过程必然对我今后的学习和工作产生积极的影响。
硬件的设计跟焊接都要我们自己动手去焊,软件的编程也要我们不断的调试,最终一个能完成课程设计的劳动成果出来了,很高兴它能按着设计的思想与要求运动起来,那便我的辛劳的结晶。
当然本次选择设计的定时数字频率计,因为受材料和个人知识水平的限制只
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 频率计 实验 报告