专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:未知   来源:互联网   点击数:  更新时间:2014年08月15日   【字体:

上接: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

关闭窗口