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

📄 main.asm

📁 PID控制
💻 ASM
字号:

;Address macro definition
TIMER0_ADDRESS    EQU   0B0H ; 8253芯片 定时器0
TIMER1_ADDRESS    EQU   0B1H ; 8253芯片 定时器1
TIMER2_ADDRESS    EQU   0B2H ; 8253芯片 定时器2
TIMERCONTROL_ADDRESS    EQU   0B3H ; 8253芯片 定时控制器
TIMER0_MODE       EQU   0F4H ;1111 X100
TIMER0_COUNTER    EQU   0FFFFH ;
INTERRUPT0_ADDRESS      EQU   0D8H ; 8259芯片
INTERRUPT1_ADDRESS      EQU   0D9H ; 8259芯片
ICW1  EQU   1BH ; 高电平触发,单片工作
ICW2  EQU   08H ; 中断类型码为08H,和09H
ICW3  EQU   00H ; 没有从片
ICW4  EQU   06H ; 一般EOI方式
OCW1  EQU   0FCH ; 屏蔽IR2~IR7  A0=1
OCW2  EQU   20H ; 0010 0000 一般EOI命令 A0=0
OCW3  EQU   08H ; 0000 1X0X   A0=1
AD_SELLECT_ADDRESS      EQU   0E8H ; 选择MAX1246芯片(A/D转换器)
AD_CANCEL_ADDRESS       EQU   0F0H ; 取消MAX1246的片选 (A/D转换器)
KEY_SEG_ADDRESS   EQU   70H ; CH451芯片(键盘&LED控制器)
CH451Isolate      EQU   0FH ; 用于在AD输入时,屏蔽CH451的端口
CH451DCLKPre      EQU   85H ; 传送准备电平
CH451DCLKSend     EQU   84H ; 传送电平
CH451DCLKPreCMD   EQU   87H ; 传送准备电平 (命令)
CH451DCLKSendCMD  EQU   85H ; 传送电平 (命令)
FEED_DOG_DCLK     EQU   8EH ; 变化DCLK以清除看门狗的计数
CH451LOAD   EQU   8BH ; 将LOAD脚置0(and方式)在让其自然上拉

FUNC_KEY_PUSH     EQU   40H ; 功能选择键被按下
SHIFT_KEY_PUSH    EQU   41H ; 移位键被按下,循环设定
ROTATE_KEY_PUSH   EQU   42H ; 循环累加键被按下,对某一位进行循环累加
ENTER_KEY_PUSH    EQU   43H ; 确定键被按下,输入设定

;command word macro definition
CH451_INITIAL_CMD EQU   4007H ;设定系统参数:010000000[WDOG][KEYB][DISP]B
      ; WDOG:1(启用),KEYB:1(启用),DISP:1(启用)
SEG_INITIAL_CMD   EQU   50E4H ;设定显示参数:0101[MODE][LIMIT][INTENSITY]B
      ;MODE:1(BCD 译码方式),LIMIT:6(6数码管),INTENSITY:4(占空比4/16)
SEG_FLASH_CMD     EQU   6000H ;设定闪烁控制:0110[D7S][D6S][D5S][D4S][D3S][D2S][D1S][D0S]B
      ;D7S~D0S 分别对应于8 个字驱动DIG7~DIG0.将相应的位置1 则闪烁
LOAD_SEG_CMD      EQU   1000H ;加载字数据:1[DIG_ADDR][DIG_DATA]B
      ;DIG_DATA:8位字数据,。DIG_ADDR:3位地址,000B~111B对应于DIG0~DIG7引脚

INITIAL8259 MACRO

      ENDM
MOV AL,76H                         ;INITIAL8253
OUT 0B3H,AL
MOV AL,
OUT 0B1H,AL
MOV AL,
OUT 0B1H,AL
MOV AL,0BAH
OUT 0B3H,AL
PID     MACRO  CURRENT,OBJECT,RESULT,LIMIT_1,LIMIT_2
         PUSH   AX
         PUSH   BX
         MOV AX, CURRENT
         SUB AX, OBJECT
         MOV ERROR,AX   ;X(0)=ERROR-ERROR_1
         SUB AX,ERROR_1
         MOV X[0],AX
         MOV AX,ERROR  ;X(1)=ERROR-2*ERROR_1+ERROR_2
         MOV BX,ERROR_1
         SAL BX,1
         SUB AX,BX
         ADD AX,ERROR_2
         MOV X[2],AX
         MOV AX,ERROR ;X(2)= ERROR
         MOV X[4],AX
         MOV  AX,Kp   ;计算PID结果RESULT=KP*X(0)+KD*X(1)+KI*X(3)
         IMUL  X[0]
         MOV BX,AX
         MOV AX,Kd
         IMUL X[2]
         ADD BX,AX
         MOV AX,Ki
         IMUL X[4]
         ADD AX,BX   ;对RESULT增量进行数据处理,防止越界。
         CMP AX,LIMIT_1
         JL  LOOP1
         MOV AX,LIMIT_1
         JMP DONE1
LOOP1    MOV BX, LIMIT_1
         NEG BX
         CMP AX,BX
         JG  DONE1
         MOV AX,BX
         JMP DONE1
DONE1    ADD RESULT,AX
         MOV AX,RESULT  ;对RESULT进行数据处理,防止越界

⌨️ 快捷键说明

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