当前位置:文档之家› 单片机实验程序(20210311075840)

单片机实验程序(20210311075840)

单片机实验程序(20210311075840)
单片机实验程序(20210311075840)

1.修改例程一的源程序

(1)将A寄存器的初值改为80H (正逻辑,数据位为1表示发光

二极管点亮 ),再对源程序进行简单修改,使程序运行后发光二极管情况与修改前相同。

( 2)将LED 向左循环移位点亮改为向右循环移位点亮

( 3)加快LED 循环移位点亮的速度

$include (C8051F020.inc) ;C8051F02x 系列单片机信息头文件包含伪指令

INIT: LCALL Init_ Device 调用初始设置子程序

(1)MOV A,#080H ;赋初始值并在发光二极管上显示该数值

CPL A

MOV P3,A

LOOP: CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

(2)RL A ;A 寄存器内容右移1 位并送1 发光二极管显示

MOV P3,A

AJMP LOOP ;无限循环

DELAY: MOV R5,#0H ;延时子程序

D1: MOV R6,#00H

DJNZ R6,$

DJNZ R5,D1

RET

$include (Init_Device.inc); 初始设置子程序文件包含伪指令

END

3)可删除几个CALL DELAY 语句即可加快循环速度

2.将例程二0——F 的循环显示改为0——9 的循环显示

$include (C8051F020.inc) ;C8051F02x 系列单片机信息头文件包含伪指令

ORG LJMP 0000H

INIT

TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;字符段码表0-7 DB 080H,090H

;字符段码表8-F

INIT: lcall Init_Device ;调用初始设置子程序

INIT1: MOV R1,#00H ;操作数据初始值

MOV A,R1

MAIN: MOV DPTR,#TAB ;读取与A 中数值对应的显示段码

MOVC A,@A+DPTR

MOV P5,A ;段码送并行口1 显示

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

CALL DELAY

INC R1 臊作数据(R1)增1

MOV A,R1

CCC C C ,#0AH,MAIN ;检查操作数据是否大于显示范围(F)

SJMP INIT1 ;无限循环

DDD DD: MOV R5,#0H ;延时子程序

D1: MOV R6,#0H

DJNZ R6,$

DJNZ R5,D1

RET

$include (Init_Device.inc) ;初始设置子程序文件包含伪指令

END

1. 例程 5 程序修改

(1) 将 KEY2 、KEY4 的功能对调

(2) 每次停下再启动 以后,更改发光二极管点亮的循环方向

$include

(C8051F020.inc) ;C8051F02x 系列单片机信息头文件包含伪指令 主程序入口

ORG LJMP

0000H INITIAL ;

ORG

0003H

LJMP

STOP ;外中断 0 服务程序 入口,开始键( STAR )

ORG

0013H

停止键( STOP )

LJMP STAR ;外中断 1 服 务程序入口 停止键( )

ORG

0100H

INITIAL:LCALL

Init_Device ;调用初始 设置子程序

MOV P3,#0FFH ;熄灭全部发光二极管

MOV

A,#0FFH

MOV

DPTR,#7F80H

MOVX

@DPTR,A ;清除数码管 2(NUM2 )显示

MOV

A,#0FEH ;点亮发光二极管的 初始数据

MOV

R1,#1H ;发光二极 管点亮位置初值

MOV

R4,#0FH

MOV

IP,#04H ;设置 INT0 (开始键 STAR )为高优先级

MOV

TCON,#05H ;外中断采用边沿触发

SETB

EX0 ;INT1 (停止键 STOP )开中断

SETB

EA ;开放中断

LOOP:

CLR EA

; 关闭中断

CJNE R4, #0FH, LP

RL

A

CJNE

R4,#0FH,LP

MOV

P3,A

CJNE

R4,#0FH,LP

INC

R1

CJNE

R4,#0FH,LP

SETB EA

;停止键的中断服 务程序

MOV DPTR,#TAB

