单片机实验3
实验内容
甲、乙两个单片机之间通信,其中甲机连接8个流水灯循环闪烁和一个按键,乙机连接又一个LED数码管,按下甲机的按键,流水灯闪烁不受影响,乙机显示按键按下的次数
单片机型号为AT89C51、用proteus8.9、keil5软件 汇编语言编写
代码
//发送
====================================================================
Processor: AT89C51
Compiler: ASEM-51 (Proteus)
====================================================================
ORG 0000H
AJMP MAIN
ORG 0003H //中断1地址
AJMP INTOSEL
ORG 0023H //串口中断地址
AJMP SENDover
ORG 0030H
MAIN:
MOV TMOD, #20H //1.定时器T1 , 模式2 八位自动充装载
MOV TL1, #0FDH //2.9600MHZ的波特率,
MOV TH1, #0FDH //3.
SETB TR1 //开定时器1
MOV SCON, #50H //串口通讯模式1
MOV R0, #0FEH //流水灯循环
MOV R1, #1H //起始按键
SETB EX0 //开外部中断0
SETB IT0 //模式1
SETB ES //开串口终端
SETB EA //开总中断
MOV SP, #60H //堆栈
MOV DPTR, #TAB
LEDLOOP: //流水灯循环
MOV A, R0
MOV P0, A
RL A
MOV R0, A
LCALL DELAY //延时
AJMP LEDLOOP
INTOSEL: //外部中断
INC SP //保护现场
PUSH ACC
MOV A, R1 //按键次数
LCALL Choose //判断按键次数,并且判断是否重新归零
MOVC A, @A+DPTR
MOV SBUF, A //发送数据
POP ACC //还原现场
DEC SP
RETI //退出
Choose:
INC R1 //按键+1
CJNE R1, #0AH,RET1 //判断是否过10次 语法CJNE
MOV R1, #0H
RET
RET1:
RET
SENDover: //串口中断
JNB TI, $ //判断是否发送完毕
CLR TI //清零
RETI //返回
//延迟
DELAY:
MOV R2, #03H
LOOP:
MOV R3 , #0FFH
LOOP1:
MOV R4 , #0FFH
DJNZ R4 , $
DJNZ R3 , LOOP1
DJNZ R2, LOOP
RET
//共阳性数码管
TAB:
DB 0C0H , 0F9H , 0A4H , 0B0H , 99H , 92H , 82H , 0F8H , 80H , 90H
END
// 接收
====================================================================
Created: 2021
Processor: AT89C51
Compiler: ASEM-51 (Proteus)
====================================================================
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP Reach //接受中断入口
ORG 0030H
MAIN:
MOV TMOD, #20H //设置波特率 发送和接收的波特率必须一致
MOV TL1, #0FDH
MOV TH1, #0FDH
SETB TR1
MOV SCON, #50H //串口模式1
SETB ES
SETB EA
MOV P0, #0C0H //首次数码管显示0
Reach: //接收
JNB RI, $ //等待接收
MOV A, SBUF //将接收的数据赋值给累加器A
MOV P0, A //在数码管上显示按键次数
CLR RI //清零
LJMP Reach
END
图