單片機 C51 & A51 編程要點(diǎn)總結
C51:
本文引用地址:http://dyxdggzs.com/article/201609/310576.htm1、頭文件:#include (我用的是 STC 89C54RD+)
2、預定義:sbit LED = P1^0 // 定義 P1 口的 0 位為 LED
注:“P1^0”這個(gè)寫(xiě)法,與 A51 不同(A51 是 P1.0),P1 是一組端口,端口號范圍 0~7
注2:sbit 用于定義 SFR(特殊功能寄存器)的位變量,上例中 LED 作為“全局變量”進(jìn)行定義
注3:以下寫(xiě)法是錯誤的:
sbit code table[ ] = {P1^0, P1^1, P1^2, P1^3}; // 想用 table[i] 指定不同的引腳,但這么做會(huì )報錯
sbit table[ ] = {P1^0, P1^1, P1^2, P1^3};
// 考慮到上面可能是 code 關(guān)鍵字使用錯誤,使用標準 C 數組寫(xiě)法,但這同樣是錯的
3、主函數寫(xiě)法:void main (void)
4、數值的表示:P1 = 1111 1111 // 二進(jìn)制
P1 = 0xff 或者 P1 = 0xFF // 十六進(jìn)制,0x 開(kāi)頭,且數值不分大小寫(xiě)
P1 = 255 // 十進(jìn)制
5、定義小數值時(shí),可以使用 unsigned char i,這樣 i 的范圍為 0~255,作為循環(huán)變量比較好用
6、左右移位:P1 <<= 2 等價(jià)于 P1 = P1 << 2 // P1 左移 2 位,左移一位相當于乘以 2
P1 >>= 3 等價(jià)于 P1 = P1 >> 3 // P1 右移 3 位,右移一位相當于除以 2
注:左右移位默認為“邏輯移位”,即無(wú)論左移還是右移,空位都補 0
7、按位與或:P1 = P1 & 0x01
P1 = P1 | 0x01
8、定義 ROM 表格(就是數據為常量的數組):
unsigned char code table[ ] = {0xff, 0xff, 0xff, 0xff};
使用:P1 = table[i]
注:table[ ] 定義為“全局變量”,上例中 i 的范圍為 0~3
注2:code 定義的常量存于“代碼區”,即 ROM 區,可以節省 RAM 空間
9、在使用數碼管編程時(shí),假如你正在使用 temp[i] 代表某一個(gè)顯示字符,突然想顯示小數點(diǎn),可以使用 temp[i] | 0x80,通過(guò)“或”運算實(shí)現加上小數點(diǎn)……
10、如果你用 Keil C51 進(jìn)行編譯,記住一點(diǎn):它不區分大小寫(xiě)!!!臥槽,今天編程序那個(gè)調錯啊,就因為一個(gè)數組名和一個(gè)變量名完全一樣,只是大小寫(xiě)不一樣罷了,標準 C 我怎么記得這樣可以啊……上網(wǎng)一查,臥槽,Keil C51 不區分大小寫(xiě),準確的說(shuō)是“連接的時(shí)候不區分大小寫(xiě)”,更準確一點(diǎn)就是“具有外部連接的變量區分大小寫(xiě),內部連接 static 區分大小寫(xiě)”……至少 Keil uVision2 是這樣,不知道別的版本是不是,待驗證……
11、沒(méi)有 unsigned float x !float 型變量從來(lái)沒(méi)有前邊加 unsigned 的語(yǔ)法!
12、Keil 編譯的程序,main 函數執行完不會(huì )停止,會(huì )循環(huán)執行 main 函數,何解?
結論 1:如果主程序中沒(méi)有 while(1) 這個(gè)無(wú)限循環(huán),程序走到最后會(huì )再次從頭開(kāi)始執行。
結論 2:如果主程序有 while(1) 這個(gè)無(wú)限循環(huán),程序走到最后會(huì )一直在這個(gè)死循環(huán)中運行,不會(huì )出現再從頭執行的情況。
這應該屬于 Keil 編譯器的 bug,有網(wǎng)友做過(guò)實(shí)驗,表示 Keil 編譯后期產(chǎn)生的匯編代碼中,結尾有一條 LJMP main,意思就是跳到 main 函數重復執行……還有一種說(shuō)法是 PC 指針溢出,溢出后的地址指向開(kāi)頭,造成繼續執行的效果……(博主覺(jué)得還是 Keil 的問(wèn)題,要是 Keil 編譯器不產(chǎn)生 LJMP main 這種語(yǔ)句,也不會(huì )產(chǎn)生循環(huán)效應……)
不管怎么說(shuō),在程序結尾加上 while(1) 能夠解決循環(huán)執行 main 函數的 bug……
評論