使用单片机时肯定会用到单片机的IO引脚。以51单片机P1口为例。内部结构如图所示
当单片机进行写操作时,引脚锁存器(D触发器)CLK端接收有效电平,然后内部总线上需要写的数据就会通过D触发器传输到Q'。当写1时Q'为0,使MOSFET截止,因此外部引脚电平为1.当写0时Q'为1,MOSFET饱和导通,此时引脚可以看成接地,所以引脚为0。
如果对单片机IO口进行读操作。由图可以看出读操作包括读寄存器和读引脚。以前知道有这两种区别,但是从来没仔细区分过。从图中可以看出读寄存器时读寄存器上的三态缓冲器打开,Q端的值直接传到了内部总线上,而下面的读引脚三台缓冲器是高阻态,读引脚时则相反。
汇编语言中对读寄存器和读引脚做了一定的区别,但说实话我在看汇编代码时还是区分不清两者的区别。现在大家对单片机编程应该大部分采用的都是C语言,在我看来,C语言中已经极大的淡化了读寄存器还是读引脚的区别。
有些人说a=P1是读引脚(a是某个字符变量),P1=P1|0x00是读寄存器(可能是认为这里P1进行了一次逻辑运算,只有寄存器中的值才能进行逻辑运算),但我在用C语言时感觉用P1=P1|0x00也是读的引脚。也有些人说看经过编译器编译后的汇编代码才能分辩出两者的区别,不知道这里大家怎么看读引脚和读寄存器?
在读引脚时需要先向引脚锁存器中写1。因为如果引脚寄存器中是0的话会导通MOSFET,使外部端口一直是低电平,即使外面接的是高电平在读引脚的时候也读的是0。以前知道需要这样做,但读引脚的时候一直没写过1,发现读的也对,现在我觉得这样写不符合规范。
一般来说单片机在上电复位后默认引脚寄存器的值是1,这样一来关断了MOSFET,而我们在使用单片机的时候如果这个引脚作为输入,也不会让它变成一会儿输出一会儿输入,使得能够准确的读出外部端口的值。现在我在写程序时如果端口做为输入引脚,我会在初始化里对其写一次1。当然,以后就不用写了,因为写了一次1后没有其他的写操作,引脚锁存器中会一直保持这个值不变。当然,如果某个单片机引脚同时作为输出和输入引脚复用时,则必须在输出完成后变成输入前先向其写1,再读引脚的值。
关键字:单片机 引脚读写
引用地址:
单片机引脚读写操作
推荐阅读最新更新时间:2024-03-16 13:56
使用32位MCU解决RFID智能标签/智能卡系统设计难题
无线射频识别 (RFID) 将成为第一种与条码技术并存并最终将在低成本识别和个人数据存储领域取代条码技术的新兴技术。 与条码技术相比,它具有多种优势,包括: 1.) 可以存储更多数据,2.) 可以在标签中集成一定智能,3.) 可以在一定距离外扫描,以及 4.) 可以减少人为干预。 所有这一切皆因MCU 的使用而成为可能。
EPC 技术对智能标签的影响
在消费层的部署中,下一代标签系统必须发展一种新的复杂级别,以应对新应用和全球互操作性所带来的复杂性。
就像统一产品编码 (UPC) 是条码技术的基本标识一样,一个名为 EPCglobal 的企业联盟也为 RFID 创建了电子产品编码 (EPC)。 EPC 代码为 64
[单片机]
[单片机][at32][填坑日记] [USB卡包] usb快速发包导致卡包
发送频率过快,导致pc或mcu未能及时应答每一包,造成缓存区遗留上一次数据。 usb频发拔插枚举,导致pc/mcu数据丢失,①mcu丢失数据,每次发送都只能发送上次内容。②pc丢失数据,每次接收只会处理上次内容。 重启电脑过程中,mcu频繁发送usb数据,导致pc端丢失应答数据,PC端卡包(缺一包应答),只能处理上次数据, 现象:按键数据一直发送,且无释放按键数据。 解决方案如下: 1. usb_dcd_int.c -- USB_device_handle_UsbReset_intsts() /** * @brief USB_device_handle_UsbReset_intsts * This interr
[单片机]
基于的单片机虚拟开发环境
单片机是国内大专院校电子技术类专业的必修课程之一,很多学生毕业之后也在从事单片机的软硬件设计工作。单片机的开发要求设计人员具有一定的硬件设计基础和汇编或者C语言的编程能力,目前国内多数大专院校都是采取先教学后实验的教学步骤,学生在学习的过程中缺少一个感性认识,在实验时又无法与课本上的知识联系起来,因此造成了时间与教学资源的双重浪费。 l Proteus的引入 伴随着计算机软件和硬件技术的飞速发展,在各个领域都出现了各种仿真系统,为各种实际系统的开发提供了准确可靠的保证,同时节约了大量的人力和物力。仿真技术的出现与发展是科技发展的必然结果,是现代科技的关键技术之一,并逐渐成为科技人员的必备技术。Proteus是在这种形势下应运
[单片机]
80C51单片机的定时器/计数器的作用与结构
80C51单片机内部设有两个16位的可编程 定时器 / 计数器 。可编程的意思是指其功能(如工作方式、定时时间、量程、启动方式等)均可由指令来确定和改变。在定时器/计数器中除了有两个16位的计数器之外,还有两个特殊功能寄存器(控制寄存器和方式寄存器)。 定时器/计数器的结构: 图片1 从上面定时器/计数器的结构图中我们可以看出,16位的定时/计数器分别由两个8位专用寄存器组成,即:T0由TH0和TL0构成;T1由TH1和TL1构成。其访问地址依次为8AH-8DH。每个寄存器均可单独访问。这些寄存器是用于存放定时或计数初值的。此外,其内部还有一个8位的定时器方式寄存器TMOD和一个8位的定时控制寄存器TCON。这
[单片机]
学习笔记 从零开始学单片机(8) 蜂鸣器唱歌
单片机上的蜂鸣器结构非常的简单 只要给一个0,它就会“叫”。让它唱歌的原理很简单,声音大小是固定的,让它的频率变化,就能让它发出不同的音符。 代码中在软件循环延时过程中,依次给它一个固定频率的方波,让它唱起来。 //晶振11.0592 #include reg51.h sbit speaker=P2^3; unsigned char byteTH0,byteT0L,duration; // 小星星句子,三个一组,第一个表示音符,第二个表示音阶,第三个表示延时长度(单位约等于0.1s) code unsigned char music ={ 1,2,2, 1,2,2, 5,2,2, 5,2,
[单片机]
AVR单片机按键检测
程序代码如下: #include avr/io.h #include util/delay.h int main(void) { DDRA=0XFF; PORTA=0XFF; DDRD=0X00; PORTD=0XFF; while(1) { if(PIND==0XFE) { _delay_ms(100); if(PIND==0XFE)PORTA=~PORTA; } } }
[单片机]
单片机C51串口中断接收和发送测试例程(含通信协议的实现)
通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。 测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。 //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include #include #define INBUF_LEN 4 //数据长度 unsigned char inbuf1
[单片机]
8051单片机供水系统水位控制的硬件电路设计
供水系统水位控制原理 下图是水塔水位控制原理图。图中虚线表示允许水位变化的上下限。在正常情况下,应保持水位在虚线范围之内,为此,在水塔的不同高度安装固定不动的三根金属棒,以感知水位变化情况。其中A棒处于下限水位以下,C棒处于上限水位,B棒在下限水位处。A棒接+5V电源,B棒、C棒各通过一个电阻与模拟地相连。 水塔由电机带动水泵供水,单片机控制电机转动以达到对水位控制的目的。供水时,水位上升,当达到上限时,由于水的导电作用,B棒、C棒连通+5V电源,因此,b、c两端均为高电平“1”状态。这时,应停止电机和水泵的工作,不再给水塔供水。 当水位降到下限时,B棒、C棒都不能与A棒导通,因此,b、c两端均为“0”状态。这时,应启动电机,
[单片机]