教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 建筑文档 >

单片机教材 - 第4章I-O接口及应用(2)

来源:网络收集 时间:2026-04-09
导读: K0~K7的状态可以组成一个8位的二进制输入数。如图4-7所示,K7、K5、K2、K0断开,K6、K4、K3、K1闭合。 开关: K7 K6 K5 K4 K3 K2 K1 K0 状态: 开 闭 开 闭 闭 开 闭 开 输入值:1 0 1 0 0 1 0 1 所以,输入的二进

K0~K7的状态可以组成一个8位的二进制输入数。如图4-7所示,K7、K5、K2、K0断开,K6、K4、K3、K1闭合。

开关: K7 K6 K5 K4 K3 K2 K1 K0 状态: 开 闭 开 闭 闭 开 闭 开 输入值:1 0 1 0 0 1 0 1 所以,输入的二进制数为0xA5。

PD口作为输出口使用,每一位与Vcc之间接有一个限流电阻和一个发光管。当PD口的某位输出1时,引脚为高电平,发光管不亮;当PD口的某位输出0时,引脚为低电平,发光管点亮。如果输出二进制数10100101,结果如下:

位数: 7 6 5 4 3 2 1 0 输出: 1 0 1 0 0 1 0 1 灯: 灭 亮 灭 亮 亮 灭 亮 灭

所以,可以用灯的亮和灭来表示二进制数。

例如:8个灯从高位到低位的状态为:灭灭亮亮亮灭灭灭,则二进制数为11000111。 现要求输入变化时,输出显示输入的结果,则程序如下:

#include void main()

{DDRC=0x00; //定义PC口为输入口 PORTC=0x00; //不使用内部上拉电阻 DDRD=0xFF; //定义PD口为输出口

while(1) PORTD=PINC; //无限循环,把输入送到输出 }

4.2.4 实验指导2

按上述程序进行实验,观察拨动开关状态与发光管的状态关系,当改变某开关状态时,看发光管的变化,并写出二进制数。然后,定义PA口为输入,PB口为输出,改变实验电路进行实验,说明其道理。

4.3 位检测与位控制

4.3.1 位检测与位控制

在前面介绍的并行接口的输入与输出都是按字节操作的。在实际应用中,并不总是采用并行输入和并行输出,有时只需要检测8位中的某一位的状态变化。同样的,有时只控制某一位的输出,而不让其它位变化。例如在图6-8所示的电路中,如我们只希望检测PC口的第3位,并把第3位的结果送到PD口的第0位,而不要影响其他位。这就是位检测与位控制的问题。

1. 位变量

在CodeVisionAVR中可以直接定义位变量为全局变量,例如:

bit on;

也可以在定义时赋初值: bit on=1,off=0;

需要定义多少位变量,应在project->configure->C Compile菜单选项下设置bit Variables Size的数量。

在mega16.h头文件中定义的很多特殊变量是能进行位操作的,不需要专门进行位定义,就可以进行位运算。在使用时,只要在这些变量后跟一个小数点和一个范围在0~7的数字。这个数就是要操作的位。例PINE.0表示变量PINE的第0位。

2. 位检测

位检测具有位读取的含义,根据C语言中赋值语句的含义,等号右边的为读取值。所以等号右边出现位变量,就是对位的检测。如果我们要检测某个输入引脚的状态,可以在赋值语句的右边使用接口输入变量的位操作符。

例如读取C口的第0位到位变量weib1,可以编程如下: bit weib1; weib1=PINC.0;

3. 位控制

位控制具有把一个位变量输出到某个引脚的含义。所以位控制时,赋值语句的左边为接口输出变量的位操作符。例如把C口的第0位控制为高电平,可编写程序如下:

DDRC=0xff; PORTC.0=1; 第一条语句定义C口为输出口,第二条语句把C口的第0位控制为高电平。

再例如,我们只希望检测C口的第3位,并把第3位的结果送到D口的第0位,而不要影响其他位。可用PORTD.0=PINC.3实现。如果我们想把输出到D口(已定义为输出口)第一位的结果送到D口的第五位。与上例不同的是,D口的第一位是输出而不是输入。应表达为:PORTD.5=PORTD.1。等号右边的变量是输出变量,而不是输入变量。

4. 位运算

位运算一般有:置1、清0、取反、与、或、非、异或等运算。 置1:位变量=1; 清0:位变量=0;

取反:位变量=!位变量;

与运算:位变量3=位变量1&位变量2; 或运算:位变量3=位变量1|位变量2; 异或运算:位变量3=位变量1^位变量2; 非运算:位变量2=!位变量1;

以上是位与位之间的运算。但有时我们希望把字符变量或整型变量的某些位改变而其它位不变。这种改变有置位、清零、取反。其操作方法如下:

(1)置位

按逻辑或运算规则,某位与0或,本位不变,与1或,本位变1。所以把一个变量与一个同长度的二进制数做按位或运算,可以使某些位不变,某些位变1。例如把字符型变量AA的0位、5位置1,其它位不变,则操作为:

AA=AA|0b00100001; (2)清零

按逻辑与运算规则,某位与1与,本位不变,与0与,本位变0。所以把一个变量与一个同长度的二进制数做按位与运算,可以使某些位不变,某些位变0。例如把字符型变量AA的0位、5位清0,其它位不变,则操作为:

AA=AA&0b11011110; (3)取反

按逻辑异或运算规则,某位与1异或,本位取反,与0异或,本位不变。所以把一个变量与一个同长度的二进制数做按位异或运算,可以使某些位不变,某些位取反。例如把字符型变量AA的0位、5位取反,其它位不变,则操作为:

AA=AA^0b00100001;

5. 位测试

在很多应用中需要知道一个变量的某一位的状态。例如某一运算为:如果字符变量AA的第2位为0时,变量BB清0;AA的第2位为1时,BB加10。这个运算要测试变量AA的第2位。“按位与”运算规则,某位与1“与”,本位不变,与0“与”,本位变0。所以把一个变量与一个同长度的测试位为1其它位为0的二进制数做“按位与”运算,可以使测试位不变,其它位变0。如果被测试位是0,则整个运算结果是0;如被测试位为1,则整个结果为非0。通过判断结果是否为非0,就能测试需要的位。对上例可以用下面的程序实现:

if(AA&0b00000100)BB=BB+10; else BB=0;

4.4 位操作应用举例

为进一步说明其使用方法,现给出几个应用实例。 4.4.1 例3:按键处理

如图4-7所示的电路图,PC3口的按键每按一次,PD3口的发光管的状态改变一次。

图4-7 键控指示灯电路

电路中,按键不按下时,在上拉电阻R1的作用下,PC3为高电平。按键按下时,引脚与地短接,为低电平状态。通常,按键所用开关为机械弹性开关,均利用了机械触点的合、断作用。一个电压信号通过机械触点的断开、闭合过程,其波形如图4-8所示。

由于机械触点的弹性作用,一个开关在按下时不会马上稳定地接通,在松手时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,抖动时间一般为5-10毫秒。如果我们每隔20毫秒检测一次按键的状态,就可以消除抖动的影响。

按键有断开、下按、接通和释放四种情况,对应为高电平、高电平到低电平的变化、低电平、低电平到高电平的变化四种状态。每按一次键都要经历这四种状态,我们检查是否按了一次键,可以检查高电平到低电平的变化或者检查低电平到高电平的变化。检查高电平到低电平的变化的方法是:上次检查如果是高电平,本次为低电平,则表示键按下。检查低电平到高电平的变化的方法是:上次检查如果是低电平,本次为高电平,则表示键释放。

下列程序段实现例3的功能。

char j;

DDRD=0xFF; //定义PD口为输出口 DDRC=0x00; DDRC=0X00;

j=PINC; //j存放PC口的上次值 while(1)

{if((PINC.3==0)&(j&0x08)==1))PORTD.3=!PORTD.3; //有键按下时指示灯改变状态

j=PINC; //保存本次键值,作为下次判断的上次值 delay_ms(20); //延时20 …… 此处隐藏:1686字,全部文档内容请下载后查看。喜欢就下载吧 ……

单片机教材 - 第4章I-O接口及应用(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/438917.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)