微机原理直流电机转速控制asm.docx
- 文档编号:6226633
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:17
- 大小:20KB
微机原理直流电机转速控制asm.docx
《微机原理直流电机转速控制asm.docx》由会员分享,可在线阅读,更多相关《微机原理直流电机转速控制asm.docx(17页珍藏版)》请在冰豆网上搜索。
微机原理直流电机转速控制asm
;*****************************************************************************
;8279键盘显示器接口芯片
;1.查询控制方式2.输入时钟2MHZ3.8279内部20分频(100KHZ)
;4.扫描计数器采用编码工作方式(通过外部138译码)
;5.显示按键值,第九次按键,清除显示
;8279查询工作方式
.MODELTINY
CMD_8279EQU0BF01H;8279命令字、状态字地址
DATA_8279EQU0BF00H;8279读写数据口的地址
.STACK100
.DATA
KEYCOUNTDB?
LED_TABDB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB080H,90H,88H,83H,0C6H,0A1H,86H,8EH
.CODE
START:
MOVAX,@DATA
MOVDS,AX
NOP
CALLINIT8279;初始化子程序
MOVKEYCOUNT,0
START1:
CALLSCAN_KEY;键扫描
JNCSTART1;没有按键
XCHGAL,KEYCOUNT
INCAL
CMPAL,9
JNZSTART2
MOVKEYCOUNT,0
CALLINIT8279_1;8个数码块全有字符显示后,再按键,清除显示
JMPSTART1
START2:
XCHGAL,KEYCOUNT
CALLKEY_NUM;键值转换为键号
LEABX,LED_TAB;字型码表
XLAT
CALLWRITE_DATA
JMPSTART1
START_EXIT:
JMP$
;8279初始化
INIT8279PROCNEAR
MOVDX,CMD_8279;CMD_8279为写命令地址、读状地址
MOVAL,34H;可编程时钟设置,设置分频系数(20分频)
OUTDX,AL
MOVAL,0;8*8字符显示,左边输入,外部译码键扫描方式
OUTDX,AL
;MOVAL,0A0H
;OUTDX,AL
CALLINIT8279_1
RET
INIT8279ENDP
INIT8279_1PROCNEAR
CALLCLEAR;清显示
MOVAL,90H;从第一个数码管开始移位显示
OUTDX,AL
RET
INIT8279_1ENDP
CLEARPROCNEAR
MOVDX,CMD_8279
MOVAL,0DEH;清除命令
OUTDX,AL
WAIT1:
INAL,DX
TESTAL,80H
JNZWAIT1;显示RAM清除完毕吗?
RET
CLEARENDP
SCAN_KEYPROCNEAR
MOVDX,CMD_8279
INAL,DX;读状态
READ_FIFO:
ANDAL,7
JZNO_KEY;是否有键按下
READ:
MOVAL,40H
OUTDX,AL;读FIFORAM
MOVDX,DATA_8279
INAL,DX
STC;有键
SCAN_KEY1:
RET
NO_KEY:
CLC;无键按下,清CY
JMPSCAN_KEY1
SCAN_KEYENDP
KEY_NUMPROCNEAR
ANDAL,3FH
RET
KEY_NUMENDP
WRITE_DATAPROCNEAR
MOVDX,DATA_8279
OUTDX,AL
RET
WRITE_DATAENDP
ENDSTART
;转速控制
REVControlPROCNEAR
MOVAL,Count;当前转速
CMPAL,RevSet;设置转速
JZREVControl1
JNBRevDEC
;提高转速
RevINC:
MOVCount500ms,1
MOV AL,RevSet;设置转速
SUBAL,Count;当前转速
RevINC1:
ADDAL,Data_0832;转速值加上上一次0832输入值就是;0832输入值
JNBRevINC2;判断是否超过0832最大输入值
MOVAL,0FFH
RevINC2:
MOVData_0832,AL
CALLDAC0832;D/A,调整0832的输出电压
JMPREVControl1
;降低转速
RevDEC:
MOVAH,Count500ms
ORAH,AH
JZRevDEC3
MOVCount500ms,0
MOVAL,Count;当前转速
SUBAL,RevSet;设置转速
RevDEC1:
XCHGAL,Data_0832;上一次0832输入值减去转速差值就;是0832输入值
SUBAL,Data_0832
JNBRevDEC2
MOVAL,10
RevDEC2:
MOVData_0832,AL
CALLDAC0832;D/A调整0832输出电压
JMPREVControl1
RevDEC3:
INCCount500ms
REVControl1:
RET
REVControlENDP
;计算速率
Timer0Int:
MOVbTime,1;0.25s定时到标志
MOVAL,NowCount;本次0.25s内计数转数
MOVCount,AL
MOVNowCount,0
SUBAL,Count1;count1:
上次0.25s的计数值
JZTIMER0_2;如果本次0.25s累计转数与上次相比不;超过正负1
INCAL;求本次与前三次的平均转数值
JZTIMER0_2
CMPAL,2
JNZTIMER0_3
TIMER0_2:
MOVAL,Count
PUSHAX
XORAH,AH
ADDAL,Count1
JNBTIMER0_4
INCAH
TIMER0_4:
ADDAL,Count2
JNBTIMER0_5
INCAH
TIMER0_5:
ADDAL,Count3
JNBTIMER0_6
INCAH
TIMER0_6:
SHRAX,2
MOVCount,AL
MOVAL,Count2
MOVCount3,AL
MOVAL,Count1
MOVCount2,AL
POPAX
MOVCount1,AL
JMPTIMER0_1
TIMER0_3:
MOVAL,Count;本次转数与前几次相差较大,以本次;为准
MOVCount3,AL;250ms测速
MOVCount2,AL
MOVCount1,AL
TIMER0_1:
RET
IfExitPROCNEAR
PUSHAX
PUSHDX
MOVAL,06H
MOVDX,0FFH
INT21H
POPDX
POPAX
JZIfExit1
JMPExit
IfExit1:
RET
InitPCIPROC NEAR
MOVAH,00H
MOVAL,03H
INT10H;清屏
MOVAH,0B1H
MOVAL,01H
INT1AH
CMPAH,0
JZInitPCI2
LEADX,msg0
InitPCI1:
MOVAH,09H
INT21H
JMPExit
InitPCI2:
MOVAH,0B1H
MOVAL,02H
MOVCX,Device_ID
MOVDX,Vendor_ID
MOVSI,0
INT1AH
JNCInitPCI3;是否存在PCI9052板卡
LEADX,msg1
JMPInitPCI1
InitPCI3:
MOVDI,PCIBAR1
MOVAH,0B1H
MOVAL,09H
INT1AH
JNCInitPCI4
LEADX,msg2
JMPInitPCI1
InitPCI4:
ANDCX,0FFFCH
MOVPCI_IO_BaseAddress0,CX
MOVDI,PCIBAR3
MOVAH,0B1H
MOVAL,09H
INT1AH;读取该卡扩展的8位IO基地址,ah=0b1h,al=09h,int1ah,di=寄存器号,用来按字/双字读取配置空间,返回ah=返回代码,;cf=0成功,cx=读取的字/双字,存放基地址
JNCInitPCI5
LEADX,msg3
JMPInitPCI1;否则,输出ds:
dx开始的字符串,显示"读8位I/O空间基地址时出错"
InitPCI5:
ANDCX,0FFFCH
MOVIO_Bit8_BaseAddress,CX
MOVDI,PCIIPR
MOVAH,0B1H
MOVAL,09H
INT1AH;读取IRQ号
JNCInitPCI6
LEADX,msg4
JMPInitPCI1;否则,输出ds:
dx开始的字符串,显示"读IRQ号出错"
InitPCI6:
MOVPCI_IRQ_NUMBER,CL
RET
InitPCIENDP
ModifyAddressPROCNEAR
MOVAX,IO_Bit8_BaseAddress
ADDIO8259_0,AX
ADDIO8259_1,AX
ADDRD_IO8259,AX
RET
ModifyAddressENDP
ModifyVectorPROCNEAR
PUSHES
MOVAL,PCI_IRQ_NUMBER
CMPAL,08H;若中断类型号在0-7之间,
JAEModifyVector1
ADDAL,08H;IRQ0..7->中断向量8..F
JMPModifyVector2
ModifyVector1:
ADDAL,70H-08H;IRQ8..F->中断向量70H..77H
ModifyVector2:
MOVINT_Vector,AL
MOVAH,35H
INT21H;AH=35H,AL=中断号,INT21H功能:
取中断向量,返回ES:
BX=中断处理程序段:
位移
MOVINT_IP,BX;保护原中断处理例程偏移地址IP
MOVAX,ES
MOVINT_CS,AX;保护原中断处理例程段地址CS
MOVAL,INT_Vector
LEADX,INT_0;INT_0为中断服务程序的标号即偏移地址DX=INT_0
PUSHDS
PUSHCS
POPDS;中断服务程序的段地址为CS中内容,所以DS=CS
MOVAH,25H
INT21H;设置新中断向量AH=25H,AL=中断号,INT21H,DS:
DX=中断处理过程段:
位移
POPDS;恢复DS中内容
MOVBL,PCI_IRQ_NUMBER
MOVDX,21H
CMPAL,08H
JBModifyVector3
MOVDX,0A1H
ModifyVector3:
INAL,DX
MOVINT_MASK,AL
ANDBL,07H
MOVCL,BL
MOVBL,1
SHLBL,CL
NOTBL
ANDAL,BL
OUTDX,AL;允许中断
POPES
STI
RET
ModifyVectorENDP
ClearIntPROCNEAR;清楚PCI9052、系统中断控制器的中断标志
MOVDX,PCI_IO_BaseAddress0
ADDDX,INTCSR
;INAL,DX
;ANDAL,mask_int_9052
;JZClearInt3;不是8259引取的中断
INCDX
INAL,DX
ORAL,0CH
OUTDX,AL;清除PCI9052的中断标志位
MOVAL,PCI_IRQ_NUMBER
CMPAL,08H
JAEClearInt1
ANDAL,7
ORAL,60H
MOVDX,20H
OUTDX,AL
JMPClearInt2
ClearInt1:
ANDAL,7
ORAL,60H
MOVDX,0A0H
OUTDX,AL
MOVDX,20H
MOVAL,62H
OUTDX,AL
ClearInt2:
CLC
RET
;ClearInt3:
STC
;RET
ClearIntENDP
Exit:
CLI
MOVBL,PCI_IRQ_NUMBER
MOVDX,21H
CMPAL,08H
JBExit1
MOVDX,0A1H
Exit1:
MOVAL,INT_MASK
OUTDX,AL;屏蔽中断
PUSHDS
MOVAL,INT_Vector
MOVDX,INT_IP;保护原中断处理例程地址
MOVAX,INT_CS
MOVAH,25H
INT21H;设置新中断向量
POPDS
STI
MOVAH,4CH
INT21H
ENDSTART
;直流电机测速
.MODELTINY
EXTRNDisplay8:
NEAR,SCAN_KEY:
NEAR,GetKeyA:
NEAR
IO8259_0EQU0F000H
IO8259_1EQU0F001H
Con_8253EQU0E003H
T0_8253EQU0E000H
T1_8253EQU0E001H
DA0832EQU0D000H
VoltageOffsetEQU5;0832调整幅度
.STACK200
.DATA
bufferDB8DUP(0);显示缓冲区,8个字节
buffer1DB8DUP(0);显示缓冲区,8个字节
VOLTAGEDB0;转换电压数字量
CountDW0;一秒转动次数
NowCountDW0;当前计数值
kpTimeDW0;保存上一次采样时定时器的值
bNeedDisplayDB0;需要刷新显示
.CODE
START:
MOVAX,@DATA
MOVDS,AX
MOVES,AX
NOP
MOVbNeedDisplay,1;显示初始值
MOVVOLTAGE,99H;初始化转换电压输入值,99H-3.0V
MOVCount,0;一秒转动次数
MOVNowCount,0;当前计数值
MOVkpTime,0;保存上一次采样时定时器的值
CALLDAC0832;初始D/A
CALLInit8253
CALLInit8259
CALLWriIntver
STI
MAIN:
CALLGetKeyA;按键扫描
JNBMain1
JNZKey1
Key0:
MOVAL,VoltageOffset;0号键按下,转速提高
ADDAL,VOLTAGE
CMPAL,VOLTAGE
JNBKey0_1
MOVAL,0FFH;最大
Key0_1:
MOVVOLTAGE,AL
CALLDAC0832;D/A
JMPMain2
Key1:
MOVAL,VOLTAGE;1号键按下,转速降低
SUBAL,VoltageOffset
JNBKey1_1
XORAL,AL;最小
Key1_1:
MOVVOLTAGE,AL
CALLDAC0832;D/A
JMPMain2
Main1:
CMPbNeedDisplay,0
JZMAIN
MOVbNeedDisplay,0;1s定时到刷新转速
Main2:
CALLRateTest;计算转速/显示
JMPMAIN;循环进行实验内容介绍与测速功能测试
;转速测量/显示
RateTest:
MOVAX,Count
MOVBL,10
DIVBL
CMPAL,0
JNZRateTest1
MOVAL,10H;高位为0,不需要显示
RateTest1:
MOVbuffer,AH
MOVbuffer+1,AL
MOVAL,VOLTAGE;给0832送的数据
ANDAL,0FH
MOVbuffer+4,AL
MOVAL,VOLTAGE
ANDAL,0F0H
RORAL,4
MOVbuffer+5,AL
MOVbuffer+2,10H;不显示
MOVbuffer+3,10H
MOVbuffer+6,10H
MOVbuffer+7,10H
LEASI,buffer
LEADI,buffer1
MOVCX,8
REPMOVSB
LEASI,buffer
CALLDisplay8;显示转换结果
RET
Timer0Int:
PUSHAX
PUSHDX
MOVbNeedDisplay,1
MOVAX,NowCount
SHRAX,1
SHRAX,1
MOVCount,AX;转一圈产生4个脉冲,Count=NowCount/4
MOVNowCount,0
MOVDX,IO8259_0
MOVAL,20H
OUTDX,AL
POPDX
POPAX
IRET
CountInt:
PUSHAX
PUSHDX
MOVDX,Con_8253
MOVAL,40H
OUTDX,AL;锁存
MOVDX,T1_8253
INAL,DX
MOVAH,AL
INAL,DX
XCHGAL,AH;T1的当前值
XCHGAX,kpTime
SUBAX,kpTime
CMPAX,100
JBCountInt1;前后二次采样时间差小于100,判断是干扰
INCNowCount
CountInt1:
MOVDX,IO8259_0
MOVAL,20H
OUTDX,AL
POPDX
POPAX
IRET
Init8253PROCNEAR
MOVDX,Con_8253
MOVAL,34H
OUTDX,AL;计数器T0设置在模式2状态,HEX计数
MOVDX,T0_8253
MOVAL,12H
OUTDX,AL
MOVAL,7AH
OUTDX,AL;CLK0=31250Hz,1s定时
MOVDX,Con_8253
MOVAL,74H
OUTDX,AL;计数器T1设置在模式2状态,HEX计数
MOVDX,T1_8253
MOVAL,0FFH
OUTDX,AL
MOVAL,0FFH
OUTDX,AL;作定时器使用
RET
Init8253ENDP
Init8259PROCNEAR
MOVDX,IO8259_0
MOVAL,13H
OUTDX,AL
MOVDX,IO8259_1
MOVAL,08H
OUTDX,AL
MOVAL,09H
OUTDX,AL
MOVAL,0FCH
OUTDX,AL
RET
Init8259ENDP
WriIntverPROCNEAR
PUSHES
MOVAX,0
MOVES,AX
MOVDI,20H
LEAAX,Timer0Int
STOSW
MOVAX,CS
STOSW
LEAAX,CountInt
MOVDI,3CH
STOSW
MOVAX,CS
STOSW
POPES
RET
WriIntverENDP
;数模转换,A-转换数字量
DAC0832PROCNEAR
MOVDX,DA0832
MOVAL,VOLTAGE
OUTDX,AL
RET
DAC0832ENDP
ENDSTART
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机原理 直流电机转速控制asm 微机 原理 直流电机 转速 控制 asm