深圳高级电工单片机项目
高电单片机实训 参考程序
试卷3101:查找大小数
试卷3102:航标灯控制
试卷3103:计数报警器
试卷3104:数码管显示
试卷3105:循环灯点亮
试卷3106:霓虹灯控制
试卷3107:算术运算器
试卷3108:继电器控制
试卷3109:倒计时音乐报警器
试卷3110: 数据传送
1 ORG 0000H ;程序启始地址 2 LJMP MAIN ;长跳主程序 3 ORG 0800H ;设主程序从0800H开始 4 MAIN: MOV 34H, 20H ;先设第一个数为最大数送34H 5 MOV 35H, 20H ;又设第一个数为最小数送35H 6 MOV R1, #19 ;剩余数长度(个数)19送R1 7 MOV R0, #21H ;设剩余19个数地址指针(即剩余数首地址送R0) 8 M0: MOV A, @R0 ;取第1余数送A 9 CJNE A, 34H, M1 ;第1余数与当前最大数比较,不等转M1 10 LJMP NEXT ;相等,不能取代,转NEXT 11 M1: JNC M2 ;CY=0,大于当前最大数,转M2 12 CJNE A, 35H, M3 ;CY=1(小与当前最大数),须与当前最小数比较,不等转M3 13 LJMP NEXT ;相等,不能取代,转NEXT 14 M2: MOV 34H, A ;取代当前最大数 15 LJMP NEXT ;转NEXT 16 M3: JNC NEXT ;CY=0,大于当前最小数,转NEXT 17 MOV 35H, A ;CY=1,小于当前最小数,取代 18 NEXT: INC R0 ;余数指针加1 19 DJNZ R1, M0 ;余数长度减1,不等于0,返回M0 20 SJMP $ ;余数比较完毕,待机 21 END
1 ORG 0000H ;程序启始地址 2 LJMP MAIN ;长跳主程序 3 ORG 0800H ;设主程序从8000H开始 4 MAIN: MOV 34H,20H ;先设第一个数为最大数送34H 5 MOV 35H,20H ;又设第一个数为最小数送35H 6 MOV R0, #21H ;设剩余19个数地址指针(即剩余数首地址送R0) 7 MOV R1,#19 ;剩余数长度(个数)19送R1 8 M0: MOV A,@R0 ;取第1余数送A 9 CLR C 10 SUBB A , 34H ;减法 11 JNC M1 ;没有借位,A中数比34H中大,跳至M1 12 MOV A,@R0 ;再取原数 13 CLR C 14 SUBB A, 35H ;减法 15 JC M2 ;有进位,跳至M2 16 LJMP NEXT 17 M1: MOV 34H, @R0 ;取代原最大数 18 LJMP NEXT 19 M2: MOV 35H,@R0 ;取代原最小数 20 NEXT: INC R0 ;余数指针加1 21 DJNZ R1, M0 ;余数长度减1,不等于0,返回M0 22 SJMP $ ;余数比较完毕,待机 23 END
1 ORG 0000H ;主程序入口 2 AJMP MAIN ;转主程序 3 ORG 0003H ;设天黑外中断0入口地址 4 AJMP GINT ;转外中断服务子程序 5 ORG 0100H ;设主程序存放0100H 6 MAIN: SETB EX0 ;开外中断0 7 SETB EA ;开CPU总中断 8 CLR P1.0 ;白天灭灯 9 SJMP $ ;等待天黑 10 11 GINT: SETB P1.0 12 MOV R7, #DATA1 ;50ms×DATA1为亮灯时间 13 LP1: ACALL DELAY ;DELAY为延时50ms子程序 14 DJNZ R7,LP1 15 CLR P1.0 16 17 MOV R7, #DATA2 ;50ms×DATA2为灭灯时间 18 LP2: ACALL DELAY 19 DJNZ R7,LP2 20 JNB P3.2, GINT ;P3.2=0转UP,即为黑夜时,程序跳转到GINT 21 RETI 22 DELAY: MOV TMOD, #01H ;设定时器T0为方式1定时 23 LP: MOV TH0, #3CH ;定时50ms赋初值高8位 24 MOV TL0, #0B0H ;定时50ms赋初值低8位 25 SETB TR0 ;启动定时器T0 26 UP: JNB TF0, UP ;查询50ms定时溢出标志。若不置位,等待. 27 CLR TF0 28 RET 29 END
1 ORG 0000H ;程序启始地址 2 CLR P1.0 ;报警复位 3 MOV TMOD, #06H ;设T0为方式2计数 4 MOV TH0, #250 ;设计数初始值为250(M-N=X) 5 MOV TL0, #250 ; 6 SETB TR0 ;启动T0计数 7 UP: JBC TF0, DOWN ;查询计数溢出标志位。若置位转DOWN 8 SJMP UP ;若不置位,转UP再查 9 DOWN: SETB P1.0 ;计数报警 10 ACALL DELAY ;报警延时 11 CLR P1.0 ;关报警 12 SJMP UP ;返回UP,等待计数 13 14 DELAY: MOV R7, #200 ;延时200毫秒子程序 15 DE2: MOV R6, #250 16 DE1: NOP 17 NOP 18 DJNZ R6, DE1 19 DJNZ R7, DE2 20 RET 21 END
1 ——在内存20H开始处存放8个任意序列正数,从串口输出静态显示 2 3 ORG 0000H ;主程序入口 4 MOV SCON,#00H ;设置串口工作方式为方式0 5 MOV R2, #8 ;设数据长度 6 MOV R0, #20H ;设数据地址指针R0 7 NEXT: MOV A, @R0 ;取第一个数送A 8 MOV DPTR, #TAB ;取表头地址送DPTR 9 MOVC A, @A+DPTR ;查数椐段码 10 11 MOV SBUF, A ;发送段码 12 JNB TI, $ ;查发送标志TI,不置位等待 13 CLR TI ;若已置位清0 14 15 ACALL DELAY ;显示延时 16 INC R0 ;地址指针加1 17 DJNZ R2, NEXT ;查显示数字个数,不够返回继续显示 18 SJMP $ 19 TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H 20 DB 92H, 82H, 0F8H, 80H, 90H 21 22 DELAY: MOV R6, #200 ;200ms延时 23 LP2: MOV R7, #250 24 LP1: NOP 25 NOP 26 DJNZ R7, LP1 27 DJNZ R6, LP2 28 RET 29 END 30
1 ORG 0000H ;程序启始地址 2 MOV P1, #00H ;开始全灭灯 3 MOV R3 , #5 ;重复5次 4 5 DISP0: MOV R2, #8 ;每次亮8个灯 6 MOV A , #01H ;设低端第1个灯亮控制字 7 DISP1: MOV P1 , A ;亮灯 8 ACALL DELAY ;亮灯延时 9 RL A ;左移修改控制字 10 DJNZ R2 , DISP1 ;查左移亮灯个数 11 12 MOV R2 , #8 ;重赋亮灯个数 13 MOV A, #80H ;设高端第1个灯亮控制字 14 DISP2: MOV P1, A ;亮灯 15 ACALL DELAY ;亮灯延时 16 RR A ;右移修改控制字 17 DJNZ R2, DISP2 ;查右移亮灯个数 18 19 DJNZ R3 , DISP0 ;查左右亮灯遍数,不够返回 20 MOV P1, #00H ;灭灯 21 SJMP $ ;待机 22 23 DELAY: MOV R5, #10 ;1秒延时 24 LP3: MOV R6, #100 25 LP2: MOV R7, #250 26 LP1: NOP 27 NOP 28 DJNZ R7, LP1 29 DJNZ R6, LP2 30 DJNZ R5, LP3 31 RET 32 END
1 ORG 0000H 2 MOV P1, #00H ;灭灯 3 MOV R0, #5 ;循环5遍 4 5 START:MOV R1, #8 ;每遍8个状态 6 MOV DPTR, #TAB ;取表基址 7 MOV R2, #0 ;取表变址 8 NEXT:MOV A, R2 ;变址送A 9 MOVC A, @A+DPTR ;查控制码 10 MOV P1 , A ;控制码送P1口亮灯 11 ACALL DELAY ;延时 12 INC R2 ;修改地址指针 13 DJNZ R1 , NEXT ;查8个状态 14 15 DJNZ R0 , START ;查5遍 16 MOV P1, #00H ;灭灯 17 SJMP $ 18 TAB: DB 18H,24H,42H,81H,81H,42H,24H,18H 19 20 DELAY:MOV R7 , #200 ;200毫秒延时 21 LP2: MOV R6 , #250 22 LP1: NOP 23 NOP 24 DJNZ R6 , LP1 25 DJNZ R7 , LP2 26 RET 27 END
1 ORG 0000H 2 START: MOV SCON, #00H ;串口方式0初始化 3 MOV 20H, #08H ;被减数8送20H 4 MOV 30H, #03H ;减数3送30H 5 MOV A, 20H ;20H内容送A 6 MOV B, 30H ;30H内容送B 7 CLR C ;进位位请0 8 SUBB A, 30H ;两数相减,差数放A 9 JNC M1 ;判进位位,不置位跳M1 10 SJMP START ;进位位置位,返回开始 11 M1: MUL AB ;差数乘以减数,其积放A 12 MOV DPTR, #TAB ;取表基址 13 MOVC A, @A+DPTR ;查显示段码 14 CPL A ;段码取反 15 MOV SBUF, A ;段码送串口 16 JNB TI $ ;查发送标志位 17 CLR TI 18 SJMP $ ;待机 19 TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 20 DB 77H,7CH,39H,5EH,79H,71H 21 END
1 ORG 0000H 2 MOV R2, #10 ;设置重复闪亮次数 3 MOV P1, #00H 4 DP0: MOV P1, #01H ;取初始控制值 5 ACALL DELAY ;调延时 6 CPL P1.0 ;控制值取反 7 ACALL DELAY ;调延时 8 DJNZ R2, DP0 ;查闪亮次数 9 SJMP $ ;待机 10 11 DELAY: MOV R5, #15 ;1.5秒延时 12 LP3: MOV R6, #100 13 LP2: MOV R7, #250 14 LP1: NOP 15 NOP 16 DJNZ R7, LP1 17 DJNZ R6, LP2 18 DJNZ R5, LP3 19 RET 20 END
1 ORG 0000H ;主程序入口 2 CLR P1.1 3 4 JB P3.2, $ ;等待启动 5 MOV SCON, #00H ;串口0方式初始 6 MOV R1, #10 ;显示10个数字 7 MOV DPTR, #TAB ;取表基址 8 MOV R0,#20H 9 LP: MOV A, @R0 ;取表变址 10 MOVC A, @A+DPTR ;查段码 11 MOV SBUF, A ;送串口 12 LP1: JBC TI, LP2 ;判发送标志位置 13 SJMP LP1 ;清标志位 14 LP2: ACALL DELAY ;显示延时 15 INC R0 ;修改地址指针 16 DJNZ R1, LP ;查显示个数 17 SETB P1.1 ;响音乐 18 19 JB P3.3, $ ;等待结束按钮 20 CLR P1.1 21 SJMP $ ; 返回 22 TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H 23 DB 92H, 82H, 0F8H, 80H, 90H 24 25 DELAY: MOV R6, #200 ;200ms延时 26 LP2: MOV R7, #250 27 LP1: NOP 28 NOP 29 DJNZ R7, LP1 30 DJNZ R6, LP2 31 RET 32 END
显示20H-29H单元中十个数后响音乐:
1 (2)显示20H-29H单元中十个数后响音乐,各单元中数可根据现场规定输入. 2 3 ORG 0000H ;主程序入口 4 AJMP MAIN 5 ORG 0013H ;外中断1入口 6 AJMP GINT1 7 ORG 0100H 8 9 MAIN: CLR P1.1 10 JB P3.2, $ ;等待启动 11 MOV IE, #84H ;开中断 12 MOV SCON, #00H ;串口0方式初始化 13 14 MOV R2, #10 ;显示10个数字 15 MOV DPTR, #TAB ;取表基址 16 MOV R0, #20H ;取地址指针 17 LP: MOV A, @R0 ;取表变址 18 MOVC A, @A+DPTR ;查段码 19 MOV SBUF, A ;送串口 20 JNB TI, $ ;判发送标志位置位否 21 CLR TI ;清标志位 22 ACALL DELAY ;显示延时 23 INC R0 ;修改地址指针 24 DJNZ R2, LP ;查显示个数 25 SETB P1.1 ;响音乐 26 SJMP $ ; 待机 27 28 GINT1: CLR P1.1 29 RETI 30 31 DELAY: MOV R5, #10 ;1秒延时 32 LP3: MOV R6, #100 33 LP2: MOV R7, #250 34 LP1: NOP 35 NOP 36 DJNZ R7, LP1 37 DJNZ R6, LP2 38 DJNZ R5, LP3 39 RET 40 TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 41 DB 80H, 90H, 88H, 83H, 0C6H, 0A1H, 86H, 8EH 42 43 END
1 ORG 0000H ;主程序入口 2 AJMP MAIN 3 ORG 0013H ;外中断1入口 4 AJMP GINT1 5 ORG 0100H 6 MAIN: CLR P1.1 7 JB P3.2, $ ;等待启动 8 MOV IE, #84H ;开中断 9 MOV SCON, #00H ;串口0方式初始化 10 MOV R1, #10 ;显示10个数字 11 MOV DPTR, #TAB ;取表基址 12 MOV R0,#09H 13 LP: MOV A, R0 ;取表变址 14 MOVC A, @A+DPTR ;查段码 15 MOV SBUF, A ;送串口 16 LP1: JBC TI, LP2 ;判发送标志位置位否 17 SJMP LP1 ;清标志位 18 LP2: ACALL DELAY ;显示延时 19 DEC R0 ;修改地址指针 20 DJNZ R1, LP ;查显示个数 21 SETB P1.1 ;响音乐 22 SJMP $ ; 返回 23 GINT1: CLR P1.1 24 RETI 25 TAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H 26 DB 92H, 82H, 0F8H, 80H, 90H 27 END
1 ORG 0000H 2 MOV R0,#20H 3 MOV R1,#30H 4 MOV R2,#8 5 MOV DPH,#00H 6 7 LP1: MOV A,R1 8 PUSH ACC 9 MOV A,R0 10 PUSH ACC 11 12 POP DPL 13 MOVX A,@DPTR 14 POP DPL 15 MOVX @DPTR,A 16 17 INC R1 18 INC R0 19 20 DJNZ R2,LP1 21 SJMP $ 22 END
1 ORG 0000H 2 MOV 61H, #20H ;内存61H存#20H 3 MOV 60H, #30H ;内存60H存#30H 4 MOV SP, #61H ;设栈顶SP= #61H 5 POP ACC ;61H存放的数20H送给A 6 MOV R0, A ;R0指针指向20H 7 POP ACC 8 MOV R1, A ;R1指针指向30H 9 MOV R2, #8 10 LP1:MOVX A, @R0 ;取原地址数送A 11 MOVX @R1, A ;送该数到新地址 12 INC R0 ;修改指针R0 13 INC R1 ;修改指针R1 14 DJNZ R2, LP1 ;查8个数据传送完否 15 SJMP $ ;注意在20H单元开始设8个数 16 END