📄 key.asm
字号:
/****************************************************************************/
/* */
/* Copyright (c) 2005, 老树工作室 */
/* All rights reserved. */
/* */
/* Email:laoshu0902@163.com */
/* www.laoshu0902.bokee.com */
/* */
/****************************************************************************/
;+============================================================================+
;| 8051 伪指令定义 |
;+============================================================================+
WDI EQU 085H ;定义看门狗的清除标志
KEY EQU 0B2H ;定义外部中断数量到时的标志
;+============================================================================+
;| 8051 中断处理程序入口 |
;+============================================================================+
ORG 0000H ;程序开始
LJMP main ;跳转主程序
ORG 0003H ;外部中断int0的中断入口地址
LJMP EI0_ISR ;跳转定时器INT0中断服务子程序
;通常子程序的长度要大于2个中断之间的空间
;所以放到子程序中执行
ORG 000BH ;定时器t0的中断入口地址
LJMP T0_ISR ;跳转定时器0中断服务子程序
ORG 0013H ;外部中断int1的中断入口地址
LJMP EI1_ISR ;跳转定时器INT1中断服务子程序
ORG 0023H ;串口中断的中断入口地址
LJMP INTERS ;跳转串口中断服务子程序
;+============================================================================+
;| 8051 主程序 |
;+============================================================================+
ORG 100H ;主程序从地址100H开始执行
;是为了避开以上这些中断
;当然程序可以从30H开始
;从这个地址开始主要是为了HEX文件的好阅读
;阅读HEX文件,使用ultraedit的最新中文版本
;+============================================================================+
;| 8051 定时器、外部中断、串口配置 |
;+============================================================================+
main: MOV SP,#70H ;设置堆栈,以下是单片机初始化
MOV TMOD,#21H ;设置定时器1和串行接口参数9600波特率,时钟11.0592MHz
MOV TL1,#0FDH ;定时器1参数的设置
MOV TH1,#0FDH
SETB TR1 ;启动定时器1中断
MOV SCON,#50H ;启动串口控制寄存器
SETB ES ;启动串口中断
SETB ET0 ;启动定时器t0中断
CLR IT0 ;选择外部中断0为低电平触发
CLR IT1 ;选择外部中断1为低电平触发
CLR EX0 ;关闭外部中断0
SETB EX1 ;启动外部中断1
MOV TH0,#0B1H ;设置定时器0参数,定时器0的中断周期大约为2ms
MOV TL0,#0E0H
CLR RS0 ;设置寄存器区基本参数
CLR RS1
SETB TR0 ;启动定时器0中断
SETB IP.4 ;设置中断优先级,串口中断为最高
CLR IP.1 ;设置定时器0优先级,低于串口中断
; SETB EA ;启动全部中断
L01: MOV A,#11111110B ;对A初始化,准备把A的数字送到P1
;+============================================================================+
;| 8051 主流程 |
;| 在主流程中判断是否有键按下,对使用软件延时的办法做流水灯的实验 |
;| 程序框架保持不变 |
;+============================================================================+
WDILP: CPL WDI
JB KEY,WDILP ;有按键按下吗?如果没有,对看门狗操作后,再次询问;
MOV P1,A ;有则把数送到P1;
L02: CALL DLY4MS ;延时消抖动
RL A ;准备好移位的数据
SJMP WDILP ;主程序流程结束
;+============================================================================+
;| 定时器0中断服务子程序 |
;+============================================================================+
T0_ISR: CPL P1.0 ;对P1.0取反,设置定时器中断到的标志,在示波器上可以看到方波
MOV TH0,#0B1H ;重新设置定时器0定时参数
MOV TL0,#0E0H
SETB ET0 ;允许定时器0中断
SETB TR0 ;启动定时器0
RETI ;中断服务子程序返回,RETI是中断子程序返回的命令代码,与子程序的RET不同
;+============================================================================+
;| 串口接收中断服务子程序 |
;+============================================================================+
INTERS: CLR ES ;禁止串行中断
JBC RI,RECINT ;判断接收标志为有接收数据吗?有则将接收标志置0,准备接收下一条数据,跳转到接收程序
SETB ES ;允许串口中断
RETI ;如果接收标志为没有数据,则中断返回
RECINT: MOV A,SBUF ;发送数据
INC ACC ;将接收的数加1
LCALL SENT ;将数发出,回应收到的数
CPL p1.1 ;做可以看到接收到数据的标志
SETB ES ;允许串口中断
RETI
;+============================================================================+
;| 外部中断0服务子程序 |
;+============================================================================+
EI0_ISR:CLR EX0 ;禁止外部中断0
CPL P1.2
LCALL DLY4MS ;延时消抖动
SETB EX0 ;启动外部中断0
RETI
;+============================================================================+
;| 外部中断1服务子程序 |
;+============================================================================+
EI1_ISR:CLR EX1 ;禁止外部中断1
CPL P1.3
LCALL DLY4MS ;延时消抖动
SETB EX1 ;启动外部中断1
RETI
;+============================================================================+
;| 串口发送数据子程序 |
;+============================================================================+
SENT: MOV SBUF,A ;发送数据
W1: JBC TI,CON1 ;判断发送成功吗? (TI=1?),成功了则清楚除TI
SJMP W1 ;没有发送成功则继续判断
CON1: CPL P1.4 ;发送一个数据,就对P1.4取反操作
CPL WDI ;发送数据成功,对看门狗取反操作
RET ;子程序返回
;+============================================================================+
;| 延时子程序 |
;+============================================================================+
DLY4MS: MOV R6,#1FFH
DLAY1: MOV R7,#0FFH
SDY: NOP
DJNZ R7,SDY
DJNZ R6,DLAY1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -