📄 sun.asm
字号:
;*********************************************
; 用89C52制作太阳电池数显充放电控制器原程序
;
;**********************************************
;
;70H内存单元存放采样值,78H-7AH存放显示的BCD码数据,
;自然就依次为个位、十位和百位,模数转换器是ADC0809
;*************************************
;* *
;* 主程序和中断程序入口 *
;* *
;*************************************
ORG 0000H ;程序执行开始地址
LJMP START ;跳至START执行
NOP ;软件陷阱
NOP ;
LJMP ERR ;
ORG 0003H ;外中断0中断入口地址
RETI ;中断返回(不开中断)
NOP;
NOP;
LJMP ERR;
ORG 000BH ;定时器T0中断入口地址
LJMP ERR ;
NOP;
NOP;
LJMP ERR;
ORG 0013H ;外中断1中断入口地址
RETI ;中断返回(不开中断)
NOP;
NOP;
LJMP ERR;
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
NOP;
NOP;
LJMP ERR;
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
NOP;
NOP;
LJMP ERR;
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
NOP;
NOP;
LJMP ERR;
;
;*************************************
;* *
;* 初始化程序中的各变量 *
;* *
;*************************************
CLEARMEMIO: CLR A ;累加器A清零
MOV P2,A ;P2口置0
MOV 70H,A ;70H单元内存清0
MOV A,#0FFH ;累加器A置1
MOV P0,A ;P0、P1、P3端口置1
MOV P1,A ;
MOV P3,A ;
RET ;子程序返回
NOP;
NOP;
LJMP ERR;
;
;*************************************
;* *
;* 主 程 序 *
;* *
;*************************************
START: MOV SP,#60H;
MOV PSW,#00H;
MOV SCON,#00H;
MOV TMOD,#01H;
SETB ET0;
SETB PT0;
MOV TL0,#0FBH;
MOV TH0,#0FFH;
SETB TR0;
SETB ET0;
LCALL CLEARMEMIO ;初始化
MAIN: LCALL DISPLAY ;显示数据一次
LCALL TEST ;测量一次
LCALL ATT ;
LCALL AQQ ;
NOP ;
NOP ;
LCALL WATCH_DOG ;
AJMP MAIN ;返回MAIN循环
NOP ;PC值出错处理
NOP ;空操作
NOP ;空操作
LJMP START ;重新复位起动
NOP;
NOP;
LJMP ERR;
WATCH_DOG: MOV TL0,#0FBH;
MOV TH0,#0FFH;
SETB TR0;
RET;
NOP;
NOP;
LJMP ERR;
;
;**********************************************
;将显示数据转换成十进制BCD码,并调显示子程序 *
;**********************************************
DISPLAY: MOV R0,#70H ;显示数据初址(70H-77H)
MOV A,@R0 ;显示数据转为三位十进制BCD码存入
MOV B,#100 ;7AH、79H、78H显示单元内
DIV AB ;显示数据除100
MOV 7AH,A ;商入7AH
MOV A,#10 ;A放入数10
XCH A,B ;余数与数10交换
DIV AB ;余数除10
MOV 79H,A ;商入79H
MOV 78H,B ;余数入78H
MOV R2,#0FFH ;
DISLOOP2: LCALL DISP ;调四位LED显示程序
DJNZ R2,DISLOOP2 ;
RET ;
NOP;
NOP;
LJMP ERR;
;*************************************************************************
; LED共阳显示子程序,显示内容在78H-7BH,数据在P1输出,列扫描在P3.0-P3.3口*
;*************************************************************************
DISP: MOV R1,#78H ;赋显示数据单元首址
MOV R5,#0FEH ;扫描字
PLAY: MOV P1,#0FFH ;关显示
MOV A,R5 ;取扫描字
ANL P3,A ;开显示
MOV A,@R1 ;取显示数据
MOV DPTR,#TAB ;取段码表首址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P1,A ;段码放入P1口
CLR P1.7 ;开小数点
LCALL DL1MS ;显示1MS
INC R1 ;指向下一地址
MOV A,P3 ;取P3口扫描字
JNB ACC.2,ENDOUT ;三位显示完转ENDOUT结束
RL A ;扫描字循环左移
MOV R5,A ;扫描字放入R5暂存,
MOV P3,#0FFH ;显示暂停
SETB P3.0 ;
SETB P3.1 ;
SETB P3.2 ;
SETB P3.7 ;
AJMP PLAY ;转PLAY循环,
MOV P3,#0FFH ;显示结束,端口置1
ENDOUT: SETB P3.0 ;
SETB P3.1 ;
SETB P3.2 ;
SETB P3.7 ;
MOV P1,#0FFH ;
RET ;子程序返回
NOP;
NOP;
LJMP ERR;
;
;***********************************************************
;LED数码显示管用共阳段码表,分别对应0-9,最后一个是"熄灭符"*
;***********************************************************
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;***************************
; 1MS延时子程序,LED显示用 *
;***************************
DL1MS: MOV R6,#14H ;
DL1: MOV R7,#19H;
DL2: DJNZ R7,DL2;
DJNZ R6,DL1;
RET;
NOP;
NOP;
LJMP ERR;
;
;*********************
;*模数转换测量子程序 *
;*********************
TEST: CLR A ;累加器A清零
MOV P2,A ;清P2口
MOV R0,#70H ;转换值存放首址
LCALL TESTART ;启动测试
WAIT: JB P3.7,MOVD ;P3.7=1则转MOVD处执行,等A/D转换结束信号后转MOVD
AJMP WAIT ;P3.7为0等待
NOP;
NOP;
LJMP ERR;
;
;****************
;测试启动子程序 *
;****************
TESTART: SETB P2.3 ;锁存测试通道地址
NOP ; 延时2微秒
NOP ;
CLR P2.3 ;测试通道地址锁存完毕
SETB P2.4 ;启动测试,发开始脉冲
NOP ; 延时2微秒
NOP ;
CLR P2.4 ;发启动脉冲完毕
NOP ;延时4微秒
NOP ;
NOP ;
NOP ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -