電子電路設計之C51單片機常見問題

姓名:仝啟龍 ? 學號:17101223413

本文轉(zhuǎn)自

http://www.elecfans.com/emb/danpianji/20111122253113_2.html

【嵌牛導讀】

筆者在工作中實際使用過AT89C2051、AT89C51逢勾、AT89C52等51單片機郁副,后來應用臺灣新茂啤誊、華邦等廠家的51單片機淹禾。實踐中遇到許多問題,都是書本上沒有的筷狼。我印象中动看,書本上的知識只有一頁插圖了,就是cpu的時序圖洞慎。最初直接用匯編寫程序痛单,然后是C51嵌套匯編。編譯器曾用偉福系列編譯器劲腿,后來使用keil等旭绒,感覺這些編譯器大同小異。需要熟練的C語言基礎,加上單片機應用的特殊性挥吵。

本文就51單片機應用中一些常見問題作個總結重父,這都是我實際碰到過的,因為文章篇幅所限忽匈,這些問題遠遠不足以表達單片機的常見問題房午。希望對初學者有所幫助,文中不完善的地方務請指點丹允。謝謝!

【嵌牛鼻子】C51編譯器位地址和字節(jié)地址郭厌,嵌套匯編,51單片機的P0口雕蔽,晶振

【嵌牛提問】C51編譯器如何區(qū)分位地址和字節(jié)地址折柠?C51為什么要嵌套匯編?

【嵌牛正文】

1:C51編譯器如何區(qū)分位地址和字節(jié)地址

是靠預定義實現(xiàn)的批狐,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者聲明了P0端口地址位于0x80扇售,后者說明了P0端口的bit0,即P0.0位于位地址空間0x80處贾陷。這2個0x80具有完全不同的含義缘眶,靠關鍵字sfr和sbit來區(qū)別。這樣當程序被編譯時髓废,編譯器會依此編譯成相應的匯編語言巷懈。例如:

C51語句: P0 = 1;

P0聲明為sfr,因此編譯成:mov 80h慌洪,01h顶燕,將把0x01數(shù)據(jù)送入0x80單元,由于0x80單元物理上對應P0端口冈爹,因此涌攻,P0.0腳將輸出高電平(其實是呈現(xiàn)高阻態(tài),P0口獨有的)频伤,其他.1-.7腳輸出低電平恳谎。

C51語句: P0_0 = 1;

P0_0聲明為sbit,因此編譯成:setb 80h憋肖,這將把位地址空間的0x80地址的bit的值置1因痛。這個位正是P0口的bit0,執(zhí)行后岸更,P0.0將輸出高阻態(tài)鸵膏。而P0.1-.7不會變化。

2:C51為什么要嵌套匯編

51單片機一個顯著優(yōu)點就是指令執(zhí)行時間固定怎炊,因此可以適應時序要求嚴格的場合谭企。例如符合ISO7816協(xié)議的cpu卡的讀寫廓译,對時序要求比較嚴格。其實就是用io腳做出來的同步半雙工串口债查。支持cpu卡的程序一般比較龐大非区,需要用c51來組織,但是由于c編譯的不確定性攀操,必須把底層程序封裝成匯編語言模塊嵌入到工程中院仿。這就帶來幾個問題:如何聲明函數(shù)、參數(shù)如何傳遞等速和。限于篇幅歹垫,不能說得很細。下面舉例:

匯編程序單獨保存一個文件颠放,加入到工程中排惨,函數(shù)如下:

_proc_a:

mov a, r7

inc a

mov r7, a

ret

用c語言在.h文件中聲明: extern unsigned char proc_a(unsigned char val);

調(diào)用時形如: retvalue = proc_a(0x11);

說明:

a:匯編程序如果帶參數(shù),則需要在匯編程序前多加一個下劃線碰凶。而聲明它的地方不用加(偉福編譯器這么要求的)暮芭。

b:函數(shù)的形參中第一參數(shù)用R7傳遞,函數(shù)返回值用R7返回欲低,這是C51的通用規(guī)范辕宏。其他參數(shù)都有相應規(guī)定。函數(shù)可以返回一個位砾莱,用psw的c位返回瑞筐。

c:上面的語句,執(zhí)行順序是把0x11給R7腊瑟,然后跳轉(zhuǎn)子程序聚假,子程序?qū)⑺?后送回。

d:函數(shù)跳轉(zhuǎn)到匯編程序時闰非,本區(qū)的R0-R7膘格,A,B财松,PSW瘪贱,DPTR等寄存器可以供子程序使用,不必考慮調(diào)用后是否要恢復這些常規(guī)資源辆毡。上例中政敢,A的值被函數(shù)使用了,編程者不必恢復調(diào)用前的值胚迫。

3:51單片機的P0口特殊之處

許多新手都碰到這個問題,其實很簡單唾那,這涉及到芯片的io腳是怎么做出來的访锻。這對硬件工程師來說十分重要褪尝。TTL的io腳模型:


P1,P2期犬,P3口都可以理解成左圖河哑,注意vcc下面有個電阻,因此可以理解成:引腳輸出1的能力弱龟虎。地那邊沒有電阻璃谨,可以理解成引腳吸入電流能力強。而P0口鲤妥,可以理解成右圖佳吞。這就是集電極開路輸出,也叫OC輸出棉安〉装猓可以看出,當CTR=1時贡耽,三極管導通衷模,引腳被接地;當ctr=0時,三極管截止蒲赂,引腳浮空阱冶,也叫三態(tài)。這個端口這么做的目的是考慮P0口肩負讀寫數(shù)據(jù)和地址復用滥嘴,這個關系要仔細看懂cpu時序圖木蹬。因此,P0口要加合適的上拉電阻氏涩,絕不要加下拉電阻届囚。上拉電阻的選擇要看外部負載情況。

4:P1-3口如何輸入輸出

從上節(jié)的左圖可以看出是尖。做輸出時意系,ctr=1則輸出強信號0,ctr=0則輸出弱信號1饺汹。當io腳做輸入時蛔添,應使ctr=0,這樣三極管截止兜辞。外部信號如果是1迎瞧,則上拉電阻加強了這個1,單片機就會讀到1逸吵。當外部信號為0時凶硅,注意,必須將上拉電阻的上拉作用全部抵消扫皱,才能在引腳上得到0足绅。

因此捷绑,對于程序來說,把io腳置1就處于接收狀態(tài)氢妈,當然也是輸出1狀態(tài)粹污。程序置io口為1,讀取的信號是不是1就依靠外部電路了首量,如果外部電路沒有“吃掉”上拉電阻的電流壮吩,則讀取得到1,反之加缘,雖然程序置io腳為1鸭叙,但是讀取得到的就是0。

因此生百,如果用io腳的高電平驅(qū)動外部電路時递雀,要小心外部電路把這個1“吃掉”從而輸出不了1。而作為輸入時蚀浆,為0電平的外設必須足夠有能力將io腳拉低缀程。所以,用io腳直接點亮led的時候市俊,最好用反邏輯杨凑,就是輸出0,讓led亮摆昧。這樣能保證驅(qū)動能力撩满。就是io腳接led的負端,led的正端過電阻接vcc绅你。

因此伺帘,io腳輸出1時,外部電路將它強行接地是沒有關系的忌锯,而io腳輸出0的時候伪嫁,外部電路強行接電源就會把io腳損壞。所以偶垮,程序加電之后张咳,一般把所有io口都寫成1:MOV P0,0FFH似舵。

P3口引腳復用脚猾,必須引腳都處于輸出1狀態(tài)。例如砚哗,把RXD腳輸出0龙助,則它什么數(shù)據(jù)都讀不進來了,筆者早期曾調(diào)試一整天才發(fā)現(xiàn)串口收不到數(shù)據(jù)是沒有把RXD置1的原因蛛芥,把時間都浪費在外圍了泌参,當時很是汗顏脆淹。

5:有關晶振

單片機的晶振在內(nèi)部可以簡化成一個反向器。當晶振輸入腳XI剛過坎壓沽一、被認為是1的一瞬間,輸出腳XO就輸出0漓糙,這個0會帶動晶振使XI電壓下降铣缠,當降低到坎壓被認為是0的一瞬間,輸出腳XO就輸出1昆禽。這樣周而復始蝗蛙。

因此,用示波器觀察正常工作的晶振輸入腳XI時醉鳖,得到的是一個不高不低的近似水平線捡硅。而XO則是幅值很大的正弦波。測量晶振輸入腳XI時盗棵,示波器表筆要打在X10檔上壮韭,否則,表筆就能把晶振弄停纹因。

因此布線時喷屋,晶振輸入腳XI要盡量靠近晶振,而XO腳可稍遠瞭恰。同時XO具有一定的驅(qū)動能力屯曹,某些芯片可以用它驅(qū)動其它時序電路(不推薦這么做,因為系統(tǒng)可靠性下降)惊畏。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恶耽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子颜启,更是在濱河造成了極大的恐慌偷俭,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件农曲,死亡現(xiàn)場離奇詭異社搅,居然都是意外死亡,警方通過查閱死者的電腦和手機乳规,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門形葬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暮的,你說我怎么就攤上這事笙以。” “怎么了冻辩?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵猖腕,是天一觀的道長拆祈。 經(jīng)常有香客問我,道長倘感,這世上最難降的妖魔是什么放坏? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮老玛,結果婚禮上淤年,老公的妹妹穿的比我還像新娘。我一直安慰自己蜡豹,他們只是感情好麸粮,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镜廉,像睡著了一般弄诲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娇唯,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天齐遵,我揣著相機與錄音,去河邊找鬼视乐。 笑死洛搀,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的佑淀。 我是一名探鬼主播留美,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伸刃!你這毒婦竟也來了谎砾?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捧颅,失蹤者是張志新(化名)和其女友劉穎景图,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碉哑,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡挚币,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扣典。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆毕。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贮尖,靈堂內(nèi)的尸體忽然破棺而出笛粘,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布薪前,位于F島的核電站润努,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏示括。R本人自食惡果不足惜铺浇,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垛膝。 院中可真熱鬧随抠,春花似錦、人聲如沸繁涂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扔罪。三九已至,卻和暖如春桶雀,著一層夾襖步出監(jiān)牢的瞬間矿酵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工矗积, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留全肮,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓棘捣,卻偏偏與公主長得像辜腺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乍恐,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容