当前位置:首页 > 51单片机IO特点
数字IC输入电流小,可以直接和单片机相接,而输出电流又相对大一些,所以在单片机电路中,经常见到用74HC04、74HC573(74HC373)、74HC245(74HC244)等数字IC作为功率驱动,来提高单片机的带负载能力。
74HC245是总线收发器,典型的CMOS三态度缓冲门。
从74HC245的功能图中,我们可以得到芯片的使用方法。19引脚OE引脚为使能引脚,当OE为高电平,An和Bn都呈现高阻态,OE为低电平,芯片处于工作状态。1引脚DIR为方向控制端,DIR高电平,Bn为输入端,数据从Bn到An,DIR为低电平,则An为输入端,数据从An到Bn。
从datasheet上我们还可以到芯片的驱动电压、拉电流、灌电流、总电流和功耗能参数, 74HC245单个IO的拉电流和灌电流最大值为35mA,总电流为70mA。
利用移位实现流水灯的程序
C语言中的位运算在单片机C程序中显得格外重要,程序中到处可见位运算,我们先了解一下C的位运算的特点。
C51提供了几种位操作符,如下表所示:
运算符 & | ^ 1、“按位与”运算符(&)
含义 按位与 按位或 按位异或 运算符 ~ << >> 含义 取反 左移 右移 参加运算的两个数据,按二进位进行“与”运算。原则是全1为1,有0为0,即:0&0=0; 0&1=0;1&0=0;1&1=1。如下例:a=5&3,即a=(0b 0101) & (0b 0011) =0b 0001 在实际的应用中被用于实现特定的功能:
2、“按位或”运算符(|)
参与或操作的两个位,只要有一个为1,则结果为1。有1为1,全0为0。 即:0|0=0; 0|1=1; 1|0=1; 1|1=1;例如:a=0x30|0x0f; //a=(0b00110000)|(0b00001111)=(0b00111111)=0x3f。
“按位或”运算最普遍的应用就是对一个变量的某些位置‘1’。如下例:a=0x00; //a=0b 00000000;a=a|0x7f; //将a的低7位置为1,a=0x7f。 3、“异或”运算符(^)
异或运算符^又被称为XOR运算符。当参与运算的两个位相同(‘1’与‘1’或‘0’与‘0’)时结果为‘0’。不同时为‘1’。即相同为0,不同为1。 0^0=0;0^1=1;1^0=1;1^1=0。例如:a=0x55^0x3f; //a=(0b01010101)^(0b00111111)=(0b01101010)=0x6a 4、“取反”运算符(~)
与其它运算符不同,“取反”运算符为单目运算符,即它的操作数只有一个。它的功能就是对操作数按位取反。也就是是‘1’得‘0’,是‘0’得‘1’。如下例:a=0xff; //a=0b11111111 a=~a; //a=0b00000000。 5、左移运算符(<<)
左移运算符用来将一个数的各位全部向左移若干位。如:a=a<<2,表示将a的各位左移2位,右边补0。如a=34(0b00100010),左移2位得0b10001000。 6、右移运算符(>>)
右移与左移相类似,只是位移的方向不同。如:a=a>>2,表示将a的各位向右移动2位,左边补0。如a=34(0b00100010),左移2位得0b10001000。 程序:
移位方式实现流水灯程序
#include
#define uchar unsigned char
#define uint unsigned int void delay_ms(uint xms) //ms级延时函数 {
uint i,j; for(i=0;i void main() { uchar i,temp; while(1) { temp=0x01; //左移 for(i=0;i<8;i++) { P2=~temp; delay_ms(1000); temp=temp<<1; } temp=0x80; for(i=0;i<8;i++) //右移 { P2=~temp; delay_ms(1000); temp=temp>>1; } } } 程序解释: 程序通过移位的方式实现了8位流水灯的左移和右移,读者结合前面讲到的移位,自己来分析程序。另外把延时语句调小,直到1ms的延时,看一下会有什么现象,并分析原因。 取表方式实现流水灯程序 #include while(1) { //左移 for(i=0;i<8;i++) { P2=table[i]; delay_ms(1000); } //右移 for(i=0;i<8;i++) { P2=table[7-i]; delay_ms(1000); } } } 程序解释: (1)取表方式实际上就是建立一个包含了各种状态的数组。相对于移位方式,取表方式要简单、灵活,在后面介绍的数码管、点阵LED中,也会用到取表方式。 (2)数组定义时(uchar code table[ 8]),相比标准C中数组的定义,多了一个关键字“code”,不加关键字“code”,表示把数组中的变量存放到MCU的RAM中,加上关键字“code”,表示把数组中的变量存放到MCU的FLASH中。单片机的FLASH空间远远大于RAM的空间,所以经常把像数组这样一旦烧录就不会再修改的变量放到FLASH中,来节省有限的RAM空间。
共分享92篇相关文档