最简密码
proteus吧
全部回复
仅看楼主
level 3
  发一个只有两个按键,最简单的密码装置,知识量不多,但也不是少到仅仅作为程序片段,只能透过仪器测试才能观察的程度,至少是一个已经完成实验作品并且能亲手搭一个实物,请同学猜猜密码,个人感觉挺适合初学单片机。
  这个程序用MCS51汇编写的,看起来已经很过时了,的确过时了,我承认。不用C语言主要是自己觉得入门比汇编还难,牵扯很多的软件以及C语言语法和本身各种定义,而汇编语法就显得简洁很多,但是这种简洁也是需要有代价的,也是让我无法前进的原因,多数情况下,C语言写一串表达式就能搞定的运算,到了汇编就必需用一大串指令去实现,而这些指令本该由单片机自己去完成的,但是,用汇编同样可以写出相当牛逼的程序,比如浮点数程序,它可以实现开方、三角函数、指数、对数等运算,这些都是我想都不敢想:仅仅是把数搬进移出的汇编竟能强大到如此地步。
  最简密码这个程序仅仅是可以运行的水平,没有达到完美的程度,比如对密码正确与否的判断、程序结构是否合理等等。
  源程序可以另保存为ASM文件后pruteus编译运行。也可以将有冒号(:)开头的数字另存为HEX文件,这才是能被单片机运行真正意义上的程序。此外,这个习作真的可以实际运行,单片机选STC系列(宏晶单片机),HEX文件如何下载到单片机同样涉及很多知识,比如元器件的购置、焊接,这又是一个故事了。
