求一单片机AT89C51汇编语言编程如下要求

12M晶振P1.0~P1.2按钮按其中一个LED灯亮并且蜂鸣器响P3.2按钮暂停功能其他功能:灯亮和蜂鸣器响持续1分钟自动停止中途可暂停。p1.0~p1.2按一下就重新计时延时1分钟

汇编帮你写一个 Sec EQU 78H
MM EQU 7BH
TM BIT 00H
STOP BIT 9H
KEY_1_DL BIT 2H
KEY_2_DL BIT 3H
KEY_3_DL BIT 4H
KEY_1_ZX BIT 5H
KEY_2_ZX BIT 6H
KEY_3_ZX BIT 7H
FLG BIT 8H
KEY_4_ZX BIT 10H
KEY_4_DL BIT 11H ORG 0000H
LJMP INIT
ORG 000BH
LJMP INIT0
INIT: MOV SP,#60H ;主程序初始化
MOV TMOD,#01H ;选择定时器/计数器T0的方式1
MOV TL0,#0B0H ;对低位赋初值
MOV TH0,#03CH ;高位赋初值
SETB EA
SETB ET0
SETB TR0
SETB STOP
START1: LCALL ST LCALL KEYSCAN
SJMP START1 ST: JB STOP,TZ
SETB P3.1
CLR P3.0
SJMP OU
TZ: CLR P3.1
SETB P3.0
MOV SEC,#00H
OU: RET
INIT0: PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
MOV TL0,#0B0H
MOV TH0,#03CH
SETB TR0
INC MM
MOV B,#02H
MOV A,MM
DIV AB
MOV A,B
CJNE A,#00H,OUTN
SETB TM
OUTN: MOV A,MM

CJNE A,#14H,OUTT0 ;50ms是否到20次,没有到就继续执行50ms的延时
MOV MM,#00
JB FLG,OUTT0 ; PAUSE FLAG
INC SEC
MOV A,sec
CJNE A,#3CH,OUTT0 ;一秒的延时是否计到60次,没有就继续执行
MOV sec,#00
SETB STOP
CLR FLG
OUTT0:SETB ET0 ;启动定时器T0
POP PSW
POP ACC
RETI KEYSCAN: JB TM, KEYS
SJMP KEYOUT
KEYS: CLR TM
JNB P3.2,KEYSCAN0
JNB KEY_1_ZX,KEY2S
CLR KEY_1_ZX ;P1.0有按键按下则跳转到子程序
KEY2S: JNB P1.0,KEYSCAN1
JNB KEY_2_ZX,KEY3S
CLR KEY_2_ZX ;P1.1有按键按下则跳转到子程序
KEY3S: JNB P1.1,KEYSCAN2
JNB KEY_3_ZX,KEY4S
CLR KEY_3_ZX
KEY4S: JNB P1.2,KEYSCAN4
JNB KEY_4_ZX,KEYOUT
CLR KEY_4_ZX
KEYOUT: RET KEYSCAN0: JB KEY_1_ZX,KEYOUT
JB KEY_1_DL,WAITO
SETB KEY_1_DL
SJMP KEYOUT WAITO: SETB KEY_1_ZX
SETB FLG ; 设置暂停标志
SETB STOP
SJMP KEYOUT KEYSCAN1: JB KEY_2_ZX,KEYOUT
JB KEY_2_DL,WAIT1
SETB KEY_2_DL
SJMP KEYOUT
WAIT1: SETB KEY_2_ZX SJMP KK

KEYSCAN4: JB KEY_4_ZX,KEYOUT
JB KEY_4_DL,WAIT1
SETB KEY_4_DL
SJMP KEYOUT
WAIT4: SETB KEY_4_ZX SJMP KK KEYSCAN2: JB KEY_3_ZX,KEYOUT
JB KEY_3_DL,WAIT2
SETB KEY_3_DL ;20ms的延时消抖
SJMP KEYOUT
WAIT2: SETB KEY_3_ZX ;判断是否放开按键
KK: JB FLG ,HUI
MOV SEC,#00H
CLR STOP
SJMP KEYOUT HUI: CLR FLG
CLR STOP SJMP KEYOUT
END
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-28
写这样的程序,别人会要收费的!
第2个回答  2013-07-28
我会用C语言写,但是用汇编我还没有用过。你要是要用C写,我可以帮到你。
相似回答
大家正在搜