• 欢迎光临~

单片机实验

开发技术 开发技术 2022-10-07 次浏览

单片机实验

由于此随笔为毕业4年后所写,仿真电路图片以及仿真软件都无法还原大学时期的情况。因此此随笔仅仅写一下代码。

 

一、     串行通信

ORG 0000H

LJMP START

ORG 0100H

START:MOV SCON,#50H

      MOV TMOD,#20H

      MOV TL1,#0F3H

      MOV TH1,#0F3H

      SETB TR1

      MOV R0,#30H

      MOV R7,#8

RWAIT:JBC RI,RNEXT

      SJMP RWAIT

RNEXT:MOV A,SBUF

      MOV @R0,A

      INC R0

      DJNZ R7,RWAIT

      CLR REN

      MOV A,#55H

      MOV SBUF,A

TWAIT1:JBC TI,TNEXT

       SJMP TWAIT1

TNEXT:MOV A,#0AAH

      MOV SBUF,A

TWAIT2:JBC TI,TEND

       SJMP TWAIT2

TEND:

END

 

二、     数模模数转换

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP INT

MAIN:

     MOV IE,#81H

     MOV A,#40H

     MOV DPTR,#8000H

LP:

     MOVX @DPTR,A

     MOV DPTR,#9000H

     MOV A,#01H

     MOVX @DPTR,A

     SJMP $

INT:

     MOVX A,@DPTR

     MOV P1,A

     RETI

 

     END

 

三、     显示数字代码

ORG 0000H

LJMP MAIN

ORG 0040H

MAIN:

     MOV 30H,#87H

     MOV 31H,#19H

     MOV 32H,#45H   ; 三个单元中存入数据

     MOV R0,#30H    ; R0指向30H单元,用做指针

     MOV R1,#33H    ; R1指向31H单元,用作指针

     MOV R2,#3      ; 控制BCD码转换3次,共6个数

     MOV R3,#01H    ; 作为显示数码管亮的有效信号

     MOV DPTR ,#TAB ; 数据指针指向表头

L1: LCALL TRANS    ; 调用转化程序

     MOV R1,#33H    ; R1再次指向33H单元

L2: LCALL SHOW     ; 调用显示子程序

TRANS:              ; 将压缩的BCD码转换为显示码

     MOV A,@R0     ; R0指向单元的内容送给A

     ANL A,#0FH     ; 取低半字节数据

     MOVC A,@A+DPTR ; 查表

     MOV @R1,A      ; 找到的数送给R1指向的单元

     INC R1         ; R1指针下移

     MOV A,@R0      ; R0指向单元的内容送给A

     ANL A,#0F0H    ; 取高半字节数据

     SWAP A         ; A的高低字节数据交换

     MOVC A,@A+DPTR ; 查表

     MOV @R1,A      ; 找到的数送给R1指向的单元

     INC R1         ; R1指针下移

     INC R0         ; R0指针下移

     DJNZ R2,TRANS  ; R2减1判断6个数是否都已转化

     RET ; 完成6个数转化,并存放在33H-38H单元内

SHOW:               ; 显示子程序

     MOV A,R3       ; 位码有效位送到A中

     MOV DPTR,#8002H; 传送位地址  

     MOVX @DPTR,A   ; 某一位的显示数码管能亮

     MOV A,@R1      ; 将显示段码送到A中

     MOV DPTR,#8004H; 传送段地址

     MOVX @DPTR,A   ; 显示数字

     LCALL DELAY    ; 延时1ms

     INC R1         ; 数据指针下移

     JB ACC.5,LOOP  ; 是否到了最高位,是,就结束

     MOV A,R3       ; 不是,就将位码有效位送到A中

     RL A           ; 将1左移

     MOV R3,A       ; 再送回R3中

     AJMP SHOW      ; 返回显示程序

LOOP:   RET            ; 显示程序结束

DELAY:              ; 延时1ms子程序

     MOV R7,#02

DL: MOV R6,#0F8H

     DJNZ R6,$

     NOP

     DJNZ R7,DL

     RET

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

     SJMP $

     END

 

四、     键盘扫描代码

ORG 0000H

LJMP MAIN

ORG 0500H

LJMP PRESS

ORG 0550H

LJMP DELAY

ORG 0600H

LJMP TABLE

 

MAIN:   LCALL PRESS    ; 检测有无按键

     JNZ LK1        ; 有按键,跳转

N1: LCALL DELAY    ; 无按键则延时

     LJMP MAIN      ; 返回

LK1:    LCALL DELAY    ; 有按键,延时,去抖动

     LCALL PRESS    ; 再次确认

     JNZ LK2        ; 确实有按键,跳转

     LCALL DELAY    ; 没有按键,抖动造成,延时去抖

     LJMP MAIN      ; 返回

LK2:    MOV R5,#0FEH   ; 第0列为低电平

     MOV R4,#00H    ; 作为列号计数器

LK4:    MOV DPTR,#0F002H;列地址

     MOV A,R5       ;

     MOVX @DPTR,A   ; 第0列输出为低电平

     MOV DPTR,#0F001H;行地址

     MOVX A,@DPTR   ; 将行线电平读进单片机

H0: ; 第0行检测

     JB Acc.0,H1    ; 若高电平,此行无键按下跳下一行

     MOV A,#00H     ; 有键按下,记录键盘第0行行码

     LJMP LKP       ; 跳转计算键号

H1: ; 第1行检测

     JB Acc.1,H2    ; 若高电平,此行无键按下跳下一行

     MOV A,#06H     ; 有键按下,记录键盘第1行行码

     LJMP LKP       ; 跳转计算键号

H2: ; 第2行检测

     JB Acc.2,H3    ; 若高电平,此行无键按下跳下一行

     MOV A,#0CH     ; 有键按下,记录键盘第2行行码    

     LJMP LKP       ; 跳转计算键号

H3: ; 第3行检测

     JB Acc.3,XYLIE ; 若高电平,此行无键按下转下一列         

     MOV A,#12H     ; 有键按下,记录键盘第3行行码        

LKP:    ; 计算键号子程序

     ADD A,R4       ; 行码+列码=键号

     MOV R3,A       ; 保存键号

     MOV R2,#01H    ;

     MOV A,R2       ;

     MOV DPTR,#0F002H;位地址

     MOVX @DPTR,A   ; 只让数字显示在最后一个数码管中

     MOV DPTR,#TABLE; 查表 

     MOV A,R3       ; 键号送到A中

     MOVC A,@A+DPTR ; 查表,找到对应的显示码

     MOV DPTR,#0F004H;显示数码管段地址

     MOVX @DPTR,A   ; 将显示码送到数码管中显示

     LCALL DELAY    ; 延时,以便人眼看到

SFANJ:  ; 按键释放检测

     LCALL DELAY    ; 延时

     LCALL PRESS    ; 调用按键检测子程序

     JNZ SFANJ      ; 按键是否释放,未释放则等待

     LJMP MAIN      ; 按键释放,再次返回主程序等待按键产生 

XYLIE:  ;下一列检测

     INC R4         ; 前一列无按键产生,检测下一列,保存列号到R4中

     MOV A,R5       ;

     JNB Acc.5,NEW  ; 若到达最后一列,则从头开始

     RL A           ; 未到达最后一列,将低电平后移

     MOV R5,A       ; 保存低电平到下一列

     LJMP LK4       ; 再次从第0行开始检测

NEW:    LJMP MAIN      ; 重新从头开始检测                                                             

PRESS:   ;检测按键子程序         

     MOV DPTR,#0F002H;列地址

     MOV A,#00H     ; 某一列为低电平

     MOVX @DPTR,A   ; 列线为低电平

     MOV DPTR,#0F001H;行地址

     MOVX A,@DPTR   ; 读取行线电平   

     CPL A          ; 行中的低电平被反转成为唯一的高电平      

     ANL A,#0FH     ; 若有按键,则A中有一位是1,高4位被屏蔽       

     RET            ; 矩阵键盘一共4行,至多6列                         

DELAY:  ;延时10ms子程序     

     MOV R7,#250

DL: MOV R6,#250

     DJNZ R6,$ 

     DJNZ R7,DL

     RET             

TABLE:

     DB 76H,38H,5EH,79H,71H,3FH

     DB 76H,38H,39H,4FH,5BH,06H

         DB 76H,38H,7CH,7DH,6DH,66H

     DB 76H,38H,77H,6FH,7FH,07H

     END

 

五、     定时器

   

ORG 0000H

   

LJMP MAIN

   

ORG 0003H

   

LJMP INT

   

ORG 0040H

 

    MAIN:

   

    MOV P1,#00H

   

    SETB EX0

   

    SETB PX0

   

    SETB IT0

   

    SETB EA

   

    SJMP $

 

 

    INT:

   

    CPL P1.0

    RETI

   

    END

 

ORG 0000H

LJMP MAIN

ORG 001BH

LJMP DVT1

ORG 0100H

    MAIN:

     MOV TMOD,#01H

     MOV TH1,#15536/256

     MOV TL1,#15536MOD256

     MOV R7,#2

     SETB ET1

     SETB EA

     SETB TR1

     SJMP $

    DVT1:

     DJNZ R7,NT1

     MOV R7,#2

     CPL P1.0

    NT1:

     MOV TH1,#15536/256

     MOV TL1,#15536MOD256

     SETB TR1

     RETI

     END

 

