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

📄 a1.asm

📁 51单片机状态顺序编码,监控程序在主程序中
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;《简易Υ辐射仪》软件清单

BUFSZ     EQU     30H                   ;显示缓冲区首址
BUF1      DATA    30H                   ;千位显示缓冲区
BUF2      DATA    31H                   ;百位显示缓冲区
BUF3      DATA    32H                   ;十位显示缓冲区
BUF4      DATA    33H                   ;个位显示缓冲区
SEC       DATA    34H                   ;时钟秒级单元(BCD码)
KEYC      DATA    38H                   ;键码
NH        DATA    39H                   ;计数器溢出次数
NOSZ      EQU     3AH                   ;测点序号存放首址
NOH       DATA    3AH                   ;测点序号高字节(BCD码)
NOL       DATA    3BH                   ;测点序号低字节(BCD码)
TJSZ      EQU     3CH                   ;测点定时条件存放首址
TJH       DATA    3CH                   ;测点定时条件高字节(BCD码)
TJL       DATA    3DH                   ;测点定时条件低字节(BCD码)
CPSSZ     EQU     3EH                   ;CPS存放首址
CPSH      DATA    3EH                   ;CPS高字节(BCD码)
CPSL      DATA    3FH                   ;CPS低字节(BCD码)

FLAG      DATA    20H                   ;辅助标志字节
KEYP      BIT     FLAG.0                ;用于描述已响应按键(1)和未响应按键(0)
DISPLY    BIT     FLAG.1                ;用于描述已显示(1)和未显示(0)
SETTING   BIT     FLAG.4                ;用于描述修改(1)和查阅(0)
CONT      BIT     FLAG.5                ;用于描述连测(1)和点测(0)
DINS      BIT     FLAG.7                ;用于描述定数测量(1)和定时测量(0)

SECD      DATA    22H                   ;时钟1/16s单元,可用于位寻址确定闪烁时间
SECD8     BIT     SECD.5                ;时钟1/16s单元的5位用于控制1/8s的闪烁
SECD2     BIT     SECD.7                ;时钟1/16s单元的7位用于控制1/2s的闪烁

SETP      DATA    2DH                   ;修改位置指针(0:千;1:百;2:十;3:个)
SETP0     BIT     SETP.0                ;0:千十;1:百个
SETP1     BIT     SETP.1                ;0:千百;1;十个

STATEN    DATA    2EH                   ;状态码(次态)
STATE     DATA    2FH                   ;状态码(现态)

LED       BIT     P1.7                  ;LED控制端(0:亮;1;灭)

          ORG     0000H      
          LJMP    MAIN                  ;复位入口

          ORG     000BH
          LJMP    TIME                  ;定时中断

          ORG     001BH
          INC     NH                    ;计数溢出中断
          RETI

;定时中断子程序:
          ORG     0030H
TIME:     ORL     TL0,#0EEH             ;重置时常数
          MOV     TH0,#85H
          PUSH    ACC                   ;保护现场
          PUSH    PSW
          MOV     PSW,#8                ;使用1区工作寄存器
          MOV     A,SECD                ;调整时钟
          ADD     A,#10H
          MOV     SECD,A
          JC      TIM1                  ;是否到了整1s?
          LJMP    ENDI
TIM1:     MOV     A,SEC                 ;调整秒单元
          ADD     A,#1
          DA      A
          MOV     SEC,A
          ANL     A,#0FCH               ;是否够4s?
          JZ      ENDI
          MOV     A,STATE
          JNZ     TEST
          JNB     CONT,ENDI             ;是否连测休止期
          LCALL   BEG                   ;自动启动一次测量
	       MOV     STATE,#1              ;进入测量状态
	       SJMP    ENDI
TEST:     CJNE    A,#1,ENDI             ;是否测量中
          JNB     DINS,DISI             ;测量方式判断
          MOV     A,TJH                 ;定数方式,将定数条件换成十六进制
	       RR      A
	       RR      A
	       CLR     C
	       SUBB    A,TH1                 ;和比较
	       JC      CPS                   ;已经够数
	       MOV     A,SEC
	       SUBB    A,#64H
	       JNC     CPS                   ;实测脉冲数虽然不够数,但时间已经够64s
	       SJMP    ENDI
DISI:     MOV     A,NH                  ;定时方式
          JNZ     CPS                   ;时间虽然不够,但实测脉冲数超过65536
          MOV     A,SEC                 
          CJNE    A,TJL,ENDI            ;测量时间到否?
CPS:      CLR     TR1                   ;停止测量
          CLR     ET1
	       MOV     R3,NH                 ;取测量结果
	       MOV     R4,TH1
	       MOV     R5,TL1
	       MOV     A,SEC                 ;单字节十进制转换为十六进制数
	       MOV     R7,A
	       ANL     A,#0FH
	       XCH     A,R7
	       ANL     A,#0F0H
	       SWAP    A
	       MOV     B,#10
			 MUL     AB
			 ADD     A,R7
			 MOV     R7,A
			 LCALL   DV31                  ;计算CPS
			 MOV     A,R4
			 MOV     R6,A
			 MOV     A,R5
			 MOV     R7,A
			 LCALL   HB2                   ;双字节十六进制数转换为十进制
          MOV     A,R3
      	 JZ      CPS1
			 MOV     R4,#99H               ;CPS封顶
			 MOV     R5,#99H               
CPS1:     MOV     CPSH,R4               ;保存测量结果CPS值
          MOV     CPSL,R5
			 MOV     A,NOL
			 ADD     A,#1
			 DA      A
			 MOV     NOL,A
			 MOV     A,NOH
			 ADDC    A,#0
			 DA      A
			 MOV     NOH,A
			 JNC     CPSE                  ;序号超出否?
			 MOV     NOL,#1                ;重新从一号测点开始
