51单片机频率计课设
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《单片机课程设计》设计报告
设计题目:简易数字频率计
系别:控制工程学院
专业:自动化
班级学号:
姓名:
指导教师:
设计时间:
简易数字频率计设计
设计任务:采用A T89S52单片机测量实验室产生的方波脉冲频率,将待测频率接至T0引脚,测量方波频率并显示。
1.总体方案设计
(1).设计思路
本次课程设计是基于51单片机的频率计设计。
该课程设计是能实现精确测量频率。
由于计数器最大能计数的频率为f/24=460.8KHz。
本设计为了便于编程将最大测量频率限制在65536*7=458.752KHz。
如果超出最大频率数码管将显示------。
该设计通过定时器1定时1S,待测频率通过计数器0在1S内的计数值得出。
每1S显示一次待测频率值。
由于最大频率可达458.752KHz,而每次计数值最大只能达到65536,所以计数器0每产生一次中断,需要将计数值加65536,并给计数初值赋0重新计数,直到1S定时时间到。
计数值计算公式为(最后一次计数值+计数器0溢出次数*65536)。
将得到的计数值经处理后转换成BCD码分别在6个数码管上显示。
本次设计,利用了定时器,计数器,中断,查表,8255扩展端口等,设计出硬件电路。
最后在PROTEUS上进行仿真。
(2).系统总体结构
(2).芯片选择
本设计主要采用A T89S52,8255A,74LS373,等构成测量系统。
74LS373芯片
为了实现P0口的复用,应在P0口连上74LS373,通过锁存器输出A0,A1(连接到8255A)。
74LS373芯片为三态输出的锁存器。
当三态允许控制端OE为低电平的时候,Q0~Q7为正常逻辑状态,可用来驱动负载或总线。
当OE为高电平时,Q0~Q7呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。
当锁存器允许端LE为高电平时,Q随数据D而变化。
当LE为低电平时,Q被锁存在已经建立的数据电平。
74LS245芯片
74LS245是8路同相三态双向总线收发器,可双向传输数据。
当片选端CE低电平有效时,DIR 为低电平,信号由B向A传输;DIR为高电平,信号由A向B传送。
当片选端CE高电平时,A,B
均为高阻态。
74ls240芯片
74ls240是八单线驱动器。
(反码,三态输出)这种八缓冲器和线驱动器是为提高三态输出存储地址驱动器,时钟驱动器和总线定向接收器和发射器的性能可和集成度而特意设计的。
设计者可按需要将原码,反码输出。
OE(低电平输出控制)。
8255芯片
由于接口有限,所以因使用8255A进行接口的扩展,使用8255A的A、B口作为数码管显示电路的扩展。
8255是可编程并行I/O接口单元,可作为单片机与多种外设连接时的中间接口电路。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,数据总线DB:D0~D7,用于8255和CPU传送8位数据,地址总线AB:A0~A1,用于选择A、B、C口与控制寄存器;控制总线CB:片选信号、复位信号、读写信号。
当CPU要对8255进行读或写数据的操作时,必须先向8255片选信号选中8255芯片,然后发读信号或者写信号对8255进行读或写数据的操作。
在本设计中,8255的PA口用于数码管的位选择,用于选中数码管;PB口用于数码管的字形选择。
实验室8255地址分配
(3)定时计数方式
设计中使计数器0工作在模式1进行对外部脉冲频率的计数。
定时器1工作在模式1进行定时。
当定时达到1S时,显示频率值。
2.硬件电路设计
(1).单片机最小系统
(2).单片机测量系统设计
只需将被测电路接到T0口即可。
(3).显示电路与A T89S52单片机接口电路
3.软件设计
1.主程序流程图
2.方波频率测量流程图
3.显示程序流程图
4.调试与测试结果分析
(1).实验系统连线
实验系统连线时将待测频率接到T0口。
(2).程序调试
本次设计首先采用了仿真软件调试,仿真软件使用PROTEUS。
在仿真过程中,遇到了一系列的问题,首先是8255的扩展接线时没有在P0口接上地址锁存器74LS373,导致单片机无法访问8255A的A、B口。
在接线正确后,进行了程序调试。
1.首先出现了测量精度低的问题,为了简化对频率值的处理,一开始采用了定时100MS,使单片机每计数100MS就输出频率值。
频率值=计数器值*10。
该方法在大频率测量是误差较小,但是测量小频率信号时,误差极大。
改进方案:定时器定时1S。
当计数器每次次溢出时将65536的个位与40H进行带进位的BCD码相加,十位与41H,进行带进位BCD码相加·······十万位与45H进行带进位BCD码相加。
当定时时间到后。
将最后一次的计数值进行BCD码转换,分别存储,并与40H到45H单元里的数分别进行带进位BCD码相加。
最后显示6位BCD码。
这样即可得到更精确的测量值。
但代码量变大。
2.调试同时也出现了数码管不亮的问题。
原因是由于定时1S,而数码管显示时间只有几毫秒。
在等待中断的时间内,数码管是不扫描显示的。
解决该问题的方法:将数码管显示程序写在等待中断的程序中。
这样可以使等待中断时进行实时显示。
3.在PROTEUS中,频率测量范围能达到1HZ——999KHZ。
但实验室中,测量值达到500KHZ 时出现了较大的误差,1M时出现了错误的显示。
原因有以下几点
a.PROTEUS仿真是在理想情况下仿真与实际捕捉脉冲不同。
b.在实际情况下单片机计数采样应是检测一个从1至0的跳变时计数器值加1。
如果前一个周期采样值为1,而下一个周期采样值为0,则计数器加1. 由此可见,检测一个1至0的跳变至少需要两个机器周期。
所以最高计数频率应为f/24=460.8KHZ,因此在实验室测量500KHZ时出现了较大的偏差。
(3).实验结果分析
本次实验实现了最频率计的实时测量,实时更新数码管。
测量范围为1HZ到458.752KHZ。
当测量频率范围超过最大值时,数码管将显示------ 提醒使用者,频率计超出量程。
4.总结
本次课程设计收获很大
5.程序清单和系统原理图
;小组成员:吴晓敏贺苗吴韵巧金林鑫
;测量范围1HZ到458KHZ 超出范围时六个数码管显示“------”
ORG 0000H
JMP START
ORG 001BH
JMP INTR1
ORG 000BH
JMP INTR0
org 0050H
START:
mov 40H,#0
mov 41H,#0
mov 42H,#0
mov 43H,#0
mov 44H,#0
mov 45H,#0 ;将要显示的数放在40H到45H。
最高位放在40H,最低位放在45H
mov 51h,#0 ;51H中存放计数器0中断的次数,如果超过6次,则计数会超过f/24,出现错误
mov sp,#80h
mov dptr,#0ff23h
mov a,#81h
movx @dptr,a ;设置8255为A,B口输出
MOV TMOD, #15H ;设置计数器0工作在工作模式1,定时器1工作在工作模式1
MOV TH0, #00H
MOV TL0, #00H ;计数器赋初值,从0开始计数
MOV TH1, #4cH
MOV TL1, #01H ;定时器赋初值,定时50MS
SETB ET1
SETB ET0
SETB EA ;开启计数器0中断,定时器1中断
SETB TR0 ;计数器开始计数
SETB TR1 ;定时器开始计数
mov 50H,#20 ;定时器循环20次,产生1S定时
wait:
call display
sjmp wait ;循环等待
intr1:
djnz 50H,next
CLR TR1 ;定时器停止定时
CLR TR0 ;计数器停止计数
mov a,51h ;把计数器中断的次数给A
add a,#0F9h ;将A与F9H相加,如果A大于等于7,则计算结果发生溢出,Cy=1
JC mistakes ;当计数次数超过f/24时(cy=1时),跳转到错误处理程序。
如果没有超过,则执行下一条指令。
call BCD ;调用16位二进制数转换成BCD码的程序,将最后一次计数值的最高位放在R4,最低位放在R0
call handle ;调用处理程序,将最后一次计数值与(计数器溢出中断次数*65536)相加,并转换成BCD码,最高位放在45H,最低位放在40H
mov 30h,40h
mov 31h,41h
mov 32h,42h
mov 33h,43h
mov 34h,44h
mov 35h,45h ;将要显示的数放入30H————35H
right:call Display ;调用显示程序。
将测得的频率显示到6个七段数码管上
MOV 50h,#20
mov TL0,#00H
mov TH0,#00H ;重新赋计数初值
mov 40H,#0
mov 41h,#0
MOV 42H,#0
MOV 43H,#0
MOV 44H,#0
MOV 45H,#0 ;初始化6位要显示的数
mov 51h,#0 ;初始化计数器0的中断次数
setb tr0 ;开启计数器0
NEXT:
MOV TL1, #01H
MOV TH1, #4cH ;重新赋定时器初值
setb tr1 ;开启定时器1
RETI
mistakes:
mov 30h,#10
mov 31h,#10
mov 32h,#10
mov 33h,#10
mov 34h,#10
mov 35h,#10 ;如果超出量程,则显示------
jmp right
INTR0: ;计数器0中断,
CLR TR0
clr c
INC 51H
mov A,40H
da a
mov b,#16
div ab
mov 40H,b ;个位相加,并转换成BCD码,个位放在40H。
RRC A
mov a,41H
addc a,#3
da a
mov b,#16
div ab
mov 41H,b ;十位相加,并转换成BCD码,十位放在41H。
RRC A
mov a,42H
addc a,#5
da a
MOV B,#16
DIV AB
mov 42H,B ;百位相加,并转换成BCD码,百位放在42H。
RRC A
mov a,43H
addc a,#5
da a
MOV B,#16
DIV AB
mov 43H,B ;千位相加,并转换成BCD码,千位放在43H。
RRC A
mov a,44H
addc a,#6
da a
MOV B,#16
DIV AB
mov 44H,B ;万位相加,并转换成BCD码,万位放在44H。
RRC A
mov a,45H
addc a,#0
da a
mov 45H,a ;十万位相加,并转换成BCD码,十万位放在45H。
mov TH0,#00H
mov TL0,#00H ;重新赋计数初值
SETB TR0 ;开启计数器0
reti
Handle: ;将最后的计数值加上(中断次数*65536),并转换成BCD码clr c
addc A,40H
da a
mov b,#16
div AB
mov 40h,B ;个位相加RRC A
mov a,r1
addc a,41H
da a
MOV B,#16
DIV AB
mov 41h,B ;十位相加RRC A
mov a,r2
addc a,42h
da a
MOV B,#16
DIV AB
mov 42h,B ;百位相加RRC A
mov a,r3
addc a,43H
da a
MOV B,#16
DIV AB
mov 43h,B ;千位相加RRC A
mov a,R4
addc a,44H
da a
MOV B,#16
DIV AB
mov 44h,B ;万位相加
RRC A
mov A,45H
addc A,#0
da a
mov 45H,a ;十万位相加
ret
Display: ;显示程序
mov dptr,#0ff20h
mov a,#0FEH
movx @dptr,a ;进行位选,选中个位
mov a,30h
movc a,@a+dptr ;查询要显示的数mov dptr,#0ff21h
movx @dptr,a ;将要显示的数送到B口call delay ;延时
mov dptr,#0ff20h ;十位显示程序
mov a,#0FDh
movx @dptr,a
mov dptr,#segtab
mov a,31h
movc a,@a+dptr
mov dptr,#0ff21h
movx @dptr,a
call delay
mov dptr,#0ff20h ;百位显示程序
mov a,#0FBH
movx @dptr,a
mov dptr,#segtab
mov a,32h
movc a,@a+dptr
mov dptr,#0ff21h
movx @dptr,a
call delay
mov dptr,#0ff20h ;千位显示程序mov a,#0F7H
movx @dptr,a
mov dptr,#segtab
mov a,33h
movc a,@a+dptr
mov dptr,#0ff21h
movx @dptr,a
call delay
mov dptr,#0ff20h ;万位显示程序mov a,#0EFH
movx @dptr,a
mov dptr,#segtab
mov a,34h
movc a,@a+dptr
mov dptr,#0ff21h
call delay
mov dptr,#0ff20h ;十万位显示程序
mov a,#0DFH
movx @dptr,a
mov dptr,#segtab
mov a,35H
movc a,@a+dptr
mov dptr,#0ff21h
movx @dptr,a
call delay
ret
BCD:
MOV R0,TH0
MOV R1,TL0
CLR A
MOV R2, A
MOV R3, A
MOV R4, A
MOV R5, #16 ;初始化R2,R3,R4
LOOP:
CLR C
MOV A, R1
RLC A
MOV R1, A
MOV A, R0
RLC A
MOV R0, A ;将16位数的最高位移出放入Cy
MOV A, R4
ADDC A, R4
DA A
MOV R4, A ;溢出的数放入R4进行自加相当与乘2.最高位的BCD码为最高位*2^15(相当于自加15次)后面几位同理
MOV A,R3
ADDC A,R3
DA A
MOV R3, A ;R3循环自加
MOV A,R2
ADDC A,R2
MOV R2, A ; R2循环自加
DJNZ R5, LOOP
MOV A, R4
MOV B, #16
DIV AB
MOV R1, A
MOV R0, B
MOV A,R2
MOV R4,A
MOV A,R3
MOV B,#16
DIV AB
MOV R3, A
MOV R2, B ;将最高位放在R4,最低位放在R0
ret
delay:
mov r6,#20
DEL1:mov r7,#20
DEL2:djnz r7,DEL2
djnz r6,del1
ret
segtab: db 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH ;0,1,2,3,4,5,6,7,8,9,- end。