51单片机频率计课设
设计题目:简易数字频率计 系 别:控制工程学院 专 班级学号: 姓 名: 指导教师: 设计时间:
《单片机课程设计》设计报告
简易数字频率计设计
设计任务:采用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. 程序清单和系统原理图
; 小组成员:5100314 吴晓敏 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
5100333贺苗 5100332 吴韵巧 5100312 金林鑫
; 测量范围1HZ 到458KHZ 超出范围时六个数码管显示“------”
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 add a,#0F9h
; 定时器停止定时
; 计数器停止计数
; 把计数器中断的次数给A ; 将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 right:call Display 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
mov 51h,#0 setb tr0
NEXT:
MOV TL1, #01H MOV TH1, #4cH setb tr1 RETI mistakes: mov 30h,#10 mov 31h,#10 mov 32h,#10 mov 33h,#10 mov 34h,#10 mov 35h,#10 jmp right
INTR0: CLR TR0 clr c
INC 51H mov A,40H
; 将要显示的数放入30H ————35H
; 调用显示程序。将测得的频率显示到6个七段数码管上
; 重新赋计数初值
; 初始化6位要显示的数 ; 初始化计数器0的中断次数 ; 开启计数器0 ; 重新赋定时器初值 ; 开启定时器1 ; 如果超出量程,则显示------
; 计数器0中断,
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
RRC A
mov a,42H
addc a,#5
da a
MOV B,#16
DIV AB
mov 42H,B
RRC A
mov a,43H
addc a,#5
da a
MOV B,#16
DIV AB
mov 43H,B
RRC A
mov a,44H
addc a,#6
da a
MOV B,#16
DIV AB
mov 44H,B
RRC A
mov a,45H
addc a,#0
da a
mov 45H,a
mov TH0,#00H
mov TL0,#00H
SETB TR0
reti
Handle:
clr c ; 十位相加,并转换成BCD 码,十位放在41H 。 ; 百位相加,并转换成BCD 码,百位放在42H 。 ; 千位相加,并转换成BCD 码,千位放在43H 。 ; 万位相加,并转换成BCD 码,万位放在44H 。 ; 十万位相加,并转换成BCD 码,十万位放在45H 。 ; 重新赋计数初值 ; 开启计数器0 ; 将最后的计数值加上(中断次数*65536),并转换成BCD 码
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 ; 查询要显示的数
; 将要显示的数送到B 口
; 延时 mov dptr,#0ff21h movx @dptr,a 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
MOV A,R2
ADDC A,R2
MOV R2, A ; R2循环自加
;R3循环自加 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 end
;0,1,2,3,4,5,6,7,8,9,-