请帮我把以下的汇编语言转换为C51单片机语言。 ORG 0000H LJMP MAIN ORG 0003H LJMP PINT0 ORG 0200H MAIN: MOV IE,#81H; cpu开放中断,INT0允许中断 SETB IT0; 外部中断为边沿触发方式 MOV SP,#30H; 指针入口地址 SETB P3.0 CLR P3.1 MOV P1,#0FFH; 使P1口全部置1 MOV P2,#00H; P2口清零 CLR P1.2 LP: JNB P1.0,LA; 检测输入信号,是否有输入信号 LA: ACALL DELAY; 延时消抖 JNB P1.0,ALARM; 再次监测输入信号,若有输入信号转入报警子程序 AJMP LP DELAY: MOV R1,0AAH LD2: MOV R2,0BBH LD1: NOP DJNZ R2,LD1 DJNZ R1,LD2 RET ALARM: SETB P1.2; 开始报警使运行正常绿指示灯熄灭,红灯和声报警启动 CPL P3.0 CPL P3.1 ;10S time MOV 51H,#14H; 10s循环次数 MOV TMOD,#01H; 定时器T0定时方式1 MOV TL0,#0B0H; 置50ms定时初值 MOV TH0,#3CH SETB TR0; 启动T0 L2: JBC TF0,L1; 查询计数溢出 SJMP L2 L1: MOV TL0,#0B0H; MOV TH0,#3CH DJNZ 51H,L2; 未到10s继续循环 SETB P3.0; 10s到关闭报警 CLR P3.1 CLR P1.2; 报警结束,正常运行指示灯亮 LJMP LP; 循环,继续工作 ;interrupt INT0 PINT0: CLR EX0; 外部中断0服务程序开始,屏蔽外部中断 PUSH PSW PUSH ACC JNB P3.2,LN; 监测是否有终端输入 LN: LCALL DELAY; 延时消抖 JNB P3.2,LN1 AJMP LN2; 无中断输入,中断返回 LN1: SETB P3.0 CLR P3.1 CLR P1.2; 使报警结束,绿指示灯亮 POP ACC POP PSW SETB EX0; 开放外部中断0 LCALL LP; 在中断继续检测是否有输入信号 LN2: RETI END
时间: 2024-03-10 21:43:22 浏览: 127
51单片机汇编葵花宝典,Keil C51使用帮助中文资料 ,Keil C51语言使用技巧及实战 学习C51基础等5个文件,都是学习单片机的资料
5星 · 资源好评率100%
以下是将汇编语言转换为C51单片机语言的代码:
```c
#include <REG51.h>
void DELAY() {
unsigned char R1, R2;
R1 = 0xAA;
do {
R2 = 0xBB;
do {
_nop_();
} while (--R2);
} while (--R1);
}
void main() {
IE = 0x81; // cpu开放中断,INT0允许中断
IT0 = 1; // 外部中断为边沿触发方式
SP = 0x30; // 指针入口地址
P3_0 = 1;
P3_1 = 0;
P1 = 0xFF; // 使P1口全部置1
P2 = 0x00; // P2口清零
while (1) {
if (P1_0 == 0) { // 检测输入信号,是否有输入信号
DELAY(); // 延时消抖
if (P1_0 == 0) { // 再次监测输入信号,若有输入信号转入报警子程序
P1_2 = 1; // 开始报警使运行正常绿指示灯熄灭,红灯和声报警启动
P3_0 = !P3_0;
P3_1 = !P3_1; // 10S time
unsigned char cnt = 0x14; // 10s循环次数
TMOD = 0x01; // 定时器T0定时方式1
TL0 = 0xB0; // 置50ms定时初值
TH0 = 0x3C;
TR0 = 1; // 启动T0
while (cnt--) { // 未到10s继续循环
while (!TF0)
; // 查询计数溢出
TF0 = 0;
TL0 = 0xB0;
TH0 = 0x3C;
}
P3_0 = 1; // 10s到关闭报警
P3_1 = 0;
P1_2 = 0; // 报警结束,正常运行指示灯亮
}
}
}
}
void PINT0() interrupt 0 { // 外部中断0服务程序开始,屏蔽外部中断
_push_(PSW);
_push_(ACC);
if (P3_2 == 0) { // 监测是否有终端输入
DELAY(); // 延时消抖
if (P3_2 == 0) {
P3_0 = 1;
P3_1 = 0;
P1_2 = 0; // 使报警结束,绿指示灯亮
_pop_(ACC);
_pop_(PSW);
EX0 = 1; // 开放外部中断0
return;
}
}
_pop_(ACC);
_pop_(PSW);
EX0 = 1; // 开放外部中断0
}
```
阅读全文