ORG 0000H

LJMP MAIN

ORG 001BH

LJMP DVT1

ORG 0100H

    MAIN:

     MOV TMOD,#60H

     MOV P1,#0

     MOV TH1,#0FFH

     MOV TL1,#0FFH

     SETB ET1

     SETB EA

     SETB TR1

     SJMP $

    DVT1:

     INC P1

     RETI

     END

 

六、     电子钟

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP DSQZD

ORG 00080H

MAIN:

     MOV SP,70H

 

     MOV TMOD,#01H

     MOV TH0,#60

     MOV TL0,#176

     SETB ET0

     SETB EA

     SETB TR0

 

SMGXS:      ;数码管显示

     ;PUSH ACC

     PUSH PSW

     MOV PSW,#08H

 

     MOV R0,#30H    ; R0指向30H单元,用做指针

     MOV R1,#33H    ; R1指向31H单元,用作指针

     MOV R2,#3      ; 控制BCD码转换3次,共6个数

     MOV R3,#01H    ; 作为显示数码管亮的有效信号

     MOV DPTR ,#TAB ; 数据指针指向表头

L1: LCALL TRANS    ; 调用转化程序

     MOV R1,#33H    ; R1再次指向33H单元

L2: LCALL SHOW     ; 调用显示子程序

     POP PSW

     ;POP ACC

TRANS:              ; 将压缩的BCD码转换为显示码

     MOV A,@R0     ; R0指向单元的内容送给A

     ANL A,#0FH     ; 取低半字节数据

     MOVC A,@A+DPTR ; 查表

     MOV @R1,A      ; 找到的数送给R1指向的单元

     INC R1         ; R1指针下移

     MOV A,@R0      ; R0指向单元的内容送给A

     ANL A,#0F0H    ; 取高半字节数据

     SWAP A         ; A的高低字节数据交换

     MOVC A,@A+DPTR ; 查表

     MOV @R1,A      ; 找到的数送给R1指向的单元

     INC R1         ; R1指针下移

     INC R0         ; R0指针下移

     DJNZ R2,TRANS  ; R2减1判断6个数是否都已转化

     RET ; 完成6个数转化,并存放在33H-38H单元内

SHOW:               ; 显示子程序

     MOV A,R3       ; 位码有效位送到A中

     MOV DPTR,#0F002H; 传送位地址  

     MOVX @DPTR,A   ; 某一位的显示数码管能亮

     MOV A,@R1      ; 将显示段码送到A中

     MOV DPTR,#0F004H; 传送段地址

     MOVX @DPTR,A   ; 显示数字

     LCALL DELAY    ; 延时1ms以便人眼看到

     MOV A,R3       ; 不是,就将位码有效位送到A中

     INC R1         ; 数据指针下移

     JB ACC.5,LOOP  ; 是否到了最高位,是,就结束

     RL A           ; 将1左移

     MOV R3,A       ; 再送回R3中

     AJMP SHOW      ; 返回显示程序

LOOP:RET            ; 显示程序结束

DELAY:              ; 延时1ms子程序

     MOV R7,#04

DL: MOV R6,#0F8H

     DJNZ R6,$

     NOP

     DJNZ R7,DL

     RET     

 

 

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

 

DSQZD:              ;定时器中断;T0中断程序

    ;PUSH ACC

    PUSH PSW

    MOV TH0,#60

    MOV TL0,#176

    MOV P1,#55H     ;检测点

    MOV R7,#20      ;T0计数50ms,20次产生一次中断

    DJNZ R7,RENEW  

    MOV R7,#20 

SECOND:            

    INC 30H

    MOV A,30H

    DA A   

    MOV 30H,A       ;16进制到BCD码调整

    CJNE A,#60,RENEW    ;比较不等转移

    MOV 30H,#00H   

MINUTE:

    INC 31H

    MOV A,31H

    DA A   

    MOV 31H,A       ;16进制到BCD码调整

    CJNE A,#60,RENEW    ;比较不等转移

    MOV 30H,#00H

HOUR:  

    INC 32H    

    MOV A,32H

    DA A   

    MOV 32H,A       ;16进制到BCD码调整

    CJNE A,#24,RENEW    ;

    MOV 32H,#00H

    RETI

 

RENEW:              ;又一次的50ms计数 

    POP PSW

    ;POP ACC

    RETI

 

 

 

     SJMP $

     END

程序员灯塔
转载请注明原文链接:单片机实验
喜欢 (0)