版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 51 單片機(jī) C 語(yǔ)言入門(mén)教程 51 單片機(jī) C 語(yǔ)言學(xué)習(xí)雜記 學(xué)習(xí)單片機(jī)實(shí)在不是件易事,一來(lái)要購(gòu)買(mǎi)高價(jià)格的編程器,仿真器,二來(lái)要學(xué)習(xí)編程語(yǔ)言,還有眾多種類(lèi)的單片機(jī)選擇真是件讓人頭痛的事。在眾多單片機(jī)中 51 架構(gòu)的芯片風(fēng)行很久,學(xué)習(xí)資料也相對(duì)很多,是初學(xué)的較好的選擇之一。51 的編程語(yǔ)言常用的有二種,一種是匯編語(yǔ)言,一種是 C 語(yǔ)言。匯編語(yǔ)言的機(jī)器代碼生成效率很高但可讀性卻并不強(qiáng),復(fù)雜一點(diǎn)的程序就更是難讀懂,而 C 語(yǔ)言在大多數(shù)情況下其機(jī)器代碼生成效率和匯編語(yǔ)言相當(dāng),但可讀性和可移植性卻遠(yuǎn)遠(yuǎn)超過(guò)匯編語(yǔ)言,而且 C 語(yǔ)言還可以嵌入?yún)R編來(lái)解決高時(shí)效性的代碼編寫(xiě)問(wèn)題。對(duì)于開(kāi)發(fā)周期來(lái)說(shuō),中大型的軟
2、件編寫(xiě)用 C 語(yǔ)言的開(kāi)發(fā)周期通常要小于匯編語(yǔ)言很多。綜合以上 C 語(yǔ)言的優(yōu)點(diǎn),我在學(xué)習(xí)時(shí)選擇了 C 語(yǔ)言。以后的教程也只是我在學(xué)習(xí)過(guò)程中的一些學(xué)習(xí)筆記和隨筆,在這里加以整理和修改,希望和大家一起分享,一起交流,一起學(xué)習(xí),一起進(jìn)步。 *注:可以肯定的說(shuō)這個(gè)教程只是為初學(xué)或入門(mén)者準(zhǔn)備的,筆者本人也只是菜鳥(niǎo)一只, 有望各位大俠高手指點(diǎn)錯(cuò)誤提出建議。 明 浩 2003-3-30 第一課 建立您的第一個(gè) C 項(xiàng)目 使用 C 語(yǔ)言肯定要使用到 C 編譯器,以便把寫(xiě)好的 C 程序編譯為機(jī)器碼,這樣單片機(jī)才能執(zhí)行編寫(xiě)好的程序。KEIL uVISION2 是眾多單片機(jī)應(yīng)用開(kāi)發(fā)軟件中優(yōu)秀
3、的軟件之一, 它支持眾多不同公司的 MCS51 架構(gòu)的芯片,它集編輯,編譯,仿真等于一體,同時(shí)還支持, PLM,匯編和 C 語(yǔ)言的程序設(shè)計(jì),它的界面和常用的微軟 VC+的界面相似,界面友好,易學(xué)易用,在調(diào)試程序,軟件仿真方面也有很強(qiáng)大的功能。因此很多開(kāi)發(fā) 51 應(yīng)用的工程師或普通的單片機(jī)愛(ài)好者,都對(duì)它十分喜歡。 以上簡(jiǎn)單介紹了 KEIL51 軟件,要使用 KEIL51 軟件,必需先要安裝它。KEIL51 是一個(gè)商業(yè)的軟件,對(duì)于我們這些普通愛(ài)好者可以到 KEIL 中國(guó)周立功公司的網(wǎng)站上下載一份能編譯 2K 的 DEMO 版軟件,基本可以滿足一般的個(gè)人學(xué)習(xí)和小型應(yīng)用的開(kāi)發(fā)。(安裝的方法和普通軟件相
4、當(dāng)這里就不做介紹了) 安裝好后,您是不是迫不及待的想建立自己的第一個(gè) C 程序項(xiàng)目呢?下面就讓我們一起來(lái)建立一個(gè)小程序項(xiàng)目吧?;蛟S您手中還沒(méi)有一塊實(shí)驗(yàn)板,甚至沒(méi)有一塊單片機(jī),不過(guò)沒(méi)有關(guān)系我們可以通過(guò) KEIL 軟件仿真看到程序運(yùn)行的結(jié)果。 首先當(dāng)然是運(yùn)行 KEIL51 軟件。怎么打開(kāi)?噢,天!那您要從頭學(xué)電腦了。呵呵,開(kāi)個(gè)玩笑,這個(gè)問(wèn)題我想讀者們也不會(huì)提的了:P。運(yùn)行幾秒后,出現(xiàn)如圖 11 的屏幕。 圖 11 啟動(dòng)時(shí)的屏幕 - 1 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 接著按下面的步驟建立您的第一個(gè)項(xiàng)目: (1)點(diǎn)擊 Project 菜單,選擇彈出的下拉式菜單中的 New Project,如圖
5、12。接著彈出一個(gè)標(biāo)準(zhǔn) Windows 文件對(duì)話窗口,如圖 13,這個(gè)東東想必大家是見(jiàn)了N 次的了,用法技巧也不是這里要說(shuō)的,以后的章節(jié)中出現(xiàn)類(lèi)似情況將不再說(shuō)明。在“文件名”中輸入您的第一個(gè) C 程序項(xiàng)目名稱,這里我們用“test”,這是筆者慣用的名稱,大家不必照搬就是了, 只要符合 Windows 文件規(guī)則的文件名都行?!氨4妗焙蟮奈募U(kuò)展名為 uv2,這是uVision2 項(xiàng)目文件擴(kuò)展名,以后我們可以直接點(diǎn)擊此文件以打開(kāi)先前做的項(xiàng)目。 KEIL圖 12 New Project 菜單 圖 13 文件窗口 (2) 選擇所要的單片機(jī),這里我們選擇常用的 Ateml 公司的 AT89C51。此時(shí)屏
6、幕如圖14 所示。AT89C51 有什么功能、特點(diǎn)呢?不用急,看圖中右邊有簡(jiǎn)單的介紹,稍后的章節(jié)會(huì)作較詳細(xì)的介紹。完成上面步驟后,我們就可以進(jìn)行程序的編寫(xiě)了。 (3) 首先我們要在項(xiàng)目中創(chuàng)建新的程序文件或加入舊程序文件。如果您沒(méi)有現(xiàn)成的程序,那么就要新建一個(gè)程序文件。在 KEIL 中有一些程序的 Demo,在這里我們還是以一個(gè)C 程序?yàn)槔榻B如何新建一個(gè) C 程序和如何加到您的第一個(gè)項(xiàng)目中吧。點(diǎn)擊圖 15 中 1 的新建文件的快捷按鈕,在 2 中出現(xiàn)一個(gè)新的文字編輯窗口,這個(gè)操作也可以通過(guò)菜單 FileNew 或快捷鍵 Ctrl+N 來(lái)實(shí)現(xiàn)。好了,現(xiàn)在可以編寫(xiě)程序了,光標(biāo)已出現(xiàn)在文本編輯窗口中
7、,等待我們的輸入了。第一程序嘛,寫(xiě)個(gè)簡(jiǎn)單明了的吧。下面是經(jīng)典的一段程序,呵,如 - 2 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 果您看過(guò)別的程序書(shū)也許也有類(lèi)似的程序:#include #include void main(void)SCON = 0x50; /串口方式 1,允許接收TMOD = 0x20; /定時(shí)器 1 定時(shí)方式 2 TCON = 0x40; /設(shè)定時(shí)器 1 開(kāi)始計(jì)數(shù)TH1 = 0xE8; /11.0592MHz 1200 波特率TL1 = 0xE8;TI = 1;TR1 = 1; /啟動(dòng)定時(shí)器 while(1)printf (Hello World!n); /顯示 Hello W
8、orld圖 14 選取芯片- 3 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 圖 15 新建程序文件這段程序的功能是不斷從串口輸出“Hello World!”字符,我們先不管程序的語(yǔ)法和意思吧, 先看看如何把它加入到項(xiàng)目中和如何編譯試運(yùn)行。 (4)點(diǎn)擊圖 15 中的 3 保存新建的程序,也可以用菜單 FileSave 或快捷鍵 Ctrl+S 進(jìn)行保存。因是新文件所以保存時(shí)會(huì)彈出類(lèi)似圖 13 的文件操作窗口,我們把第一個(gè)程序命名為 test1.c,保存在項(xiàng)目所在的目錄中,這時(shí)您會(huì)發(fā)現(xiàn)程序單詞有了不同的顏色,說(shuō)明KEIL 的 C 語(yǔ)法檢查生效了。如圖 16 鼠標(biāo)在屏幕左邊的 Source Group1 文
9、件夾圖標(biāo)上右擊彈出菜單,在這里可以做在項(xiàng)目中增加減少文件等操作。我們選“Add File to Group Source Group 1”彈出文件窗口,選擇剛剛保存的文件,按 ADD 按鈕,關(guān)閉文件窗,程序文件已加到項(xiàng)目中了。這時(shí)在 Source Group1 文件夾圖標(biāo)左邊出現(xiàn)了一個(gè)小+號(hào)說(shuō)明,文件組中有了文件,點(diǎn)擊它可以展開(kāi)查看。 圖 16 把文件加入到項(xiàng)目文件組中- 4 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 (5)C 程序文件已被我們加到了項(xiàng)目中了,下面就剩下編譯運(yùn)行了。這個(gè)項(xiàng)目我們只是用做學(xué)習(xí)新建程序項(xiàng)目和編譯運(yùn)行仿真的基本方法,所以使用軟件默認(rèn)的編譯設(shè)置,它不會(huì)生成用于芯片燒寫(xiě)的 HE
10、X 文件,如何設(shè)置生成 HEX 文件就請(qǐng)看下面的第三課。我們先來(lái)看圖 17 吧,圖中 1、2、3 都是編譯按鈕,不同是 1 是用于編譯單個(gè)文件。2 是編譯當(dāng)前項(xiàng)目,如果先前編譯過(guò)一次之后文件沒(méi)有做動(dòng)編輯改動(dòng),這時(shí)再點(diǎn)擊是不會(huì)再次重新編譯的。3 是重新編譯,每點(diǎn)擊一次均會(huì)再次編譯鏈接一次,不管程序是否有改動(dòng)。在 3 右邊的是停止編譯按鈕,只有點(diǎn)擊了前三個(gè)中的任一個(gè),停止按鈕才會(huì)生效。5 是菜單中的它們, 我個(gè)人就不習(xí)慣用它了。嘿嘿,這個(gè)項(xiàng)目只有一個(gè)文件,您按 123 中的一個(gè)都可以編譯。按了?好快哦,呵呵。在 4 中可以看到編譯的錯(cuò)誤信息和使用的系統(tǒng)資源情況等,以后我們要查錯(cuò)就靠它了。6 是有一
11、個(gè)小放大鏡的按鈕,這就是開(kāi)啟關(guān)閉調(diào)試模式的按鈕,它也存在于菜單DebugStartStop Debug Session,快捷鍵為 Ctrl+F5。 圖 17 編譯程序(6)進(jìn)入調(diào)試模式,軟件窗口樣式大致如圖 18 所示。圖中 1 為運(yùn)行,當(dāng)程序處于停止?fàn)顟B(tài)時(shí)才有效,2 為停止,程序處于運(yùn)行狀態(tài)時(shí)才有效。3 是復(fù)位,模擬芯片的復(fù)位,程序回到最開(kāi)頭處執(zhí)行。按 4 我們可以打開(kāi) 5 中的串行調(diào)試窗口,這個(gè)窗口我們可以看到從 51 芯片的串行口輸入輸出的字符,這里的第一個(gè)項(xiàng)目也正是在這里看運(yùn)行結(jié)果。這些在菜單中也有,這里不再一一介紹大家不妨找找看,其它的功能也會(huì)在后面的課程中慢慢介紹。首先按 4 打開(kāi)
12、串行調(diào)試窗口,再按運(yùn)行鍵,這時(shí)就可以看到串行調(diào)試窗口中不斷的打印“Hello World!”。呵呵,是不是不難呀?這樣就完成了您的第一個(gè) C 項(xiàng)目。最后我們要停止程序運(yùn)行回到文件編輯模式中,就要先按停止按鈕再按開(kāi)啟關(guān)閉調(diào)試模式按鈕。然后我們就可以進(jìn)行關(guān)閉 KEIL 等相關(guān)操作了。 到此為止,第一課已經(jīng)完結(jié)了,初步學(xué)習(xí)了一些 KEIL uVision2 的項(xiàng)目文件創(chuàng)建、編譯、運(yùn)行和軟件仿真的基本操作方法。其中一直有提到一些功能的快捷鍵的使用,的確在實(shí)際的開(kāi)發(fā)應(yīng)用中快捷鍵的運(yùn)用可以大大提高工作的效率,建議大家多多使用,還有就是對(duì)這里所講的操作方法舉一反三用于類(lèi)似的操作中。 - 5 - 51 單片機(jī)
13、 C 語(yǔ)言入門(mén)教程 圖 18 調(diào)試運(yùn)行程序第二課 初步認(rèn)識(shí) 51 芯片 上一課我們的第一個(gè)項(xiàng)目完成了,可能有懂 C 語(yǔ)言的朋友會(huì)說(shuō),“這和 PC 機(jī)上的 C 語(yǔ)言沒(méi)有多大的區(qū)別呀”。的確沒(méi)有太大的區(qū)別,C 語(yǔ)言只是一種程序語(yǔ)言的統(tǒng)稱,針對(duì)不同的處理器相關(guān)的 C 語(yǔ)言都會(huì)有一些細(xì)節(jié)的改變。編寫(xiě) PC 機(jī)的 C 程序時(shí),如要對(duì)硬件編程您就必須對(duì)硬件要有一定的認(rèn)識(shí),51 單片機(jī)編程就更是如此,因它的開(kāi)發(fā)應(yīng)用是不可與硬件脫節(jié)的, 所以我們先要來(lái)初步認(rèn)識(shí)一下 51 苾片的結(jié)構(gòu)和引腳功能。MSC51 架構(gòu)的芯片種類(lèi)很多,具體特點(diǎn)和功能不盡相同(在以后編寫(xiě)的附錄中會(huì)加入常用的一些 51 芯片的資料列表),在
14、此后的教程中就以 Atmel 公司的 AT89C51 和 AT89C2051 為中心對(duì)象來(lái)進(jìn)行學(xué)習(xí),兩者是AT89 系列的典型代表,在愛(ài)好者中使用相當(dāng)?shù)亩?,?yīng)用資料很多,價(jià)格便宜,是初學(xué) 51 的首選芯片。嘿嘿,口水多多有點(diǎn)賣(mài)廣告之嫌了。:P 圖 21 AT89C51 和 AT89C2051 引腳功能圖 - 6 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 表 21 AT89C51 和 AT89C2051 主要性能表 圖 21 中是 AT89C51 和AT89C2051 的引腳功能圖。而表 21 中則是它們的主要性能表。以上可以看出它們是大體相同的,由于 AT89C2051 的 IO 線很少,導(dǎo)致它無(wú)法
15、外加 RAM 和程序ROM,片內(nèi) Flash 存儲(chǔ)器也少,但它的體積比AT89C51 小很多,以后大家可根據(jù)實(shí)際需要來(lái)選用。它們各有其特點(diǎn)但其核心是一樣的,下面就來(lái)看看 AT89C51 的引腳具體功能。 1.電源引腳 Vcc 40 電源端GND 20 接地端 工作電壓為 5V,另有 AT89LV51 工作電壓則是 2.7-6V, 引腳功能一樣。 2.外接晶體引腳 圖 22 外接晶體引腳 XTAL1 19 XTAL2 18 XTAL1 是片內(nèi)振蕩器的反相放大器輸入端,XTAL2 則是輸出端,使用外部振蕩器時(shí),外部振蕩信號(hào)應(yīng)直接加到XTAL1,而 XTAL2 懸空。內(nèi)部方式時(shí),時(shí)鐘發(fā)生器對(duì)振蕩脈沖
16、二分頻,如晶振為12MHz,時(shí)鐘頻率就為6MHz。晶振的頻率可以在1MHz-24MHz內(nèi)選擇。電容取 30PF 左右。 - 7 -AT89C51AT89C20514KB 可編程 Flash 存儲(chǔ)器(可擦寫(xiě) 1000 次) 2KB 可編程 Flash 存儲(chǔ)器(可擦寫(xiě) 1000 次) 三級(jí)程序存儲(chǔ)器保密 兩級(jí)程序存儲(chǔ)器保密 靜態(tài)工作頻率:0Hz-24MHz 靜態(tài)工作頻率:0Hz-24MHz 128 字節(jié)內(nèi)部 RAM 128 字節(jié)內(nèi)部 RAM 2 個(gè) 16 位定時(shí)/計(jì)數(shù)器 2 個(gè) 16 位定時(shí)/計(jì)數(shù)器 一個(gè)串行通訊口 一個(gè)串行通訊口 6 個(gè)中斷源 6 個(gè)中斷源 32 條 I/O 引線 15 條 I/
17、O 引線 片內(nèi)時(shí)種振蕩器 1 個(gè)片內(nèi)模擬比較器 51 單片機(jī) C 語(yǔ)言入門(mén)教程 型號(hào)同樣為 AT89C51 的芯片,在其后面還有頻率編號(hào),有 12,16,20,24MHz 可選。大家在購(gòu)買(mǎi)和選用時(shí)要注意了。如 AT89C51 24PC 就是最高振蕩頻率為 24MHz,40P6 封裝的普通商用芯片。 3. 復(fù) 位 RST 9 在振蕩器運(yùn)行時(shí),有兩個(gè)機(jī)器周期(24 個(gè)振蕩周期)以上的高電平出現(xiàn)在此引腿時(shí),將使單片機(jī)復(fù)位,只要這個(gè)腳保持高電平,51 芯片便循環(huán)復(fù)位。復(fù)位后P0P3 口均置 1 引腳表現(xiàn)為高電平,程序計(jì)數(shù)器和特殊功能寄存器 SFR 全部清零。當(dāng)復(fù)位腳由高電平變?yōu)榈碗娖綍r(shí),芯片為 ROM
18、 的 00H 處開(kāi)始運(yùn)行程序。常用的復(fù)位電路如圖 2 3 所示。 復(fù)位操作不會(huì)對(duì)內(nèi)部 RAM 有所影響。 圖 23 常用復(fù)位電路 4. 輸入輸出引腳 (1) P0 端口P0.0-P0.7 P0 是一個(gè) 8 位漏極開(kāi)路型雙向I/O 端口,端口置 1(對(duì)端口寫(xiě) 1)時(shí)作高阻抗輸入端。作為輸出口時(shí)能驅(qū)動(dòng) 8 個(gè) TTL。 對(duì)內(nèi)部 Flash 程序存儲(chǔ)器編程時(shí),接收指令字節(jié);校驗(yàn)程序時(shí)輸出指令字節(jié),要求外接上拉電阻。 在訪問(wèn)外部程序和外部數(shù)據(jù)存儲(chǔ)器時(shí),P0 口是分時(shí)轉(zhuǎn)換的地址(低 8 位)/數(shù)據(jù)總線,訪問(wèn)期間內(nèi)部的上拉電阻起作用。 (2) P1 端口P1.0P1.7 P1 是一個(gè)帶有內(nèi)部上拉電阻的 8
19、 位雙向 I/0 端口。輸出時(shí)可驅(qū)動(dòng) 4 個(gè) TTL。端口置 1 時(shí),內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對(duì)內(nèi)部 Flash 程序存儲(chǔ)器編程時(shí),接收低 8 位地址信息。(3) P2 端口P2.0P2.7 P2 是一個(gè)帶有內(nèi)部上拉電阻的 8 位雙向 I/0 端口。輸出時(shí)可驅(qū)動(dòng) 4 個(gè) TTL。端口置 1 時(shí),內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對(duì)內(nèi)部 Flash 程序存儲(chǔ)器編程時(shí),接收高 8 位地址和控制信息。 在訪問(wèn)外部程序和 16 位外部數(shù)據(jù)存儲(chǔ)器時(shí),P2 口送出高 8 位地址。而在訪問(wèn) 8位地址的外部數(shù)據(jù)存儲(chǔ)器時(shí)其引腳上的內(nèi)容在此期間不會(huì)改變。 - 8 - 51 單片機(jī) C 語(yǔ)言入
20、門(mén)教程 (4)P3 端口P3.0P3.7 P2 是一個(gè)帶有內(nèi)部上拉電阻的 8 位雙向 I/0 端口。輸出時(shí)可驅(qū)動(dòng) 4 個(gè) TTL。端口置 1 時(shí),內(nèi)部上拉電阻將端口拉到高電平,作輸入用。對(duì)內(nèi)部 Flash 程序存儲(chǔ)器編程時(shí),接控制信息。除此之外 P3 端口還用于一些專(zhuān)門(mén)功能,具體請(qǐng)看 表 22.。 P13 端口在做輸入使用時(shí),因內(nèi)部有上接電阻,被外部拉低的引腳會(huì)輸出一定的電流。 表 22 P3 端口引腳兼用功能表 呼!一口氣說(shuō)了那么多,停一下吧。嗯,什么?什么叫上拉電阻?上拉電阻簡(jiǎn)單來(lái)說(shuō)就是把電平拉高,通常用 4.710K 的電阻接到 Vcc 電源,下拉電阻則是把電平拉低,電阻接到GND 地線
21、上。具體說(shuō)明也不是這里要討論的,接下來(lái)還是接著看其它的引腳功能吧。 5. 其它的控制或復(fù)用引腳 (1) ALE/PROG 30 訪問(wèn)外部存儲(chǔ)器時(shí),ALE(地址鎖存允許)的輸出用于鎖存地址的低位字節(jié)。即使不訪問(wèn)外部存儲(chǔ)器,ALE 端仍以不變的頻率輸出脈沖信號(hào)(此頻率是振蕩器頻率的 1/6)。在訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),出現(xiàn)一個(gè) ALE 脈沖。對(duì)Flash 存儲(chǔ)器編程時(shí),這個(gè)引腳用于輸入編程脈沖 PROG (2) PSEN 29 該引是外部程序存儲(chǔ)器的選通信號(hào)輸出端。當(dāng) AT89C51 由外部程序存儲(chǔ)器取指令或常數(shù)時(shí),每個(gè)機(jī)器周期輸出 2 個(gè)脈沖即兩次有效。但訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),將不會(huì)有脈沖輸出。
22、(3) EA/Vpp 31 外部訪問(wèn)允許端。當(dāng)該引腳訪問(wèn)外部程序存儲(chǔ)器時(shí),應(yīng)輸入低電平。要使 AT89C51 只訪問(wèn)外部程序存儲(chǔ)器(地址為 0000H-FFFFH),這時(shí)該引腳必須保持低電平。對(duì) Flash 存儲(chǔ)器編程時(shí),用于施加 Vpp 編程電壓。Vpp 電壓有兩種,類(lèi)似芯片最大頻率值要根據(jù)附加的編號(hào)或芯片內(nèi)的特征字決定。具體如表23 所列。 表 23 Vpp 與芯片型號(hào)和片內(nèi)特征字的關(guān)系 - 9 - Vpp = 12V Vpp = 5V 印刷在芯片面上的型號(hào) AT89C51 xxxx YYWW AT89LV51 xxxx YYWW AT89C51 xxxx-5 YYWW AT89LV51
23、xxxx-5 YYWW 片內(nèi)特征字 030H=1EH 030H=1EH 030H=1EH 030H=1EH 031H=51H 031H=61H 031H=51H 031H=61H 032H=FFH 032H=FFH 032H=05H 032H=05H P3 引腳 兼用功能 P3.0串行通訊輸入(RXD) P3.1串行通訊輸出(TXD) P3.2外部中斷 0( INT0) P3.3外部中斷 1(INT1) P3.4定時(shí)器 0 輸入(T0)P3.5定時(shí)器 1 輸入(T1)P3.6外部數(shù)據(jù)存儲(chǔ)器寫(xiě)選通 WRP3.7外部數(shù)據(jù)存儲(chǔ)器寫(xiě)選通 RD 51 單片機(jī) C 語(yǔ)言入門(mén)教程 看到這您對(duì) AT89C51
24、 引腳的功能應(yīng)該有了一定的了解了,引腳在編程和校驗(yàn)時(shí)的時(shí)序我們?cè)谶@里就不做詳細(xì)的探討,通常情況下我們也沒(méi)有必要去撐握它,除非您想自己開(kāi)發(fā)編程器。下來(lái)的課程我們要開(kāi)始以一些簡(jiǎn)單的實(shí)例來(lái)講述 C 程序的語(yǔ)法和編寫(xiě)方法技巧,中間穿插相關(guān)的硬件知識(shí)如串口,中斷的用法等等。 第三課 生成 HEX 文件和最小化系統(tǒng) 在開(kāi)始C語(yǔ)言的主要內(nèi)容時(shí),我們先來(lái)看看如何用KEIL uVISION2來(lái)編譯生成用于燒寫(xiě)芯片的HEX文件。HEX文件格式是Intel公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字節(jié),所有數(shù)據(jù)使用16進(jìn)制數(shù)字表示, 常用來(lái)保存單片機(jī)或其他處理器的目標(biāo)程序代碼。它保存物理程序存儲(chǔ)區(qū)中的目標(biāo)代碼映象。
25、一般的編程器都支持這種格式。我們先來(lái)打開(kāi)第一課做的第一項(xiàng)目,打開(kāi)它的所在目錄,找到test.Uv2的文件就可以打開(kāi)先前的項(xiàng)目了。然后右擊圖31中的1項(xiàng)目文件夾,彈出項(xiàng)目功能菜單,選Options for TargetTarget1,彈出項(xiàng)目選項(xiàng)設(shè)置窗口,同樣先選中項(xiàng)目文件夾圖標(biāo),這時(shí)在Project菜單中也有一樣的菜單可選。打開(kāi)項(xiàng)目選項(xiàng)窗口,轉(zhuǎn)到Output選項(xiàng)頁(yè)圖32所示,圖中1是選擇編譯輸出的路徑,2是設(shè)置編譯輸出生成的文件名,3則是決定是否要?jiǎng)?chuàng)建HEX文件,選中它就可以輸出HEX文件到指定的路徑中。選好了?好,我們?cè)賹⑺匦戮幾g一次,很快在編譯信息窗口中就顯示HEX文件創(chuàng)建到指定的路徑中
26、了,如圖33。這樣我們就可用自己的編程器所附帶的軟件去讀取并燒到芯片了,再用實(shí)驗(yàn)板看結(jié)果,至于編程器或仿真器品種繁多具體方法就看它的說(shuō)明書(shū)了,這里也不做討論。 (技巧:一、在圖31中的1里的項(xiàng)目文件樹(shù)形目錄中,先選中對(duì)象,再單擊它就可對(duì)它進(jìn)行重命名操作,雙擊文件圖標(biāo)便可打開(kāi)文件。二、在Project下拉菜單的最下方有最近編輯過(guò)的項(xiàng)目路徑保存,這里可以快速打開(kāi)最近在編輯的項(xiàng)目。) 。圖31項(xiàng)目功能菜單- 10 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 圖32 項(xiàng)目選項(xiàng)窗口 圖 33 編譯信息窗口 或許您已把編譯好的文件燒到了芯片上,如果您購(gòu)買(mǎi)或自制了帶串口輸出元件的學(xué)習(xí)實(shí)驗(yàn)板,那您就可以把串口和 PC
27、 機(jī)串口相聯(lián)用串口調(diào)試軟件或 Windows 的超級(jí)終端,將其波特率設(shè)為 1200,就可以看到不停輸出的“Hello World!”字樣。也許您還沒(méi)有實(shí)驗(yàn)板,那這里先說(shuō)說(shuō) AT89C51 的最小化系統(tǒng),再以一實(shí)例程序驗(yàn)證最小化系統(tǒng)是否在運(yùn)行,這個(gè)最小化系統(tǒng)也易于自制用于實(shí)驗(yàn)。圖 34 便是 AT89C51 的最小化系統(tǒng),不過(guò)為了讓我們可以看出它是在運(yùn)行的, 我加了一個(gè)電阻和一個(gè) LED,用以顯示它的狀態(tài),晶振可以根據(jù)自己的情況使用,一般實(shí)驗(yàn)板上是用 11.0592MHz 或 12MHz,使用前者的好外是可以產(chǎn)生標(biāo)準(zhǔn)的串口波特率, 后者則一個(gè)機(jī)器周期為 1 微秒,便于做精確定時(shí)。在自己做實(shí)驗(yàn)里,
28、注意的是 VCC 是+5V 的, 不能高于此值,否則將損壞單片機(jī),太低則不能正常工作。在 31 腳要接高電平,這樣我們才能執(zhí)行片內(nèi)的程序,如接低電平則使用片外的程序存儲(chǔ)器。下面,我們建一個(gè)新的項(xiàng)目名為 OneLED 來(lái)驗(yàn)證最小化系統(tǒng)是否可以工作(所有的例程都可在我的主頁(yè)下面下載到,網(wǎng)址: 或 )。程序如下: - 11 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 #include /預(yù)處理命令 void main(void) /主函數(shù)名 /這是第一種注釋方式 unsigned int a; /定義變量 a 為 int 類(lèi)型 /
29、* 這是第二種注釋方式 */ do /do while 組成循環(huán) for (a=0; a50000; a+); /這是一個(gè)循環(huán)P1_0 = 0; /設(shè) P1.0 口為低電平,點(diǎn)亮 LED for (a=0; a50000; a+); /這是一個(gè)循環(huán)P1_0 = 1; /設(shè) P1.0 口為高電平,熄滅 LED while(1); 圖 34 AT89C51 最小化系統(tǒng) 這里先講講 KEIL C 編譯器所支持的注釋語(yǔ)句。一種是以“/”符號(hào)開(kāi)始的語(yǔ)句,符號(hào)之后的語(yǔ)句都被視為注釋?zhuān)钡接谢剀?chē)換行。另一種是在“/*”和“*/”符號(hào)之內(nèi)的為注釋。注釋不會(huì)被 C 編譯器所編譯。一個(gè) C 應(yīng)用程序中應(yīng)有一個(gè) m
30、ain 主函數(shù),main 函數(shù)可以調(diào)用 - 12 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 別的功能函數(shù),但其它功能函數(shù)不允許調(diào)用 main 函數(shù)。不論 main 函數(shù)放在程序中的那個(gè)位置,總是先被執(zhí)行。用上面學(xué)到的知識(shí)編譯寫(xiě)好的 OneLED 程序,并把它燒到剛做好的最小化系統(tǒng)中。上電,剛開(kāi)始時(shí) LED 是不亮的(因?yàn)樯想姀?fù)位后所有的 IO 口都置 1 引腳為高電平),然后延時(shí)一段時(shí)間(for (a=0; a50000; a+)這句在運(yùn)行),LED 亮,再延時(shí),LED熄滅,然后交替亮、滅。第一個(gè)真正的小應(yīng)用就做完,呵呵,先不要管它是否實(shí)用哦。如果沒(méi)有這樣的效果那么您就要認(rèn)真檢查一下電路或編譯燒寫(xiě)的
31、步驟了。 第四課 數(shù)據(jù)類(lèi)型 先來(lái)簡(jiǎn)單說(shuō)說(shuō) C 語(yǔ)言的標(biāo)識(shí)符和關(guān)鍵字。標(biāo)識(shí)符是用來(lái)標(biāo)識(shí)源程序中某個(gè)對(duì)象的名字的,這些對(duì)象可以是語(yǔ)句、數(shù)據(jù)類(lèi)型、函數(shù)、變量、數(shù)組等等。C 語(yǔ)言是大小字敏感的一種高級(jí)語(yǔ)言,如果我們要定義一個(gè)定時(shí)器 1,可以寫(xiě)做“Timer1”,如果程序中有“TIMER1”, 那么這兩個(gè)是完全不同定義的標(biāo)識(shí)符。標(biāo)識(shí)符由字符串,數(shù)字和下劃線等組成,注意的是第一個(gè)字符必須是字母或下劃線,如“1Timer”是錯(cuò)誤的,編譯時(shí)便會(huì)有錯(cuò)誤提示。有些編譯系統(tǒng)專(zhuān)用的標(biāo)識(shí)符是以下劃線開(kāi)頭,所以一般不要以下劃線開(kāi)頭命名標(biāo)識(shí)符。標(biāo)識(shí)符在命名時(shí)應(yīng)當(dāng)簡(jiǎn)單,含義清晰,這樣有助于閱讀理解程序。在 C51 編譯器中,
32、只支持標(biāo)識(shí)符的前32 位為有效標(biāo)識(shí),一般情況下也足夠用了,除非你要寫(xiě)天書(shū):P。 關(guān)鍵字則是編程語(yǔ)言保留的特殊標(biāo)識(shí)符,它們具有固定名稱和含義,在程序編寫(xiě)中不允許標(biāo)識(shí)符與關(guān)鍵字相同。在 KEIL uVision2 中的關(guān)鍵字除了有 ANSI C 標(biāo)準(zhǔn)的 32 個(gè)關(guān)鍵字外還根據(jù) 51 單片機(jī)的特點(diǎn)擴(kuò)展了相關(guān)的關(guān)鍵字。其實(shí)在 KEIL uVision2 的文本編輯器中編寫(xiě)C 程序,系統(tǒng)可以把保留字以不同顏色顯示,缺省顏色為天藍(lán)色。(標(biāo)準(zhǔn)和擴(kuò)展關(guān)鍵字請(qǐng)看附錄一中的附表 1-1 和附表 1-2) 先看表 41,表中列出了 KEIL uVision2 C51 編譯器所支持的數(shù)據(jù)類(lèi)型。在標(biāo)準(zhǔn) C 語(yǔ)言中基本的
33、數(shù)據(jù)類(lèi)型為 char,int,short,long,float 和 double,而在 C51 編譯器中 int 和short 相同,float 和 double 相同,這里就不列出說(shuō)明了。下面來(lái)看看它們的具體定義: 表 41 KEIL uVision2 C51 編譯器所支持的數(shù)據(jù)類(lèi)型 1 char 字符類(lèi)型 char 類(lèi)型的長(zhǎng)度是一個(gè)字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量。分無(wú)符號(hào)字符類(lèi)型 unsigned char 和有符號(hào)字符類(lèi)型 signed char,默認(rèn)值為 signed char 類(lèi)型。 - 13 -數(shù)據(jù)類(lèi)型 長(zhǎng) 度 值 域 unsigned char 單字節(jié) 0255 si
34、gned char 單字節(jié) -128+127 unsigned int 雙字節(jié) 065535 signed int 雙字節(jié) -32768+32767 unsigned long 四字節(jié) 04294967295 signed long 四字節(jié) -2147483648+2147483647 float 四字節(jié) 1.175494E-383.402823E+38 * 13 字節(jié) 對(duì)象的地址 bit 位 0 或 1 sfr 單字節(jié) 0255 sfr16 雙字節(jié) 065535 sbit 位 0 或 1 51 單片機(jī) C 語(yǔ)言入門(mén)教程 unsigned char 類(lèi)型用字節(jié)中所有的位來(lái)表示數(shù)值,所可以表達(dá)的
35、數(shù)值范圍是 0255。signed char 類(lèi)型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù), 負(fù)數(shù)用補(bǔ)碼表示。所能表示的數(shù)值范圍是-128+127。unsigned char 常用于處理 ASCII 字符或用于處理小于或等于 255 的整型數(shù)。 正數(shù)的補(bǔ)碼與原碼相同,負(fù)二進(jìn)制數(shù)的補(bǔ)碼等于它的絕對(duì)值按位取反后加 1。 2 int 整型 int 整型長(zhǎng)度為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。分有符號(hào) int 整型數(shù) signed int 和無(wú)符號(hào)整型數(shù) unsigned int,默認(rèn)值為 signed int 類(lèi)型。signed int 表示的數(shù)值范圍是-32768+3276
36、7,字節(jié)中最高位表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù)。unsigned int 表示的數(shù)值范圍是 065535。 好了,先停一下吧,我們來(lái)寫(xiě)個(gè)小程序看看 unsigned char 和 unsigned int 用于延時(shí)的不同效果,說(shuō)明它們的長(zhǎng)度是不同的,呵,盡管它并沒(méi)有實(shí)際的應(yīng)用意義,這里我們學(xué)習(xí)它們的用法就行。依舊用我們上一課的最小化系統(tǒng)做實(shí)驗(yàn),不過(guò)要加多一個(gè)電阻和 LED,如圖 41。實(shí)驗(yàn)中用 D1 的點(diǎn)亮表明正在用 unsigned int 數(shù)值延時(shí),用 D2 點(diǎn)亮表明正在用unsigned char 數(shù)值延時(shí)。 圖 41 第 4 課實(shí)驗(yàn)用電路 我們把這個(gè)項(xiàng)目稱為 TwoLE
37、D,實(shí)驗(yàn)程序如下: #include /預(yù)處理命令 - 14 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 void main(void) /主函數(shù)名 unsigned int a; /定義變量 a 為 unsigned int 類(lèi)型unsigned char b; /定義變量 b 為 unsigned char 類(lèi)型 do /do while 組成循環(huán) for (a=0; a65535; a+) P1_0 = 0; /65535 次設(shè) P1.0 口為低電平,點(diǎn)亮 LED P1_0 = 1; /設(shè) P1.0 口為高電平,熄滅 LED for (a=0; a30000; a+); /空循環(huán) for (b=
38、0; b255; b+) P1_1 = 0; /255 次設(shè) P1.1 口為低電平,點(diǎn)亮 LED P1_1 = 1; /設(shè) P1.1 口為高電平,熄滅 LED for (a=0; a30000; a+); /空循環(huán) while(1); 同樣編譯燒寫(xiě),上電運(yùn)行您就可以看到結(jié)果了。很明顯 D1 點(diǎn)亮的時(shí)間長(zhǎng)于 D2 點(diǎn)亮的時(shí)間。程序中的循環(huán)延時(shí)時(shí)間并不是很好確定,并不太適合要求精確延時(shí)的場(chǎng)合,關(guān)于這方面我們以后也會(huì)做討論。這里必須要講的是,當(dāng)定義一個(gè)變量為特定的數(shù)據(jù)類(lèi)型時(shí),在程序使用該變量不應(yīng)使它的值超過(guò)數(shù)據(jù)類(lèi)型的值域。如本例中的變量 b 不能賦超出 0255 的值,如 for (b=0; b25
39、5; b+)改為 for (b=0; b256; b+),編譯是可以通過(guò)的,但運(yùn)行時(shí)就會(huì)有問(wèn)題出現(xiàn), 就是說(shuō) b 的值永遠(yuǎn)都是小于 256 的,所以無(wú)法跳出循環(huán)執(zhí)行下一句 P1_1 = 1,從而造成死循環(huán)。同理 a 的值不應(yīng)超出 065535。大家可以燒片看看實(shí)驗(yàn)的運(yùn)行結(jié)果,同樣軟件仿真也是可以看到結(jié)果的。 3. long 長(zhǎng)整型 long 長(zhǎng)整型長(zhǎng)度為四個(gè)字節(jié),用于存放一個(gè)四字節(jié)數(shù)據(jù)。分有符號(hào) long 長(zhǎng)整型 signed long 和無(wú)符號(hào)長(zhǎng)整型 unsigned long,默認(rèn)值為 signed long 類(lèi)型。signed int 表示的數(shù)值范圍是-2147483648+214748
40、3647,字節(jié)中最高位表示數(shù)據(jù)的符號(hào),“0”表示正數(shù),“1”表示負(fù)數(shù)。unsigned long 表示的數(shù)值范圍是 04294967295。 4. float 浮點(diǎn)型 float 浮點(diǎn)型在十進(jìn)制中具有 7 位有效數(shù)字,是符合 IEEE754 標(biāo)準(zhǔn)的單精度浮點(diǎn)型數(shù)據(jù),占用四個(gè)字節(jié)。因浮點(diǎn)數(shù)的結(jié)構(gòu)較復(fù)雜在以后的章節(jié)中再做詳細(xì)的討論。 5. * 指針型 指針型本身就是一個(gè)變量,在這個(gè)變量中存放的指向另一個(gè)數(shù)據(jù)的地址。這個(gè)指針變量- 15 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 要占據(jù)一定的內(nèi)存單元,對(duì)不同的處理器長(zhǎng)度也不盡相同,在 C51 中它的長(zhǎng)度一般為 1 3 個(gè)字節(jié)。指針變量也具有類(lèi)型,在以后的課
41、程中有專(zhuān)門(mén)一課做探討,這里就不多說(shuō)了。 6. bit 位標(biāo)量 bit 位標(biāo)量是 C51 編譯器的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可定義一個(gè)位標(biāo)量,但不能定義位指針,也不能定義位數(shù)組。它的值是一個(gè)二進(jìn)制位,不是 0 就是 1,類(lèi)似一些高級(jí)語(yǔ)言中的 Boolean 類(lèi)型中的 True 和 False。 7. sfr 特殊功能寄存器 sfr 也是一種擴(kuò)充數(shù)據(jù)類(lèi)型,點(diǎn)用一個(gè)內(nèi)存單元,值域?yàn)?0255。利用它可以訪問(wèn) 51 單片機(jī)內(nèi)部的所有特殊功能寄存器。如用 sfr P1 = 0x90 這一句定 P1 為P1 端口在片內(nèi)的寄存器,在后面的語(yǔ)句中我們用以用 P1 = 255(對(duì) P1 端口的所有引腳置高電平)之
42、類(lèi)的語(yǔ)句來(lái)操作特殊功能寄存器。 AT89C51 的特殊功能寄存器表請(qǐng)看附錄二 8. sfr16 16 位特殊功能寄存器 sfr16 占用兩個(gè)內(nèi)存單元,值域?yàn)?065535。sfr16 和 sfr 一樣用于操作特殊功能寄存器,所不同的是它用于操作占兩個(gè)字節(jié)的寄存器,好定時(shí)器 T0 和 T1。 9. sbit 可錄址位 sbit 同位是 C51 中的一種擴(kuò)充數(shù)據(jù)類(lèi)型,利用它可以訪問(wèn)芯片內(nèi)部的 RAM 中的可尋址位或特殊功能寄存器中的可尋址位。如先前我們定義了 sfr P1 = 0x90; /因 P1 端口的寄存器是可位尋址的,所以我們可以定義sbit P1_1 = P11; /P1_1 為 P1
43、中的 P1.1 引腳 /同樣我們可以用 P1.1 的地址去寫(xiě),如 sbit P1_1 = 0x91; 這樣我們?cè)谝院蟮某绦蛘Z(yǔ)句中就可以用 P1_1 來(lái)對(duì)P1.1 引腳進(jìn)行讀寫(xiě)操作了。通常這些可以直接使用系統(tǒng)提供的預(yù)處理文件,里面已定義好各特殊功能寄存器的簡(jiǎn)單名字,直接引用可以省去一點(diǎn)時(shí)間,我自己是一直用的。當(dāng)然您也可以自己寫(xiě)自己的定義文件, 用您認(rèn)為好記的名字。 關(guān)于數(shù)據(jù)類(lèi)型轉(zhuǎn)換等相關(guān)操作在后面的課程或程序?qū)嵗袑⒂兴峒?。大家可以用所講到的數(shù)據(jù)類(lèi)型改寫(xiě)一下這課的實(shí)例程序,加深對(duì)各類(lèi)型的認(rèn)識(shí)。 第五課 常量 上一節(jié)我們學(xué)習(xí)了 KEIL C51 編譯器所支持的數(shù)據(jù)類(lèi)型。而這些數(shù)據(jù)類(lèi)型又是怎么用在
44、常量和變量的定義中的呢?又有什么要注意的嗎?下面就來(lái)看看吧。暈!你還區(qū)分不清楚什么是常量,什么是變量。常量是在程序運(yùn)行過(guò)程中不能改變值的量,而變量是可以在程序運(yùn)行過(guò)程中不斷變化的量。變量的定義可以使用所有 C51 編譯器支持的數(shù)據(jù)類(lèi)型,而常量的數(shù)據(jù)類(lèi)型只有整型、浮點(diǎn)型、字符型、字符串型和位標(biāo)量。這一節(jié)我們學(xué)習(xí)常量定義和用法, 而下一節(jié)則學(xué)習(xí)變量。 常量的數(shù)據(jù)類(lèi)型說(shuō)明是這樣的 1. 整型常量可以表示為十進(jìn)制如 123,0,89 等。十六進(jìn)制則以 0x 開(kāi)頭如 0x34,-0x3B 等。長(zhǎng)整型就在數(shù)字后面加字母 L,如 104L,034L,0xF340 等。 2. 浮點(diǎn)型常量可分為十進(jìn)制和指數(shù)表示
45、形式。十進(jìn)制由數(shù)字和小數(shù)點(diǎn)組成,如 - 16 - 51 單片機(jī) C 語(yǔ)言入門(mén)教程 0.888,3345.345,0.0 等,整數(shù)或小數(shù)部分為 0,可以省略但必須有小數(shù)點(diǎn)。指數(shù)表示形式為數(shù)字.數(shù)字e數(shù)字,中的內(nèi)容為可選項(xiàng),其中內(nèi)容根據(jù)具體情況可有可無(wú),但其余部分必須有,如 125e3,7e9,-3.0e-3。 字符型常量是單引號(hào)內(nèi)的字符,如a,d等,不可以顯示的控制字符,可以在該字符前面加一個(gè)反斜杠“”組成專(zhuān)用轉(zhuǎn)義字符。常用轉(zhuǎn)義字符表請(qǐng)看表 51。字符串型常量由雙引號(hào)內(nèi)的字符組成,如“test”,“OK”等。當(dāng)引號(hào)內(nèi)的沒(méi)有字符時(shí),為空字符串。在使用特殊字符時(shí)同樣要使用轉(zhuǎn)義字符如雙引號(hào)。在 C 中
46、字符串常量是做為字符類(lèi)型數(shù)組來(lái)處理的,在存儲(chǔ)字符串時(shí)系統(tǒng)會(huì)在字符串尾部加上o 轉(zhuǎn)義字符以作為該字符串的結(jié)束符。字符串常量“A”和字符常量A是不同的, 前者在存儲(chǔ)時(shí)多占用一個(gè)字節(jié)的字間。 位標(biāo)量,它的值是一個(gè)二進(jìn)制。 3.4.5. 表 51 常用轉(zhuǎn)義字符表 常量可用在不必改變值的場(chǎng)合,如固定的數(shù)據(jù)表,字庫(kù)等。常量的定義方式有幾種,下面來(lái)加以說(shuō)明。 #difine False 0x0; /用預(yù)定義語(yǔ)句可以定義常量#difine True 0x1; /這里定義 False 為 0,True 為 1 /在程序中用到 False 編譯時(shí)自動(dòng)用 0 替換,同理 True 替換為 1 unsigned in
47、t code a=100; /這一句用 code 把 a 定義在程序存儲(chǔ)器中并賦值const unsigned int c=100; /用 const 定義 c 為無(wú)符號(hào) int 常量并賦值 以上兩句它們的值都保存在程序存儲(chǔ)器中,而程序存儲(chǔ)器在運(yùn)行中是不允許被修改的, 所以如果在這兩句后面用了類(lèi)似 a=110,a+這樣的賦值語(yǔ)句,編譯時(shí)將會(huì)出錯(cuò)。 說(shuō)了一通還不如寫(xiě)個(gè)程序來(lái)實(shí)驗(yàn)一下吧。寫(xiě)什么程序呢?跑馬燈!對(duì),就寫(xiě)這個(gè)簡(jiǎn)單易懂的吧,這個(gè)也好說(shuō)明典型的常量用法。先來(lái)看看電路圖吧。它是在我們上一課的實(shí)驗(yàn)電路的基礎(chǔ)上增加 6 個(gè) LED 組成的,也就是用 P1 口的全部引腳分別驅(qū)動(dòng)一個(gè) LED,電路如圖 5 1 所示。 新建一個(gè) RunLED 的項(xiàng)目,主程序如下: #include /預(yù)處理文件里面定義了特殊寄存器的名稱如 P1 口定義為 P1 void main(void) /定義花樣數(shù)據(jù) cons tunsigned char design32=0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, - 17 -轉(zhuǎn)義字符 含義 ASCII 碼(16/10 進(jìn)制) o 空字符(NULL) 00H/0 n 換行符(LF) 0AH/10 r 回車(chē)符(CR) 0DH/13 t 水平制表符(HT) 09H/
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年?yáng)|平小學(xué)招聘數(shù)學(xué)臨聘教師備考題庫(kù)及參考答案詳解1套
- 2026年國(guó)藥控股陜西有限公司招聘?jìng)淇碱}庫(kù)及完整答案詳解一套
- 學(xué)校相關(guān)內(nèi)控制度
- 加強(qiáng)財(cái)經(jīng)制度內(nèi)控制度
- 醫(yī)保藥店內(nèi)控制度
- 基建辦內(nèi)控制度
- 社保政府采購(gòu)內(nèi)控制度
- 農(nóng)機(jī)局單位內(nèi)控制度
- 小學(xué)工會(huì)內(nèi)控制度
- 寫(xiě)文前面套話內(nèi)控制度
- (完整word版)Word操作練習(xí)題(解析和答案)
- 模具外協(xié)作業(yè)流程
- 法定代表人的委托書(shū) 法定代表人委托書(shū)原件(3篇)
- 公安機(jī)關(guān)業(yè)務(wù)技術(shù)用房建設(shè)標(biāo)準(zhǔn)
- 醫(yī)療器械質(zhì)量體系文件 013-偏差管理規(guī)定
- GB/T 32615-2016紡織機(jī)械短纖維梳理機(jī)術(shù)語(yǔ)和定義、結(jié)構(gòu)原理
- GB/T 31592-2015消防安全工程總則
- GB/T 2091-2008工業(yè)磷酸
- 家庭電路與安全用電課件 蘇科版物理九年級(jí)下冊(cè)
- GB/T 12234-2019石油、天然氣工業(yè)用螺柱連接閥蓋的鋼制閘閥
- 主題班會(huì)PPt-敬畏規(guī)則
評(píng)論
0/150
提交評(píng)論