標(biāo)題: 關(guān)于51單片機(jī)的IO位定義 [打印本頁]

作者: WANG....    時間: 2017-10-22 13:13
標(biāo)題: 關(guān)于51單片機(jī)的IO位定義
各位大佬小弟有個地方不明白能不能幫忙解釋一下;
為什么51單片機(jī)的IO在用的時候要進(jìn)行位定義,進(jìn)行sbit;
不然就會出錯;而直接用哪個口就不會。
比如:我用P0口就不會;
用P0^0;就會出錯;必須進(jìn)行宏定義或者位操作才不會

作者: 蘆葦劫    時間: 2017-10-22 14:30
不用位定義,異或結(jié)果為一個字節(jié),如果位定義,編譯匯編后使用setb,clr操作位。 所以你現(xiàn)在不用位定義,使用p1異或某一位時,是字節(jié)運算,把p1的其它位屏蔽掉,否則取反沒什么 意義。
作者: xfliu    時間: 2017-10-22 17:25
編譯器編譯規(guī)則的問題吧
作者: HC6800-ES-V2.0    時間: 2017-10-23 09:03
其實,這個問題出在REG51.H頭文件上。
你查看一下這個頭文件就知道,它里面定義了P0、P1、P2、P3,而沒有定義位,所以,你的程序在開始時,就要進(jìn)行位定義sbit,而不用對口進(jìn)行定義。
如果你在頭文件中,加上I/O口位的定義,程序里也是可以不定義就直接使用的。
像STC15的頭文件,就定義了位的,可以不再定義而直接使用。
好好理解一下頭文件的作用吧。
作者: yzwzfyz    時間: 2017-10-23 13:50
其實,每一個都是要定義的,否則編譯系統(tǒng)不認(rèn)識它,包括P0也不認(rèn)識。
只是有些定義被“隱藏”了,你不知道而矣,這其中就有P0。
這個隱藏的場所,常常在:INCLUDE XXXX.H中,不信你打開XXXX.H看看,里面有沒有對P0的定義。
作者: xbook_ben    時間: 2017-10-24 17:21
看看頭文件就明白了,在頭文件里,明確的將P0映射到對應(yīng)的寄存器地址上,P0就變成一個代號,也就是說,P0已經(jīng)登記在冊,只要我們在文件中使用它,編譯器知道它指的是什么東西。而P0^0在其他的地方并沒有出現(xiàn)過,要使用當(dāng)然要自己先聲明或者定義了(注意:P0^0是在異或運算)。

作者: lcmmain    時間: 2017-10-24 22:11
位綁定是位,sbit
作者: wskjinfen    時間: 2017-10-25 12:15
頭文件沒加載或者有問題reg51.h
作者: jden    時間: 2017-10-25 14:02
sfr P0    = 0x80; sfr P1    = 0x90; sfr P2    = 0xA0; sfr P3    = 0xB0;
作者: jden    時間: 2017-10-25 14:05
sfr P0    = 0x80; sfr P1    = 0x90; sfr P2    = 0xA0; sfr P3    = 0xB0;這是reg52.h頭文件中的定義,之所以你用P0口不會報錯,就是因為頭文件中已經(jīng)有定義,但是沒有P0^0之類的定義,所以就錯誤,總之,定義一下是沒錯的,即使只是為了增加程序可讀性,對吧!!
作者: ChunyuY19    時間: 2017-10-25 19:39
P0 P1也是定義過的 在reg52.h里看下
作者: 569103160    時間: 2023-4-26 08:19
重復(fù)定義了 頭文件里面有  就直接用P00......Pxx
作者: mtt661    時間: 2023-4-26 16:28
在REGX52.H中每個針腳都定義了,用的是P0_0,不是P0^0,直接用P0_0就可以。
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
作者: Hephaestus    時間: 2023-4-26 21:01
因為在c語言里面P0^0是P0異或0的意思。

C51為了擴(kuò)展c語言讓其能更好的支持51單片機(jī),借用了異或運算符^,但是同時規(guī)定必須與sbit配合服用才表示位定義,這樣才不會跟基本c語言語法發(fā)生沖突。
作者: jning    時間: 2023-4-27 09:21
在頭文件里,明確的將P0映射到對應(yīng)的寄存器地址上,P0就變成一個代號,也就是說,P0已經(jīng)登記在冊,只要我們在文件中使用它,編譯器知道它指的是什么東西。
作者: wufa1986    時間: 2023-4-27 10:01
這是編譯器的限制和規(guī)則,沒必要深究STC的頭文件有定義可以直接P00
作者: coody_sz    時間: 2023-4-27 10:01
樓主,你將頭文件去掉,你會發(fā)現(xiàn)連P0都認(rèn)不得。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1