上接:http://www.51hei.com/mcu/3983.html
1. 实验目的
学习如何使用中断
2. 任务要求
用定时器中断方式完成闪灯实验
设计验证外部边沿中断/电平变化中断
睡眠唤醒
3. 实验器材
单片机PIC16F886一片、LED灯一只、电阻任选、下载器(及相关的线)一个
4. 实验方案
图 1 硬件设计图
图 2 定时器中断软件流程图
图 3电平变化中断流程图
图 4 睡眠唤醒流程图
5. 实验现象分析
基础实验部分:
仿真模拟,在反转PORTA的代码部分加上断点,用STOP WATCH 观察两次运行至断点所需的时间,
。
然后下载至芯片,LED灯闪动正常。
电平变化中断实验:
使用PORTB的RB5作为输入端口,当给RB5电平变化时,RA端口上的灯闪烁4次,从头到尾RC端上的灯只有亮一种状态。
睡眠唤醒实验:触发一次唤醒,RA端灯亮灭四次,RC3改变一次状态。
做电平变化中断和睡眠唤醒实验时遇到两个问题:1.电平变化中断标志位清零前没有对PORTB执行读写操作,导致清除无效;1,DELAY函数写在中断内部,总是提前RETURN破坏了现场且多执行了DELAY操作。
附:
定时器中断代码:
#INCLUDE p16f886.inc
__config _CONFIG1, _WDT_OFF
CONTEXT_SAVING UDATA_SHR
W_TMP RES 1
S_TMP RES 1
RESET CODE 0x0
PAGESEL MAIN
GOTO MAIN
ISR CODE 0X04
MOVWF W_TMP
SWAPF STATUS,W
MOVWF S_TMP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以上保存现场
BANKSEL INTCON
BCF INTCON,2 ;;;;;;;;;;;;;清除TMR0中断标志位
BANKSEL PORTA
COMF PORTA,1 ;;;;;;;;;;;;;;PORTA翻转
BANKSEL TMR0
MOVLW B'00001111' ;;;;;;;;;;;;;;TMR0预置数
MOVWF TMR0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以下恢复现场
SWAPF S_TMP,W
MOVWF STATUS
SWAPF W_TMP,F
SWAPF W_TMP,W
RETFIE
CODE
MAIN
MOVLW B'00001111'
MOVWF TMR0 ;;;;;;;;;;;;;;;;;;;;;;;TMR0预置数
BANKSEL OPTION_REG
MOVLW B'000011'
MOVWF OPTION_REG ;;;;;;;;;;;;;;;;;;;;;TMR0设置为16分频
BANKSEL INTCON
BSF INTCON,GIE
BSF INTCON,T0IE ;;;;;;;;;;;;;;;;;;;;;总中断使能,TMR0中断使能
;;;;;;;;;
BANKSEL OSCCON
MOVLW B'00000011'
MOVWF OSCCON ;;;;;;;;;;;;;;;;;;;;;;振荡器设置为310KHz,内部振荡器
BANKSEL ANSEL
CLRF ANSEL
BANKSEL TRISA;
MOVLW B'00000000'
MOVWF TRISA
BANKSEL PORTA
CLRF PORTA ;;;;;;;;;;;;;;;;;;;;;设置PORTA为输出
LP
NOP
GOTO LP
END
外部中断代码:
#INCLUDE p16f886.inc
__config _CONFIG1, _WDT_OFF
CONTEXT_SAVING UDATA_SHR
W_TMP RES 1
S_TMP RES 1
LP0 RES 1
LP1 RES 1
TIMES RES 1
RESET CODE 0x0
PAGESEL MAIN
GOTO MAIN
ISR CODE 0x04
MOVWF W_TMP
SWAPF STATUS,W
MOVWF S_TMP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以上保护现场
BANKSEL PORTB
BSF PORTB,4
BANKSEL INTCON
BCF INTCON,RBIF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;读PORTB,清除中断标志位
MOVLW D'4'
MOVWF TIMES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置亮灯次数为4
MM COMF PORTA,F
CALL DELAY
COMF PORTA,F
CALL DELAY
DECFSZ TIMES,F
GOTO MM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;闪烁4次
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以下恢复现场
SWAPF S_TMP,W
MOVWF STATUS
SWAPF W_TMP,F
SWAPF W_TMP,W
RETFIE
CODE
DELAY
MOVLW 01FH
MOVWF LP0
L0 MOVLW 01FH
MOVWF LP1
L1 DECFSZ LP1,F
GOTO L1
DECFSZ LP0,F
GOTO L0
RETURN
MAIN
BANKSEL TRISC
MOVLW B'11110111'
MOVWF TRISC
BANKSEL PORTC
MOVLW B'00001000'
XORWF PORTC,F;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;设置RC3标志程序执行,用于判断程序是否被重复执行
BANKSEL INTCON
BCF INTCON,RBIF;;;;;;;;;;;;;;;;;;;;;;;;;;清除中断标志位
BANKSEL OSCCON
MOVLW B'00000011'
MOVWF OSCCON;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置振荡器频率31KHz
BANKSEL ANSEL
CLRF ANSEL
BANKSEL TRISA;BANK1
MOVLW B'00000000'
MOVWF TRISA
BANKSEL PORTA
CLRF PORTA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置PORTA为输出
BANKSEL INTCON
MOVLW B'11011000'
MOVWF INTCON;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;使能电平变化中断
BANKSEL OPTION_REG
MOVLW B'01010000'
MOVWF OPTION_REG;;;;;;;;;;;;;;;;;;;;;;;;;;;使能PORTB上拉
BANKSEL PORTB
CLRF PORTB
BANKSEL TRISB
MOVLW B'00100000'
MOVWF TRISB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置RB5为输入
BANKSEL ANSELH
CLRF ANSELH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置模拟输入模式为0
BANKSEL IOCB
MOVLW B'00100000'
MOVWF IOCB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;允许PORTB5电平变化使能
LOOP
GOTO LOOP
END
睡眠唤醒代码:
#INCLUDE p16f886.inc
__config _CONFIG1, _WDT_OFF
CONTEXT_SAVING UDATA_SHR
W_TMP RES 1
S_TMP RES 1
LP0 RES 1
LP1 RES 1
TIMES RES 1
RESET CODE 0x0
PAGESEL MAIN
GOTO MAIN
ISR CODE 0x04
MOVWF W_TMP
SWAPF STATUS,W
MOVWF S_TMP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以上保护现场
BANKSEL PORTB
BSF PORTB,4
BANKSEL INTCON
BCF INTCON,RBIF;;;;;;;;;;;;;;;;;;;;;;;;读PORTB并清除中断标志位
MOVLW D'4'
MOVWF TIMES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置亮灯次数4
MM COMF PORTA,F
CALL DELAY
COMF PORTA,F
CALL DELAY
DECFSZ TIMES,F
GOTO MM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;灯闪烁四次
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;以下恢复现场
SWAPF S_TMP,W
MOVWF STATUS
SWAPF W_TMP,F
SWAPF W_TMP,W
RETFIE
CODE
DELAY
MOVLW 01FH
MOVWF LP0
L0 MOVLW 01FH
MOVWF LP1
L1 DECFSZ LP1,F
GOTO L1
DECFSZ LP0,F
GOTO L0
RETURN
MAIN
BANKSEL INTCON
BCF INTCON,RBIF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清除中断标志位
BANKSEL OSCCON
MOVLW B'00000011'
MOVWF OSCCON;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置振荡器31KHz
BANKSEL ANSEL
CLRF ANSEL
BANKSEL TRISA
MOVLW B'00000000'
MOVWF TRISA
BANKSEL PORTA
CLRF PORTA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置PORTA输出
BANKSEL INTCON
MOVLW B'11011000'
MOVWF INTCON;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;使能总中断使能和电平变化中断使能
BANKSEL OPTION_REG
MOVLW B'01010000'
MOVWF OPTION_REG;;;;;;;;;;;;;;;;;;;;;;;;
BANKSEL PORTB
CLRF PORTB
BANKSEL TRISB
MOVLW B'00100000'
MOVWF TRISB
BANKSEL ANSELH
CLRF ANSELH
BANKSEL IOCB
MOVLW B'00100000'
MOVWF IOCB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置PORTB5电平变化中断使能
BANKSEL PORTC
MOVLW B'11110111'
BANKSEL TRISC
CLRF TRISC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置PORTC3为输出
loop
BANKSEL PORTC
MOVLW B'00001000'
XORWF PORTC,F
CALL DELAY;;;;;;;;;;;;;;;;;;;;;;RC3改变一次状态,执行一次SLEEP,显示是否进入休眠
SLEEP
NOP
GOTO loop
END
下一篇: pic单片机走马灯动态显示实验报告 http://www.51hei.com/mcu/4080.html