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

📄 自动饮料机自动续杯系统源程序.asm

📁 光电智能检测系统是通过89S52单片机对键盘、显示器、外部电路及检测设备的控制而实现的。 自动饮料机智能续杯装置是在光电检测系统的基础上开发而成的
💻 ASM
字号:
;*****************************
;使用伪指令定义变量
;*****************************
DIO BIT p1.0     ;定义单片机与7289的数据线DATA相连接的端口为DIO
CLK BIT P1.1     ;定义单片机与7289的时钟CLK相连接的端口为CLK
CS  BIT P1.2     ;定义单片机与7289的片选信号CS相连接的端口为CS
KEY BIT P3.2     ;定义单片机与7289的按键信号KEY相连接的端口为KEY
DIRECT1 BIT P0.5 ;电机1转向控制
PULSE1  BIT P0.4 ;电机1脉冲控制
DIRECT2 BIT P0.2 ;电机2转向控制
PULSE2  BIT P0.3 ;电机2脉冲控制
CGQ1 BIT P3.4    ;光电传感器1
CGQ2 BIT P3.5    ;光电传感器2


BIT_CNT  EQU 74H ;定义一个寄存器,存放需要传送的数据的位数
DELAY    EQU 75H ;延时寄存器(计数器)
SEND_BUF EQU 76H ;定义一个寄存器,存放需要发送的数据
REC_BUF  EQU 77H ;定义一个寄存器,存放接受到的数据
DECIMAL  EQU 78H ;定义一个寄存器,存放键值的个位
DECIMAL1 EQU 79H

T_HB     EQU 71H ;定时器时间高字节
T_LB     EQU 70H ;定时器时间低字节



;******************************
;定义程序入口和中断向量区
;******************************

        ORG     0000H
        AJMP    RESET
        ORG     000BH
        AJMP    TIMER0

;******************************
;程序开始,入口为RESET
;******************************

        ORG   0030H
RESET:  JB    CGQ1,RESET      ;光电传感器1触发作为开始信号
        MOV   SP,#30H         ;定义堆栈首地址
        MOV   R2,#0           ;R2延时计数器
        SETB  CS              ;时序:CS初始状态为高电平,7289不使能
        SETB  KEY             ;KEY初始状态为高电平
        SETB  DIO             ;时序:DATA初始状态为高电平
        CLR   CLK             ;时序:CLK初始状态为低电平

        MOV   DELAY,#45H      ;复位延时25MS

RST_DELAY1:
        DJNZ  R2,RST_DELAY1
        DJNZ  DELAY,RST_DELAY1

        MOV   SEND_BUF,#0A4H  ;7289初始化命令
        ACALL SEND            ;调用向7389发送指令子程序,发送一个字节
        SETB  CS              ;时序:CS状态恢复高电平,7289不使能



;*******************************
;键盘显示部分
;*******************************



;*******************************
;第一次输入
;*******************************

MAIN_LP:JB    KEY,MAIN_LP
        MOV   SEND_BUF,#15H   ;有键按下,发送读键盘命令
        ACALL SEND            ;发送命令字节(一个字节)
        ACALL RECEIVE         ;读DATA得到键值
        SETB  CS              ;时序:CS状态恢复高电平,7289不使能

        MOV   B,#10           ;10进制转换
        MOV   A,REC_BUF
        DIV   AB              ;键值除以10得到商和余数
        MOV   DECIMAL1,B      ;DECIMAL1存放键值个位

        MOV   B,#0
        MOV   SEND_BUF,#81H   ;发送命令:下载数据且译码
        ACALL SEND
        MOV   SEND_BUF,B      ;键值十位数清零
        ACALL SEND
        SETB  CS
        MOV   SEND_BUF,#80H   ;发送命令:下载数据且译码
        ACALL SEND
        MOV   A,DECIMAL1
        SUBB  A,#6
        MOV   SEND_BUF,A       ;发送键值个位数到7289
        ACALL SEND
        SETB  CS

        MOV   SEND_BUF,#88H    ;发送命令:设定刚发送数据显示为闪烁
        ACALL SEND
        MOV   SEND_BUF,#0FCH
        ACALL SEND
        SETB  CS

MAIN_LP2:JNB  KEY,MAIN_LP2     ;等待键松开
        MOV   A,DECIMAL1       ;键值个位复给A
        CJNE  A,#7,NEXT3       ;判断键值,不等跳转
        AJMP  MAIN_LP3
NEXT3:  CJNE  A,#8,CLS         ;判断键值,不等跳转

;*********************************
;第二次输入
;*********************************

MAIN_LP3:JB   KEY,MAIN_LP3
        MOV   SEND_BUF,#15H    ;有键按下,发送读键盘命令
        ACALL SEND
        ACALL RECEIVE
        SETB  CS

        MOV B,#10
        MOV A,REC_BUF
        DIV AB
        MOV DECIMAL,B
        MOV B,A



MAIN_LP4:JNB  KEY,MAIN_LP4     ;等待键松开
        MOV   A,DECIMAL
        CJNE  A,#9,NEXT5       ;确认键发送电机开始工作信号
        LJMP  CLS              ;取消键返回