A,@A+DPTR ; 获取发光二极管 点亮位置计数值的显示段码 MOV DPTR,#7F80H MOVX @DPTR,A ;发光二极管点 亮位置计数值的显示数据送显示 SETB

EX1

;INT0 (启动键 STAR )开中断

JNZ $ ;等待重新启动条件 --A=0 MOV A,#0FFH ;清除数码管 2(NUM2 )显 示

;禁止 INT0 中断(避 免程序误动作) ;恢复 A 寄存器内容 CLR IE1;清除INT1 (停止键STOP )中断标志(避免程序误动作 ) RETI

;中断返回

LP: LCALL DELAY1 LCALL DELAY1 LCALL DELAY1 LCALL DELAY1

CJNE R1,#8H,LOOP MOV R1,#0H SJMP LOOP

CLR EA

CJNE R4,#0F0H,LOOP RR A

CJNE R4,#0F0H,LOOP MOV P3,A

CJNE R4,#0F0H,LOOP DEC R1

CJNE R4,#0F0H,LOOP SETB EA LCALL DELAY1 LCALL DELAY1 LCALL DELAY1 LCALL DELAY1 CJNE R1,#0H,LP MOV R1,#8H SJMP LP

STAR:

;启动键的中断服 务程序 MOV A,#00H

;设置启动条 件 --A=0

STOP:

PUSH ACC

; 保护 A 寄存器 内容 MOV A,R1

;读取发光二 极管点亮位置计数值 MOVC

MOVX @DPTR,A

CLR EX1 POP ACC

CLR PUSH MOV CPL MOV POP RETI

IE0 ;清除INTO (启动键STOP)中断标志(避免程序误动作)ACC

A,R4 A

R4,A ACC

;中断返回

TAB: DB 0C0H,0F9H,0A4H,0B0H,099H ;0--4 段码

DB 092H,082H,0F8H,080H ;5--8 段码

DELAY1: MOV R6,#0 ;延时子程序

D1: MOV R7,#0

DJNZ R7,$

DJNZ R6,D1

RET

$include (Init_Device.inc) ;初始设置子程序文件包含伪指令END

2?修改例程6,将计数范围由0-F扩展至OO-FF (使用定时器/计时

$include DP2

DP_L DP_H (C8051F020.inc) ;C8051F02x 系列单片机信息头文件包含伪指令

;低位数值暂存器

; 高位数值暂存器

EQU

EQU

EQU

07F80H

30H

31H

MAIN: LCALL Init_Device ;调用初始设置子程序

MOV TMOD,#00000101B ;C/T0 工作于方式2

MOV A,#0 ; 显示初值为0

MOV DP_L,A

MOV DP_H,A

CALL DISPLAY ; 调用显示子程序显示初值0

MOV TL0,#0 ;C/T0 置初值0

器0),并在 2 位数码管上用10 进制数显示计数结果00-99)

SETB TR0 ;启动计数器0

LOOP: MOV A,TL0 ;读计数器0 的计数值

CJNE A,#0AH,L1

MOV TL0,#0

MOV A,#0

INC DP_H

MOV A,DP_H

CJNE A,#0AH,MM

MOV DP_H,#0

MM: MOV A,#0

L1: MOV DP_L,A ;在NUM2 显示计数器0 的计数值CALL DISPLAY ;调用显示子程序显示计数值

SJMP LOOP ;无限次循环

;显示子程序

DISPLAY: MOV A,DP_L ;读低位显示值

CALL DECODE ;调用换码子程序

MOV DPTR,#DP2 ;显示段码送NUM2

MOVX @DPTR,A

MOV A,DP_H ;读高位显示值

CALL DECODE ;调用换码子程序

MOV P5,A

RET

;换码子程序

DECODE: MOV DPTR,#TAB

MOVC A,@A+DPTR

RET

TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H ;显示段码DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH ;显示段码

$include (Init_Device.inc) ;初始设置子程序文件包含伪指令

END