CPSE:     MOV     STATE,#0              ;进入休止期
          MOV     SEC,#0                ;开始计算休息时间
ENDI:     MOV     C,14H                 ;每1/8s申请一次显示
          MOV     DISPLY,C
			 POP     PSW                   ;恢复现场
			 POP     ACC
			 RETI                          ;定时中断结束

;主程序
MAIN:     MOV     SP,#67H               ;设置系统堆栈区为68~7FH
          MOV     R0,#20H               ;把内存20H~7FH全清零
          CLR     A
CLRS:     MOV     @R0,A
          INC     R0
          CJNE    R0,#80H,CLRS
;发光二极管自检(闪烁三次);
          MOV     R2,#3
TES1:     CLR     LED                   ;亮
          LCALL   TIM2                  ;延时
          SETB    LED                   ;灭
          LCALL   TIM2                  ;延时
          DJNZ    R2,TES1
;数码管自检(从0000~9999进行显示):
TES2:     MOV     BUF1,R2               ;设置显示内容(四位显示内容相同)
          MOV     BUF2,R2               
          MOV     BUF3,R2
          MOV     BUF4,R2
          LCALL   SS                    ;显示
          LCALL   TIM2                  ;延时
          INC     R2                    ;更换显示内容
          CJNE    R2,#0BH,TES2          ;直到完全熄灭
;开始初始化:
          MOV     TJL,#4                ;测量条件默认为4s
          MOV     NOL,#1                ;测点序号默认从第一点开始
			 MOV     TH0,#85H              ;时钟定时器(1/16s,6MHz晶体)
			 MOV     TL0,#0EEH             
			 MOV     TMOD,#51H             ;T0定时,T1计数
			 SETB    PT1                   ;计数溢出中断为高级中断
			 CLR     ET1                   ;暂时关闭计数器
			 SETB    TR0                   ;定时器开始工作
			 SETB    ET0
			 SETB    EA
;主程序进入监控循环:
LOOP:     JB      DISPLY,LOOP1
          LCALL   DISP                  ;调用显示模块
LOOP1:	 LCALL   KIN                   ;读取键码
          JZ      KEY0                  ;按键否?
			 MOV     KEYC,A                ;保存输入键码,用于去抖处理
			 MOV     R4,#20                ;延时去抖动
			 MOV     R5,#0
TIM0:     DJNZ    R5,TIM0
          DJNZ    R4,TIM0
			 LCALL   KIN                   ;再次读取键码
			 XCH     A,KEYC                ;保存输入键码
			 XRL     A,KEYC                ;与上次按键比较
			 JZ      KEY2                  ;相同否?
KEY0:     CLR     KEYP                  ;未按键或键码发生变化,清响应标志
          SJMP    LOOP
KEY2:     JB      KEYP,LOOP             ;按键已经响应,不再响应,防止连击
          CLR     CONT                  ;任何按键均结束连测方式
			 MOV     A,STATE               ;取当前状态
			 MOV     B,#4
			 MUL     AB
			 ADD     A,KEYC                ;结合键码
			 INC     A
			 MOVC    A,@A+PC               ;查表
			 SJMP    KEY3
			 DB      11H,21H,32H,43H       ;状态0下K1~K4对应的反应元素
			 DB      60H,60H,60H,60H       ;状态1下K1~K4对应的反应元素
			 DB      72H,82H,60H,60H       ;状态2下K1~K4对应的反应元素
			 DB      93H,83H,60H,60H       ;状态3下K1~K4对应的反应元素
KEY3:     MOV     B,A
          ANL     A,#0FH
			 MOV     STATEN,A              ;保存次态
			 MOV     A,B
			 SWAP    A
			 ANL     A,#0FH                ;取模块号
			 MOV     B,#3
          MUL     AB
			 MOV     DPTR,#WORK
			 JMP     @A+DPTR               ;进入指定模块
WORK:     LJMP    WK0                   ;路标集合
          LJMP    WK1
			 LJMP    WK2
			 LJMP    WK3
			 LJMP    WK4
			 LJMP    WK5
			 LJMP    WK6
			 LJMP    WK7
			 LJMP    WK8
			 LJMP    WK9
WK0:      LJMP    WKE                   ;空操作,返回汇合点
WK1:      LCALL   BEG                   ;启动连续测量
          SETB    CONT                  ;设立连测标志
			 LJMP    WKE                   ;返回汇合点
WK2:      LCALL   BEG                   ;启动一次测量(点测)
          LJMP    WKE                   ;返回汇合点
WK3:      CLR     SETTING               ;进入查询条件状态
          MOV     SETP,#0
			 LJMP    WKE                   ;返回汇合点
WK4:      CLR     SETTING               ;进入查询序号状态
          MOV     SETP,#0
			 LJMP    WKE                   ;返回汇合点
WK5:      LJMP    WKE                   ;返回汇合点
WK6:      MOV     A,STATE
          CJNE    A,#1,WK61
			 MOV     CPSH,#0               ;测量中,中止本次测量,CPS清零
			 MOV     CPSL,#0
			 MOV     SEC,#0                ;时钟复位
			 LJMP    WKE                   ;返回汇合点
WK61:     CJNE    A,#2,WK6E
          MOV     A,TJH                 ;退出条件状态之前,检查新条件的性质
			 JZ      WK64                  ;小于100按定时方式进行测量
			 ADD     A,#05H
			 DA      A
			 JNC     WK62                  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -