A27基于51单片机汇编语言6位数码管频率计Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-22 10:36:23    阅读:18 次   消耗积分:15 分

image.png

A27基于51单片机汇编语言6位数码管频率计Proteus设计

用51单片机做一个量程0~65535Hz的频率计:T0当定时器产生1秒闸门,T1当计数器数P3.5脚上来的脉冲,闸门一关就把TH1/TL1的16位二进制数转成5位BCD码送数码管显示。这里面最值钱的是二进制转十进制那段双移位算法,比除法通用得多。资料包含Proteus仿真文件和完整汇编源码。

一、设计实现功能

本设计功能简介:使用51单片机和汇编语言设计一个6位数码管频率计的proteus仿真,要求以下功能:

1、使用汇编语言编写程序。

2、T0工作在定时方式,产生1秒的计数闸门;T1工作在计数方式,统计输入脉冲。

3、5位数码管动态显示测得的频率值,按键控制开始测量。

二、资源汇总

1、仿真文件:Proteus工程,7.8和8.6两个版本都能直接打开。

2、程序文件:main.asm汇编源码,以及编译好的cx.hex。

3、修改日期小工具:购买资料后赠送,用于修改文件创建日期,下载地址在文章最后。

三、设计介绍

拿到压缩包之后先解压,没有解压软件的直接搜"压缩",下载解压软件后先解压文件,再运行仿真和程序。

测试信号接P3.5(T1的计数输入脚),按键接P1.7启动测量。5位数码管段码接P0,位选接P2.0~P2.4。

图1 Proteus仿真总览

仿真原理图

TMOD一个字节同时配置两个定时器,这是本设计的关键:

`asm
MOV TMOD,#51H ;0101 0001B
MOV TH0,#(65536-50000)/256 ;T0定时50ms
MOV TL0,#(65536-50000)MOD 256
MOV TH1,#00H ;T1计数值清零
MOV TL1,#00H
MOV IE,#8AH ;EA=1 + ET0=1 + ET1=1(只开T0中断)
`

位值含义
高4位0101T1:GATE=0、C/T=1(计数)、方式1
低4位0001T0:GATE=0、C/T=0(定时)、方式1

测量流程三步:

1、按键按下(P1.7变低),同时 SETB TR0 和 SETB TR1,闸门打开、计数器开始数。

2、T0每50毫秒中断一次,CNT累加到20就是1秒,这时 CLR TR0、CLR TR1 关闸,把TH1/TL1存起来。

3、调用HTOD把16位二进制转成BCD,再送数码管显示,按键再按一次重新开始。

`asm
INT_T0: MOV TH0,#(65536-50000)/256
MOV TL0,#(65536-50000)MOD 256
INC CNT
MOV A,CNT
CJNE A,#20,RETUNE ;20×50ms=1秒
MOV CNT,#00H
CLR TR0 ;关闸
CLR TR1
MOV VALUEL,TL1 ;锁存计数值
MOV VALUEH,TH1
LCALL HTOD
RETUNE: RETI
`

1秒闸门数到的脉冲数,就是频率(Hz)。这个方法的精度取决于晶振(12MHz晶振的1秒闸门误差约±1个机器周期),误差下限是±1Hz,也叫"±1计数误差",是所有闸门式频率计的通病。量程受16位计数器限制:最大65535,所以这叫0~65535Hz频率计;要测更高频,得先分频再乘回去。

真正需要看懂的是HTOD这段——16位二进制转5位BCD:

`asm
HTOD: MOV R2,VALUEH ;R2R3 = 16位二进制数
MOV R3,VALUEL
CLR A
MOV R4,A ;R4R5R6 = 三个字节BCD,先清零
MOV R5,A
MOV R6,A
MOV R7,#10H ;循环16次,一次处理一位
LOOP1: CLR C
MOV A,R3 ;二进制数左移一位,最高位进C
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6 ;BCD部分也左移一位(×2+进位)
ADDC A,R6
DA A ;十进制调整,自动处理进位
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP1
CZ: MOV R0,#DVALUE4 ;拆成5个单独的数字
MOV A,R6
ANL A,#0FH
MOV @R0,A ;个位
...
`

算法叫"移位加3"(double dabble):把二进制数一位一位移到BCD区,每移一位BCD区整体乘以2,DA A负责在超过9时自动加6修正。16次循环结束,R4R5R6里就是压缩BCD码,再用 ANL A,#0FH 和 SWAP A 把高低半字节拆成独立的数字,存到DVALUE0~DVALUE4。

为什么不用除法?51的 DIV AB 一次只能除以一个8位立即数,要把16位数除10000、1000、100、10得连做四次,代码更长、还容易溢出。移位法只用一个16次循环就全搞定,换8位、24位、32位只是改循环次数和BCD字节数。

显示部分扫描5位:

位位选数据
万位P2.0低DVALUE0
千位P2.1低DVALUE1
百位P2.2低DVALUE2
十位P2.3低DVALUE3
个位P2.4低DVALUE4

特别注意: 显示一直为0,先看信号有没有接到P3.5(T1脚),接P3.4是T0的计数脚,数不到;数值只有实际的一半,说明闸门不是1秒,检查CNT是不是加到20;读数跳变±1~2属于正常的±1计数误差,不是故障;显示乱码,核对数码管共阴共阳和段码表(这份表3FH起是共阴编码);测量高频时数值封顶65535,是16位计数器溢出了,需要外加分频器。

四、日期修改

资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。

五、资料下载

付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A26基于51单片机汇编语言8位数码管滚动显示器Proteus设计
下一篇:A28基于51单片机汇编语言蜂鸣器警报声Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}