0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

51單片機(jī)應(yīng)用中5個(gè)常見問題總結(jié)

GReq_mcu168 ? 2017-12-06 09:53 ? 次閱讀

本文就51單片機(jī)應(yīng)用中一些常見問題作個(gè)總結(jié),這都是我實(shí)際碰到過的,因?yàn)槲恼缕?,這些問題遠(yuǎn)遠(yuǎn)不足以表達(dá)單片機(jī)的常見問題。希望對(duì)初學(xué)者有所幫助,文中不完善的地方務(wù)請指點(diǎn)。謝謝!

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

是靠預(yù)定義實(shí)現(xiàn)的,比如:sfr P0 = 0x80; sbit P0_0 = 0x80;前者聲明了P0端口地址位于0x80,后者說明了P0端口的bit0,即P0.0位于位地址空間0x80處。這2個(gè)0x80具有完全不同的含義,靠關(guān)鍵字sfr和sbit來區(qū)別。這樣當(dāng)程序被編譯時(shí),編譯器會(huì)依此編譯成相應(yīng)的匯編語言。例如:

C51語句: P0 = 1;

P0聲明為sfr,因此編譯成:mov 80h,01h,將把0x01數(shù)據(jù)送入0x80單元,由于0x80單元物理上對(duì)應(yīng)P0端口,因此,P0.0腳將輸出高電平(其實(shí)是呈現(xiàn)高阻態(tài),P0口獨(dú)有的),其他.1-.7腳輸出低電平。

C51語句: P0_0 = 1;

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

2:C51為什么要嵌套匯編

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

匯編程序單獨(dú)保存一個(gè)文件,加入到工程中,函數(shù)如下:

_proc_a:

mov a, r7

inc a

mov r7, a

ret

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

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

說明:

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

b:函數(shù)的形參中第一參數(shù)用R7傳遞,函數(shù)返回值用R7返回,這是C51的通用規(guī)范。其他參數(shù)都有相應(yīng)規(guī)定。函數(shù)可以返回一個(gè)位,用psw的c位返回。c:上面的語句,執(zhí)行順序是把0x11給R7,然后跳轉(zhuǎn)子程序,子程序?qū)⑺?后送回。

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

3:51單片機(jī)的P0口特殊之處

許多新手都碰到這個(gè)問題,其實(shí)很簡單,這涉及到芯片的io腳是怎么做出來的。這對(duì)硬件工程師來說十分重要。TTL的io腳模型:

P1,P2,P3口都可以理解成左圖,注意vcc下面有個(gè)電阻,因此可以理解成:引腳輸出1的能力弱。地那邊沒有電阻,可以理解成引腳吸入電流能力強(qiáng)。而P0口,可以理解成右圖。這就是集電極開路輸出,也叫OC輸出??梢钥闯?,當(dāng)CTR=1時(shí),三極管導(dǎo)通,引腳被接地;當(dāng)ctr=0時(shí),三極管截止,引腳浮空,也叫三態(tài)。這個(gè)端口這么做的目的是考慮P0口肩負(fù)讀寫數(shù)據(jù)和地址復(fù)用,這個(gè)關(guān)系要仔細(xì)看懂cpu時(shí)序圖。因此,P0口要加合適的上拉電阻,絕不要加下拉電阻。上拉電阻的選擇要看外部負(fù)載情況。

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

從上節(jié)的左圖可以看出。做輸出時(shí),ctr=1則輸出強(qiáng)信號(hào)0,ctr=0則輸出弱信號(hào)1。當(dāng)io腳做輸入時(shí),應(yīng)使ctr=0,這樣三極管截止。外部信號(hào)如果是1,則上拉電阻加強(qiáng)了這個(gè)1,單片機(jī)就會(huì)讀到1。當(dāng)外部信號(hào)為0時(shí),注意,必須將上拉電阻的上拉作用全部抵消,才能在引腳上得到0。

因此,對(duì)于程序來說,把io腳置1就處于接收狀態(tài),當(dāng)然也是輸出1狀態(tài)。程序置io口為1,讀取的信號(hào)是不是1就依靠外部電路了,如果外部電路沒有“吃掉”上拉電阻的電流,則讀取得到1,反之,雖然程序置io腳為1,但是讀取得到的就是0。

因此,如果用io腳的高電平驅(qū)動(dòng)外部電路時(shí),要小心外部電路把這個(gè)1“吃掉”從而輸出不了1。而作為輸入時(shí),為0電平的外設(shè)必須足夠有能力將io腳拉低。所以,用io腳直接點(diǎn)亮led的時(shí)候,最好用反邏輯,就是輸出0,讓led亮。這樣能保證驅(qū)動(dòng)能力。就是io腳接led的負(fù)端,led的正端過電阻接vcc。

因此,io腳輸出1時(shí),外部電路將它強(qiáng)行接地是沒有關(guān)系的,而io腳輸出0的時(shí)候,外部電路強(qiáng)行接電源就會(huì)把io腳損壞。所以,程序加電之后,一般把所有io口都寫成1:MOV P0,0FFH。

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

5:有關(guān)晶振

單片機(jī)的晶振在內(nèi)部可以簡化成一個(gè)反向器。當(dāng)晶振輸入腳XI剛過坎壓、被認(rèn)為是1的一瞬間,輸出腳XO就輸出0,這個(gè)0會(huì)帶動(dòng)晶振使XI電壓下降,當(dāng)降低到坎壓被認(rèn)為是0的一瞬間,輸出腳XO就輸出1。這樣周而復(fù)始。

因此,用示波器觀察正常工作的晶振輸入腳XI時(shí),得到的是一個(gè)不高不低的近似水平線。而XO則是幅值很大的正弦波。測量晶振輸入腳XI時(shí),示波器表筆要打在X10檔上,否則,表筆就能把晶振弄停。

因此布線時(shí),晶振輸入腳XI要盡量靠近晶振,而XO腳可稍遠(yuǎn)。同時(shí)XO具有一定的驅(qū)動(dòng)能力,某些芯片可以用它驅(qū)動(dòng)其它時(shí)序電路(不推薦這么做,因?yàn)橄到y(tǒng)可靠性下降)。

寫到這里,才發(fā)覺51單片機(jī)的問題太多了,這篇文字簡直就是滄海一粟。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628381
  • 晶振
    +關(guān)注

    關(guān)注

    33

    文章

    2728

    瀏覽量

    67506
  • 51單片機(jī)
    +關(guān)注

    關(guān)注

    272

    文章

    5689

    瀏覽量

    122164

原文標(biāo)題:電子設(shè)計(jì)之C51單片機(jī)常見問題

