有關(guān)51單片機(jī)讀端口、讀引腳的問題
80C51單片機(jī)有P0-P3四個(gè)P口,以P0為例說明:
要搞清這個(gè)問題,就要明白p0口的內(nèi)部結(jié)構(gòu)。P0口是由鎖存器經(jīng)兩個(gè)驅(qū)動(dòng)場效應(yīng)管和外部引腳相連的。
讀引腳的意思就是直接讀P0外部引腳的電位,而讀端口(鎖存器)讀的是內(nèi)部與數(shù)據(jù)總線鏈接的鎖存器的電位。
兩者不同。一般來說,讀取P0的數(shù)據(jù),都是讀引腳,目的是獲取與P0相連的外部電路的狀態(tài)。而讀端口是在執(zhí)行下述語句時(shí)由CPU自行完成的:
inc P0;給p0加1
執(zhí)行這個(gè)語句時(shí) ,采用“讀-改-寫”的過程,先讀取p0的端口數(shù)據(jù),再加1,然后送到p0鎖存器里。注意這個(gè)端口數(shù)據(jù)跟p0的引腳狀態(tài)不一樣,比如你事先給p0寫進(jìn)69H,p0里數(shù)據(jù)就是69H,而引腳上的狀態(tài)因?yàn)槟銢]有執(zhí)行MOV A,p0之類的指令,它是不會(huì)進(jìn)到p0的鎖存器里去的。由此可見,所謂的讀端口,不是讀取p0的狀態(tài),而是在執(zhí)行inc之類的指令時(shí)由CPU自行完成的,
讀引腳就是讀取p0口狀態(tài)了。讀引腳時(shí)要注意:先要給p0寫FFH,使它的場效應(yīng)管T2和地?cái)嚅_。
因?yàn)閜0口的場效應(yīng)管T2一端接地,一端與外部引腳相連,由P0的鎖存器控制,當(dāng)給鎖存器寫1時(shí),它和地?cái)嚅_,寫0時(shí)和地相連,所以寫零時(shí)讀到的總是低電平。
試想你現(xiàn)在要讀P0引腳,按理說P0與外部電路相連,外部電路的是什么狀態(tài),就應(yīng)該讀到什么,但如果p0口的場效應(yīng)管T2一端接地的話,它會(huì)把p0口電位拉低,你讀到的總是低電平0,所以要先給p0寫FFH,把p0的場效應(yīng)管T2和地?cái)嚅_,再讀數(shù)時(shí)就是真實(shí)狀態(tài)了。當(dāng)外部電路斷開,再讀時(shí)讀到的就是p0端口(鎖存器)的真實(shí)狀態(tài)了。