單片機 C51 編程要點(diǎn)總結

發(fā)布時(shí)間:2017-8-29 10:34    發(fā)布者:信盈達李工
關(guān)鍵詞: 單片機
1、頭文件:#include
2、預定義:sbit LED = P1^0  // 定義 P1 口的 0 位為 LED  

注:“P1^0”這個(gè)寫(xiě)法,與 A51 不同(A51 P1.0),P1 是一組端口,端口號范圍 0~7

2sbit 用于定義 SFR(特殊功能寄存器)的位變量,上例中 LED 作為全局變量進(jìn)行定義

3:以下寫(xiě)法是錯誤的:

sbit code table[ ] = {P1^0, P1^1, P1^2, P1^3};  // 想用 table指定不同的引腳,但這么做會(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
注:table[ ] 定義為全局變量,上例中 i 的范圍為 0~3
2code 定義的常量存于代碼區,即 ROM 區,可以節省 RAM 空間
9、在使用數碼管編程時(shí),假如你正在使用 temp代表某一個(gè)顯示字符,突然想顯示小數點(diǎn),可以使用 temp | 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……
本文地址:http://selenalain.com/thread-516333-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)在線(xiàn)工具

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页