求单片机课程设计 用汇编语言设计计数器 AT89C51

利用各自制作的单片机开发板,采用汇编语言或C语言编写程序,实现计程器功能。具体要求如下:
1、里程脉冲信号通过外部中断1输入,每来1个脉冲里程数增加0.1km;
2、显示功能。数码管4位显示显示总里程数值,最大值999.9(km),最小值000.0(km);
3、保养提醒。满足下列条件之一者:第一,累计达到1km;第二,累计时间达到10s;通过声光(蜂鸣器和发光二极管)报警提醒。每次报警,此次的保养条件记录停止,新的保养条件开始累计。报警过程中,不影响总里程数的累计;
4、通过P3.2按键取消报警,保养条件2重新计时。

完成了计数部分
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP INT_1
MAIN:
SETB EA
SETB EX1
SETB IT1
MOV 30H,#00H
MOV 31H,#00H
START:MOV A,30H
MOV B,#10H
DIV AB
MOV 70H,B
MOV 71H,A
MOV A,31H
MOV B,#10H
DIV AB
MOV 72H,B
MOV 73H,A
MOV R0,#70H
MOV R3,#80H
MOV A,R3

LOOP: MOV P2,A
MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JNB P2.6,LK
ANL A,#7FH
LK:
MOV P0,A
LCALL D1MS
LPP:INC R0
MOV A,R3
JB ACC.4,START
RR A
MOV R3,A
SJMP LOOP

INT_1:PUSH PSW
PUSH ACC
MOV A,30H
INC A
DA A
MOV 30H,A
MOV A,31H
ADDC A,#0
DA A
MOV 31H,A
POP ACC
POP PSW
RETI

TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
D1MS:MOV R7,#02H
DL:MOV R6,#0FFH
DL6:DJNZ R6,DL6
DJNZ R7,DL
RET
END
求单片机高手

第1个回答  2013-06-29
那就再加2个比较就可以了吗。31H和30H是累计里程的压缩BCD数据,你的第一个条件是累计到达1KM的时候,也就是10个脉冲到的时候,那么在主程序START计数70H的时候,对70H的数据进行比较就行了
MOV A,70
JZ ALARM ;跳转到报警程序
另外一个就是计时功能了,那么就再增加一个定时中断来计时,启动INT_T0来进行计时,进行50ms定时,然后用R0做计数单元,每次中断R0加1,到达200的时候就是10S了,再去启动报警。

至于消除报警,不就简单了吗,写一条指令
JNB P2.3,CANCEL_ALARM ;CACEL_ALARM取消报警子程序,把R0清零就可以了