首页 > 其他分享 >单片机实验

单片机实验

时间:2022-10-07 18:55:21浏览次数:43  
标签:LJMP R0 R1 MOV 单片机 实验 DPTR ORG

单片机实验

由于此随笔为毕业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

标签:LJMP,R0,R1,MOV,单片机,实验,DPTR,ORG
From: https://www.cnblogs.com/xjlnl/p/16760405.html

相关文章

  • 实验2:Open vSwitch虚拟交换机实践 实验3:OpenFlow协议分析实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Pytho......
  • 实验5:开源控制器实践——POX
    基础要求tcpdump验证Hub模块h1pingh2的tcpdump抓包结果截图h1pingh3的tcpdump抓包结果截图tcpdump验证Switch模块h1pingh2的tcpdump抓包结果截图h1ping......
  • 实验3:OpenFlow协议分析实践
    (三)实验报告3.1请用Markdown排版;3.2基础要求只需要提交导入到/home/用户名/学号/lab3/目录下的拓扑文件,wireshark抓包的结果截图和对应的文字说明;3.2.1搭建所示拓扑,完......
  • 实验5:开源控制器实践——POX
    一、实验目的1.能够理解POX控制器的工作原理;2.通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;3.能够运用POX控制器编写自定义......
  • 实验3:OpenFlow协议分析实践
    (一)基本要求1.搭建下图所示拓扑,完成相关IP配置,并实现主机与主机之间的IP通信。用抓包软件获取控制器与交换机之间的通信数据。主机 IP地址h1 192.168.0.101/24h2 1......
  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践一、实验目的能够运用wireshark对OpenFlow协议数据交互过程进行抓包;能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制......
  • 51单片机代码
    延时函数:typedefunsignedintu16;voiddelay(u16i)//延时函数,i=1时,大约延时10us,i=50000时,大约延时450ms{while(i--);}voiddelay1s()//延时函数,延时1秒......
  • 实验3:OpenFlow协议分析实践
    一、实验目的能够运用wireshark对OpenFlow协议数据交互过程进行抓包;能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制。二、实验环境Ubuntu20......
  • SDCC+XMAKE 51内核单片机排坑
    xmake是一款很方便的构建工具,只要在工程文件写入一个xmake.lua文件即可,以51单片机为例:target("test_xmake")--目标set_kind("binary")--生成二进制add_......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够......