proteus仿真戳图
2019年10月26日 14点10分 1
level 3
以下源程序(复制,另存为ASM文件)
;===============================================================;
; Disassembled Using DIS8051 - (C)1989 Data Sync Engineering ;
;===============================================================;
;P3.7=红 P3.5=黄 P3.4=黄 P3.3=绿 @6MHz
;说明:
;绿灯500毫秒暗,500毫秒亮,共5次。
;绿灯闪烁按下无效(不计时)。按满12下,最多3遍,限制40秒完成。
;最后10秒倒计时红灯闪烁提醒。
;按错2遍亮黄灯,第3次错或超出时间亮红灯,正确亮绿灯。
;密码从P1口读入,8位处理成12位放入30H-31H单元
;P3.0按键定义为"上",即低电平取反
;P3.1按键定义为"下",即低电平保持不变
;待校验密码存放在累加器中,直接和30H或31H单元相比较,结果放入?,
;?代表我也不知道放入哪个内存单元,可能根本没放,也可能是F0为1代表正确
;又可能是其中的工作寄存器的数值到一定值后代表正确,
;反正程序编译通过了,没细究
ORG 00000H
sjmp 030h
;
ORG 00003H
mov sp,#007h
acall int
sjmp 0030h
;
ORG 00030H
L0030: MOV R3,#000H
MOV R4,#000H
MOV R2,#000H
MOV R7,#00AH
MOV P3,#0B4H
SETB TR0
MOV TMOD,#001H
MOV IE,#081H
;
L003A: MOV R6,#004H
;
L003C: MOV TH0,#00BH
MOV TL0,#0DCH
;
L0042: JNB TF0,L0042
CLR TF0
DJNZ R6,L003C
CPL P3.3
DJNZ R7,L003A
MOV P3,#0BFH ;0000 0111B
MOV R6,#004H
MOV R7,#03CH
MOV TH0,#00BH
MOV TL0,#0DCH
ACALL L00BE
;
L005F: MOV R0,#030H
;
L0061: MOV R5,#008H
CJNE R0,#031H,L0068
MOV R5,#004H
;
L0068: JNB P3.1,L0072
JNB P3.0,L0079
ACALL L00CD
SJMP L0068
;
L0072: ACALL L00B1
JB P3.1,l0068
MOV C,P3.1
SJMP L007D
;
L0079: ACALL L00B1
JB P3.0,l0068
MOV C,P3.0
CPL C
;
L007D: RL A
MOV ACC.0,C
;
L0080: ACALL L00CD
JNB P3.1,L0080
JNB P3.0,L0080
DJNZ R5,L0068
XRL A,@R0
INC R0
JZ L00A5
CJNE R0,#032H,L0061
;
L0091: clr P3.4 ;判断是否
正确的
算法过于繁复,寄存器使用过多,待改进。
MOV R2,#000H
INC R4
CJNE R4,#002H,L005F
clr P3.5
DEC R4
INC R3
CJNE R3,#002H,L005F
;
L00A0: MOV P3,#03CH ;0011 1100B bad
clr tr0
sjmp $
L00A5: INC R2
CJNE R0,#032H,L0061
CJNE R2,#002H,L0091
MOV P3,#0B4H ;00
clr tr0
L00AF: SJMP L00AF ;停机
;按键延时字程序
L00B1: SETB RS0
MOV R7,#050H
;
L00B5: MOV R6,#050H
;
L00B7: DJNZ R6,L00B7
DJNZ R7,L00B5
CLR RS0
RET ;返回主程序
;
;
L00BE: MOV A,P1
CPL A
MOV 030H,A
MOV C,P1.7
MOV 20H.3,C
MOV C,P1.4
MOV 20H.2,C
MOV C,P1.3
MOV 20H.1,C
MOV C,P1.0
MOV 20H.0,C
MOV 31H,20H
RET
;
;
L00CD: JNB TF0,L00EE
CLR TF0
MOV TH0,#00BH
MOV TL0,#0DCH
DJNZ R6,L00CD
MOV R6,#004H
JNB F0,L00E6
CPL P3.7
CJNE R7,#001H,L00E6
AJMP L00A0
L00E6: DJNZ R7,L00CD
SETB F0
CLR P3.7
MOV R7,#014H
L00EE: RET
int: mov p3,#03ch
clr f0
jnb p3.2,$
reti
;
; Unresolved Address Reference list
;
;
;
;
END
2019年10月26日 14点10分 2
level 3
复制,另存为HEX文件
:02000000802E50
:070003007581073109802619
:100030007B007C007A007F0A75B0B4D28C75890190
:1000400075A8817E04758C0B758ADC308DFDC28DA0
:10005000DEF3B2B3DFED75B0BF7E047F3C758C0B71
:10006000758ADC11CE78307D08B831027D0430B15C
:100070000730B00D11E780F611C120B1F1A2B180B7
:100080000811C120B0E8A2B0B32392E011E730B16B
:10009000FB30B0F8DDD866086019B832CAC2B47A4D
:1000A000000CBC02C0C2B51C0BBB02B975B03CC28F
:1000B0008C80FE0AB832B0BA02E375B0B4C28C804C
:1000C000FED2D37F507E50DEFEDFFAC2D322E5900F
:1000D000F4F530A2979203A2949202A2939201A205
:1000E00090920085203122308D1EC28D758C0B754B
:1000F0008ADCDEF37E0430D507B2B7BF010201AC63
:10010000DFE5D2D5C2B77F142275B03CC2D530B27C
:02011000FD32BE
:00000001FF
2019年10月26日 14点10分 3
level 3
  ASM文件先编译后运行,在仿真时可以按暂停,可以单步执行,观察单片机内部各个寄存器数值是否是事先设定的数值,对程序正确与否很有帮助.这个过程称为调试
HEX文件则不行.所以,仿制者可能有电路图,想做出比原版更多功能,单单拿到只能被单片机执行的代码是没有意义,因为程序设计时能事先入对硬件的校验,一旦和电路不符,停止工作。
  那么习作是否也能加上这种设计呢[吐舌]
  当然,HEX文件重新转换成ASM文件(汇编源程序)也是可以做到的,这个过程称为“反编译”,山寨货的源头啊。最期的单片机,比如仿真的这个型号没有专门的硬件电路,来防止专用设备直接读取单片机ROM数据,读出ROM再经过"反编译"就能得到源程序。现在的,比如宏晶机片机都有硬件防解密。
  最后贴出51编译软件以及反编译工具的网址:
http://bit.kuas.edu.tw/~8051/
http://bit.kuas.edu.tw/~8051/DIS8051.zip
这个反编译器是DOS版,现在64位系统已经无法运行,需要用到“虚拟机“.网上有类拟功能windows版,有付费的,而免费结果没有DOS版精确.
2019年10月26日 15点10分 4
1