pic单片机采用定时器中断的闪灯实

上接:http://www.51hei.com/mcu/3983.html

1. 实验目的

学习如何使用中断

2.  任务要求

用定时器中断方式完成闪灯实验

设计验证外部边沿中断/电平变化中断

睡眠唤醒

3.  实验器材

单片机PIC16F886一片、LED灯一只、电阻任选、下载器(及相关的线)一个

4.  实验方案

图 1 硬件设计图

图 2 定时器中断软件流程图


图 3电平变化中断流程图

图 4 睡眠唤醒流程图

5.  实验现象分析

基础实验部分

仿真模拟,在反转PORTA代码部分加上断点,用STOP WATCH 观察两次运行至断点所需的时间,

然后下载至芯片,LED灯闪动正常。

电平变化中断实验:

使用PORTBRB5作为输入端口,RB5电平变化时,RA端口上的灯闪烁4次,从头到尾RC端上的灯只有亮一种状态

睡眠唤醒实验:触发一次唤醒,RA端灯亮灭四次,RC3改变一次状态。

做电平变化中断和睡眠唤醒实验时遇到两个问题:1.电平变化中断标志位清零前没有对PORTB执行读写操作,导致清除无效;1DELAY函数写在中断内部,总是提前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

以上是pic单片机采用定时器中断的闪灯实的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>