微机原理直流电机转速控制asm.docx

上传人:b****6 文档编号:6226633 上传时间:2023-01-04 格式:DOCX 页数:17 大小:20KB
下载 相关 举报
微机原理直流电机转速控制asm.docx_第1页
第1页 / 共17页
微机原理直流电机转速控制asm.docx_第2页
第2页 / 共17页
微机原理直流电机转速控制asm.docx_第3页
第3页 / 共17页
微机原理直流电机转速控制asm.docx_第4页
第4页 / 共17页
微机原理直流电机转速控制asm.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

微机原理直流电机转速控制asm.docx

《微机原理直流电机转速控制asm.docx》由会员分享,可在线阅读,更多相关《微机原理直流电机转速控制asm.docx(17页珍藏版)》请在冰豆网上搜索。

微机原理直流电机转速控制asm.docx

微机原理直流电机转速控制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

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1