0-7 8-F

通过对例程8 的程序进行修改和上机调试,改变源程序的功能

()将发送1、2、3、4 的ASCII 码改为发送A、B、C、D ASCII 码

(2)将接收的第2、第 3 字节数据的显示位置交换

$include (C8051F020.inc) ;C8051F02x 系列单片机信息头文件包含伪指令NUM2 EQU 07F80H ;NUM2 地址

NUM3 EQU 07F90H ;NUM3 地址

NUM4 EQU 07FA0H ;NUM4 地址

NUM5 EQU 07FB0H ;NUM5 地址

TIM_L EQU 0FDH ;T/C1 低字节计数值

TIM_H EQU 0FDH ;T/C1 高字节计数值

REC_BUF0 EQU 32H ;数据接收缓冲器0

REC_BUF1 EQU 34H ;数据接收缓冲器1

REC_BUF2 EQU 33H ;数据接收缓冲器2

FLAG BIT 01H ;数据发送完成标志

ORG 0000H

LJMP MAIN ;转主程序

ORG 0023H

LJMP RECE ;转串行通信中断程序

;主程序

MAIN: lcall Init Device ;C8051F02x 系列单片机信息头文件包含伪指令MOV A,#0FFH

MOV P5,A

MOV DPTR,#NUM2

MOVX @DPTR,A ;清除数码管NUM1 的显示

MOV DPTR,#NUM3

MOVX @DPTR,A ;清除数码管NUM2 的显示

MOV DPTR,#NUM4

MOVX @DPTR,A ;清除数码管NUM3 的显示

MOV DPTR,#NUM5

MOVX @DPTR,A ;清除数码管NUM4 的显示

MOV R6,#0 ;通信操作状态寄存器清除

MOV SP,#40H ;堆栈栈底设置

MOV TMOD,#00100000B ;T/C1 方式2

MOV TH1,#TIM_H ;T/C1 重装填值

MOV SETB MOV SETB SETB TL1,#TIM_L

TR1

SCON0,#01010000B

ES

EA

;T/C1 计数值;启动T/C1 ; 串口方式1 ;串

口中断允许

;开中断

;主循环

LOOP: CALL KEYBOARD ;调用案件状态分析子程序

CJNE A,#0FFH,L0 ;按键状态发生变化转L0

CLR FLAG ; 按键状态无变化,清除发送完成标志

SJMP LOOP

L0: JB FLAG,LOOP ;数据发送完成,返回主循环

MOV R7,A ; 否则,键值暂存R7

MOV A,#043H ;C

MOV SBUF0,A ;发送字符C 的ASCII 码值

CALL DELAY

MOV A,#04FH ;O

MOV SBUF0,A ;发送字符O 的ASCII 码值

CALL DELAY

MOV A,#04DH ;M

MOV SBUF0,A ;发送字符M 的ASCII 码值

CALL DELAY

MOV A,#04BH ;K

MOV SBUF0,A ;发送字符K 的ASCII 码值

CALL DELAY

MOV A,#40H ;发送数字0 的ASCII 码值

MOV SBUF0,A

CALL DELAY

MOV A,R7

ADD A,#40H ; 生成键值的ASCII 码值

MOV SBUF0,A ;发送键值的ASCII 码值

SETB FLAG ;置位发送完成标志

SJMP LOOP

;中断服务程序

RECE: JNB TI,REC1 ;非发送转接收处理

CLR TI ;否则,清除发送中断标志

RETI ;中断返回

REC1: PUSH ACC ;保护累加器A

MOV A,SBUF0 ;读接收缓冲器

CJNE R6,#0,REC2

CJNE A,#43H,REC6 ;接收状态为0,进行字符C 的过滤处理

MOV R6,#1 ; 接收状态改为1

SJMP REC6

REC2: CJNE R6,#1,REC3

CJNE A,#4FH,REC5 ;接收状态为1,进行字符O 的过滤处理

MOV R6,#2 ; 接收状态改为2

