【51單片機】學(xué)習(xí)總結(jié)

打開了兩個文件,可以看到有個文件是帶星號且有個紅叉的,有個紅叉說明它為當(dāng)前打開的文件,也就是正在編輯的文件。當(dāng)按下Ctrl+S時只保存了當(dāng)前文件。另一個文件沒有保存,當(dāng)你的電腦意外斷電或死機時,如果你在那之前按了Ctrl+S那么可以挽回點損失,可是另一個文件的信息可能就丟失了。所以推薦按F7(對所以文件進行編譯,并且保存),這樣就可以在編譯的同時將所以文件保存一次。所以在真正做工程的時候就要學(xué)會定期按F7,不是說一定要程序編寫完整后才按F7。
2.

在C51選項中的Include Paths 選項中要設(shè)置頭文件的路徑后方能打開頭文件,對頭文件進行編譯!
3.
4.
5.
6.
7.
9.

10.
11.main函數(shù)的標(biāo)準(zhǔn)寫法為:
int main(void)
{
return 0;
}
12.
13.
14.

串口調(diào)試助手一般選擇“字符格式顯示”。如果想顯示數(shù)字則寫入語句UART_send_byte(‘8’) ,要注意顯示數(shù)字時只能顯示一位即0~9;想顯示字母時可寫入語句UART_send_byte(‘A’)。注意別掉了‘’尤其是寫數(shù)字時。寫字母丟失的話還會報錯。寫數(shù)字丟失的話就不會報錯。此時顯示的是數(shù)字相應(yīng)的ASII碼。
15.
16.
17.
在數(shù)據(jù)類型定義完畢后不能通過table [11] = “how are you”;來改變數(shù)組里面的元素,這樣做在keil 下會有警告!但不報錯,實際是不正確的。那么要改變數(shù)組的元素只能通過對里面元素逐個賦值。
18.
19.
bit i2c_read_buf(uint8 *buf, uint8 addr, uint8 len)
{
}
在主函數(shù)中可以直接寫為bit i2c_read_buf(&a, b, c); 也可以寫為 y = bit i2c_read_buf(&a, b, c),將函數(shù)的返回值給了y。
20.
21.

22.

(1)結(jié)果為:44
是否就說明結(jié)構(gòu)體指針 p 指向了整個 int a 呢?
(可以從第一個字節(jié)地址開始逐個指向下一個字節(jié)地址直到第4個為止)
(2)接著把tmp={44}該為tmp={127};
結(jié)果為:127
依然正確
(3)繼續(xù)改為tem={128};
結(jié)果為:-128
顯然不是我們想要的,倘若 p 指向了整個 int a,那么結(jié)果應(yīng)該為 128 才對,顯然*p 只是指向int a的第一個地址。不會自動指向下一地址繼續(xù)將剩下的3個字節(jié)讀完,只有將剩下的三個字節(jié)讀完才能讀取一個完整的INT型數(shù)據(jù)。以上是在指針為char 類型的時候。(4)承接上面的,繼續(xù)把char *p 改為 int *p
結(jié)果為 128
正常了。為什么?因為char類型指針一次只能放一個地址(一個字節(jié)一個地址),
而int *p 一次能放4個地址,所以此時 p 可以一次指向4個int a 的四個地址
23.
24.
那么 p 指向了一個地址(table的首地址),至于可以指向幾個地址這個由指針的類型決定。現(xiàn)在指針類型為char而char占一個字節(jié)只能放一個地址,所以 p 一次只能指向一個地址,所以 *p != 111,因為*p只讀取了111的第一個地址的數(shù)據(jù),還有三個地址的數(shù)據(jù)沒讀。注意此時 p+1不指向table[1]這個元素的首地址。而是指向第一個元素的第二個地址??梢宰鲆幌赂纳苼硪淮巫x取4個地址,即讓指針一次指向int類型數(shù)據(jù)的4個地址。
把 char *p改成 int *p,這樣就可以一次指向四個地址了。則 *p = 111, *(p+1) = 232;注意括號一定要帶上,不然結(jié)果是 112.
可以得出結(jié)論。p不是指向一個地址,指向幾個地址由p 的數(shù)據(jù)類型決定。p + 1不是代表下一個地址。如 int *p,則p+1代表下一段連續(xù)的4個地址??梢岳斫鉃?p+1指向了4個連續(xù)的地址。在進行*(p+1)運算后將4個地址的數(shù)據(jù)連續(xù)讀取出來,合成了一個完整的int類型的數(shù)據(jù)。
25.
26.
分別寫成第一個數(shù)字或字母所對應(yīng)的二進制數(shù)即可。至于二進制到16進制的轉(zhuǎn)化也是如此,倒過來就是了。反正記著,4位二進制數(shù)對應(yīng)一位十六進制數(shù)。
27.
28.
29.
30.
&a+1等價于(&a)+1.不能出現(xiàn)&(a+1)的情況,系統(tǒng)不認同,會報錯!
31.
32.

這種命名方法在KEIL下會報錯,然而在VC++下卻沒問題。當(dāng)你把code改成其他字母(不要與原來的code一樣就行),你會發(fā)現(xiàn)都沒問題??梢钥闯霾⒉皇敲拇笮懗鰡栴}。原因是KEIL不認同以結(jié)構(gòu)體小寫字母來命名(這里是指全小寫),當(dāng)你把其中一個字母該為大寫時就沒問題了。如把最后一行改成 CODE Code 讓變量名的第一個字母為大寫就行了。
33.
34.
35. 定時器1工作在模式1時的溢出是指在TH1=255(0xFF),TL1 =0的情況下,TL1達到255再 +1 就溢出了,此時溢出標(biāo)志位TF1=1,需要清零才能讓定時器繼續(xù)工作。否則不定時,而是處于等待狀態(tài),等待TF1=0,然后才開始定時。要弄清什么時候才會溢出!
還有就是TL1每加1表示已經(jīng)定時一個機器周期,在12T/11.0592MHz的單片機中機器周期為12/11059200 s 大約為1us.也就是說TL1每加1表示已經(jīng)定時1us 。而TH1加1就表示已經(jīng)經(jīng)歷了256個機器周期。這里說的+1并不會使定時器溢出,只有TH1達到255了那么接下來的256個機器周期后就會溢出了!
還有就是TL1每加1表示已經(jīng)定時一個機器周期,在12T/11.0592MHz的單片機中機器周期為12/11059200 s 大約為1us.也就是說TL1每加1表示已經(jīng)定時1us 。而TH1加1就表示已經(jīng)經(jīng)歷了256個機器周期。這里說的+1并不會使定時器溢出,只有TH1達到255了那么接下來的256個機器周期后就會溢出了!
評論