文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電子電路設(shè)計(jì)之C51單片機(jī)常見問題

    筆者在工作實(shí)際使用過AT89C2051、AT89C51、AT89C52等51單片機(jī),本文就51單片機(jī)
    發(fā)表于 11-22 11:28 ?1w次閱讀
    電子電路設(shè)計(jì)之C<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>常見問題</b>

    單片機(jī)開發(fā)過程常見問題

    單片機(jī)在組裝與開發(fā)過程總是會(huì)出現(xiàn)一些問題,導(dǎo)致過程不是那么順利的完成。今日分享一些單片機(jī)常見問題的解決辦法1.單片機(jī)EN8F609兼容PI
    發(fā)表于 09-11 16:33

    單片機(jī)的這5個(gè)常見問題,你能解決嗎?

    單片機(jī)學(xué)習(xí)、考試,甚至在面試過程,有各種問題等待著我們,當(dāng)然,常見的問題其實(shí)也不少,今天就梳理了5個(gè)比較
    發(fā)表于 12-12 17:03

    單片機(jī)面試常見問題及答案

    單片機(jī)面試常見問題及答案,單片機(jī)IO口開漏輸出和推挽輸出有什么區(qū)別?推挽輸出:既可以輸出低電平,也可以輸出高電平,可以直接驅(qū)動(dòng)功耗不大的數(shù)字器件。導(dǎo)通損耗小、效率高、既提高電路的負(fù)載能力,又提高開關(guān)
    發(fā)表于 07-19 06:48

    51單片機(jī)串口中斷使用總結(jié)

    51單片機(jī)串口中斷使用總結(jié),有程序,可以參考。
    發(fā)表于 03-28 10:00 ?13次下載

    有關(guān)51單片機(jī)有關(guān)晶振的問題總結(jié)(干貨)

    在初學(xué)51單片機(jī)的時(shí)候,總是伴隨很多有關(guān)于晶振的問題,其實(shí)晶振就是如同人的心臟,是血液的脈搏,把單片機(jī)的晶振問題搞明白了,51單片機(jī)的其他問
    的頭像 發(fā)表于 02-10 11:02 ?9038次閱讀

    51單片機(jī)經(jīng)常使用的寄存器功能總結(jié)

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)經(jīng)常使用的寄存器功能總結(jié)。
    發(fā)表于 08-29 17:29 ?12次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>經(jīng)常使用的寄存器功能<b class='flag-5'>總結(jié)</b>

    51單片機(jī)是什么?應(yīng)該如何學(xué)習(xí)51單片機(jī)

    51 單片機(jī)是目前使用最多的單片機(jī)之一,那么什么是 51 單片機(jī)呢?作為新手,又該如何自學(xué) 51
    發(fā)表于 12-23 07:57 ?73次下載

    51單片機(jī)最全入門總結(jié)

    51單片機(jī)最簡入門知識(shí)點(diǎn)總結(jié),初級(jí)入門總結(jié)時(shí)鐘周期:晶振振蕩周期 T時(shí)鐘=1/f晶振機(jī)器周期:計(jì)數(shù)器/定時(shí)器加一的時(shí)長機(jī)器周期=12*時(shí)鐘周期(12M晶振
    發(fā)表于 11-05 11:20 ?46次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>最全入門<b class='flag-5'>總結(jié)</b>

    51單片機(jī)學(xué)習(xí) 基礎(chǔ)知識(shí)總結(jié)

    51單片機(jī)學(xué)習(xí) 基礎(chǔ)知識(shí)總結(jié)
    發(fā)表于 11-11 19:21 ?39次下載
    <b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>學(xué)習(xí)    基礎(chǔ)知識(shí)<b class='flag-5'>總結(jié)</b>

    keil uvsion551單片機(jī)的學(xué)習(xí)總結(jié)(不定時(shí)更新)

    keil uvsion551單片機(jī)的學(xué)習(xí)總結(jié)(不定時(shí)更新)
    發(fā)表于 11-21 14:51 ?10次下載
    keil uvsion<b class='flag-5'>5</b>與<b class='flag-5'>51</b><b class='flag-5'>單片機(jī)</b>的學(xué)習(xí)<b class='flag-5'>總結(jié)</b>(不定時(shí)更新)

    總結(jié):30個(gè)單片機(jī)常見問題解決辦法!

    總結(jié):30個(gè)單片機(jī)常見問題解決辦法!
    的頭像 發(fā)表于 10-17 17:46 ?2868次閱讀
    <b class='flag-5'>總結(jié)</b>:30<b class='flag-5'>個(gè)</b><b class='flag-5'>單片機(jī)</b><b class='flag-5'>常見問題</b>解決辦法!

    單片機(jī)常見問題的解決思路和解決辦法

    30個(gè)單片機(jī)常見問題解決辦法!
    的頭像 發(fā)表于 09-18 16:51 ?2224次閱讀
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>常見問題</b>的解決思路和解決辦法

    stc51單片機(jī)怎么燒錄

    步驟 常見問題與解決方法 STC51單片機(jī)是一種常見的8位單片機(jī),廣泛應(yīng)用于各種嵌入式系統(tǒng)。它具有高性能、低成本、易于學(xué)習(xí)和使用等優(yōu)點(diǎn)。ST
    的頭像 發(fā)表于 01-02 17:41 ?2328次閱讀

    51單片機(jī)晶振的問題總結(jié)

    電子發(fā)燒友網(wǎng)站提供《51單片機(jī)晶振的問題總結(jié).doc》資料免費(fèi)下載
    發(fā)表于 09-07 09:32 ?0次下載