;++++++++++++++++++++计数器程序+++++++++++++
;功能:计数器 ; 3位LED显示
;==============================================
;硬件
;1处理器采用AT89C2051
;2 显示采用LED/3位 (两 位整数,一位小数)
;=======================================================
;资源按排
;T0 用于产生采样定时
;T1 用于显示刷新控制
;INT0 用于外中断(中断方式为:脉冲方式)
;P0口输出BCD数据
;P3输出位驱动
;---------------------------------------------
;第0组通用寄存器主要作为T0定时与计数结果写入控制
;第1组通用寄存器主要作为显示用
;第三组通用寄存器主要作为计数
;================================================
;赋值区(位区)
ADYCW BIT 00H ;该位为1,计数已经溢出
;-------------------------------------------
;赋值区(数据存储器)
VSB EQU 7FH ;十位
VGB EQU 7EH ;个位
VXB EQU 7DH ;小数
XSSXB EQU 67H ;显示刷新定时
;------------------------------------------------
ADXB EQU 12H ;计数结果小数存储器
ADGB EQU 11H ;计数结果个位存储器
ADSB EQU 10H ;计数结果十位存储器
;=================================================
ORG 0000H
AJMP KS ;去主程序
ORG 0003H ;INT0外中断入口
AJMP ZD0;INT0中断处理(计数)
ORG 000BH ;T0中断入口
AJMP DS0;T0中断处理(产生主时钟)
ORG 001BH ;T1中断入口
AJMP DS1;T1中断处理(显示刷新)
;-------------------------------------------
KS: ;空操作(起动稳定部分)
NOP
NOP
;主程序(所有数据初始化部分0
MOV VSB,#0 ;初始
MOV VGB,#0
MOV VXB,#0
MOV ADXB,#0 ;AD结果小数存储器
MOV ADGB,#0 ;AD结果个位存储器
MOV ADSB,#0 ;AD结果十位存储器
;主程序(功能,控制设置部分)
MOV SP,#30H ;设置堆栈
MOV P3,#0FFH ;屏蔽显示地址
MOV P1,#0FFH ;屏蔽显示数据
MOV XSSXB,#10 ;设置显示刷新时间
MOV R5,#222 ;时钟(采样时间)与T0配合
MOV R6,#30 ;时钟(采样时间)与T1配合
MOV DPTR,#BCDB ;将BCD码表装入数据指针(DPTR)
SETB RS0 ;设置第二组通用寄存器
MOV R0,#VXB ;将需要显示的数据起始地址装入
MOV R2,#1 ;设置显示位的起始位标志
CLR RS0 ;恢复
MOV TL0,#106 ;T0定时值设置为150(初值150)
MOV TH0,#106
MOV TL1,#6 ;T1刷新时间
MOV TH1,#6
MOV IE,#8BH
MOV IP,#1 ;T0,INT0中断优先
MOV TMOD,#22H ;T0,T1定时方式设置为2
MOV TCON,#53H ;起动T0,T1定时器,将INT0触发方式,设置为脉冲方式
AJMP $ ;死循环
;设置结束
;===========================================================================
DS0: ;时钟与AD数据存储处理子程序
PUSH PSW
PUSH ACC
MOV PSW,#0 ;原始
DJNZ R5,DS0C ;不等0出
MOV R5,#222 ;333毫秒
DJNZ R6,DS0C
MOV R6,#30 ;999毫秒
MOV VXB,ADXB ;AD结果写入电压数据存储器
MOV VGB,ADGB
MOV VSB,ADSB
DS0C:
POP ACC
POP PSW
RETI
;============================================
DS1: ;从小数开始显示
PUSH PSW
PUSH ACC
CLR RS1
SETB RS0 ;使用第二组通用寄存器
DJNZ XSSXB,DS1C
MOV XSSXB,#10 ;刷新率定时
MOV P1,#0FFH ;显示复位,屏蔽数据
MOV P3,#0FFH ;显示复位,屏蔽显示位地址
;刷新第一位
CJNE R2,#1,XS2 ;检查是否显示到第一位
MOV A,@R0 ;电流小数数据传到
MOVC A,@A+DPTR ;查表
MOV P1,A ;传出显示数据
CLR P3.1 ;显示电流小数
INC R0 ;显示数据地址加一
INC R2 ;显示位数加一
XS2: ;刷新第二位
CJNE R2,#2,XS3 ;检查是否显示到第二位
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A ;传出显示数据
CLR P1.7 ;显示电流个位
INC R0
INC R2
AJMP DS1C
XS3: ;刷新第三位
CJNE R2,#3,DS1C ;检查是否显示到第三位
MOV A,@R0
JZ XS30
MOVC A,@A+DPTR
MOV P1,A ;传出显示数据
CLR P3.7 ;显示
XS30:
MOV R0,#VXB ;重装显示数据起始存储器地址
MOV R2,#1 ;重装显示起始位地址
MOV DPTR,#BCDB
DS1C:
POP ACC
POP PSW
RETI
;============================================
ZD0: ;三位计数
PUSH PSW
PUSH ACC
CLR RS0
SETB RS1
JB ADYCW,ZD0C
INC R0 ;小数加一
CJNE R0,#10,ZD0C
MOV R0,#0 ;进位
INC R1 ;个位加一
CJNE R1,#10,ZD0C
MOV R1,#0 ;进位
INC R2 ;十位加一
CJNE R2,#10,ZD0C
MOV R0,#10 ;溢出
MOV R1,#10
MOV R2,#10
SETB ADYCW
ZD0C:
POP ACC
POP PSW
RETI
;============================================
BCDB: ;BCD码表
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
;0 1 2 3 4 5 6 7 8 9 -(溢出)
;============================================
END