1.单片机内部资源

大家看到下面这张图片应该不算陌生了

寄存器1

可是如果我们看到的是这张的话就会觉得陌生

寄存器2

像我们所熟知的P0,P1,P2,P3,包括上图的TCON以及“#include<reg52.h>”头文件中的IE,SCON等等都叫做寄存器。这些寄存器我们粗浅的认为就是一个8位的变量,其中像P0^0这个最低位就是控制单片机的外部IO端口输出高低电平。

而像TOCN^1(也就是IE0)这些有什么作用呢?

后面我们就要开始学习单片机内部的资源了。


2.IE0的作用

大家还记得原理图的P3端口标出的这些吗

P3端口图

而P3寄存器的每一位都在“#include<reg52.h>”头文件中声明好了(本篇开头的第一张图那里)。

我们先拿P3.2来说,如果这个IO端口被外部电路拉低,那么TCON的第1位(也就是TOCN^1)就会被置1,在程序中IE0变为1。

这样吧,我们用一根杜邦线的一头插入P3.2的引脚,然后另一头插入如下图所示GND的地方

GND


接着把下面的代码下载进开发板看看有什么现象

#include <reg52.h> 
#include <function.h>//详见第六章第8讲

//请提前将P3.2和GND用杜邦线连接起来
void main()
{  
    LED_Init();//初始化LED硬件模块
    
    while(1)
    {   
        if(IE0==0)
        {
            LED2=!LED2;  
            delay_ms(50);
            LED2=1;  //如果IE0不等于0了,要保证熄灭LED2
        }    
        if(IE0==1)
        {
            LED9=!LED9;  
            delay_ms(50);
            LED9=1;  //如果IE0不等于1了,要保证熄灭LED9
        }    
        delay_ms(50);//总要执行 “if(IE0==0)”或者“if(IE0==1)”,这个延时是保持其中一盏灯灭的时间,保证了总有灯闪烁的现象    
    }
}

我们看到LED9在不停闪烁,此时拔了连接GND那头的杜邦线看到LED9熄灭,LED2不停闪烁,连着拔插几次观察现象就可以得出,当P3.2遇到低电平的时候IE0会一直等于1,只有P3.2为高电平时IE0才会等于0。


3.IT0的作用

再看到TCON^0(也就是IT0),我们把上面的代码中的“IE0”改为“IT0”测试IT0的初始值是多少。

经测试,IT0初始值为0。

若是我们在主函数开头赋值给IT0为1,那么IE0只有当P3.2从高电平变成低电平(俗称下降沿)就会被置1,即使P3.2后面变成高电平 IE0也不会变为0,一直是1。

P3.2电平高低变化图

这时需要我们在程序里让IE0清零(俗称软件清零)才行。

我们把下面的代码下载进去

#include <reg52.h> 
#include <function.h> //详见第六章第8讲

void main()
{  
    IT0 = 1;
    LED_Init();   //初始化LED硬件模块 
    
    while(1)
    { 
        if(IE0==1)//只有当P3.2从高电平变成低电平这个瞬间(下降沿)IE0才会被置1,后面P3.2不管是一直保持高电平还是低电平,IE0被清0之后都不会再次被置1,只有P3.2再次产生下降沿才会被置1
        {  
            IE0=0;
            LED2=!LED2;  
        }     
        delay_ms(50);
    }   
}

即使杜邦线一直都插着GND端口,也就是P3.2都保持着低电平,LED2也不会闪烁,只有不断拔插杜邦线,LED2才会有亮灭的跳变。

所以当IT0等于1时,P3.2遇到下降沿IE0就会被置1,我们软件把这个位清0之后,如果P3.2没有再次遇到下降沿,IE0都不会被置1。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)