SJMP REC6

REC3: CJNE R6,#2,REC4

CJNE A,#4DH,REC5 ; 接收状态为2,进行字符M 的过滤处理

MOV R6,#3 ; 接收状态改为3

MOV R5,#3 ; 数据接收计数器设置为3

SJMP REC6

REC4: CJNE R6,#3,REC6

PUSH ACC ;接收状态为3,暂存接收的内容

MOV A,#REC_BUF0

ADD A,R5

MOV R0,A ;生成接收数据存放缓冲器地址

POP ACC ;恢复接收数据至A 寄存器

MOV @R0,A ;保存接收的数据

DEC R5 ; 接收数据计数器减1

CJNE R5,#0,REC6

CALL DISPLAY ; 接收数据计数器减为0,进行接收结果的显示

REC5: MOV R6,#0 ;接收状态恢复为0(就绪状态)

REC6: POP ACC ;恢复累加器A

CLR RI ;清除接收中断标志

RETI ;中断返回

KEYBOARD: MOV A,P2 ;读按键状态输入端口

RR A

RR A

RRC A ;KEY1 有效键值移入位累加器C

JC K1 ;键值无效转KEY2 键值的分析

MOV A,#1 ; 否则,KEY1 代码送A 寄存器

SJMP K5

K1: RRC A ;KEY2 有效键值移入位累加器C

JC K2 ;键值无效转KEY3 键值的分析

MOV A,#2 ; 否则,KEY2 代码送A 寄存器

SJMP K5

K2: RRC A ;KEY3 有效键值移入位累加器C

JC K3 ;键值无效转KEY4 键值的分析

MOV A,#3 ; 否则,KEY3 代码送A 寄存器

SJMP K5

K3: RRC A ;KEY4 有效键值移入位累加器C

JC K4 ;键值无效转按键无效处理

MOV A,#4 ; 否则,KEY4 代码送A 寄存器

SJMP K5

TAB:

DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H DB

080H,090H,088H,083H,0C6H,0A1H,086H,08EH

K4: K5: MOV RET

A,#0FFH ; 按键无效代码送 A 寄存器

DISPLAY:

MOV A,REC_BUF2 ;读取接收的第 2 字节数据 SWAP A ;高、低 4 位交换

ANL

A,#0FH ;分离高 4 位有效数值

CALL

DECODE

;换码

MOV

DPTR,#NUM2

MOVX

@DPTR,A ;在数码管 NUM2 显示第 2 字节数据高

MOV

A,REC_BUF2 ;读取接收的第 2 字节数据

ANL

A,#0FH ;提取低 4 位有效数值

CALL

DECODE

;换码

MOV

DPTR,#NUM3

MOVX

@DPTR,A ;在数码管 NUM3 显示第 2 字节数据低

MOV

A,REC_BUF1 ;读取接收的第 3 字节数据

SWAP

A ;高、低 4 位交 换

ANL

A,#0FH ;分离高 4 位有效数值

CALL

DECODE

;换码

MOV

DPTR,#NUM4

MOVX

@DPTR,A ;在数码管 NUM4 显示第 3 字节数据高

MOV

A,REC_BUF1 ;读取接收的第 3 字节数据

ANL

A,#0FH ;提取低 4 位有效数值

CALL

DECODE

;换码

MOV

DPTR,#NUM5

MOVX

@DPTR,A ;在数码管 NUM5 显示第 3 字节数据低

RET

J

DECODE PROGRAM -------

DECODE:

MOV DPTR,#TAB

MOVC

A,@A+DPTR

RET

J DELAY

PROGRAM --------

DELAY: MOV R5,#80H

D1:

MOV R6,#0H

DJNZ

R6,$

DJNZ R5,D1

4 位数值

4 位数值

4 位数值

4 位数值

RET $include (Init_Device.inc) ;初始设置子程序文件包含伪指令

END

相关主题
文本预览
相关文档 最新文档