第四章IO接口及应用试卷.ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本章内容 (对应课本第6、10、11章) §4.1 ATmega16(L)的I/O接口结构 §4.2 ATmega16(L)的I/O接口的配置 §4.3 ATmega16(L)的I/O接口的第二功能 §4.4 应用举例 §4.5 数码管显示技术 §4.6 行列式矩阵键盘技术 §4.7 蜂鸣器驱动 第四章 I/O接口及应用 作为通用I/O接口使用时,AVR单片机所有I/O接口都具有真正的读-修改-写功能。 所有的端口都具有与电压无关的上拉电阻。 §4.2 AVR单片机I/O接口的配置 作为通用数字I/O口使用时,每个I/O接口都具有3个寄存器: 1、端口寄存器及配置 如果希望读取引脚的逻辑电平值,一定要读取PINX,而不是PORTX。注意:PINX是只读的,不能对其赋值。 例如: temp=PINB; //将PB口引脚信号读入变量temp中。 设置DDRx方向寄存器 设置PORTx数据寄存器 设置PINx输入引脚寄存器(只读寄存器) DDRxn PORTxn I/O 上拉电阻 说明 0 0 输入 无 高阻态 0 1 输入 有 带上拉的输入 1 0 输出 无 输出低电平 1 1 输出 无 输出高电平 表6-1 端口的引脚配置 (对上拉电阻的理解,可参照下图理解) 悬空(高阻态)很容易受干扰 图中单片机的三个I/O口PC7、PC6、PC5作为输入口(输入方式),分别与K3、K2、K1三个按键连接。 K2是标准的连接方式,当没有按下K2时,PC6的输入为高电平,按下K2输入为低电平。PC6引脚上的电平值反映了按键的状态(外部上拉)。 按键K1是一种经济的接法,它充分利用了AVR单片机I/O口的内部上拉特点。在K1的连接中,除了把PC5定义为输入方式时(DDRC=0xDF),同时设置PC5口的上拉电阻有效(PORTC |=BIT(5)),这样当K1处在断开状态时,PC5引脚在内部上拉电阻的作用下为稳定的高电平(如果上拉电阻无效,则PC5处在高阻输入态,PC5的输入易受到干扰,不稳定),按下K1输入为低电平。 与K2连接方式比较,K1连接电路中省掉了一个外部上拉电阻,而在K2的连接方法中,由于外部使用了上拉电阻,所以只要设置PC6口为输入方式即可,该口内部的上拉电阻有效与否则不必考虑了。 而对于K3的连接方式,我们不提倡使用,因当K3按下闭合时,PC7口直接与Vcc接通了,有可能会造成大的短路电流流过PC7引脚,从而把端口烧毁。 2、配置实例 当然,特殊情况下也不带上拉输入。 如A/D中的模拟信号输入、功能模块(中断、定时器等)的输入可以是低电平触发。 (4)读取某一位的操作(使用“PINX”) 例://假设PB7通过一个10K的上拉电阻接5V电源,并且PB7还接有一个按键,按键的另一端接地。如果按键按下,执行程序语句1,否则执行程序语句2。 if((PINB 0x80)==0) 程序语句1; else 程序语句2; 或 if(PINB (17)==0)程序语句1; else 程序语句2; 3、I/O接口配置技巧 在AVR单片机的I/O接口中,每个端口位的输入/输出都有一个方向寄存器位进行控制。 使用赋值语句(如DDRA=0x0F)可以设置端口的方向。但是在改变其中一位的值的时候,同时还要考虑其他7位的状态,并且要小心翼翼地避免不小心改变了其他位的值。 技巧:可以使用单片机C语言中的位运算符。 如:DDRA|=(1PA5); 或 DDRA|=BIT(5); DDRA=0X10; DDRA|=BIT(5); 区别!! ATmega16单片机除了具有通用I/O功能之外,大多数端口还具有第二功能。 见课本P76 表6-2 §4.3 I/O接口的第二功能 一、『例4-1』:彩灯控制 ATmega16 硬件电路分析: 采用开关语句switch/case实现: void main(void) { uint i; uchar j; PORTB = 0xFF; DDRB = 0xFF; //设置PB口为输 出口 while(1) { //无限循环 for(i=0;i4;i++) { switch(i) { case 0: PORTB=0xEE; //1110 1110 break; case 1: PORTB=0xDD; //1101 1101 break; case 2: PORTB=0xBB;

您可能关注的文档

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档