⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sun.asm

📁 用89C52制作太阳电池数显充放电控制器原程序.说明:70H内存单元存放采样值
💻 ASM
📖 第 1 页 / 共 2 页
字号:


;*********************************************
; 用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 + -