460 likes | 651 Views
知识回顾与新课引入. 1 、单片机的组成?各部分功能是? 2 、单片机与电子计算机的组成有何异同? 3 、 ATmega16 的 PDIP 封装形式有多少个引脚?其中 I/O 占了多少个引脚? 4 、单片机 C 语言开发时常用的头文件有?. I/O 接口及应用. 并行接口概述 并行接口应用举例 位检测与位控制 位操作实例. 并行接口概述. 并行输入工作原理 并行输出工作原理 并行输入/输出接口工作原理. 并行输入工作原理.
E N D
知识回顾与新课引入 1、单片机的组成?各部分功能是? 2、单片机与电子计算机的组成有何异同? 3、ATmega16的PDIP封装形式有多少个引脚?其中I/O占了多少个引脚? 4、单片机C语言开发时常用的头文件有?
I/O接口及应用 • 并行接口概述 • 并行接口应用举例 • 位检测与位控制 • 位操作实例
并行接口概述 • 并行输入工作原理 • 并行输出工作原理 • 并行输入/输出接口工作原理
并行输入工作原理 并行输入接口中某一位的简化电路如图4-1所示。引脚的状态取决于外电路,缓冲器后的状态为引脚状态,三态门的输出由RP端控制,当RP为0时,三态门的输出为高阻状态,数据总线不受引脚影响;当RP为1时,三态门的输出与输入相同,此时为读引脚状态。在读接口时,RP控制端有效。
并行输出工作原理 并行输出接口中某一位的简化接口电路如图所示。当控制端WP为0(低电平)时,数据锁存器的输出端Q为上次输出的值,与输入端D无关,数据总线操作不影响输出。当控制端WP为1时,数据锁存器的输出端Q的值为输入端D的值,为输出数据状态。数据输出到引脚。锁存器输出端Q为0时,输出为低电平;锁存器输出端Q为1时,输出高电平。RL控制端为读取输出值。
并行输入/输出接口工作原理 • 端口A • 端口B • 端口C • 端口D
端口A • 端口A特性 • 端口作为通用数据I/O口 • 端口的第二功能
端口A特性 端口A是一个8位双向I/O口。端口A包含3个I/O地址,其中有两个寄存器和一个输入引脚:数据寄存器PORTA、数据方向寄存器DDRA、输入引脚PINA。数据寄存器PORTA和数据方向寄存器DDRA是可读可写的,而输入引脚PINA仅仅可读不可写。PINA不是一个寄存器,这个地址是用来访问端口A的物理值。当读取PINA时,读到的是施加于引脚上的逻辑值。端口A的所有引脚都可以单独选择上拉电阻,并且可吸收20mA的电流,所以可以直接驱动LED指示灯。上拉电阻被激活且引脚被拉低时,则该引脚会输出电流。
端口作为通用数据I/O口 当端口A作为通用输入输出口时,它的8个引脚具有完全相同的功能。数据方向寄存器DDRA的各位用于引脚方向的选择。当DDRAn被置1时,则相应的端口A的引脚为输出引脚;反之,为输入引脚。
端口的第二功能 端口A 的第二功能比较单一,可以作为ADC的模拟输入端。
端口B • 端口特性 • 端口作为通用数据I/O口 • 端口的第二功能
端口特性 端口B是一个8位双向I/O口。端口B包含3个I/O地址,其中有两个寄存器和一个输入引脚:数据寄存器PORTB、数据方向寄存器DDRB、输入引脚PINB。数据寄存器PORTB和数据方向寄存器DDRB是可读可写的,而输入引脚PINB仅仅可读不可写。PINB不是一个寄存器,这个地址是用来访问端口B的物理值。当读取PINB时,读到的是施加于引脚上的逻辑值。端口B的所有引脚都可以单独选择上拉电阻,并且可吸收20mA的电流,所以可以直接驱动LED指示灯。上拉电阻被激活且引脚被拉低时,则该引脚会输出电流。
端口作为通用数据I/O口 当端口B作为通用输入输出口时,它的8个引脚具有完全相同的功能。数据方向寄存器DDRB的各位用于引脚方向的选择。当DDRBn被置1时,则相应的端口B的引脚为输出引脚;反之,为输入引脚。
端口的第二功能 引脚第二功能说明如下: ● T0 :T/C0的外部引脚输入。 ● T1 :T/C1的外部引脚输入。 ● AIN0 :当该引脚无上拉电阻并且被配置为输入时,为模拟比较器的正输入端。 ● AIN1 :当该引脚无上拉电阻并且被配置为输入时,为模拟比较器的负输入端。 ● MOSI :SPI的主机数据输出,从机数据输入。 ● MISO :SPI的主机数据输入,从机数据输出。 ● SCK :SPI的主机时钟输出,从机时钟输入。
端口C • 端口特性 • 端口作为通用数据I/O口
端口特性 端口C是一个8位双向I/O口。端口C包含3个I/O地址,其中有两个寄存器和一个输入引脚:数据寄存器PORTC、数据方向寄存器DDRC、输入引脚PINC。数据寄存器PORTC和数据方向寄存器DDRC是可读可写的,而输入引脚PINC仅仅可读不可写。PINC不是一个寄存器,这个地址是用来访问端口A的物理值。当读取PINC时,读到的是施加于引脚上的逻辑值。端口C的所有引脚都可以单独选择上拉电阻,并且可吸收20mA的电流,所以可以直接驱动LED指示灯。上拉电阻被激活且引脚被拉低时,则该引脚会输出电流。
端口作为通用数据I/O口 当端口C作为通用输入输出口时,它的8个引脚具有完全相同的功能。数据方向寄存器DDRC的各位用于引脚方向的选择。当DDRCn被置1时,则相应的端口C的引脚为输出引脚;反之,为输入引脚。
端口D • 端口特性 • 端口作为通用数据I/O口 • 端口的第二功能
端口特性 端口D是一个8位双向I/O口。端口D包含3个I/O地址,其中有两个寄存器和一个输入引脚:数据寄存器PORTD、数据方向寄存器DDRD、输入引脚PIND。数据寄存器PORTD和数据方向寄存器DDRD是可读可写的,而输入引脚PIND仅仅可读不可写。PIND不是一个寄存器,这个地址是用来访问端口D的物理值。当读取PIND时,读到的是施加于引脚上的逻辑值。端口D的所有引脚都可以单独选择上拉电阻,并且可吸收20mA的电流,所以可以直接驱动LED指示灯。上拉电阻被激活且引脚被拉低时,则该引脚会输出电流。
端口作为通用数据I/O口 当端口D作为通用输入输出口时,它的8个引脚具有完全相同的功能。数据方向寄存器DDRD的各位用于引脚方向的选择。当DDRDn被置1时,则相应的端口D的引脚为输出引脚;反之,为输入引脚。
端口的第二功能 ● RXD :UART的数据接收引脚。 ● TXD :UART的数据发送引脚。 ● INT0 :外部中断源0。 ● INT1 :外部中断源1。 ● OCIB :比较匹配B的外部输出。 ● OCIA :比较匹配A的外部输出。 ● ICP :输入捕获引脚。 ● OC2:比较匹配的外部输出。
并行接口应用举例 • 例4.2.1彩灯控制 • 例4.2.2二进制数输出控制
彩灯控制 如图4-4所示的电路,有8只发光二极管接在PC口,每只发光管低电平点亮。如果按图4-5所示的方式点亮,每次点亮两只发光亮,间隔0.2s后,再换成点亮相邻的两只,依此类推,4次后,再回到第一次,周而复始,形成彩灯的移动。 图4-4 彩灯控制电路 图4-5 彩灯点亮示意图
彩灯控制程序 #include <mega16.h> #include <delay.h> void main( ) { char i,j ; /* PORTC定义 */ PORTC=0x00 ; DDRC=0X11; while(1) { j=0x11 ; For (i=0; i<4 ;i++) { PORTC= ~j ; delay_ms(100) ; j =j <<1 ; } }; }
例4.2.2二进制数输出控制 如图4-6所示为二进制数输入、输出控制的电路原理图。 图4-6 并行输入/输出应用
PC口作为输入接口使用,每一位接有上拉电阻和开关。当开关断开时,输入为高电平,读取的结果为1;当开关闭合时,输入为低电平,读取的结果为0。这样8个开关s0~s7的状态可以组成一个8位的二进制输入数。如图4-7所示,s7、s5、s2、s0断开,s6、s4、s3、s1闭合。PC口作为输入接口使用,每一位接有上拉电阻和开关。当开关断开时,输入为高电平,读取的结果为1;当开关闭合时,输入为低电平,读取的结果为0。这样8个开关s0~s7的状态可以组成一个8位的二进制输入数。如图4-7所示,s7、s5、s2、s0断开,s6、s4、s3、s1闭合。 开关: S7 S6 S5 S4 S3 S2 S1 S0 状态: 开 闭 开 闭 闭 开 闭 开 输入值:1 0 1 0 0 1 0 1 所以,输入的二进制数为0xa5。
PD口作为输出口使用,每一位与VCC之间接有一个限流电阻和一个发光二级管。当PD口的某位输出1时,引脚为高电平,发光管不亮;当PD口的某位输出0时,引脚为低电平,发光管点亮。如果输出二进制数10100101,结果如下: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。现要求输入变化时,输出显示输入的结果,则程序如下:例如:8个灯从高位到低位的状态为灭灭亮亮亮灭灭灭,则二进制数为11000111。现要求输入变化时,输出显示输入的结果,则程序如下: #include <mega16.h> void main( ) {DDRC= 0x00 ; PORTC=0x00 ; DDRD= 0xff ; while(1) PORTD=PINC ; }
位检测与位控制 • 位变量 • 位检测 • 位控制 • 位运算 • 位测试
位变量 在CVAVR中可以直接定义位变量为全局变量,例如: bit on; 也可以在定义时赋值: bit on=1, off=0;
位检测 位检测具有位读取的含义,根据C语言中赋值语句的含义,等号右边的为读取值。所以等号右边出现位变量,就是对位的检测。如果要检测某个输入引脚的状态,可以在赋值语句的右边使用接口输入变量的位操作符。 例如读取C口的第0位到位变量weib1,可以编程如下: bit weib1; weib1=PINC.0;
位控制 位控制具有把一个位变量输出到某个引脚的含义。所以位控制时,赋值语句的左边为接口输出变量的位操作符。例如把C口的第0位控制为高电平,可编写程序如下: DDRC=0xff; PORTC.0=1;
位运算 位运算一般有:置1、清0、取反、与、或、非、异或等运算。 置1:位变量=1; 清0:位变量=0; 取反:位变量=!位变量 与运算:位变量3=位变量1&位变量2 或运算:位变量3=位变量1|位变量2 异或运算:位变量3=位变量1^位变量2 非运算:位变量2=!位变量1
位测试 在很多应用中需要知道一个变量的状态。例如某一运算为:如果字符变量AA 的第二位为0时,变量BB清0;AA的第二位为1时,BB加10。这个运算要测试 变量AA的第二位。“按位与”运算规则,某位与1“与”,本位不变,与0“与”,本位变0。所以使测试位不变,其它位变0。如果被测试位是0,则整个运算结果是0;如被测试位为1,则整个结果为非0。通过判断结果是否为非0,就能测试需要的位。对上例可以用下面的程序实现: if(AA&0b00000100) BB=BB+10;else BB=0;
位操作应用实例 • 例4-3按键处理 • 例4-4加减计数 • 例4-5方波输出
例4-3按键处理 如图4-7所示的电路图,PC3口的按键每按一次,PD3口的发光管的状态改变一次。 图4-7 键控指示灯电路
按键不按下时,PC3为高电平;按下时,为低电平。闭合与断开的瞬间伴有一连串的抖动,抖动时间一般为5~10ms。按键不按下时,PC3为高电平;按下时,为低电平。闭合与断开的瞬间伴有一连串的抖动,抖动时间一般为5~10ms。
按键抖动影响的消除:每隔20ms检测一次按键的状态。按键抖动影响的消除:每隔20ms检测一次按键的状态。 • 检查是否按了一次键,可以检查高电平到低电平的变化,或低电平到高电平的变化。
下列程序段实现[例4-3]的功能。 bit j ; main() { DDRD=0xff; DDRC=0x00; j=PINC.3; while(1) {j=PINC.3; delay_ms(20); if((PINC.3==0) &&(j==1))} PORTD.3=! PORTD.3; }
例4-4加减计数 如图4-9所示的电路图,PD口的8个发光管显示一个8位的二进制数,j04按键每按一次,PD口显示的二进制数加1,j05按键每按一次,PD口显示的二进制数减1。 图4-9 键控计数电路
下列程序段实现[例4-4]的功能。 #include <mega16.h> #include <delay.h> bit p1,p2; void main( ) { PORTC=0xfe ; DDRC=0x0f ; PORTD=0xff ; DDRD=0xff ; while(1) {p1= PINC.4; p2= PINC.5; delay_ms(20); if( (PINC.4==0)&&(p1==1)) PORTD--; if( (PINC.5==0)&&(p2==1)) PORTD++; }; }
例4-5方波输出 如图4-10所示的电路图,由PD口的第五位输出方波,方波的高电平时间和低电平时间是相等的,如果高电平时间为Xms,则方波周期为2Xms,方波频率为P=1000/(2X)=500/X。 图4-10 方波信号发生电路及输出波形
下列程序段实现[例4-5]的功能。 #include <mega16.h> #include <delay.h> void main( ) { int x; DDRD=0xff ; x=500; while(1) { PORTD.5=1; delay_ms(x); PORTD.5=0; delay_ms(x);} } } 改变x的值,能改变方波的频率。