源程序清单
1.汇编程序
ORG 0000H ;主程序入口 0000 020030 LJMP MAIN
ORG 0003H ;外部中断0入口 0003 0200D4 LJMP A2D
ORG 000BH ;t0入口 000B 02007A LJMP SELECT
ORG 0013H ;外部中断1入口 0013 020062 LJMP KEY ORG 0030H
MAIN: ;主程序
0030 75A886 MOV IE,#86H ;外部中断0,t0,外部中断1使能
0033 7590F6 MOV P1,#0F6H ;键盘初值 0036 758C3C MOV TH0,#3CH ;t0赋初值 0039 758AB0 MOV TL0,#0B0H
003C 758901 MOV TMOD,#01H ;设置t0工作方式为方式1 003F D288 SETB IT0 ;打开中断0
0041 120048 LCALL XUEHAO ;调用显示学号子程序
0044 7C1E MOV R4,#30 ;设置t0延时次数,即任务中延时1.5s的功能选择,因为定时器最多计时65536us,所以需要多次计时累计 0046 80FE SJMP $ ;踏步命令
0048 9001A7 XUEHAO: MOV DPTR,#XUEHAOTAB 004B 7A03 MOV R2,#3 004D 7B05 XUEHAO2:MOV R3,#5 004F 7400 XUEHAO1:MOV A,#0 的字型码
0051 93 MOVC A,@A+DPTR 0052 F599 MOV SBUF,A 0054 3099FD JNB TI,$ 0057 C299 CLR TI 送
0059 A3 INC DPTR 005A DBF3 DJNZ R3,XUEHAO1 005C 12018D LCALL DELAY1S 005F DAEC DJNZ R2,XUEHAO2
0061 22 RET
0062 12019E KEY: LCALL DELAY10MS 0065 20B311 JB P3.3,KEY1 下状态,为按下则返回
0068 9001B6 MOV DPTR,#SHUZITAB 006B 1200B4 LCALL JUDGEKEY 006E 04 INC A 的数字比键值大1)
006F 93 MOVC A,@A+DPTR 0070 F599 MOV SBUF,A 0072 3099FD JNB TI,$ 0075 C299 CLR TI
0077 D28C SETB TR0 0079 32 KEY1: RETI
SELECT: 007A 20B319 JB P3.3,SELECTOUT 007D DC17 DJNZ R4,SELECTOUT ;学号显示子程程序 ;3次刷新
;每次发送5个显示码进数码管 ;a清零,dptr自加来选择需要显示 ;查表,给a赋值 ;a发送到串行口
;查询串行口发送中断标志位
;清除中断标志位,准备进行下一次发 ;dptr加1,指向下一个字型码地址 ;执行显示5个字型码 ;延迟1s ;刷新3次 ;键盘按键响应程序
;延迟10ms之后判断是否按键还是按 ;dptr指向数字表首地址
;调用判断键值子程序
;键值加1调用字型码(因为硬件显示 ;查表得字型码
;发送a到串行口进行显示 ; ;打开定时器t0 ;中断返回 ;长按1.5s功能选择程序
;判断按键是否按下,否则返回 ;判断是否达到1.5s,否则r4减1返
回(r4记录中断次数)
007F 1200B4 LCALL JUDGEKEY ;调用判断键值子程序 0082 B40003 CJNE A,#0,SELECT1 ;得到a的键值,判断功能 0085 12009D LCALL D2A
0088 B40103 SELECT1: CJNE A,#1,SELECT2 008B 120048 LCALL XUEHAO 008E B40303 SELECT2: CJNE A,#3,SELECT3 0091 1200CA LCALL ATOD
0094 7C1E SELECT3: MOV R4,#30 ;r4重新赋初值
0096 758C3C SELECTOUT:MOV TH0,#3CH 0099 758A0B MOV TL0,#0BH
009C 32 RETI
009D 900FFF D2A: MOV DPTR,#0FFFH 00A0 74C8 MOV A,#200 00A2 7A64 MOV R2,#100 00A4 14 D2A1: DEC A
00A5 F0 MOVX @DPTR,A 00A6 B400FB CJNE A,#0,D2A1 00A9 120195 LCALL DELAY3MS 00AC 04 D2A2: INC A
00AD F0 MOVX @DPTR,A 00AE B4C8FB CJNE A,#200,D2A2 00B1 DAF1 DJNZ R2,D2A1 00B3 22 RET
00B4 7800 JUDGEKEY: MOV R0,#0 00B6 7400 MOV A,#0 00B8 309402 JNB P1.4,JP1 00BB 7801 MOV R0,#1 00BD 7590A7 JP1:MOV P1,#0A7H 00C0 309002 JNB P1.0,JP2 00C3 7402 MOV A,#2 00C5 28 JP2:ADD A,R0
00C6 7590F6 MOV P1,#0F6H 00C9 22 RET
00CA E4 ATOD: CLR A 00CB D2A8 SETB EX0 00CD 90FFFE MOV DPTR,#0FFFEH 00D0 F0 MOVX @DPTR,A 00D1 7814 MOV R0,#20 00D3 22 RET
;定时计数器重新赋初值 ;中断返回 ;数模转换程序 ;键值判断程序 ;模数转换程序 ;打开中断0
;dptr指向adc0808首地址 ;启动adc0808 ;重新设定采样次数 ;返回 A2D: ;模数转换中断响应程序 00D4 90FFFE MOV DPTR,#0FFFEH
00D7 D2D4 A2D1: SETB RS1 ;打开第三组
00D9 E0 MOVX A,@DPTR ;取得adc0808反馈值
00DA F5F0 MOV B,A ;把a中的值倒置(因为采样的时候是从高位到低位倒置的) 00DC 7400 MOV A,#0 00DE 30F702 JNB B.7,SS1 00E1 D2E0 SETB ACC.0 00E3 30F602 SS1:JNB B.6,SS2 00E6 D2E1 SETB ACC.1 00E8 30F502 SS2:JNB B.5,SS3 00EB D2E2 SETB ACC.2 00ED 30F402 SS3:JNB B.4,SS4 00F0 D2E3 SETB ACC.3 00F2 30F302 SS4:JNB B.3,SS5 00F5 D2E4 SETB ACC.4 00F7 30F202 SS5:JNB B.2,SS6 00FA D2E5 SETB ACC.5 00FC 30F102 SS6:JNB B.1,SS7 00FF D2E6 SETB ACC.6 0101 30F002 SS7:JNB B.0,SS8 0104 D2E7 SETB ACC.7
0106 75F033 SS8:MOV B,#51 ;以下将得到数值转换成bcd码,因为a的范围是0~255,电压范围是0~5,所以将得到值除以51得到最高位整数值
0109 84 DIV AB ;然后第二位再乘10,除以51,得到第二位,以此类推
010A FB MOV R3,A 010B E5F0 MOV A,B 010D 75F00A MOV B,#10 0110 A4 MUL AB 0111 FA MOV R2,A 0112 E5F0 MOV A,B
0114 B4000A CJNE A,#00,LP1 0117 EA MOV A,R2 0118 75F033 MOV B,#51 011B 84 DIV AB 011C FA MOV R2,A 011D E5F0 MOV A,B 011F 800B SJMP LP2 0121 EA LP1: MOV A,R2 0122 04 INC A
0123 75F033 MOV B,#51 0126 84 DIV AB
0127 2405 ADD A,#5 0129 FA MOV R2,A 012A E5F0 MOV A,B 012C 75F00A LP2:MOV B,#10 012F A4 MUL AB 0130 F9 MOV R1,A 0131 E5F0 MOV A,B 0133 B40008 CJNE A,#0,LP3 0136 E9 MOV A,R1 0137 75F033 MOV B,#51 013A 84 DIV AB 013B F9 MOV R1,A 013C 8009 SJMP LP4 013E E9 LP3:MOV A,R1 013F 04 INC A 0140 75F033 MOV B,#51 0143 84 DIV AB 0144 2405 ADD A,#5 0146 F9 MOV R1,A 0147 120157 LP4:LCALL DIANYA 014A C2D4 CLR RS1
014C 90FFFE MOV DPTR,#0FFFEH
014F F0 MOVX @DPTR,A 低位分别放在r3,r2,r1
0150 D882 DJNZ R0,A2D 0152 7814 MOV R0,#20 0154 C2A8 CLR EX0 0156 32 RETI
0157 74FF DIANYA: MOV A,#0ffH 0159 F599 MOV SBUF,A 015B 3099FD JNB TI,$ 015E C299 CLR TI
0160 74FF MOV A,#0FFH 0162 F599 MOV SBUF,A
0164 3099FD JNB TI,$ 0167 C299 CLR TI
0169 9001B6 MOV DPTR,#SHUZITAB016C EB MOV A,R3
016D 93 MOVC A,@A+DPTR 016E 547F ANL A,#7FH 0170 F599 MOV SBUF,A 0172 3099FD JNB TI,$ 0175 C299 CLR TI
;转换完成,最高位,次高位,最;显示电压程序 ;显示黑 0177 EA MOV A,R2 0178 93 MOVC A,@A+DPTR 0179 F599 MOV SBUF,A 017B 3099FD JNB TI,$ 017E C299 CLR TI 0180 E9 MOV A,R1 0181 93 MOVC A,@A+DPTR 0182 F599 MOV SBUF,A 0184 3099FD JNB TI,$ 0187 C299 CLR TI 0189 12018D LCALL DELAY1S 018C 22 RET
018D 7D64 DELAY1S: MOV R5,#100 ;延时一秒子程序 018F 12019E DELAY1S1: LCALL DELAY10MS 0192 DDFB DJNZ R5,DELAY1S1 0194 22 RET
0195 7E06 DELAY3MS: MOV R6,#6 ;延时一秒子程序 0197 7FFA DELAY3MS1:MOV R7,#250 0199 DFFE DJNZ R7,$
019B DEFA DJNZ R6,DELAY3MS1 019D 22 RET
019E 7E14 DELAY10MS: MOV R6,#20 ;延时一秒子程序 01A0 7FFA DELAY10MS1:MOV R7,#250 01A2 DFFE DJNZ R7,$
01A4 DEFA DJNZ R6,DELAY10MS1 01A6 22 RET 01A7 FFFFF7
01AA F7F7 XUEHAOTAB:DB 0FFH,0FFH,0F7H,0F7H,0F7H ;学号显示表 01AC FBFBAB
01AF A7B3 DB 0FBH,0FBH,0ABH,0A7H,0B3H 01B1 F9F9C0
01B4 82B0 DB 0F9H,0F9H,0C0H,82H,0B0H
01B6 C0F9A4 01B9 B09992 01BC 82F880
01BF 90 SHUZITAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数字表
符号 值 类型
A2D A2D1 AC ACC ATOD B CY D2A D2A1 D2A2 DELAY10MS DELAY10MS1 DELAY1S DELAY1S1 DELAY3MS DELAY3MS1 DIANYA DPH DPL EA ES ET0 ET1 EX0 EX1 F0 F1 IE IE0 IE1 IP IT0 IT1 JP1 JP2 = 00D4H CODE 标号 = 00D7H CODE 标号 = 00D6H CONST 常量 = 00E0H CONST 常量 = 00CAH CODE 标号 = 00F0H CONST 常量 = 00D7H CONST 常量 = 009DH CODE 标号 = 00A4H CODE 标号 = 00ACH CODE 标号 = 019EH CODE 标号 = 01A0H CODE 标号 = 018DH CODE 标号 = 018FH CODE 标号 = 0195H CODE 标号 = 0197H CODE 标号 = 0157H CODE 标号 = 0083H CONST 常量 = 0082H CONST 常量 = 00AFH CONST 常量 = 00ACH CONST 常量 = 00A9H CONST 常量 = 00ABH CONST 常量 = 00A8H CONST 常量 = 00AAH CONST 常量 = 00D5H CONST 常量 = 00D1H CONST 常量 = 00A8H CONST 常量 = 0089H CONST 常量 = 008BH CONST 常量 = 00B8H CONST 常量 = 0088H CONST 常量 = 008AH CONST 常量 = 00BDH CODE 标号 = 00C5H CODE 标号
JUDGEKEY = 00B4H CODE 标号 KEY = 0062H CODE 标号 KEY1 = 0079H CODE 标号 LP1 = 0121H CODE 标号 LP2 = 012CH CODE 标号 LP3 = 013EH CODE 标号 LP4 = 0147H CODE 标号 MAIN = 0030H CODE 标号 OV = 00D2H CONST 常量 P P0 P1 P2 P3 PCON PS PSW PT0 PT1 PX0 PX1 RB8 REN RI RS0 RS1 SBUF SCON SELECT SELECT1 SELECT2 SELECT3 SELECTOUT SHUZITAB SM0 SM1 SM2 SP SS1 SS2 SS3 SS4 SS5 SS6 = 00D0H CONST 常量 = 0080H CONST 常量 = 0090H CONST 常量 = 00A0H CONST 常量 = 00B0H CONST 常量 = 0087H CONST 常量 = 00BCH CONST 常量 = 00D0H CONST 常量 = 00B9H CONST 常量 = 00BBH CONST 常量 = 00B8H CONST 常量 = 00BAH CONST 常量 = 009AH CONST 常量 = 009CH CONST 常量 = 0098H CONST 常量 = 00D3H CONST 常量 = 00D4H CONST 常量 = 0099H CONST 常量 = 0098H CONST 常量 = 007AH CODE 标号 = 0088H CODE 标号 = 008EH CODE 标号 = 0094H CODE 标号 = 0096H CODE 标号 = 01B6H CODE 标号 = 009FH CONST 常量 = 009EH CONST 常量 = 009DH CONST 常量 = 0081H CONST 常量 = 00E3H CODE 标号 = 00E8H CODE 标号 = 00EDH CODE 标号 = 00F2H CODE 标号 = 00F7H CODE 标号 = 00FCH CODE 标号
SS7 = 0101H CODE 标号 SS8 = 0106H CODE 标号 TB8 = 009BH CONST 常量 TCON = 0088H CONST 常量 TF0 = 008DH CONST 常量 TF1 = 008FH CONST 常量 TH0 = 008CH CONST 常量 TH1 = 008DH CONST 常量 TI = 0099H CONST 常量 TL0 = 008AH CONST 常量 TL1 = 008BH CONST 常量 TMOD = 0089H CONST 常量 TR0 = 008CH CONST 常量 TR1 = 008EH CONST 常量 XUEHAO = 0048H CODE 标号 XUEHAO1 = 004FH CODE 标号 XUEHAO2 = 004DH CODE 标号 XUEHAOTAB = 01A7H CODE 标号
公有符号: 97 私有符号: 0
以下程序为wave输入源程序,不带机器码,方便同学复制粘贴体验神奇效果~
ORG 0000H ;主程序入口 LJMP MAIN
ORG 0003H ;外部中断0入口 LJMP A2D
ORG 000BH ;t0入口 LJMP SELECT
ORG 0013H ;外部中断1入口 LJMP KEY ORG 0030H
MAIN: ;主程序
MOV IE,#86H ;外部中断0,t0,外部中断1使能 MOV P1,#0F6H ;键盘初值 MOV TH0,#3CH ;t0赋初值 MOV TL0,#0B0H
MOV TMOD,#01H ;设置t0工作方式为方式1 SETB IT0 ;打开中断0
LCALL XUEHAO ;调用显示学号子程序
MOV R4,#30 ;设置t0延时次数,即任务中延时1.5s的功能选择,因为定时器最多计时65536us,所以需要多次计时累计 SJMP $ ;踏步命令
XUEHAO: MOV DPTR,#XUEHAOTAB ;学号显示子程程序 MOV R2,#3 ;3次刷新
XUEHAO2:MOV R3,#5 ;每次发送5个显示码进数码管
XUEHAO1:MOV A,#0 ;a清零,dptr自加来选择需要显示的字型码 MOVC A,@A+DPTR ;查表,给a赋值
MOV SBUF,A ;a发送到串行口
JNB TI,$ ;查询串行口发送中断标志位
CLR TI ;清除中断标志位,准备进行下一次发送 INC DPTR ;dptr加1,指向下一个字型码地址 DJNZ R3,XUEHAO1 ;执行显示5个字型码 LCALL DELAY1S ;延迟1s DJNZ R2,XUEHAO2 ;刷新3次
RET
KEY: LCALL DELAY10MS ;键盘按键响应程序
JB P3.3,KEY1 ;延迟10ms之后判断是否按键还是按下状态,为按下则返回
MOV DPTR,#SHUZITAB ;dptr指向数字表首地址
LCALL JUDGEKEY ;调用判断键值子程序 INC A ;键值加1调用字型码(因为硬件显示的数字比键值大1)
MOVC A,@A+DPTR ;查表得字型码
MOV SBUF,A ;发送a到串行口进行显示 JNB TI,$ ; CLR TI
SETB TR0 ;打开定时器t0 KEY1: RETI ;中断返回
SELECT: ;长按1.5s功能选择程序 JB P3.3,SELECTOUT ;判断按键是否按下,否则返回
DJNZ R4,SELECTOUT ;判断是否达到1.5s,否则r4减1返回(r4记录中断次数)
LCALL JUDGEKEY CJNE A,#0,SELECT1 LCALL D2A
SELECT1: CJNE A,#1,SELECT2 LCALL XUEHAO SELECT2: CJNE A,#3,SELECT3 LCALL ATOD
SELECT3: MOV R4,#30 SELECTOUT:MOV TH0,#3CH MOV TL0,#0BH
RETI
D2A: MOV DPTR,#0FFFH MOV A,#200 MOV R2,#100 D2A1: DEC A
MOVX @DPTR,A CJNE A,#0,D2A1 LCALL DELAY3MS D2A2: INC A
MOVX @DPTR,A CJNE A,#200,D2A2 DJNZ R2,D2A1 RET
JUDGEKEY: MOV R0,#0 MOV A,#0 JNB P1.4,JP1 MOV R0,#1 JP1:MOV P1,#0A7H JNB P1.0,JP2 MOV A,#2 JP2:ADD A,R0 MOV P1,#0F6H
;调用判断键值子程序 ;得到a的键值,判断功能 ;r4重新赋初值
;定时计数器重新赋初值 ;中断返回 ;数模转换程序 ;键值判断程序 RET
ATOD: CLR A ;模数转换程序 SETB EX0 ;打开中断0
MOV DPTR,#0FFFEH ;dptr指向adc0808首地址 MOVX @DPTR,A ;启动adc0808 MOV R0,#20 ;重新设定采样次数 RET ;返回
A2D: ;模数转换中断响应程序 MOV DPTR,#0FFFEH
A2D1: SETB RS1 ;打开第三组
MOVX A,@DPTR ;取得adc0808反馈值
MOV B,A ;把a中的值倒置(因为采样的时候是从高位到低位倒置的) MOV A,#0 JNB B.7,SS1 SETB ACC.0 SS1:JNB B.6,SS2 SETB ACC.1 SS2:JNB B.5,SS3 SETB ACC.2 SS3:JNB B.4,SS4 SETB ACC.3 SS4:JNB B.3,SS5 SETB ACC.4 SS5:JNB B.2,SS6 SETB ACC.5 SS6:JNB B.1,SS7 SETB ACC.6 SS7:JNB B.0,SS8 SETB ACC.7
SS8:MOV B,#51 ;以下将得到数值转换成bcd码,因为a的范围是0~255,电压范围是0~5,所以将得到值除以51得到最高位整数值
DIV AB ;然后第二位再乘10,除以51,得到第二位,以此类推 MOV R3,A MOV A,B MOV B,#10 MUL AB MOV R2,A MOV A,B
CJNE A,#00,LP1 MOV A,R2 MOV B,#51
DIV AB MOV R2,A MOV A,B SJMP LP2 LP1: MOV A,R2 INC A MOV B,#51 DIV AB ADD A,#5 MOV R2,A MOV A,B LP2:MOV B,#10 MUL AB MOV R1,A MOV A,B CJNE A,#0,LP3 MOV A,R1 MOV B,#51 DIV AB MOV R1,A SJMP LP4 LP3:MOV A,R1 INC A MOV B,#51 DIV AB ADD A,#5 MOV R1,A LP4:LCALL DIANYA CLR RS1
MOV DPTR,#0FFFEH MOVX @DPTR,A r3,r2,r1
DJNZ R0,A2D MOV R0,#20 CLR EX0 RETI
DIANYA: MOV A,#0ffH MOV SBUF,A JNB TI,$ CLR TI
MOV A,#0FFH MOV SBUF,A JNB TI,$
;转换完成,最高位,次高位,最低位分别放在;显示电压程序 ;显示黑
CLR TI
MOV DPTR,#SHUZITAB MOV A,R3 MOVC A,@A+DPTR ANL A,#7FH MOV SBUF,A JNB TI,$
CLR TI MOV A,R2
MOVC A,@A+DPTR MOV SBUF,A JNB TI,$
CLR TI MOV A,R1
MOVC A,@A+DPTR MOV SBUF,A JNB TI,$ CLR TI
LCALL DELAY1S RET
DELAY1S: MOV R5,#100 DELAY1S1: LCALL DELAY10MS DJNZ R5,DELAY1S1 RET
DELAY3MS: MOV R6,#6 DELAY3MS1:MOV R7,#250 DJNZ R7,$
DJNZ R6,DELAY3MS1 RET
DELAY10MS: MOV R6,#20 DELAY10MS1:MOV R7,#250 DJNZ R7,$
DJNZ R6,DELAY10MS1 RET
;延时一秒子程序 ;延时一秒子程序;延时一秒子程序 XUEHAOTAB:DB 0FFH,0FFH,0F7H,0F7H,0F7H ;学号显示表 DB 0FBH,0FBH,0ABH,0A7H,0B3H DB 0F9H,0F9H,0C0H,82H,0B0H
SHUZITAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;数字表
因篇幅问题不能全部显示,请点此查看更多更全内容