A23基于51单片机汇编语言独立按键LED累加器Proteus设计
作者:单片机仿真   类别:51单片机仿真    日期:2026-10-22 10:36:10    阅读:16 次   消耗积分:5 分

image.png

A23基于51单片机汇编语言独立按键LED累加器Proteus设计

用51单片机的计数器方式做按键累加:T0不接内部时钟,而是数P3.4脚上的按键脉冲,每按一次TL0加1,主程序把TL0原样送到P1口,8个LED用二进制显示当前次数,0数到255再回卷。整段程序只有7行,但是把"定时器当计数器用"这件事讲透了。资料包含Proteus仿真文件和完整汇编源码。

一、设计实现功能

本设计功能简介:使用51单片机和汇编语言设计一个独立按键LED累加器的proteus仿真,要求以下功能:

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

2、T0工作在计数器方式1,统计T0引脚(P3.4)上的按键脉冲个数。

3、P1口接8个LED,二进制显示累加值,溢出后自动回卷。

二、资源汇总

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

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

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

三、设计介绍

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

电路两部分:按键接P3.4(T0计数输入脚),8个LED接P1.0~P1.7,低电平点亮。注意T0的计数输入是P3.4,这是硬件固定引脚,按键必须接这里,接别的口数不到。

图1 Proteus仿真总览

仿真原理图

全部程序就这7行:

`asm
ORG 0
MOV TMOD,#00000101B ;T0方式1,C/T=1 计数方式
MOV TH0,#0 ;初值清零
MOV TL0,#0
SETB TR0 ;启动T0开始数脉冲
LOOP: MOV P1,TL0 ;低8位计数直接送P1显示
LJMP LOOP ;循环刷新
END
`

关键在TMOD这个字节:

位值含义
GATE0不门控,TR0=1就启动
C/T1计数方式,数T0引脚脉冲(0=定时,数内部机器周期)
M1 M001方式1,16位计数器

· 定时方式数的是"时间":每个机器周期加1,12MHz下1微秒加1。

· 计数方式数的是"事件":T0引脚(P3.4)每来一个下降沿加1,跟时间无关。

所以同一段代码,TMOD写01H是定时器(A21、A24都用这个),写05H就变成计数器,这是51定时器最容易被忽略的一个开关。

显示部分是MOV P1,TL0,TL0是计数值的低8位,直接送到端口,8个LED就是8位二进制:

按键次数TL0P1输出LED显示(低电平亮)
000H0000 0000全灭
101H0000 0001最右1个亮
202H0000 0010右数第2个亮
303H0000 0011右数2个亮
505H0000 01011、3位亮
255FFH1111 1111全亮
25600H0000 0000溢出回零,全灭

计数方式有个硬件限制必须知道:外部脉冲的高电平和低电平各至少要维持一个机器周期,也就是说T0能数的最高频率是晶振频率的1/24,12MHz下约500kHz。按键脉冲远低于这个值,完全没问题;但如果拿它测高频信号就不够了(A27频率计用的是T1计数,同理)。

特别注意: 按键按了数字不动,99%是按键没接P3.4,接到P3.2/P3.3去了;数字一次跳好几个,是按键机械抖动产生了多个脉冲,实物要并104电容或者用施密特整形;数到255后突然全灭不是坏了,是8位溢出回卷,这是设计如此;想看0~99的十进制显示,得把TL0做除法分离十位个位再查段码,那就变成A19那种做法了。

四、日期修改

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

五、资料下载

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

/

版权所有,转载本站文章请注明出处:proteus单片机
上一篇:A22基于51单片机汇编语言独立按键LED台灯Proteus设计
下一篇:A24基于51单片机汇编语言8X8点阵显示数字0-9Proteus设计
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}