📄 自动饮料机自动续杯系统源程序.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 + -