NEXT5:
        CJNE  A,#6,MAIN_LP3    ;判断按键
        MOV   A,DECIMAL1       ;复第一次输入键值
        CJNE  A,#7,MAIN_LP6    ;控制不同电机


;**********************************
;步进电机部分
;**********************************

;**********************************
;步进电机1控制
;**********************************

MAIN_LP5:
        MOV   T_HB,#0F7H       ;初始化方波信号的高低电平时间寄存器
        MOV   T_LB,#09H

        MOV   TMOD,#01H        ;定时器0和定时器1均选用16位定时器模式
        MOV   TH0,T_LB         ;向定时器0装入初值,定时器0负责对脉冲宽度定时
        MOV   TCON,#00H
        MOV   IE,#82H          ;EA=1,ET0=1,开启总中断使能,定时器0中断使能

        CLR   DIRECT1          ;方向状态为零
        SETB  TR0


HERE1:  JB    CGQ1,RESET1      ;光电传感器1关闭电机
        JNB   CGQ2,RESET1      ;光电传感器2关闭电机

        AJMP  HERE1            ;自跳转语句,形成死循环,主程序无其他任务

CLS:    MOV   SEND_BUF,#0A4H  ;7289初始化命令
        ACALL SEND            ;调用向7389发送指令子程序,发送一个字节
        SETB  CS              ;时序:CS状态恢复高电平,7289不使能
        LJMP  MAIN_LP

;************************************
;转移跳板
;************************************

RESET1: MOV   IE,#00H
        LJMP  RESET


;************************************
;步进电机2控制
;************************************


MAIN_LP6:
        MOV   T_HB,#0F7H       ;初始化方波信号的高低电平时间寄存器
        MOV   T_LB,#09H

        MOV   TMOD,#01H        ;定时器0和定时器1均选用16位定时器模式
        MOV   TH0,T_LB         ;向定时器0装入初值,定时器0负责对脉冲宽度定时
        MOV   TCON,#00H
        MOV   IE,#82H          ;EA=1,ET0=1,开启总中断使能,定时器0中断使能

        CLR   DIRECT2           ;方向状态为零
        SETB  TR0


HERE2:  JB    CGQ1,RESET1      ;光电传感器1关闭电机
        JNB   CGQ2,RESET1      ;光电传感器2关闭电机


        AJMP  HERE2            ;自跳转语句,形成死循环,主程序无其他任务



;*********************************
;中断服务程序TIMER0
;*********************************

TIMER0:
        PUSH  A                ;将重要信息推入堆栈
        PUSH  psw
        CLR   TR0              ;关闭定时器

        MOV   TH0,T_HB         ;向定时器0复初值
        MOV   TL0,T_LB

        MOV   A,DECIMAL1       ;将输入键值复A
        CJNE  A,#7,BUJIN2      ;选择电机
        CPL   PULSE1           ;步进电机1的P0.4状态翻转
        AJMP  BUJIN1

BUJIN2: CPL   PULSE2           ;步进电机2的P0.3状态翻转

BUJIN1: SETB  TR0              ;开启定时器
        POP   psw              ;将重要信息取出
        POP   A
        RETI                   ;中断返回

;**********************************
;接收数据子程序
;**********************************

RECEIVE:MOV   BIT_CNT,#8       ;定义接受8位
        SETB  DIO              ;时序:DATA初始状态为高电平
        ACALL LONG_DELAY       ;调用子程序,延时50微秒
RECEIVE_LP:
        SETB  CLK              ;时序:CLK状态变为高电平
        ACALL SHORT_DELAY      ;调用子程序,延时10微秒
        MOV   C,DIO            ;接收数据送REC_BUF低位
        MOV   A,REC_BUF
        RLC   A
        MOV   REC_BUF,A
        CLR   CLK              ;时序:CLK状态恢复低电平
        ACALL SHORT_DELAY      ;调用子程序,延时10微秒

        DJNZ  BIT_CNT,RECEIVE_LP
        CLR   DIO
        RET

;************************************
;发送命令或数据子程序
;************************************

SEND:   MOV   BIT_CNT,#8       ;设发送位数为8位
        CLR   CS               ;时序:CS状态变为低电平,7289使能
        ACALL LONG_DELAY       ;调用子程序,延时50微秒

SEND_LP:MOV   A,SEND_BUF       ;将待发送数据从最高位开始依次发送
        RLC   A
        MOV   SEND_BUF,A
        MOV   DIO,C


        SETB  CLK              ;时序:CLK状态变为高电平
        ACALL SHORT_DELAY      ;调用子程序,延时10微秒
        CLR   CLK              ;时序:CLK状态恢复低电平
        ACALL SHORT_DELAY      ;调用子程序,延时10微秒

        DJNZ  BIT_CNT,SEND_LP
        CLR   DIO
        RET

;************************************
;长延时(50微秒)子程序
;************************************

LONG_DELAY:
        MOV   DELAY,#20
        DJNZ  DELAY,$
        RET

;************************************
;短延时(10微秒)子程序
;************************************

SHORT_DELAY:
        MOV   DELAY,#2
        DJNZ  DELAY,$
        RET



⌨️ 快捷键说明

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