; ***************************************************************************
;文件名“5_1.ASM”
;功能:用PWM控制直流电机
; ***************************************************************************
STATUSEQU03H;定义状态寄存器地址
PORTCEQU07H;定义端口C的数据寄存器地址
PORTDEQU08H;定义端口D的数据寄存器地址
TRISAEQU85H;定义端口A的方向寄存器
TRISCEQU87H;定义端口C的方向寄存器
TRISDEQU88H;定义端口D的方向寄存器
INTCONEQU0BH;定义INTCON控制寄存器
CCP1IFEQU2H;定义CCP1IF
CCP1CONEQU17H;定义CCP1CON控制寄存器
CCPR1LEQU0EH;定义CCPR1L控制寄存器
CCPR1HEQU0FH;定义CCPR1H控制寄存器
TMR2EQU11H;定义TMR2控制寄存器
T2CONEQU12H;定义T2CON控制寄存器
PR2EQU92H;定义PR2控制寄存器
PIR1EQU0CH;定义第一外设中断标志寄存器
PIR2EQU0DH;定义第二外设中断标志寄存器
TMR1LEQU0EH;定义TMR1L
TMR1HEQU0FH;定义TMR1F
ADRESHEQU1EH;定义ADRESH
ADCON0EQU1FH;定义数模转换器ADC的寄存器
PIE1EQU8CH;定义第一外设中断屏蔽寄存器
PIE2EQU8DH;定义第二外设中断屏蔽寄存器
ADCON1EQU9FH;定义数模转换器ADC的寄存器
T1CONEQU10H;定义TIMER1控制寄存器
RP1EQU06H;定义状态寄存器中的页选位RP1
RP0EQU05H;定义状态寄存器中的页选位RP0
ZEQU02H;定义状态寄存器中的0标志位Z
DATA1EQU20H;定义外循环变量
DATA2EQU21H;定义内循环变量
TEMPEQU22H;定义临时变量存储端口D的输入
AD_STATUSEQU23H;定义AD状态变量
COUNT1EQU1AH;定义存储外循环次数的变量
COUNT2EQU0FFH;定义存储内循环次数的变量
; ***************************主程序开始*********************************
ORG00H
NOP;空指令
GOTO MAIN
ORG04H;中断向量的地址为04H
GOTOINT;跳到中断子程序
; *****************************中断子程序开始****************************
INT
MOVWFW_TEMP;W寄存器的内容存储
SWAPFSTATUS,0;将STATUS寄存器中高低字节交换
MOVWFSTATUS_TEMP;交换后的结果存入STATUS_TEMP
MOVLW80H;让端口D的第8位的输出翻转
XORWFPORTD,1;
BTFSCPIR1,CCP1IF;清除中断标志位
SWAPFSTATUS_TEMP,0;中断前的STATUS的内容,重新装入
MOVWFSTATUS;
SWAPFW_TEMP,1;中断前的W的内容重新装入
SWAPFW_TEMP,0;
RETFIE
; *******************************中断子程序结束**************************
; ********************************主程序开始*****************************
MAIN
CALLINITIAL;调用初始化程序
LOOP
CALLAD_CONVERT;调用A/D转换子程序
CALLPWM;调用PWM输出子程序
GOTOLOOP;;
; ***************************************************************************
; ***************************初始化子程序开始*********************************
INITIAL
BSFSTATUS,RP0;转到体1
BCFSTATUS,RP1;
MOVLW00H;将端口C设为输出
MOVWFTRISC;
BCFSTATUS,RP0;转到体0
BCFSTATUS,RP1;
MOVLW00H;
MOVWFPORTC;清除PORTC口
MOVLW0FFH;设定周期初始值
MOVWFPR2;
BSFSTATUS,RP0;转到体1
BCFSTATUS,RP1;
CLRFTMR2;
MOVLW80H;设定初始工作周期
MOVWFCCPR1L;
MOVLW0CH;
MOVLWCCP1CON;设定PWM模式
MOVLW00H;
MOVWFT2CON;
BSFT2CON,0;启动TMR2
BCFSTATUS,RP0;转到体0
BCFSTATUS,RP1;
MOVLW0EH;设定转换通道,转换值向左靠齐
MOVWFADCON1;以VDD和VSS为参考
BSFTRISA,0;设定RA0为输入端
BCFSTATUS,RP0;
MOVLW81H;FOSC/32,启动AN0
MOVWFADCON0;
BCFSTATUS,RP0;转到体0
BCFSTATUS,RP1;;
BSFPORTC,3;使用BSF/BCF设定正反转命令
RETURN
; ***************************初始化子程序结束*********************************
; ***************************PWM输出子程序*************************************
PWM
MOVFAD_STATUS,0;
BCFSTATUS,RP0;转到体0
BCFSTATUS,RP1;
MOVWFCCPR1L;更新工作周期的命令值
RETURN
; ***************************PWM输出子程序结束******************************
; ***************************A/D转换子程序******************************
AD_CONVERT
BCFSTATUS,RP0;转到体0
BCFSTATUS,RP1;
BSFADCON0,0;开始A/D转换
WAIT
BTFSCADCON0,0;等待转换结束
CALLDELAY;
GOTOWAIT;
MOVFADRESH,W;
MOVWFAD_STATUS;存储转换值
RETURN
; ***************************A/D转换子程序结束******************************
; ***************************延时子程序****************************************
DELAY
MOVLWCOUNT1;设置外部循环的次数
MOVWFDATA1;
LOOP1
MOVLWCOUNT2;设置内部循环的次数
MOVWFDATA2;
LOOP2
DECFSZDATA1,1;内部循环变量自减1,为0则跳转
GOTOLOOP2;
DECFSZDATA2,1;外部循环变量自减1,为0则跳转
GOTOLOOP1;
RETURN;返回主程序
; ***************************延时子程序结束*************************************
; ***************************主程序结束*************************************
END