
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这个字节:
| 位 | 值 | 含义 |
| GATE | 0 | 不门控,TR0=1就启动 |
| C/T | 1 | 计数方式,数T0引脚脉冲(0=定时,数内部机器周期) |
| M1 M0 | 01 | 方式1,16位计数器 |
· 定时方式数的是"时间":每个机器周期加1,12MHz下1微秒加1。
· 计数方式数的是"事件":T0引脚(P3.4)每来一个下降沿加1,跟时间无关。
所以同一段代码,TMOD写01H是定时器(A21、A24都用这个),写05H就变成计数器,这是51定时器最容易被忽略的一个开关。
显示部分是MOV P1,TL0,TL0是计数值的低8位,直接送到端口,8个LED就是8位二进制:
| 按键次数 | TL0 | P1输出 | LED显示(低电平亮) |
| 0 | 00H | 0000 0000 | 全灭 |
| 1 | 01H | 0000 0001 | 最右1个亮 |
| 2 | 02H | 0000 0010 | 右数第2个亮 |
| 3 | 03H | 0000 0011 | 右数2个亮 |
| 5 | 05H | 0000 0101 | 1、3位亮 |
| 255 | FFH | 1111 1111 | 全亮 |
| 256 | 00H | 0000 0000 | 溢出回零,全灭 |
计数方式有个硬件限制必须知道:外部脉冲的高电平和低电平各至少要维持一个机器周期,也就是说T0能数的最高频率是晶振频率的1/24,12MHz下约500kHz。按键脉冲远低于这个值,完全没问题;但如果拿它测高频信号就不够了(A27频率计用的是T1计数,同理)。
特别注意: 按键按了数字不动,99%是按键没接P3.4,接到P3.2/P3.3去了;数字一次跳好几个,是按键机械抖动产生了多个脉冲,实物要并104电容或者用施密特整形;数到255后突然全灭不是坏了,是8位溢出回卷,这是设计如此;想看0~99的十进制显示,得把TL0做除法分离十位个位再查段码,那就变成A19那种做法了。
四、日期修改
资料中提供修改日期的小工具,购买资料赠送修改文件创建日期的小工具,三个下载地址都在文章最后。
五、资料下载
付费后获取下载链接,直接下载到电脑上,然后解压即可!每个链接前面都配了二维码,手机扫码可以直接跳转。
/

