《AVR单片机》PPT课件

上传人:san****019 文档编号:21453631 上传时间:2021-05-01 格式:PPT 页数:63 大小:564KB
返回 下载 相关 举报
《AVR单片机》PPT课件_第1页
第1页 / 共63页
《AVR单片机》PPT课件_第2页
第2页 / 共63页
《AVR单片机》PPT课件_第3页
第3页 / 共63页
点击查看更多>>
资源描述
AVR单 片 机 原 理 及 应 用陈渊睿Tel: 13002086301E-mail: 华 南 理 工 大 学 电 力 学 院 第 五 章AVR单 片 机 I/O端 口 、 中 断 系 统 ATmega16等 有 4 个 8 位 的 I/O 口 ( ATmega8无A口 , C口 无 PC7) 。 它 们 分 别 是 端 口 A、 端 口 B、端 口 C、 端 口 D。 这 32 个 引 脚 均 可 以 由 程 序 定 义为 输 入 口 或 者 输 出 口 。单片机在实际应用时必须通过这些引脚来接收外界信息,经处理后输 出相应信号。本 章 只 讲 基 本 的 输 入 、 输 出 功 能 (通 用I/O)。 这 32 个 引 脚 还 有 第 二 功 能5.1.2 I/O端 口 的 通 用 I/O功 能1 有 关 I/O口 的 寄 存 器1) A 口 数 据 寄 存 器 PORTA $1B($3B)2) A 口 数 据 方 向 寄 存 器 DDRA $1A($3A)3) A 口 输 入 脚 地 址 PINA $19($39)5.1 AVR单 片 机 的 I/O端 口 A口的输入引脚地址PINA不是一个寄存器,该地址允许对A口的每一个引脚的物理值进行访问。当读PORTA时,读到的是PORTA的数据锁存器(在单片机内部);当读PINA时,外部引脚上的逻辑值(0或1)被读取 B口 、 C口 、 D口 作 为 通 用 I/O时 , 具 有 与 A口 同 样 的功 能4) B 口 数 据 寄 存 器 PORTB $18($38)5) B 口 数 据 方 向 寄 存 器 DDRB $17($37)6) B 口 输 入 脚 地 址 PINB $16($36)7) C 口 数 据 寄 存 器 PORTC $15($35)8) C 口 数 据 方 向 寄 存 器 DDRC $14($34)9) C 口 输 入 脚 地 址 PINC $13($33)10) D 口 数 据 寄 存 器 PORTD $12($32)11) D 口 数 据 方 向 寄 存 器 DDRD $11($31)12) D 口 输 入 脚 地 址 PIND $10($30) 以 PC0 为例说明不考虑端口的第二功能时,I/O 口内部电路及工作原理2 I/O口 内 部 电 路 及 工 作 原 理 当C口数据方向寄存器DDRC的第0位置位 (DDC0=1) 时, PC0口定义输出. 由PC0口的内部工作原理图可见, DDC0的Q端为1, MOS管上拉截止; 同时PORTC0的三态门打开, PC0引脚的输出电平取决于C口数据寄存器PORTC的第0位 (PORTC0) 的输出Q端值, 即: DDC0=1 (PC0定义为输出), PORTC0=1时, PC0输出高电平; PORTC0=0时, PC0输出低电平当DDC0=0时, PC0口定义输入. PORTC0=0时, 上拉MOS截止, PC0口作三态输入; PORTC0=1时 (上拉MOS激活), PC0口作带上拉电阻的输入. 后一种输入方式可省去键盘、开关、继电器等接口电路的上拉电阻 DDC0 是可读的, 用指令 in r16,DDRC 再看 r16 的第 0 位; PORTC0 的输出 Q 也是可读的, 用指令 in r16,PORTC 再看 r16 的第 0 位, 读的是锁存器(PORTC); PINC0 是可读的, 用指令 in r16,PINC 再看r16 的第 0 位, 读的是引脚电平 DDC0, PORTC0 都是可写的(可定义输入或输出和确定输出电平的高低等), 但 PINC 是不可写的 (引脚电平的高低是外部客观存在) 表 5-1 I/O 口 引 脚 配 置 表DDRXn PORTXn PUD in SFIOR I/O方 式 内 部 上 拉 电 阻 引 脚 状 态 说 明0 0 X 输 入 无 效 三 态 ( 高 阻 )0 1 0 输 入 有 效 外 部 引 脚 拉 低 时 输 出 电 流 (uA)0 1 1 输 入 无 效 三 态 ( 高 阻 )1 0 X 输 出 无 效 推 挽 0输 出 , 吸 收 电 流 (20mA)1 1 X 输 出 无 效 推 挽 1输 出 , 输 出 电 流 (20mA) C口特性:C口是一个8位双向 I/O口.C口占了3个I/O寄存器地址, 分别是C口数据寄存器PORTC $15($35), C口数据方向寄存器DDRC $14($34) 和C口的输入引脚 PINC $13($33). C口的输入引脚地址为只读, 而数据寄存器和数据方向寄存器为可读写 所有的C口引脚都有独立可选的上拉电阻, C口的输出缓冲器可以吸收20mA的电流以直接驱动LED显示.当PC0PC7引脚被用作输入(DDCn=0)且被外部拉低时, 若内部上拉电阻被触发(PORTC n=1), 这些引脚将向外输出电流A口、B口、D口作普通I/O口时同上 3 I/O口 的 特 点(1)作输入或输出可定义;(2)输出时,低电平灌电流大于 20mA。若允许输出口电平升至 1V 以上,灌电流可达 40mA(但每个口的总电流、芯片的总电流有限制) (3)输入时,可三态输入(不带上拉,大于 2.2V为逻辑1); 也可带上拉,可省去外电路的上拉电阻 5.1.4 I/O端 口 的 应 用1 I /O 端 口 使 用 注 意 事 项 1) 先定义 I/O 口方向,对数据方向寄存器的某位置 1 为输出,清 0 为输入 2) 作输入口时,若需上拉电阻,可对端口数据寄存器PORTX相应位置 1(且PUD0),这样省去外部电路的上拉电阻,可作为拨动开关、继电器接点、键盘和数字拨码盘的输入口 3) 作输出口时,上拉电阻已断开,对口数据寄存器相应位置 1 推挽输出高电平,对口数据寄存器相应位清 0 推挽输出低电平。从驱动能力看, 低电平时的灌电流更强些, 若不介意电压升到 1V, 灌电流可达 40mA,可直接驱动继电器和LED数码管 2 I/O 口 应 用 举 例0 LED闪烁 ;ATmega16的 PA口 PA0 PA7分 别 接 LED(D1 D8)的 阴 极 , 各 串 300R限 流 电 阻 后 接 Vcc.include m16def.inc.org $000rjmp start.org $02Astart:ldi r16,low(RAMend) ;Set stackpointerout spl,r16ldi r16,high(RAMend)out sph,r16ldi r16,$ff ;set porta as outputout ddra,r16 ;(Continued)loop:ldi r16,$00 ;输 出 低 led亮out porta,r16ldi r24,6 ;设 延 时rcall delayldi r16,$ff ;输 出 高 led灭out porta,r16ldi r24,4rcall delayrjmp loop ;(Continued)delay:d1: ldi r25,200d2: ldi r26,200d3: dec r26brne d3dec r25brne d2dec r24brne d1ret若要实现流水灯效果,如何更改程序? 1 数字拨码盘输入两位 BCD 码, 数码管静态显示出来 B 口定义为带内部上拉的输入口, 外接两个 BCD码数字拨盘。拨盘被拨到某一个位置时, 输入控制线A分别与 4 位数据线中的某几位接通, A 端接地. 例把拨盘拨为3, 则数据线 2、1 与 A 相通,读入低电平,8、4 与 A 不通,读入高电平,即读入为1100,取反即为0011(3)。C口、D口定义为输出,经 300电阻接两共阴数码管各段,数码管公共端(阴极)接地 .include 8535def.inc rjmp reset tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f ;七 段 码 表(0 9, 共 阴 ) reset:ldi r16,$02 ;栈 指 针 置 初 值 out sph,r16 ldi r16,$5f out spl,r16 ldi r16,0 ;定 义 B 口 输 入 带 上 拉 out ddrb,r16ldi r16,$ff out portb,r16 out ddrc,r16 ;定 义 C 口 D 口 为 输 出 out ddrd,r16 loop: in r16,pinb ;读 B 口 引 脚 , 开 关 闭 合 为 0 com r16 ;取 反 , 开 关 闭 合 对 应 为 1 mov r17,r16 andi r16,$0f ;取 个 位 BCD 码 swap r17 ;半 字 节 交 换 andi r17,$0f ;取 十 位 BCD 码 ldi ZH,high(tab*2) ;查 个 位 七 段 码 ldi ZL,low(tab*2) add ZL,r16 lpm out portc,r0 ;送 C 口 静 态 输 出 ldi ZH,high(tab*2) ;查 十 位 七 段 码 ldi ZL,low(tab*2) add ZL,r17 lpm out portd,r0 ;送 D 口 静 态 输 出 h: rjmp h ; 2 动态扫描五位数码管显示静态显示 1 位数码需占 8 位口(包括小数点),要显示 5 位数码需 40 位输出口,这显然是不实用的。为了节省输出口,可采用动态扫描方式,显示五位数码只需 13 位输出口电路如下图,B 口作字线, D 口低 5 位作位线,动态扫描显示五位数码,利用人眼的视觉暂留效应,可看到稳定的数字程序:16位二进制数(r17:r16)转换为5位BCD码(个万位分别存于r18r22),并用数码管显示 2 动态扫描五位数码管显示 2 动态扫描五位数码管显示.include 8535def.inc .org $0000 rjmp reset tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f reset: ldi r16,low(ramend) ;栈 指 针 置 初 值 out spl,r16 ldi r16,high(ramend) out sph,r16 ldi r16,$ff ;定 义 PB PD 为 输 出 口 out ddrb,r16 out ddrd,r16 2 动态扫描五位数码管显示 ldi r16,$ff ;设 待 显 示 数 为 $ffff(即 65535) ldi r17,$ff rcall b16td5 ;调 二 转 十 子 程 见 4.3.1 mov r22,r20 ;将 BCD 码 送 r18r22 mov r21,r19 mov r20,r18 mov r19,r17 mov r18,r16 aa: rcall smiao ;调 动 态 扫 描 子 程 rjmp aa 2 动态扫描五位数码管显示smiao: ldi r16,$fe ;送 个 位 位 线 out portd, r16 mov r23,r18 ;将 个 位 的 BCD 码 送 R23 rcall cqb ;查 七 段 码 送 B 口 输 出 rcall t1ms ;延 时 1ms ldi r16,$fd ;送 十 位 位 线 out portd, r16 mov r23,r19 ;将 十 位 的 BCD 码 送 R23 rcall cqb ;查 七 段 码 送 B 口 输 出 rcall t1ms ;延 时 1ms 2 动态扫描五位数码管显示ldi r16,$fb ;送 百 位 位 线 out portd,r16 mov r23,r20 ;将 百 位 的 BCD 码 送 R23 rcall cqb ;查 七 段 码 送 B 口 输 出 rcall t1ms ;延 时 1ms ldi r16,$f7 ;送 千 位 位 线 out portd,r16 mov r23,r21 ;将 千 位 的 BCD 码 送 R23 rcall cqb ;查 七 段 码 送 B 口 输 出 rcall t1ms ;延 时 1ms ldi r16,$ef ;送 万 位 位 线 out portd,r16 mov r23,r22 ;将 万 位 的 BCD 码 送 R23 rcall cqb ;查 七 段 码 送 B 口 输 出 rcall t1ms ;延 时 1ms ret 2 动态扫描五位数码管显示cqb: ldi zh,high(tab*2) ;七 段 码 的 首 地 址 给 Z ldi zl,low(tab*2) add zl,r23 ;首 地 址 +偏 移 量 lpm ;查 表 送 B 口 输 出 out portb,r0 ret t1ms: ldi r24,101 ;延 时 1 毫 秒 子 程 push r24 del2: push r24 del3: dec r24 brne del3 pop r24 dec r24 brne del2 pop r24 ret 打 印 机 接 口 设 计Centronic接口打印机一般采用8位数据线和3根基本的应答控制线/STB, BUSY, /ACK以 PP40 彩色绘图打印机为例,接口时序如图 8535 与 PP40 的 接 口 电 路 如 图 若打印如下两行字符 t: 32C P: 102kPa 则要把以下 ASCII 码送给打印机: $74(t), $3A(:), $20(空格), $33(3), $32(2), $6F(), $43(C),$0A(换行), $50(P), $3A(:), $20(空格), $31(1), $30(0), $32(2), $6B(k), $50(P), $61(a), $0A(换行) 设事先已将这些 ASCII 码放在 SRAM 中$100 开始的单元中 1 采用查询的方法。单片机每送一个数据,发选通脉冲后,打印机忙线变高,同时接收处理该数据,完成后忙线变低,单片机查到忙线变低后再送下一个数据。 .include “8535def.inc” RESET: ldi r16,low(ramend) ;栈指针置初值 out spl,r16 ldi r16,high(ramend) out sph,r16 ldi r16,$ff ;定义 C 口为输出 out ddrc,r16 ldi r16,$01 ;定义PD0为输出, PD2为输入 out ddrd,r16 sbi portd,0 ;先使PD0输出为高 ldi xh,$01 ;X指向打印缓冲区首址 ldi xl,$00 ldi r25,18 ;要打印的字符数 loop: ld r24,x+ ;向打印机数据口送一个字符 out portc,r24 cbi portd,0 ;发选通脉冲 rcall t1us sbi portd,0 rcall t1us ;延时 3us rcall t1us rcall t1us loop1: sbic pind,2 ;等待忙线变低(耗时长) rjmp loop1 dec r25 ;字节数是否发完 brne loop ;没发完再发下一个 here: rjmp here 打印机中的微电机和机械的动作是一个慢过程,需要几ms才能传送一个字节数据。用查询的方法送一组数据给打印机有时需要数秒钟,单片机在这段时间内就不能干别的事情,这样常常是不允许的2 采用中断的方法。主程序送第一个数据给打印机数据口,接着发选通脉冲,打印机接收处理该数据时,忙线变高,直到处理好此数据后忙线变低,BUSY的下降沿产生一个INT0中断,在中断服务子程序中再送下一个数据,发送选通脉冲后立即返回主程序。这样,送字符和发选通信号是在外部中断0服务子程序中完成,单片机主程序照常执行。每送一个字符,只打断几微秒。 .include 8535def.inc .org $000 rjmp RESET rjmp EXT_INT0 RESET: ldi r16,low(ramend) ;栈指针置初值 out spl,r16 ldi r16,high(ramend) out sph,r16 ldi r16,$ff ;定义 C 口为输出 out ddrc,r16 ldi r16,$01 ;定义 PD0 为输出 PD2 为输入 out ddrd,r16 sbi portd,0 ;先使 PD0 输出为高 ldi r16,$02 ;定义 INT0 下降沿申请中断 out MCUCR,r16 SER r16 ;清中断标志寄存器 out GIFR,r16 ldi xh,$01 ;X 指向打印缓冲区首址 ldi xl,$00 ldi r25,17 ;要打印的字符数ld r24,x+ ;向打印机数据口送第一个字符 out portc,r24 cbi portd,0 ;发选通脉冲 rcall t1us sbi portd,0 ldi r24,$40 ;使能 INT0 中断 out GIMSK,r24 sei ;开中断 here: rjmp here EXT_INT0:in r1,sreg ;保护标志寄存器 ld r24,x+ ;向打印机数据口送字符 out portc,r24 cbi portd,0 ;发选通脉冲 rcall t1us sbi portd,0 dec r25 ;是否发完 brne ext_int01 ldi r24,$00 ;发完则关 INT0 中断 out GIMSK,r24 ext_int01: out sreg,r1 ;恢复标志寄存器 reti 主 程 序 中断服务程序KK+1 中 断 响 应中 断 返 回中 断 请 求 中 断 过 程 示 意 图5.2 AVR单 片 机 的 中 断 系 统中断的概念中断服务程序与子程序的区别中断是随机发生的,服务程序无需通过指令调用,返回用RETI子程序需通过rcall、ICALL、CALL指令调用,返回用RET ATmega8有19个中断源(含RESET,ATmega16有21个)。每个中断源在程序空间都有一个独立的中断向量。所有的中断事件都有自己的使能位。当使能位置位且 SREG中的 I 也置位的情况下,中断可以发生 程序空间的最低位置定义为复位及中断向量。完整的中断表见复位与中断矢量表。 在中断向量表中处于低地址的中断具有高的优先级, 所以 RESET 具有最高的优先级5.2.1 中 断 源 和 中 断 标 志 设置中断向量地址最典型的方法如下: 地址 矢量号 代码 注释 $000 1 RJMP RESET ;复位(上电、外部、 BOD、看门狗) $001 2 RJMP EXT_INT0 ;IRQ0 $002 3 RJMP EXT_INT1 ;IRQ1 $003 4 RJMP TIM2_COMP ;T2比较匹配 $004 5 RJMP TIM2_OVF ;T2 溢出 $005 6 RJMP TIM1_CAPT ;T1 输入捕捉 $006 7 RJMP TIM1_COMPA ;T1比较匹配A $007 8 RJMP TIM1_COMPB ;T1比较匹配B $008 9 RJMP TIM1_OVF ;T1 溢出 $009 10 RJMP TIM0_OVF ;T0 溢出 $00a 11 RJMP SPI_STC ;SPI传输结束 $00b 12 RJMP UART_RXC ;UART接收结束 $00c 13 RJMP UART_DRE ;UART数据空 设置中断向量地址最典型的方法如下(续): 地址 矢量号 代码 注释 $00d 14 RJMP UART_TXC ;UART发送结束 $00e 15 RJMP ADC ;AD转换结束 $00f 16 RJMP EE_RDY ;EEP准备好 $010 17 RJMP ANA_COMP ;模拟比较器 $011 18 RJMP TWI_INT ;TWI状态中断 $012 19 RJMP SPM_RDY ;写Flash准备好 ;下面主程序开始 $013 RESET: LDI R16,HIGH(RAMEND) $014 OUT SPH, R16 $015 LDI R16,LOW(RAMEND) $016 OUT SPL, R16 $017 XXX 中断标志:指示中断是否存在的标记,由内部专用触发器充任,触发器置1表示有中断,清零表示无中断。各中断标志分布于相应I/O寄存器中。如GIFR、TIFR等 5.2.3 中 断 处 理当程序计数器PC指向实际中断向量开始执行相应的中断例程时,硬件清除对应的中断标志。一些中断标志位也可以通过软件写1来清除 当一个符合条件的中断发生后,如果相应的中断使能位为0,则中断标志位挂起,并一直保持到中断执行,或者被软件清除 如果全局中断标志I被清零,则所有的中断都不会被执行,直到I置位,然后被挂起的各个中断按中断优先级依次中断 注意:外部电平中断没有中断标志位,无法记忆,因此当电平变为非中断电平后,中断条件即终止注意:进入中断例程时状态寄存器SREG不会被自动保存,从中断例程返回(RETI)时也不会被自动恢复。用户编写中断例程时必须注意保护SREG。如:EXT_INT0: in r1,sreg ;保护状态寄存器SREG out sreg,r1 ;恢复状态寄存器SREG reti 能否直接用PUSH、POP? 5.3 有 关 的 I/O寄 存 器1、通用中断控制寄存器GICR*器件不同时,I/O寄存器的名称或每位的含义可能会不同(详见相应器件的数据手册)以下只讨论与ATmega8相关的 位7:INT1 外部中断请求1使能 当INT1位和SREG中的I位都为1时,外部引脚(INT1)中断使能。MCU 通用控制寄存器MCUCR中的中断检测控制位1/0(ISC11和ISC10) 定义中断1是上升沿中断还是下降沿中断,或者是低电平中断。即使管脚被定义为输出,中断仍可产生。相应的中断从程序存储器的(字)地址$002起执行 位6:INT0 外部中断请求0使能 当INT0位和SREG中的I位都为1时,外部引脚(INT0)中断使能。MCU 通用控制寄存器MCUCR中的中断检测控制位1/0(ISC01和ISC00) 定义中断1是上升沿中断还是下降沿中断,或者是低电平中断。即使管脚被定义为输出,中断仍可产生。相应的中断从程序存储器的(字)地址$001起执行 2、通用中断标志寄存器GIFR位7:INTF1 外部中断标志1 当INT1引脚信号边沿或逻辑变化触发中断请求时,INTF1置位1。如果SREG中的I位及GICR中的INT1位都为1,则MCU将跳转到中断地址$002。中断例程执行时,此标志被清除,也可以通过向其写1来清除。当配置为低电平中断时,该标志恒为0,因低电平中断可由读PIN寄存器决定 位6:INTF0 外部中断标志0 当INT0引脚信号边沿或逻辑变化触发中断请求时,INTF0置位1。如果SREG中的I位及GICR中的INT0位都为1,则MCU将跳转到中断地址$001。中断例程执行时,此标志被清除,也可以通过向其写1来清除。当配置为低电平中断时,该标志恒为0,因低电平中断可由读PIN寄存器决定 3、定时器/计数器中断屏蔽寄存器TIMSK位7:OCIE2 T/C2输出比较匹配中断使能 当OCIE2位和SREG中的I都为1时,T/C2比较匹配中断使能。当T/C2的比较匹配发生(即定时器/计数器中断标志寄存器TIFR中的OCF2置位)时,中断例程(中断矢量地址$003)将执行 位6:TOIE2 T/C2溢出中断使能 当TOIE2 和I 都为1 时,T/C2 溢出中断使能。当T/C2 溢出(即TIFR 中的TOV2 位置位)时,中断例程($004)得到执行 位5:TICIE1 T/C1输入捕捉中断使能 当TICIE1和I 都为1时,输入捕捉事件中断使能。当PD6(ICP)的捕捉触发事件发生(即TIFR 中的ICF1置位)时,中断例程($005)将执行 位4:OCIE1A T/C1输出比较A 匹配中断使能 当OCIE1A和I都为1时,输出比较A匹配中断使能。当T/C1的比较A 匹配发生(即TIFR中的OCF1A置位)时,中断例程($006)将执行 位3:OCIE1B T/C1 输出比较B 匹配中断使能 当OCIE1B和I都为1时,输出比较B匹配中断使能。当T/C1 的比较B 匹配发生(即TIFR 中的OCF1B置位)时,中断例程($007)将执行 位2:TOIE1 T/C1 溢出中断使能 当TOIE1和I 都为1时,T/C1溢出中断使能。当T/C1溢出(即TIFR 中的TOV1 位置位)时,中断例程($008)得到执行 位1:Res 保留位,读出为0位0:TOIE0 T/C0 溢出中断使能 当TOIE0和I 都为1时,T/C0溢出中断使能。当T/C0溢出(即TIFR 中的TOV0 位置位)时,中断例程($009)得到执行 4、定时器/计数器中断标志寄存器TIFR位7:OCF2 T/C2输出比较标志 当T/C2 与OCR2 的值匹配时,OCF2 置位。 此位在执行中断例程时硬件清零,或者通过对其写 1 来清零。当SREG中的位I、OCIE2和OCF2 一同置位时,中断例程得到执行位6:TOV2 T/C2溢出中断使能 当T/C2 溢出时,TOV2置位。执行相应的中断例程时此位硬件清零,也可通过向其写 1来清零。 当SREG 中的位I、TOIE2和TOV2一同置位时,中断例程得到执行。在PWM模式中,当T/C2在$00 改变计数方向时,TOV2置位 位5:ICF1 输入捕获标志1 当输入捕获事件发生时,ICF1置位,表明T/C1 的值已经送到输入捕获寄存器ICR1。清零方式同前。当SREG中的位I、TICIE1和ICF1一同置位时中断例程得到执行位4:OCF1A 输出比较标志1A当T/C1与输出比较寄存器OCR1A的值匹配时,OCF1A置位。清零方式同前。当SREG 中的位I、OCIE1A和OCF1A 一同置位时 中断例程得到执行位3:OCF1B 输出比较标志1B当T/C1与输出比较寄存器OCR1B的值匹配时,OCF1B置位。清零及中断与上面类似 位2:TOV1 T/C1溢出标志 当T/C1溢出时,TOV1置位。当SREG 中的位I、TOIE1和TOV1一同置位时,中断例程得到执行。在PWM 模式中,当T/C1 在$0000 改变计数方向时,TOV1 置位位1:保留位。读出为0位0:TOV0 T/C0溢出标志当T/C0溢出时,TOV0置位。当SREG 中的位I、TOIE0和TOV0一同置位时,中断例程得到执行 5.4 外 部 中 断外部中断由INT0 (PD2)和INT1 (PD3)引脚触发。应当注意:如果中断使能,则即使INT0/INT1配置为输出,也可触发中断。此特性提供了一个产生软件中断的方法。触发方式可为上升沿、下降沿、逻辑变化或低电平,由MCU控制寄存器MCUCR设定。当设置为低电平触发并使能中断时,只要电平为低,中断就一直触发 5.5 中 断 响 应 时 间 AVR中断响应时间最少为4个时钟周期。在这4个时钟期间,PC(2个字节)自动入栈,而SP减2。在通常情况下,中断向量处为一个相对跳转指令,此跳转要花2个时钟周期。如果中断在一个多周期指令执行期间发生,则在此多周期指令执行完后,MCU才会执行中断程序从中断例程返回亦需4个时钟周期。在此期间,PC将被弹出栈,SP增2,SREG 的位I 被置位 AVR退出中断程序时,总是返回到主程序并执行一条指令之后才能再响应被挂起的中断 5.6 MCU控 制 寄 存 器 MCUCR位7:SE 休眠使能 执行SLEEP指令时,SE位必须置位才能使MCU进入休眠模式。为了防止无意间使MCU进入休眠,建议与SLEEP指令相连使用(即:真要MCU进入休眠时,先置位SE,紧接着执行SLEEP指令) 位6,5,4:SM2,SM1,SM0 休眠模式选择位 这三位用于选择休眠模式。见下表 位3,2:ISC11, ISC10 中断检测控制1,位1和位0 选择INT1中断的边沿或电平注意:改变ISC11/ISC10时,首先要禁止INT1(清除GICR 的INT1位),否则可能引发不必要的中断(对于INT0也类似)ISC11 ISC10描述0 0 INT1低电平中断0 1上升沿和下降沿都触发中断1 0 INT1下降沿中断1 1 INT1上升沿中断 位1,0:ISC01, ISC00 中断检测控制0,位1和位0 选择INT0中断的边沿或电平 INTn 引脚的电平在检测边沿之前采样。如果选择边沿中断,则宽于一个CPU 时钟的脉冲将触发中断。太窄的脉冲不能保证中断。如果选择了低电平触发,则低电平必须保持到当前执行的指令结束才会引发中断ISC01 ISC00描述0 0 INT0低电平中断0 1上升沿和下降沿都触发中断1 0 INT0下降沿中断1 1 INT0上升沿中断 补充例:中断计数int0(PD2),int1(PD3)分别通过按键接地,r27:r26存计数值(初值为0),按int0一次计数增10,按int1一次计数增1,计数值在5位共阴数码管中显示,PA口驱动字线,PC0PC4分别选择个位万位 部分程序代码:.include 8535def.inc.org $000rjmp main.org $001rjmp ext_int0.org $002rjmp ext_int1.org $011tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6fmain:ldi r16,low(ramend)out spl,r16ldi r16,high(ramend)out sph,r16 ldi r16,0b00001011 ;int1下降沿中断,int0上升沿中断out mcucr,r16clr r16out ddrd,r16 ;PD口设为输入ser r16out portd,r16 ;使能上拉out ddra,r16 ;PA、PC口设为输出out ddrc,r16out gifr,r16 ;清中断标志寄存器ldi r16,$C0out gimsk,r16 ;允许int0 int1中断ldi r26,0 ;r27:r26初值为0ldi r27,0sei aa: mov r16,r26mov r17,r27rcall b16td5 ;调二转十子程 mov r22,r20 ;将 BCD 码送 r18r22 mov r21,r19 mov r20,r18 mov r19,r17 mov r18,r16 rcall smiao ;调动态扫描子程 rjmp aa ext_int0:adiw r26,10retiext_int1:adiw r26,1reti
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!