Fork me on GitHub

深圳高级电工单片机项目

高电单片机实训 参考程序

试卷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
3103最大最小数的选取

 

 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 
3103最大最小数的选取02

 

 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               
3104串口输出数字显示

 

 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
倒计时音乐报警(1)

显示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            
倒计时音乐报警(2)

 

 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    
(2) 倒计9-0,响音乐

 

 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)

 

 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
数据传送(2)

 

posted @ 2019-03-18 21:28  一抹荧光  阅读(878)  评论(0编辑  收藏  举报