1.單片機內(nèi)部資源
大家看到下面這張圖片應該不算陌生了
可是如果我們看到的是這張的話就會覺得陌生
像我們所熟知的P0,P1,P2,P3,包括上圖的TCON以及“#include<reg52.h>”頭文件中的IE,SCON等等都叫做寄存器。這些寄存器我們粗淺的認為就是一個8位的變量,其中像P0^0這個最低位就是控制單片機的外部IO端口輸出高低電平。
而像TOCN^1(也就是IE0)這些有什么作用呢?
后面我們就要開始學習單片機內(nèi)部的資源了。
2.IE0的作用
大家還記得原理圖的P3端口標出的這些嗎
而P3寄存器的每一位都在“#include<reg52.h>”頭文件中聲明好了(本篇開頭的第一張圖那里)。
我們先拿P3.2來說,如果這個IO端口被外部電路拉低,那么TCON的第1位(也就是TOCN^1)就會被置1,在程序中IE0變?yōu)?。
這樣吧,我們用一根杜邦線的一頭插入P3.2的引腳,然后另一頭插入如下圖所示GND的地方
接著把下面的代碼下載進開發(fā)板看看有什么現(xiàn)象
#include <reg52.h> #include <function.h>//詳見第六章第8講 //請?zhí)崆皩3.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);//總要執(zhí)行 “if(IE0==0)”或者“if(IE0==1)”,這個延時是保持其中一盞燈滅的時間,保證了總有燈閃爍的現(xiàn)象 } }
我們看到LED9在不停閃爍,此時拔了連接GND那頭的杜邦線看到LED9熄滅,LED2不停閃爍,連著拔插幾次觀察現(xiàn)象就可以得出,當P3.2遇到低電平的時候IE0會一直等于1,只有P3.2為高電平時IE0才會等于0。
3.IT0的作用
再看到TCON^0(也就是IT0),我們把上面的代碼中的“IE0”改為“IT0”測試IT0的初始值是多少。
經(jīng)測試,IT0初始值為0。
若是我們在主函數(shù)開頭賦值給IT0為1,那么IE0只有當P3.2從高電平變成低電平(俗稱下降沿)就會被置1,即使P3.2后面變成高電平 IE0也不會變?yōu)?,一直是1。
這時需要我們在程序里讓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再次產(chǎn)生下降沿才會被置1 { IE0=0; LED2=!LED2; } delay_ms(50); } }
即使杜邦線一直都插著GND端口,也就是P3.2都保持著低電平,LED2也不會閃爍,只有不斷拔插杜邦線,LED2才會有亮滅的跳變。
所以當IT0等于1時,P3.2遇到下降沿IE0就會被置1,我們軟件把這個位清0之后,如果P3.2沒有再次遇到下降沿,IE0都不會被置1。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程