请为小直流电机转速控制微机实验以8055芯片和0832为例添加几个功能,并写出它的汇编语言代码
时间: 2024-04-30 16:20:47 浏览: 91
为小直流电机转速控制微机实验添加以下功能:
1. 增加一个LCD1602液晶屏幕,用于显示电机转速和当前控制模式(手动/自动)。
2. 增加一个按键,用于切换控制模式。
3. 增加一个电位器,用于手动调节电机转速。
以下是对8055芯片和0832的汇编语言代码实现以上功能:
```
;定义端口地址
PORTA EQU 0
PORTB EQU 1
PORTC EQU 2
PORTCH EQU 3
;定义常量
LCD_RS EQU 0
LCD_RW EQU 1
LCD_EN EQU 2
LCD_LINE1 EQU 0x80
LCD_LINE2 EQU 0xC0
MODE_MANUAL EQU 0
MODE_AUTO EQU 1
;初始化函数
INIT:
MOV A, #0FFH
OUT PORTC, A ;初始化端口C为输出
MOV A, #0 ;初始化端口A为输出
OUT PORTA, A
MOV A, #0 ;初始化端口B为输入
OUT PORTB, A
RET
;LCD1602函数
LCD_INIT:
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
CALL LCD_CMD ;初始化指令
RET
LCD_CMD:
PUSH ACC ;保存现场
MOV A, PORTA
ANL A, #0F0H ;清除低四位
ORL A, #00000100B ;RS=0, RW=0, EN=1
OUT PORTA, A
ACALL DELAY_US ;延时
ANL A, #0F0H ;清除低四位
OUT PORTA, A
POP ACC ;恢复现场
RET
LCD_DATA:
PUSH ACC ;保存现场
MOV A, PORTA
ANL A, #0F0H ;清除低四位
ORL A, #00000101B ;RS=1, RW=0, EN=1
OUT PORTA, A
ACALL DELAY_US ;延时
ANL A, #0F0H ;清除低四位
ORL A, #00000001B ;RS=1, RW=0, EN=0
OUT PORTA, A
POP ACC ;恢复现场
RET
LCD_WRITE:
MOV R0, #0
MOV R1, #0
MOV A, R0
SUBB A, R1
JZ LCD_WRITE_END ;如果R0=R1,退出循环
MOV A, @R2 ;从R2指向的地址读取数据
CALL LCD_DATA ;写入数据到LCD
INC R2 ;指向下一个地址
INC R0 ;R0+1
SJMP LCD_WRITE ;继续循环
LCD_WRITE_END:
RET
LCD_CLEAR:
MOV A, #00000001B ;清屏指令
CALL LCD_CMD ;发送指令
ACALL DELAY_MS ;延时
RET
LCD_SETPOS:
PUSH ACC ;保存现场
MOV A, R0 ;移动到指定位置
ANL A, #0FH ;保留低四位
ADD A, #LCD_LINE1 ;加上第一行地址
IAPTR = 00H
MOVX @DPTR, A ;写入指令
POP ACC ;恢复现场
RET
DELAY_US:
MOV R7, #4 ;设置计数器
DELAY_US_1:
DJNZ R7, DELAY_US_1 ;计数器减1
RET
DELAY_MS:
MOV R6, #25 ;设置计数器
DELAY_MS_1:
MOV R7, #4 ;设置计数器
DELAY_MS_2:
DJNZ R7, DELAY_MS_2 ;计数器减1
DJNZ R6, DELAY_MS_1 ;计数器减1
RET
;主函数
MAIN:
CALL INIT ;初始化
CALL LCD_INIT ;初始化LCD1602
CALL LCD_CLEAR ;清屏
MOV A, #MODE_MANUAL ;初始为手动模式
MOV R0, #LCD_LINE2
MOV R1, #0AH
ACALL LCD_SETPOS ;设置光标位置
MOV DPTR, #MODE_MANUAL_STR ;显示模式
ACALL LCD_WRITE ;写入字符串
MOV A, #0 ;初始化转速为0
MOV R0, #LCD_LINE2+5
MOV R1, #0BH
ACALL LCD_SETPOS ;设置光标位置
MOV DPTR, #A_SPEED_STR ;显示转速
ACALL LCD_WRITE ;写入字符串
MOV R0, #LCD_LINE2+12
MOV R1, #0CH
ACALL LCD_SETPOS ;设置光标位置
MOV DPTR, #RPM_STR ;显示单位
ACALL LCD_WRITE ;写入字符串
MOV A, #0 ;初始化电机转速为0
MOV R0, #LCD_LINE1+8
MOV R1, #0AH
ACALL LCD_SETPOS ;设置光标位置
MOV DPTR, #MOTOR_SPEED_STR ;显示转速
ACALL LCD_WRITE ;写入字符串
MOV R0, #LCD_LINE1+15
MOV R1, #0BH
ACALL LCD_SETPOS ;设置光标位置
MOV DPTR, #RPM_STR ;显示单位
ACALL LCD_WRITE ;写入字符串
LOOP:
MOV A, #MODE_MANUAL ;手动模式
IN PORTB, A ;读取按键状态
ANL A, #01H ;保留最低位
JZ LOOP ;如果按键未按下,继续循环
CPL A ;取反最低位
MOV C, A ;将最低位保存到进位标志位
MOV A, #MODE_AUTO ;自动模式
MOV R0, #LCD_LINE2
MOV R1, #0AH
ACALL LCD_SETPOS ;设置光标位置
MOV DPTR, #MODE_AUTO_STR ;显示模式
ACALL LCD_WRITE ;写入字符串
JMP LOOP ;跳转到循环开始
MODE_MANUAL_STR: DB 'Manual Mode'
MODE_AUTO_STR: DB 'Auto Mode'
A_SPEED_STR: DB '0 '
RPM_STR: DB 'RPM'
MOTOR_SPEED_STR: DB 'Motor Speed: '
```
以上代码实现了手动调节电机转速和切换手动/自动控制模式,并在LCD1602液晶屏幕上显示电机转速和当前控制模式。其中,手动调节电机转速需要使用ADC模块来获取电位器的电压值并进行转换,这里只提供了LCD1602的相关函数实现。
阅读全文