九九热视频精品在线,亚洲成a人片在线观看中文动漫,香蕉福利视频http://www.bjzhda.cnzh-cn曙海教育集團(tuán)論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團(tuán)論壇單片機(jī)學(xué)習(xí)的基本過程http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2228&Page=1wangxinxin2010-12-7 15:10:46經(jīng)常有單片機(jī)愛好者問我們,如何學(xué)習(xí)單片機(jī)?學(xué)習(xí)單片機(jī)的步驟是什么?我們初略總結(jié)了一下,單片機(jī)學(xué)習(xí)的過程基本上可分四個(gè)階段:


第一階段


是先瀏覽教科書里的硬件部分,大至了解單片機(jī)的硬件結(jié)構(gòu)。如ROMRAM、地址、IO口等,以及看一些廠家的MCU資料(Data Sheet),來加強(qiáng)MCU所提供各項(xiàng)資源的印象。


第二階段


 
就是了解二進(jìn)位數(shù)字、十六進(jìn)位數(shù)和軟件方面的內(nèi)容。盡管有很多高級(jí)語言可用于單片機(jī)的編程,但我覺得初學(xué)還是以匯編語言為好,更有利于和硬件結(jié)合,掌握硬件結(jié)構(gòu)。知道匯編語言、機(jī)器語言、
指令、
程序等概念后,就從MOV指令開始,學(xué)習(xí)匯編語言和編程,在此如51的MCU匯編語言系統(tǒng)有111條指令,簡(jiǎn)單又好理解它們?cè)?/font>
樣和硬件聯(lián)系,更有助于一般學(xué)習(xí)單片機(jī)的指令整合與運(yùn)用.因此其方法可先了
解幾條基本的MOV指令和它的機(jī)器語言,大致建立起單片機(jī)的硬件和軟件概念,
來知道單片機(jī)的硬件是由指令控制指揮的。


第三階段


按照編程環(huán)境的使用手冊(cè),熟悉使用編程環(huán)境。現(xiàn)在的編程環(huán)境一般都和電腦相連,只要具備基本電腦知識(shí)的人都可很快掌握操作步驟。


第四階段



是依靠實(shí)驗(yàn)板,學(xué)習(xí)掌握單片機(jī)的匯編語言指令系統(tǒng)和簡(jiǎn)單編程。
同時(shí)和前面所學(xué)硬件知識(shí)結(jié)合組裝,起到主學(xué)軟件,鞏固硬件的雙重作用。開始
時(shí)可用別人編的簡(jiǎn)單程式在實(shí)驗(yàn)板上進(jìn)行驗(yàn)證、分析,主要是熟悉該學(xué)習(xí)方法,
在應(yīng)用方面主要針對(duì)單片機(jī)I/O各項(xiàng)介面的使用,如A/DD/APWM輸出的應(yīng)用,LCDVFD的控制,以及如何規(guī)范各項(xiàng)串列輸出入口的通訊協(xié)定等,對(duì)其所控制的各項(xiàng)元器件須先分析驅(qū)動(dòng)能力,如電流電壓?jiǎn)栴}等。匯編語言熟悉后,
建議盡快學(xué)習(xí)C語言的編程,畢竟C語言有功能豐富的庫函數(shù)、運(yùn)算速度快、編譯效率高、
有良好的可移植性,而且可以直接實(shí)現(xiàn)對(duì)系統(tǒng)硬件的控制。C語言是一種結(jié)構(gòu)化
程序設(shè)計(jì)語言,它支持當(dāng)前程序設(shè)計(jì)中廣泛采用的由頂向下結(jié)構(gòu)化程序設(shè)計(jì)技
術(shù)。此外,C語言程序具有完善的模塊程序結(jié)構(gòu),從而為軟件開發(fā)中采用模塊化
程序設(shè)計(jì)方法提供了有力的保障。因此,使用C語言進(jìn)行程序設(shè)計(jì)已成為軟件
開發(fā)的一個(gè)主流。用C語言來編寫目標(biāo)系統(tǒng)軟件,會(huì)大大縮短開發(fā)周期,且明顯地
增加軟件的可讀性,便于改進(jìn)和擴(kuò)充,從而研制出規(guī)模更大、性能更完備的系統(tǒng)。]]>
討論單片機(jī)實(shí)現(xiàn)SPWM的算法及實(shí)現(xiàn)過程http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2224&Page=1wangxinxin2010-12-7 15:05:29在論壇上看到越來越多的地方在討論用單片機(jī)直接輸出SPWM波形的話題,但大多數(shù)都是在爭(zhēng)論單片機(jī)能否實(shí)現(xiàn)的問題,就我最近在網(wǎng)上查找的一些單片機(jī)的資料,有一些增強(qiáng)型的單片機(jī)應(yīng)該是可以的,如:
   菲利浦的p89lpc938,輸出PWM最高32M,晶振最高18M,指令執(zhí)行時(shí)間2至4個(gè)時(shí)鐘周期。我目前所用
   c80051F系列,單周期指令執(zhí)行,最高可達(dá)100MIPS(據(jù)宣傳)。輸出I/O可編程。功能強(qiáng)大。

   還有在論壇上常看見的Si8250好像也不錯(cuò)。
   雖然在這里列出了幾款單片機(jī),我希望在下面的帖子就不要再討論有關(guān)單片機(jī)硬件的問題。
   希望大家多多討論SPWM的算法,以及用單片機(jī)實(shí)現(xiàn)的控制過程

 

我現(xiàn)在僅對(duì)規(guī)則采樣法了解一點(diǎn),公式如下:
    脈寬=aTcsin(wTd) Tc為載波頻率,a為調(diào)制度,w為正弦波角頻率,  Td為脈沖所在的時(shí)間。這個(gè)公式算出的結(jié)果用兩個(gè)IO輸出,當(dāng)一個(gè)IO輸出一個(gè)半波的PWM時(shí),此時(shí)另一個(gè)輸出為無效電平。
我用單片機(jī)實(shí)現(xiàn)這個(gè)公式的想法:
    用查表的方法。把0.5Tcsin(wTd)算出做一個(gè)表格,用一個(gè)八位的A/D來采樣輸出電壓的變化,計(jì)算后得到a值,再根據(jù)下面的式子算出實(shí)際的脈寬:0.5aTcsin(wTd)/128,這僅是我一點(diǎn)單純的思路,希望大家積極發(fā)表意見,特別是如果我的想法有不對(duì)的地方,

]]>
關(guān)于單片機(jī)應(yīng)用的拓展討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2221&Page=1wangxinxin2010-12-7 15:00:22        本貼就是想先起個(gè)頭,把以前熊自己想到的一起想法說出來,先扔塊磚頭,有玉的盡管砸來。

        1、用單片機(jī)當(dāng)振蕩器用。在一些開關(guān)電源等應(yīng)用場(chǎng)合,往往需要一個(gè)振蕩器,看過一些電路常用邏輯芯片或三極管實(shí)現(xiàn)。而如果有非常便宜的8腳單片機(jī)(如16F683/12F508之類的),可以很容易的實(shí)現(xiàn)需要的振蕩頻率,甚至借助內(nèi)帶或外加的比較器實(shí)現(xiàn)反饋。現(xiàn)在拆機(jī)的8腳芯片已經(jīng)在2-3元/片,有的還帶片內(nèi)A/D或比較器,實(shí)現(xiàn)這個(gè)應(yīng)該不難。而且此類芯片可以用內(nèi)置振蕩源,不用外加任何器件,電路可以很簡(jiǎn)單。對(duì)開關(guān)電源不十分懂,這個(gè)只是一個(gè)初步的想法;

        2、用單片機(jī)當(dāng)邏輯芯片用。比如LED的串行轉(zhuǎn)并行靜態(tài)顯示,一般就164或595來實(shí)現(xiàn),級(jí)數(shù)也有一定的限制。但如果用89C2051來實(shí)現(xiàn),用串口通訊進(jìn)行。也就是用一片51作主控芯片,2051當(dāng)作被控芯片,記得51串行口的應(yīng)用中可以直接實(shí)現(xiàn)多片通訊的。每片2051編一個(gè)地址,主控51直接用串口向指定的2051發(fā)顯示內(nèi)容就行了。而且2051經(jīng)過簡(jiǎn)單的編程還可以實(shí)現(xiàn)BCD轉(zhuǎn)7段顯示解碼、BDC轉(zhuǎn)十進(jìn)制譯碼(用于輝光管)等功能。2051下拉電流可達(dá)20毫安,足夠驅(qū)動(dòng)數(shù)碼管(當(dāng)然得是共陽的,如果是共陰的電路就復(fù)雜了)。電路也相當(dāng)簡(jiǎn)單,只需要一個(gè)去耦電容,復(fù)位可以由主控芯片用I/0直接控制,時(shí)鐘可以由外部提供,甚至可以所有的單片機(jī)用一個(gè)時(shí)鐘源即可;

        3、用單片機(jī)當(dāng)A/D用。有的單片機(jī)本身不帶A/D,如果手邊有便宜的帶A/D的片子,但I(xiàn)/O不夠,就可以直接拿帶A/D的片子作并行或串行A/D用。主控芯片根據(jù)需要向帶A/D的芯片發(fā)出啟動(dòng)A/D的指令,完成后向主控芯片發(fā)出中斷,然后通過I/O傳輸數(shù)據(jù)就是了。

         以上就是幾個(gè)空想,歡迎大家一起來討論。]]>
初學(xué)單片機(jī)幾個(gè)不易掌握的概念http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2219&Page=1wangxinxin2010-12-7 14:52:23如何才能學(xué)好單片機(jī)ARM一起討論交流下以便很好的學(xué)習(xí)!http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2218&Page=1wangxinxin2010-12-7 14:51:36單片機(jī)ARM一起討論下,
單片機(jī)可以分為8位,16位,32位機(jī),就按生產(chǎn)的公司不同,側(cè)重點(diǎn)就不一樣,而且就算同是8位機(jī),處理能力也有不同,你初學(xué)單片機(jī)我建議還是從51系列如8051或MCS51開始學(xué),因?yàn)樗容^簡(jiǎn)單,容易入門。當(dāng)然也可以直接從高檔的單片機(jī)開始學(xué),如AVR或者ARM等目前非常流行的單片機(jī)開始,這就要看你自己是出于什么目的去學(xué)習(xí)了,
至于學(xué)什么語言,要看編譯器支持什么語言了,一般低端的單片機(jī)都支持匯編語言和C語言,但高檔的單片機(jī)還支持其他的語言,比如C++什么的,
如果你從51開始學(xué)習(xí)的話我個(gè)人認(rèn)為你還是從匯編語言開始學(xué),主要是看你的側(cè)重以及發(fā)展需要,不要求你匯編語言能立有多強(qiáng),但至少人家寫個(gè)程序你應(yīng)該能看懂就行,不然怎么做項(xiàng)目開發(fā)呢,而且有些什么需要用C語言與匯編語言嵌套使用,比如定時(shí)功能?當(dāng)你的匯編語言有一定的基礎(chǔ)了之后,你就可以開始學(xué)習(xí)C了,當(dāng)然直接學(xué)C也可以。
C語言的優(yōu)越性是眾所周知的,它的執(zhí)行效率高,但是具體執(zhí)行每一條語句時(shí)間卻比較長約1ms(12M),還有C的可讀性很強(qiáng),容易理解。 匯編語言他是比較精確,雖然學(xué)起來比較麻煩但是學(xué)好他還是有必要的,因?yàn)樽鲆恍?zhǔn)確性高的程序還是用匯編語言,
我的想法是:假如你想立竿見影的話,直接從C入手,假如你想成為單片機(jī)高手的話,從匯編開始。看你有不同建議和意見可以加QQ:313807838交流

做一個(gè)真正的單片機(jī)開發(fā)高手,然后逐步的學(xué)習(xí)ARM  成功走入嵌入式開發(fā)行列成為能手!]]>
關(guān)于c51內(nèi)存優(yōu)化的帖子問題http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2217&Page=1wangxinxin2010-12-7 14:50:06
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運(yùn)行.
]]>
基于利用單片機(jī)構(gòu)成高精度PWM式12位D/A的討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2216&Page=1wangxinxin2010-12-7 14:46:45在用單片機(jī)制作的變送器類和控制器類的儀表中,需要輸出1—5V或4—20mA的直流信號(hào)的時(shí)候,通常采用專用的D/A芯片,一般是每路一片。當(dāng)輸出信號(hào)的精度較高時(shí),D/A芯片的位數(shù)也將隨之增加。

  在工業(yè)儀表中,通常增加到12位。12位D/A的價(jià)格目前比單片機(jī)的價(jià)格要高得多,占用的接口線數(shù)量也多。尤其是在需隔離的場(chǎng)合時(shí),所需的光電耦合器數(shù)量與接口線相當(dāng),造成元器件數(shù)量大批增加,使體積和造價(jià)隨之升高。如果在單片機(jī)控制的儀表里用PWM方式完成D/A輸出,將會(huì)使成本降低到12位D/A芯片的十分之一左右。我們?cè)赟系列流量儀表中采用了這種方式,使用效果非常理想。下面介紹一下PWM方式D/A的構(gòu)成原理。

  二 電路原理

  一般12位D/A轉(zhuǎn)換器在手冊(cè)中給出的精度為±1/2LSB,溫度漂移的綜合指標(biāo)在20—50ppm/℃,上述兩項(xiàng)指標(biāo)在0.2級(jí)儀表中是可以滿足要求的,下面給出的電路可以達(dá)到上述兩項(xiàng)指標(biāo)。

  圖1中的T是固定寬度,τ的寬度是可變的。τ分為5000份,每份2us。所以τ的最大值τmax=2×5000=10000us,這就是T的寬度。當(dāng)τ=T時(shí),占空比為1,Vo=5.000V,τ=0時(shí),Vo=0V。這種脈沖電壓經(jīng)過兩級(jí)RC濾波后得到的電壓可由下式表示:

圖片點(diǎn)擊可在新窗口打開查看

圖片點(diǎn)擊可在新窗口打開查看

  VM必須是精密電壓源。Vo與占空比成正比,且線性較好,這種方式在理論上是很成熟的,但實(shí)際應(yīng)用上還存在一些問題。圖2是實(shí)際線路,其中單片機(jī)可用8098或8031兩種常用芯片,VM的數(shù)值為5.000V±2mV,D/A與單片機(jī)必須是電氣隔離的。否則數(shù)字脈沖電流產(chǎn)生的干擾會(huì)影響D/A精度,從示波器可以看到高達(dá)50mV的干擾毛刺電壓,因此有必要加光電隔離。經(jīng)隔離后的脈沖驅(qū)動(dòng)模擬開關(guān)CD4053CD4053是三組兩觸點(diǎn)模擬開關(guān),由PWM脈沖控制開關(guān)的公共接點(diǎn)使之與+5.000V和地接通,在VI得到與單片機(jī)輸出相一致的PWM波形。該波形經(jīng)兩級(jí)RC濾波后由運(yùn)放構(gòu)成的電壓跟隨器輸出Vo。其中RC的時(shí)間常數(shù)一般取RC≥2T,這樣兩級(jí)RC加起來就會(huì)得到紋波小于3mV的直流電壓,本電路中RC=220ms,如果想進(jìn)一步減小紋波,可適當(dāng)提高RC的乘積,但電路的響應(yīng)速度也會(huì)放慢。

圖片點(diǎn)擊可在新窗口打開查看

  用運(yùn)放做RC濾波器輸出的緩沖大有益處。它不僅提高了濾波電路帶載能力,而且使線性度得到了提高。通過實(shí)驗(yàn)可知,這一級(jí)運(yùn)放的的緩沖作用是保證整個(gè)D/A精度和線性度的重要環(huán)節(jié)。盡管RC濾波器無負(fù)載,處在非常理想的條件下工作,但Vo并不完全與占空比成正比。經(jīng)測(cè)試,Vo與理想值有一些誤差,如圖3所示。

圖片點(diǎn)擊可在新窗口打開查看

  圖中的曲線1表示理想值,曲線2表示實(shí)測(cè)值。由圖中可見,曲線2的根部不太理想。這是因?yàn)樗褂玫碾娙莶皇羌冸娙荩渲泻幸欢ǖ碾姼小T谡伎毡葮O小時(shí),由于脈沖非常窄,它產(chǎn)生的高次諧波的頻率很高,電感對(duì)高次諧波的感抗較大,因此在脈沖沿的位置上,盡管電壓變化很大,但實(shí)際實(shí)際給電容充電卻很小。這樣就在窄脈沖時(shí)產(chǎn)生非線性。當(dāng)采用無感電容時(shí),這種非線性有較大改善,但仍不能完全吻合。由于無感電容容量太小,價(jià)格也較高,所以在大時(shí)間常數(shù)濾波電路中沒有實(shí)際意義。在實(shí)際使用中解決這一問題的方法是舍棄根部非線性部分,只用線性部分,在工業(yè)儀表中,標(biāo)準(zhǔn)的信號(hào)一般為1—5V或4—20mA。而曲線2的非線性部分在0.4V以下,所以當(dāng)采用1—5V輸出信號(hào)時(shí),精度為0.03%完全滿足12位D/A要求。

  除精度滿足要求外,溫度特性也必須滿足要求。影響溫度特性的原因主要是5V精密電源和運(yùn)算放大器的溫度特性。為不使價(jià)格太高,選用2DW232精密穩(wěn)壓二極管,運(yùn)放的電阻與濾波電阻要匹配且溫度系數(shù)≤25ppm。運(yùn)算放大器選擇溫漂≤10uV/℃的均可,一般廉價(jià)低溫漂運(yùn)放都可滿足這個(gè)指標(biāo)。采用上述措施后D/A的總溫度漂為33ppm/℃。

  三 實(shí)測(cè)數(shù)據(jù)

  由于這個(gè)線路是在0.2級(jí)精密儀表中使用的,因此要求線性度和溫度特性必須滿足要求,另外,這個(gè)數(shù)據(jù)是測(cè)量V/I轉(zhuǎn)換后4-20mA電源值與給定電流值之間的誤差。這個(gè)誤差還包含了V/I轉(zhuǎn)換的誤差。因此實(shí)際的D/A自身的誤差比總誤差要小。

  由以上數(shù)據(jù)可知,滿量程的線性度為0.04%,滿量程的溫度漂移為0.033%/10℃,系統(tǒng)響應(yīng)時(shí)間約為2.2s,輸出信號(hào)與標(biāo)準(zhǔn)值相差0.1%時(shí)所用的時(shí)間為11s。

圖片點(diǎn)擊可在新窗口打開查看

  四 結(jié)束語

  上面所介紹的D/A電路結(jié)構(gòu)簡(jiǎn)單,原理易懂,在8098及8031單片機(jī)上都可以應(yīng)用,筆者采用8098單片機(jī)的四路高速輸入輸出同時(shí)控制四路精密D/A輸出。后面加一級(jí)V/I轉(zhuǎn)換電路,構(gòu)成標(biāo)準(zhǔn)的4—20mA電流輸出,電路經(jīng)一年多的現(xiàn)場(chǎng)實(shí)際應(yīng)用,效果很好,適于目前0.2級(jí)儀表的全部要求。

]]>
單片機(jī)鍵盤輸入編程http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2215&Page=1wangxinxin2010-12-7 14:42:44線接P1.4~P1.7。行列式鍵盤輸入適合于按鍵輸入多的情況,如有16個(gè)按鍵輸入,用簡(jiǎn)單按鍵輸入用要占用2個(gè)輸入口(共16位),而使用行列式鍵盤輸入只需占用一個(gè)輸入口(8位)。但行列式鍵盤輸入軟件編寫較復(fù)雜,對(duì)初學(xué)者而言有一定的難度。
  
  以上略談了一下按鍵輸入的情況。在很多狀態(tài)下,按鍵輸入的值要同時(shí)要在LED數(shù)碼管上顯示出來。如一個(gè)按鍵設(shè)計(jì)為輸入遞增(加法)鍵,可以設(shè)計(jì)成每點(diǎn)按一下,數(shù)值遞增加1,同時(shí)在LED數(shù)碼管上顯示出來;也可設(shè)計(jì)成持續(xù)按下時(shí),數(shù)值以一定時(shí)間間隔(如0.3秒)累加。但是當(dāng)欲輸入值較大時(shí)(如三位LED數(shù)碼管作輸入顯示時(shí)的輸入值最大為999),則可能按下鍵的時(shí)間太長(最長達(dá)300秒),看來這種方式只適用于一位或至多兩位數(shù)值(最大99)的輸入。當(dāng)然你也可多設(shè)幾個(gè)鍵,每個(gè)鍵只負(fù)責(zé)一位數(shù)值的輸入,但這樣會(huì)占用較多的口線,浪費(fèi)寶貴的硬件資源。
  大家可能見到過,一些進(jìn)口的溫度控制器(如日本RKC INSTRUMENT INC. 生產(chǎn)的REX_C700溫控器)的面板設(shè)計(jì)為:溫度測(cè)量值用4位LED數(shù)碼管顯示,輸入設(shè)定值顯示也用4位LED數(shù)碼管,輸入按鍵只有4個(gè),一個(gè)為“模式設(shè)定鍵”,一個(gè)為“左移鍵”,另兩個(gè)為“加法鍵”、“減法鍵”。欲輸入設(shè)定值(溫控值)時(shí),按一下“模式設(shè)定鍵”,程序進(jìn)入設(shè)定狀態(tài),此時(shí)輸入設(shè)定值顯示的4位LED數(shù)碼管中,個(gè)位顯示最亮(穩(wěn)定顯示),而十、百、千位顯示較暗(有閃爍感),說明可對(duì)個(gè)位進(jìn)行輸入。按下“加法鍵”或“減法鍵”,即可輸入個(gè)位數(shù)的值;點(diǎn)按一下“左移鍵”,變?yōu)槭伙@示最亮,而個(gè)、百、千位顯示較暗,說明可對(duì)十位進(jìn)行輸入。按下“加法鍵”或“減法鍵”,即可輸入十位數(shù)的值;……這樣可完成4位數(shù)的輸入。完成輸入后,再按一下“模式設(shè)定鍵”,程序即退出設(shè)定狀態(tài),進(jìn)入工作運(yùn)行。用這種輸入方法,不僅輸入4位數(shù)用4個(gè)鍵即可,再多位(5位至24位)的輸入也用這4個(gè)鍵就夠了。
  
大家了解了這種新穎的按鍵輸入方式后,一定很感興趣,也想掌握設(shè)計(jì)方法。為了便于大家理解,這里結(jié)合筆者設(shè)計(jì)的一款“節(jié)能時(shí)控器”,詳細(xì)進(jìn)行講解。“節(jié)能時(shí)控器”用于定時(shí)控制大功率電器工作,因現(xiàn)采用分時(shí)計(jì)費(fèi)方法,可起到節(jié)約開支的作用,對(duì)工業(yè)生產(chǎn)成效顯著。
  
圖3為“節(jié)能時(shí)控器”硬件構(gòu)成原理圖。“節(jié)能時(shí)控器”共有4個(gè)輸入按鍵:set--模式設(shè)定鍵,left--左移鍵,up—加法鍵,on/off--定時(shí)1、2啟動(dòng)/關(guān)閉鍵。單片機(jī)IC1(AT89C2051)只有15條I/O線,由于受I/O線數(shù)量限制,因此P1口中的P1.0~P1.3既作為驅(qū)動(dòng)4位LED數(shù)碼管的數(shù)據(jù)輸出一部分,同時(shí)也用作按鍵的輸入。無疑,這種方式大大節(jié)約了硬件的I/O線,但也給編程者提出了更高的技術(shù)要求。限于篇幅,我們只對(duì)要詳解的按鍵輸入程序進(jìn)行分析,其它部分只略作介紹。如讀者需“節(jié)能時(shí)控器”詳細(xì)的源程序,可以Email圖片點(diǎn)擊可在新窗口打開查看uyuandz@163.com與作者聯(lián)系。

  圖4為主程序狀態(tài)流程圖。可見主程序只負(fù)責(zé)進(jìn)行走時(shí)或調(diào)整時(shí)間的運(yùn)算及顯示,而判斷按鍵輸入則放在T1定時(shí)中斷(10mS)服務(wù)子程序中。T0作為走時(shí)的基準(zhǔn)被設(shè)置為100mS定時(shí)中斷。這種設(shè)計(jì)的優(yōu)點(diǎn)是大大簡(jiǎn)化了主程序設(shè)計(jì),并且CPU會(huì)定時(shí)關(guān)心鍵盤,只要定時(shí)中斷時(shí)間足夠短(如為幾十mS),就不會(huì)漏掉每一次的按鍵輸入。
  
下面為判斷按鍵輸入的T1定時(shí)中斷服務(wù)子程序,序號(hào)為解釋方便而加。

序號(hào)  
1:void zd1(void) interrupt 3
        
2:{
        
3:uchar i,j;i=P1;j=P3;
        
4:TH1=-(5000/256);
        
5:TL1=-(5000%256);
        
6:if(m==1)n++;
        
7:if(n>=30){n=0;m=0;}
        
8:P3_7=0;
        
9:P1=0xff;
        
10:if(P1!=0xff)
        
11:{
        
12:if(n==0)m=1;
        
13:{if(n==1)
        
14:{
        
15:if(P1_0==0){set++;left=0;}
        
16:if(set>=4)set=0;
        
17:if(set==1)flag=0x55;
        
18:if(P1_1==0)left++;
        
19:if(left>=4)left=0;
        
20:if(P1_2==0){up++;
        
21:switch(left)
        
22:{
        
23:case 0:{if(up>=10)up=0;}break;
        
24:case 1:{if(up>=6)up=0;}break;
        
25:case 2:{if(up>=10)up=0;}break;
        
26:case 3:{if(up>=3)up=0;}break;
        
27:default:break;
        
28:}
        
29:}
        
30:if(P1_2==0){
        
31:switch(set)
        
32:{case 0:break;
        
33:case 1圖片點(diǎn)擊可在新窗口打開查看[left]=up;break;
        
34:case 2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break;
        
35:case 3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break;
        
36:default:break;
        
37:}
}
        
38:else {
        
39:switch(set)
        
40:{case 0:break;
        
41:case 1:up=x[left];break;
        
42:case 2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break;
        
43:case 3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break;
        
44:default:break;}
45   
:}}
        
46:}}
        
47:P1=i圖片點(diǎn)擊可在新窗口打開查看3=j;
        
48:}
  
序號(hào)1(程序解釋,以下同):聲明定時(shí)1中斷函數(shù)。
  
序號(hào)2:定時(shí)1中斷函數(shù)開始。
  
序號(hào)3:定義i、j為無符號(hào)字符型局部變量。將當(dāng)時(shí)的P1口、P3口狀態(tài)送i、j暫存。
  
序號(hào)4、5:定時(shí)器T1重新載入10mS初值。
  
序號(hào)6:如變量m等于1,則變量n遞增。說明:m、n為整個(gè)程序開始時(shí)定義的無符號(hào)字符型全局變量。
  
序號(hào)7:如變量n大于等于30,則m、n清零。
  
序號(hào)8:P3.7置0,準(zhǔn)備讀取按鍵輸入。
  
序號(hào)9:P1口置全1,準(zhǔn)備讀取按鍵輸入。
  
序號(hào)10:如果P1口不等于全1,說明4個(gè)按鍵中有鍵按下。
  
序號(hào)11:進(jìn)入if(P1!=0xff)語句范圍。
  
序號(hào)12:如果n等于0,進(jìn)入if(n==0)語句,m置1。
  
序號(hào)13:如果n等于1,進(jìn)入if(n==1)語句,同時(shí)進(jìn)行下面的具體判斷按鍵語句。作用效果為:開始時(shí)m、n均賦0,一旦有鍵按下,第一次中斷產(chǎn)生時(shí)m賦1;第二次中斷產(chǎn)生時(shí)n遞增。當(dāng)n等于1時(shí)(第二次中斷產(chǎn)生)進(jìn)入下面的具體判斷按鍵語句。若持續(xù)按下鍵,則第三次中斷產(chǎn)生~第三十一次中斷產(chǎn)生時(shí),程序不進(jìn)入具體的判斷按鍵語句過程(因這時(shí)n不等于1)。由于中斷每10mS產(chǎn)生一次,這樣可實(shí)現(xiàn)每0.31秒(31x10=0.31秒)進(jìn)行一次加法或移位的操作,與人眼的視覺特性相吻合。
  
序號(hào)14:進(jìn)入具體判斷按鍵語句范圍。
  
序號(hào)15:如果P1.0等于0(即電路中的set鍵按下),變量set遞增,變量left清0。說明:set、left是為了判斷模式設(shè)定及左移而在整個(gè)程序開始時(shí)定義的無符號(hào)字符型全局變量。
  
序號(hào)16:如果set大于等于4,則set清0。說明:set值只能在0~3間變化,只有4種工作模式(走時(shí)及輸出控制模式、走時(shí)調(diào)整模式、定時(shí)1調(diào)整模式、定時(shí)2調(diào)整模式)。
  
序號(hào)17:在set等于1時(shí),向RAM區(qū)標(biāo)志變量flag寫入55H。說明:flag是在整個(gè)程序開始時(shí)定義的無符號(hào)字符型全局變量,用作判斷RAM區(qū)是否受干擾的依據(jù)。

]]>
dsp 大家討論一下單片機(jī)技術(shù)是不是有些落后了,相對(duì)dsphttp://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2214&Page=1wangxinxin2010-12-7 14:41:17
單片機(jī)的發(fā)展是不是快到盡頭了
1:
老話題了,現(xiàn)在都P4了,可單片機(jī)依然使用。你說呢?
2:
51單片機(jī)已經(jīng)有20多年歷史了,還在不斷出新型號(hào)看不出“快到盡頭”的跡象。
3:
感覺DSP技術(shù)發(fā)展很快了不過很多人很看好DSP技術(shù)了
所以現(xiàn)在是不是多學(xué)DSP技術(shù)更好呢呵呵
4:
去年單片機(jī)市場(chǎng)達(dá)到137億美元,預(yù)計(jì)到2009年將達(dá)227億美元
5:
整個(gè)零頭花花
6:
這同制造工藝有關(guān),什么時(shí)候你能在家里做P4了,現(xiàn)在的單片機(jī)早就沒了.
7:
DSP單片機(jī)各有各的特點(diǎn)和優(yōu)勢(shì)  現(xiàn)在很多手機(jī)里面就是用ARM做控制處理器,DSP做數(shù)據(jù)處理,互相發(fā)揮優(yōu)勢(shì),要取代彼此都不容易。
8:
哈哈,有汽車了,不是還有自行車嗎?不同的要求,造就不同的生命力.
單片機(jī)不會(huì)過時(shí)的!
9:
大家討論一下單片機(jī)技術(shù)是不是有些落后了,相對(duì)DSP   說實(shí)話如今的單片機(jī)早一不是當(dāng)年那個(gè)一統(tǒng)天下的霸主了 現(xiàn)在隨著興新技術(shù)的不斷涌現(xiàn) 它也的光環(huán)會(huì)退色了 不過話有說又說回來單片機(jī)至少在目前沒有沒有看到頭了跡象 
10:
說白了你們所說的DSP不也是單片機(jī)嗎,何必把他們對(duì)立起來?
11:
12:
是啊要是DSP做到2元人民幣每片,我就買兩個(gè)DSP,一個(gè)拿來用,另一個(gè)拿來扔
13:
DSP單片機(jī)是不是就是多了一堆可以并行的高速乘法器?

]]>
初學(xué)者怎樣快速掌握單片機(jī)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2213&Page=1wangxinxin2010-12-7 14:38:06      但是,對(duì)于單片機(jī)很多人存在學(xué)習(xí)上的誤區(qū),指導(dǎo)如何下手,有的人高估了單片機(jī)的難度,有一種敬畏的心里,認(rèn)為自己不行,有的人低估了它的深度,導(dǎo)致學(xué)了很長時(shí)間還是很膚淺!因此要學(xué)習(xí)單片機(jī)首先要有一個(gè)正確的認(rèn)識(shí)和了解。
      首先,學(xué)習(xí)單片機(jī)并不像學(xué)習(xí)傳統(tǒng)數(shù)字電路或模擬電路那樣直觀,原因是除了“硬件”之外還存在一個(gè)“軟件”的因素。正是這個(gè)“軟件”因素的存在,使得許多同學(xué)怎么也弄不懂單片機(jī)的工作過程,不明白為什么將幾個(gè)數(shù)送來送去,就能控制一盞燈的亮、滅或控制一臺(tái)電機(jī)變速、液晶屏的現(xiàn)實(shí)等。由此對(duì)單片機(jī)產(chǎn)生一種“神奇”、  “敬畏”,甚至“恐懼”感,阻礙了學(xué)習(xí)單片機(jī)的熱情與興趣,因而在社會(huì)上有“單片機(jī)難學(xué)”一說。
對(duì)于初學(xué)者我有些經(jīng)驗(yàn)想和大家分享:
學(xué)習(xí)的步驟
當(dāng)前的單片機(jī)種類很多,但是51是最基礎(chǔ)的,因此單片機(jī)的學(xué)習(xí)最好也是從51開始,不僅容易上手,而且相當(dāng)實(shí)用。然而51單片機(jī)畢竟過于基礎(chǔ),后來的很多單片機(jī)在功能上都有很大的擴(kuò)展,因此按照我們實(shí)驗(yàn)室多數(shù)人的路線接下來大多數(shù)人會(huì)學(xué)習(xí)AVR單片機(jī),AVR單片機(jī)在功能上較51有很大提升,集成了A/D、快速PWM等很多實(shí)用的功能,而且和很多大型的單片機(jī)在功能上有很多類似之處,因此如果以后還想掌握其他單片機(jī)AVR無疑是一個(gè)很好的跳板。
學(xué)習(xí)的過程
學(xué)習(xí)單片機(jī)最終要的是當(dāng)然是練,我所說的學(xué)習(xí)跟課堂上的單片機(jī)學(xué)習(xí)不同,我以前也看過一些單片機(jī)教材,有些教材講的是單片機(jī)的工作原理和內(nèi)部結(jié)構(gòu),這些東西對(duì)于我們暫時(shí)并不需要,等以后開課的時(shí)候在學(xué)習(xí)好了。現(xiàn)在要學(xué)習(xí)的是暫時(shí)拋開內(nèi)部結(jié)構(gòu)原理不談,如何能用單片機(jī)寫一些簡(jiǎn)單的小程序,是從實(shí)用性的角度出發(fā),網(wǎng)上有一種說法稱之為先實(shí)踐后理論的學(xué)習(xí)方法。
以此我的觀點(diǎn)如下,單片機(jī)的硬件結(jié)構(gòu)首先要有一個(gè)基本的了解,最起碼要知道各引腳的功能、區(qū)別,能自己動(dòng)手搭一個(gè)單片機(jī)的最小系統(tǒng),然后就可以直接從程序入手,程序最好還是用C語言編程,從簡(jiǎn)單的跑馬燈做起,逐漸深入,陸續(xù)可以做一些數(shù)碼管、液晶、DS1302、DS18B20等電子元器件的應(yīng)用,在深入就可以結(jié)合一些具體實(shí)例擴(kuò)展一些中斷、串口通訊等功能。還有一點(diǎn)要聲明的是單片機(jī)里用到的C語言其實(shí)很有限,課堂上學(xué)習(xí)C++的很大一部分內(nèi)容在初期單片機(jī)編程中都用不到,因此沒必要因?yàn)橛X的自己的C語言基礎(chǔ)不是很好而對(duì)單片機(jī)望而止步!
學(xué)習(xí)的工具
    軟件方面方面,51單片機(jī)用的是KEIL軟件,這個(gè)軟件在學(xué)校圖書館軟件下載和其他網(wǎng)站上都有,具體用法自己查找相關(guān)資料,AVR的軟件就比較多了,我用的是CVAVR,另外還有ICCAVR等多款編譯軟件,這要看個(gè)人喜好了,建議有了一定的51基礎(chǔ)再學(xué)。另外就是燒寫軟件,燒寫軟件的作用就是將編譯器生成的HEX文件燒寫至單片機(jī)里,這要配合下載線實(shí)用,如果有并口的話最好用并口下載線,軟件最好用廣州雙龍的SLISP軟件,如果是筆記本沒有并口的話則要自己買一個(gè)下載器了,名稱為USBASP,網(wǎng)上電子市場(chǎng)有賣20塊錢左右,軟件會(huì)隨光盤自帶。
    硬件方面,首先是要有單片機(jī),對(duì)于單片機(jī)有一點(diǎn)要注意,51單片機(jī)最好買89S51、89S52這兩種型號(hào),上面我所說的燒寫程序是ISP方式,這兩種單片機(jī)支持ISP下載,所以如果買其他型號(hào)的燒寫程序可能會(huì)不太方便,AVR單片機(jī)常用的就是ATmega16L其它型號(hào)的區(qū)別也不是很大,甚至有些兼容。至于單片機(jī)開發(fā)板,目前的價(jià)格都很貴,不過像上次學(xué)校里廣告的那個(gè)六十多塊錢的最好還是免了,沒什么作用。能買一塊當(dāng)然好,沒有的話也不要緊,自己動(dòng)手買個(gè)電路板搭一下也很方便,引出ISP接口,燒寫程序十分容易,然后將I/O口引出擴(kuò)展也很方便。 
學(xué)習(xí)單片機(jī)的其它幾個(gè)注意點(diǎn):
1.理論與實(shí)踐并重
    對(duì)一個(gè)初學(xué)單片機(jī)的人來說,如果按教科書式的學(xué)法,上來就是一大堆指令、名詞,學(xué)了半天還搞不清這些指令起什么作用,也許用不了幾天就會(huì)覺得枯燥乏味以致半途而廢。所以學(xué)習(xí)與實(shí)踐結(jié)合是一個(gè)好方法,邊學(xué)習(xí)、邊演練,循序漸進(jìn),這樣用不了幾次就能將所用到的指令理解、吃透、扎根于腦海,甚至“根深蒂固”。也就是說,當(dāng)你學(xué)習(xí)完幾條指令后(一次數(shù)量不求多,只求懂),接下去就該做實(shí)驗(yàn)了,通過實(shí)驗(yàn),使你感受到剛才的指令產(chǎn)生的控制效果,眼睛看得見(燈光)、耳朵聽得到(聲音),更能深刻理解指令是怎樣轉(zhuǎn)化成信號(hào)去實(shí)現(xiàn)控制的,通過實(shí)驗(yàn)看到自己所學(xué)的成果不僅有一種成就感也能提升你對(duì)單片機(jī)的興趣。說句實(shí)在話,單片機(jī)與其說是學(xué)出來的,還不如說是做實(shí)驗(yàn)練出來的,何況做實(shí)驗(yàn)本身也是一種學(xué)習(xí)過程。因此邊學(xué)邊練的學(xué)習(xí)方法,效果特別好。
    2.合理安排時(shí)間持之以恒
    學(xué)習(xí)單片機(jī)不能“三天打魚、兩天曬網(wǎng)”  ,要有持之以恒的毅力與決4心。學(xué)習(xí)完幾條指令后,就應(yīng)及時(shí)做實(shí)驗(yàn),融匯貫通,而不要等幾天或幾個(gè)星期之后再做實(shí)驗(yàn),這樣效果不好甚至前學(xué)后忘。另外要有打“持久戰(zhàn)”  的心理準(zhǔn)備,不要興趣來時(shí)學(xué)上幾天,無興趣時(shí)涼上幾星期。學(xué)習(xí)單片機(jī)很重要的一點(diǎn)就是持之以恒。
3.遇到問題耐心檢查
單片機(jī)有軟硬件兩方面的內(nèi)容,有時(shí)一個(gè)程序怎么調(diào)都不出效果,然而從理論分析卻又是對(duì)的,這是就要仔細(xì)找原因了,學(xué)習(xí)單片機(jī)經(jīng)常碰到很多問題,有時(shí)一兩天都不能解決,這是就要有耐心,從底層找起,相信每找出一個(gè)錯(cuò)誤都會(huì)有一個(gè)新的收獲。切不可輕言放棄!!!
    4.對(duì)只短暫學(xué)過一遍的知識(shí),充其量只比浮光掠影稍好。因此,較好的方法是過一段時(shí)間后(1-2個(gè)月)再重新學(xué)一遍,學(xué)過的知識(shí)要經(jīng)常運(yùn)用,這樣反復(fù)循環(huán)幾次就能徹底弄懂消化,永不忘卻。
    5.要進(jìn)行適當(dāng)投資購買實(shí)驗(yàn)器材及書籍資料
    單片機(jī)技術(shù)含金量高,一旦學(xué)會(huì)后,給你帶來的效益當(dāng)然也高,無論是應(yīng)聘求職還是自起爐灶開廠辦公司,其前景都光明無限。因此在學(xué)習(xí)時(shí)要舍得適當(dāng)投資購買必要的學(xué)習(xí)、實(shí)驗(yàn)器材。另外還要經(jīng)常去科技圖書店看看,購買一些適合自己學(xué)習(xí)、提高的書籍。一本好的書籍真的很重要,可以隨時(shí)翻閱,隨時(shí)補(bǔ)充不懂或遺忘的知識(shí)。
要說的就那么多了,以上知識(shí)我這個(gè)小菜鳥的一些感觸,希望有用,以后共同學(xué)習(xí)!]]>
51讀寫IIC器件http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2212&Page=1wangxinxin2010-12-7 14:21:29這個(gè)是從我剛申請(qǐng)的blog上 粘過來的,想大家共同提高,沒給出完全的代碼,自己動(dòng)手吧

飛利浦(Philips)的IIC,物美價(jià)廉啊!才2條線搞定一切。不錯(cuò)、不錯(cuò)。所以,EEPROM呀,I/O擴(kuò)展啊,什么A/D D/A啊,外加LED驅(qū)動(dòng)、日歷時(shí)鐘芯片等等全用它。好多mcu自帶IIC控制器,不過我們常玩的51系列不怎么咬它,還好對(duì)于主從固定的模式(51為主,其他IIC器件為從),我們可以用軟件實(shí)現(xiàn)主對(duì)從的雙向讀寫

如圖  我們首先的 有 啟動(dòng)IIC器件的函數(shù) start(),和停止IIC器件的函數(shù) stop(),由于要對(duì)其進(jìn)行寫地址(SAR/W),和寫寄存器地址,得有個(gè)寫1字節(jié)的函數(shù) write_byte(),然后就是連續(xù)寫的函數(shù)write(),和連續(xù)讀read(),外加2個(gè)檢驗(yàn)是否聽話的標(biāo)志位 ack(),ACK,nck(),NCK。

       好了,東西差不多了。我們來看看怎么寫一字節(jié)進(jìn)這個(gè)玩意去。
void write_byte(unsigned char money)    //偶喜歡錢   就把money當(dāng)要寫進(jìn)去的數(shù)吧
{
       unsigned char i = 8;                    //每字節(jié)8位  么辦法一個(gè)一個(gè)來
       start();                                        //開始哦
       do
       {                                    //好了這里容易 自己去搞定吧     就是依次把移出的位 傳給IIC器件嗎
                                                  
       }while (i-- != 0)
       SDA = 1;                              // 移完了 1字節(jié) 接著干嗎??  釋放總線等 應(yīng)答位啊
       SCL = 1;
       if (SDA = = 0)                       //應(yīng)答那里來   SDA哦 SDA=0 為應(yīng)答位  =1為非應(yīng)答位
       {
              ack();                  //返回有應(yīng)答
        }
        else
        {
              nck();                     //返回?zé)o應(yīng)答
        }                                          /////////     哦耶  我會(huì)寫寫IIC的程序了哦
}
 
好了 我們來個(gè) 在IIC器件m處連續(xù)寫n個(gè) 在51中首地址為 k 的數(shù)
void write(unsigned char m,unsigned char k,unsigned char n)
{
        start();
         write_byte(SAW)  ;                 //得讓IIC知道你在寫還是讀那個(gè)IIC器件  所以的先寫入個(gè)SAW
        if (NCK)                                     //這是個(gè) 對(duì)無應(yīng)答的處理
       {
       }
       write_byte(m)  ;                     //往m處寫吧
        if (NCK)                                     //這還是個(gè)對(duì)無應(yīng)答的處理
       {
       }
       do
       {
                //好了把51中從k開始的數(shù)用    write_byte()  一個(gè)一個(gè)的往IIC里扔吧
       }
       delay();                 //給點(diǎn)時(shí)間讓IIC去消化下   呵呵其實(shí)是 IIC頁寫功能要求的有點(diǎn)時(shí)間自己倒騰
}
 
連寫的程序也過了  搞讀吧     在IIC器件m處連續(xù)讀n個(gè)數(shù)并把它們放在51中首地址為 k 的地方
void read(unsigned char m,unsigned char k,unsigned char n)
{
        start();
        write_byte(SAW)  ;                     //讀之前還有點(diǎn)東西要寫  就是 m了
        if (NCK)                                     //這是個(gè) 對(duì)無應(yīng)答的處理
       {
       }
       write_byte(m)  ;                            //去m處讀,所以
        if (NCK)                                     //這還是個(gè)對(duì)無應(yīng)答的處理
       {
       }
       stop();
       start();                                        
       write_byte(SAR)  ;                     //真正的讀開始了
                                         // 接下來就是個(gè) 從SDA讀n個(gè)數(shù)  每個(gè)數(shù)讀8位的程序了
 
                                         //  自己輕松搞定吧  快下班了       或者以后寫吧
}

這個(gè)只要注意SAW、SAR  就能用在任意IIC了,但連讀和連寫  當(dāng)n > 1 時(shí),還有個(gè)致命的小問題,書上有,給懶人留點(diǎn)發(fā)揮的空間吧,反正問題容易解決,只是完全不看書的話,一定出事而已

]]>
在有限資源的單片機(jī)上實(shí)現(xiàn)模擬系統(tǒng)的討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2211&Page=1wangxinxin2010-12-7 14:18:11嵌入式網(wǎng)絡(luò)單片機(jī)集成式開發(fā)系統(tǒng)主模塊模擬家庭網(wǎng)關(guān),并利用其外圍擴(kuò)展模塊模擬信息家電,從而成功搭建了一個(gè)模擬家庭網(wǎng)關(guān)和信息家電交互的軟硬件平臺(tái),這種利用一個(gè)單片機(jī)集成系統(tǒng)對(duì)家庭網(wǎng)關(guān)和信息家電進(jìn)行模擬,為研究信息家電的內(nèi)部體系結(jié)構(gòu)以及家庭網(wǎng)關(guān)和信息家電功能分配提供了實(shí)驗(yàn)平臺(tái),同時(shí)大大節(jié)省了資源和費(fèi)用。

  2  相關(guān)理論研究

  2.1信息家電

  信息家電是所有能夠通過網(wǎng)絡(luò)系統(tǒng)交互信息的家電產(chǎn)品,也就是說信息家電是將數(shù)字技術(shù)和網(wǎng)絡(luò)技術(shù)集成在電冰箱、洗衣機(jī)等傳統(tǒng)家用電器上并以此為基礎(chǔ)建立家庭網(wǎng)絡(luò)環(huán)境,信息家電具有以下特點(diǎn):(1)通過有線或無線方式相連,能相互識(shí)別并協(xié)同工作與網(wǎng)絡(luò)化;(2)能夠遵循一定的協(xié)議,通過家庭網(wǎng)關(guān)或直接與外部網(wǎng)絡(luò)進(jìn)行信息交互;(3)功能單一[1]集中并且使用簡(jiǎn)單;(4)具有實(shí)時(shí)化、數(shù)字化與智能化的特點(diǎn);(5)應(yīng)用嵌入式操作系統(tǒng)。根據(jù)這些特點(diǎn),我們將其內(nèi)部體系結(jié)構(gòu)分為上下兩大模塊層,上層為軟件模塊,由上至下為應(yīng)用層(如服務(wù)注冊(cè)、應(yīng)用協(xié)議解釋等)、嵌入式操作系統(tǒng)層(如嵌入式Linux、WinCE等)、設(shè)備驅(qū)動(dòng)層(如液晶顯示屏驅(qū)動(dòng)、觸摸屏驅(qū)動(dòng)等),下層為硬件模塊,包括核心主板(包括嵌入式處理器芯片如S3C2410等) 、家電硬件及控制層(自帶控制模塊)、外圍芯片(如RTL8019AS、Bluetooth等)。其中核心主板為主控制器,信息家電通過外圍芯片與外界進(jìn)行信息交互,在核心主板的控制下再與家電控制模塊進(jìn)行雙向信息交流,從而實(shí)現(xiàn)對(duì)家電硬件的監(jiān)控。這里提到的嵌入式操作系統(tǒng)在今后隨著信息家電產(chǎn)品功能的增多增強(qiáng),對(duì)其的使用是一種必然趨勢(shì),本文在有限資源的單片機(jī)上實(shí)現(xiàn)模擬系統(tǒng)就沒有對(duì)其進(jìn)行討論。

  2.2家庭網(wǎng)關(guān)

  單個(gè)的信息家電也可以具有與Internet直接連接上網(wǎng)的功能,但是借助現(xiàn)有的計(jì)算機(jī)網(wǎng)絡(luò)技術(shù),將家庭內(nèi)各種家電和設(shè)備連網(wǎng),通過家庭網(wǎng)絡(luò)為人們提供各種豐富、多樣化、個(gè)性化、方便、舒適、安全和高效的服務(wù),把所有的信息家電連接起來形成一個(gè)家庭網(wǎng)絡(luò),再把接入Internet的功能移至到家庭網(wǎng)關(guān),由家庭網(wǎng)關(guān)承擔(dān)起與Internet進(jìn)行信息交互的責(zé)任,這不僅會(huì)減少信息家電的負(fù)載、降低成本,而且對(duì)家庭網(wǎng)絡(luò)化也是一種促進(jìn),因?yàn)榧彝ゾW(wǎng)絡(luò)內(nèi)部可以使用不同的協(xié)議,從而更具靈活性。因此,實(shí)現(xiàn)家庭網(wǎng)絡(luò)與外部信息的交換需要設(shè)計(jì)一個(gè)理想的家庭網(wǎng)關(guān)。家庭網(wǎng)關(guān)應(yīng)具備的兩個(gè)主要功能是:(1)作為家庭內(nèi)部網(wǎng)絡(luò)和外部網(wǎng)絡(luò)連接的一種物理接口;(2)使住宅用戶可以獲得各種家庭服務(wù)(包括現(xiàn)有的服務(wù)和未來可能出現(xiàn)的服務(wù),譬如經(jīng)過授權(quán)能打開朋友家的影碟機(jī)進(jìn)行影片觀看等)的平臺(tái)。

  家庭網(wǎng)關(guān)接口的有效的解決方案,當(dāng)前比較統(tǒng)一的觀點(diǎn)是開發(fā)一個(gè)集中式網(wǎng)關(guān),它將提供一個(gè)最有效的橋接外部網(wǎng)絡(luò)和家庭網(wǎng)絡(luò)或設(shè)備的解決方案。另外,以PC作為家庭網(wǎng)關(guān),體積過大,環(huán)境適應(yīng)能力差,而且還必須安裝兩個(gè)網(wǎng)絡(luò)適配器(一個(gè)用于連接 Internet,一個(gè)用于連接內(nèi)部網(wǎng)絡(luò)),總的費(fèi)用也比一臺(tái)專用網(wǎng)關(guān)要高。因此,設(shè)計(jì)專用網(wǎng)關(guān)是完全有必要的。鑒于家庭網(wǎng)關(guān)的功能特點(diǎn),其邏輯結(jié)構(gòu)應(yīng)如圖1所示。

家庭網(wǎng)關(guān)邏輯結(jié)構(gòu)

圖1家庭網(wǎng)關(guān)邏輯結(jié)構(gòu)

  3   硬件選型

  3.1 SX52的特點(diǎn)

  如何利用單片機(jī)本身有限的資源對(duì)信息進(jìn)行TCP/IP協(xié)議處理,使之變成可以在互聯(lián)網(wǎng)上傳輸?shù)腎P數(shù)據(jù)包,目前有兩種方案:一種是PC網(wǎng)關(guān)+專用網(wǎng),缺點(diǎn)是要增加布線和第三方協(xié)議轉(zhuǎn)換軟件;另一種是32位MCU+RTOS,弊端是開發(fā)難,成本極高。而用軟件方法實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議比采用集成網(wǎng)絡(luò)協(xié)議的芯片,具有節(jié)省空間、降低成本的優(yōu)點(diǎn),更重要的是可以隨意配置甚至修改各種協(xié)議,且能通過軟件升級(jí)方式跟隨未來的發(fā)展。通過美國Ubicom公司的SX52微控器進(jìn)行網(wǎng)絡(luò)控制就具備這個(gè)優(yōu)勢(shì),其主要特點(diǎn)有:(1)速度快,在100MHz頻率下能達(dá)到100MIPS;(2)現(xiàn)成的網(wǎng)絡(luò)協(xié)議模塊供套用,可以通過虛擬外設(shè)功能來運(yùn)行網(wǎng)絡(luò)協(xié)議棧,例如TCP、IP、HTTP以及SMTP等;(3)強(qiáng)大的虛擬外設(shè)功能,即通過軟件對(duì)I/O口進(jìn)行靈活的配置,CPU執(zhí)行虛擬軟件模塊就可以驅(qū)動(dòng)普通的I/O口來模擬外設(shè)的功能,比如UART、SPI、IIC和FSK等。采用其成功的網(wǎng)絡(luò)協(xié)議模塊和一些適用于小型嵌入式系統(tǒng)的做法構(gòu)筑現(xiàn)場(chǎng)控制是非常合適的做法。 <!-- 2008-9-16 20:11:55-->

]]>
TCL-東芝單片機(jī)維修實(shí)例http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2210&Page=1wangxinxin2010-12-7 14:16:54機(jī)型:AT21S135
例1. 開機(jī)燒保險(xiǎn)
故障現(xiàn)象: 接通電源時(shí),保險(xiǎn)絲即刻燒斷。
分析與檢修

開機(jī)保險(xiǎn)絲即刻被燒斷,首先應(yīng)檢查整流電路及開關(guān)電源部分是否存在
短路元件,其次應(yīng)檢查行輸出部分有無短路元件。檢查該例故障時(shí),發(fā)現(xiàn)+B 電源的負(fù)載有
短路,查行輸出管Q402 ,其集電極到發(fā)射極已短路,進(jìn)一步發(fā)現(xiàn)逆程電容C406 內(nèi)部已開
路。這說明逆程電容開路失效使逆程時(shí)間縮短,逆程脈沖幅度增大,將行輸出管擊穿。
例2.
開關(guān)電源控制失效
故障現(xiàn)象:開機(jī)后無聲、無圖、無光柵。
分析與檢修:打開機(jī)殼檢查,發(fā)現(xiàn)R801 已燒斷,Q804 集射結(jié)已擊穿。更換新件后,
開機(jī)緩慢提升交流電壓,發(fā)現(xiàn)R801 溫升很快,立即關(guān)閉交流電源,檢查發(fā)現(xiàn)C810 內(nèi)部開
路,造成穩(wěn)壓調(diào)整回路失效,使開關(guān)電源輸出電壓過高,負(fù)載電流過大,致Q804 燒壞。
更換Q804 及R801 、C810 后,電路工作恢復(fù)正常。
例3.
行線性電感燒壞
故障現(xiàn)象:開機(jī)后無聲、無圖、只有豎直一條亮線。
分析與檢修:檢查時(shí)首先發(fā)現(xiàn)有燒焦氣味,說明有被燒焦的器件。可先在功率較大的電
路部分查找故障部位,隨發(fā)現(xiàn)行線性校正電感L412 焊腳脫焊、電阻R411 已燒壞。
這一故障的引發(fā)原因,是L412 的引腳焊接松動(dòng),導(dǎo)致行電流全部流過R411 并將其燒
毀,行掃描停止。但回掃變壓器T402 的初級(jí)繞組與逆程電容仍產(chǎn)生逆程高壓脈沖,所以由
高壓包產(chǎn)生的各路電源仍正常供電,場(chǎng)掃仍然進(jìn)行,因而出現(xiàn)豎直一條亮線。替換電阻R411 、
加強(qiáng)焊接L412 后電路恢復(fù)正常工作。
例4. 搜臺(tái)有遺漏
故障現(xiàn)象: 預(yù)置搜索頻道時(shí),某些電視頻道被遺漏。
分析與檢修: 由故障現(xiàn)象可知,搜索功能有但不完善。因此不是MCU 內(nèi)部及高頻調(diào)諧
器的故障,可能是搜索頻道時(shí)外部的信號(hào)不能到達(dá)MCU 。
與搜索頻道有關(guān)的信號(hào),除TMPA8803 內(nèi)部的AFA 、AFB 以外,2135S 型彩電線路還
增加了行同步頭分離電路,由Q202 、Q203 組成。該電路從TMPA8803 的Pin45 輸出的全電
視信號(hào)中,分離出行同步頭,再取道Pin62 輸入到MCU,作為收到電視節(jié)目的標(biāo)志信號(hào)

MCU 據(jù)此可判斷已搜索到一個(gè)電視頻道。
進(jìn)一步檢查發(fā)現(xiàn),C207 短路失效,分離電路不能正常工作,MCU 失去了判斷的依據(jù)

發(fā)生了某些頻道不能搜索預(yù)置的故障。
例5. 無TV 輸出
故障現(xiàn)象:無聲、無圖、有藍(lán)屏。
分析與檢修:有藍(lán)屏,所以視頻輸出部分、掃描部分、MCU 等都是正常的,故障可能
在高頻頭至TV 輸入引腳(Pin26 )之間。用示波器檢查Pin30 的視頻輸出正常,但Pin26
沒有視頻信號(hào)輸入。進(jìn)一步檢查發(fā)現(xiàn)Q209 發(fā)射極虛焊,中斷了TV 信號(hào)的輸出。補(bǔ)焊后故
障排除。
例6. AV 信號(hào)不能輸入
故障現(xiàn)象:TV 信號(hào)接收正常,AV 信號(hào)不能接收。

分析與檢修:懷疑是AV 輸入電路有故障,但反復(fù)檢查未發(fā)現(xiàn)不正常的地方。后來又將
AV 信號(hào)經(jīng)C242 耦合從Pin26 輸入,TV 信號(hào)經(jīng)C909 耦合從Pin24 輸入作試驗(yàn),結(jié)果AV 信
號(hào)能正常顯示,說明Pin24 輸入電路有故障。替換TMPA8803 后AV、TV 均能正常接收。
例7.晶振損壞
故障現(xiàn)象:接通電源后指示燈亮,按遙控鍵和本機(jī)鍵均無法進(jìn)入收視狀態(tài)。
分析與檢修:從故障現(xiàn)象推知,MCU 部分沒有啟動(dòng)運(yùn)行,所以遙控鍵、本機(jī)鍵均不起作
用。這有可能是MCU 的復(fù)位電路不正常或晶振損壞。檢查發(fā)現(xiàn)復(fù)位電路各晶體管都能正常
工作。懷疑晶振有故障,替換一新的晶振作試驗(yàn),故障排除。
例8. FBP 脈沖消失
故障現(xiàn)象:有正常伴音,屏幕是“黑屏”。
分析與檢修:可以作待機(jī)轉(zhuǎn)換,電源指示燈也亮,但屏幕是黑屏,不能顯示菜單和圖像
檢查見顯像管燈絲亮,說明行掃描正常,調(diào)整簾柵電壓可見回掃線。
上述現(xiàn)象說明RGB 的輸出為截止電平,這是東芝機(jī)芯對(duì)顯像管的一種保護(hù)措施。當(dāng)掃
描電路部分出現(xiàn)故障使FBP 脈沖不能到達(dá)TMPA8803 的Pin12 腳時(shí),為了保護(hù)顯像管的熒
屏不被電子束打壞,TMPA8803 通過I2C 總線自動(dòng)將RGB 的輸出電平變?yōu)楹陔娖剑故?br/>減至最小。
檢查后發(fā)現(xiàn)D404 管擊穿短路,造成FBP 脈沖消失,屏幕呈黑屏。
例9.視放電路偏壓不正常
故障現(xiàn)象:屏幕呈白色,可見到回掃線。
分析與檢修:屏幕呈白色,行、場(chǎng)回掃線清晰可辨,這種故障一般發(fā)生在末級(jí)視放電路,
直接原因是顯像管三個(gè)陰極的電流過大,陰極電位太低而形成回掃期不能使陰極電流截止。
使三個(gè)電子槍同時(shí)不能截止的原因只能是偏置電路的故障,三個(gè)通道的放大電路同時(shí)損
壞的幾率很小。檢查發(fā)現(xiàn)Q510 集極擊穿短路,使Q501 、Q502 、Q503 的發(fā)射極電位偏低

引起陰極電位低下而出現(xiàn)回掃線。更換Q510 后偏置恢復(fù)正常。
例10.二次穩(wěn)壓電源無輸出
故障現(xiàn)象:開機(jī)出現(xiàn)“三無”,遙控鍵、本機(jī)鍵不起作用。
分析與檢修:首先檢查電源部分,看到開關(guān)電源電路能正常工作,有112V 主電源輸出。
檢查二次穩(wěn)壓部分,發(fā)現(xiàn)H-Vcc(+9V)電源電壓只有4.5V 左右。該電源的18V 電源供給
正常,輸出變低,有可能是負(fù)載短路。
檢查發(fā)現(xiàn)IC201 的Pin17 已短路,Q207 、Q206 并未損壞,后發(fā)現(xiàn)C030 電容擊穿短路,
更換后H-Vcc 電源故障排除。原來是C030 短路后,使Q206 基極電位升高,H-Vcc 電源電
壓升高,損壞了IC201(TMPA8803)。
例11. 行管推動(dòng)不足
故障現(xiàn)象:行管過熱。
分析與檢修:引起行管過熱有可能是推動(dòng)不足,也可能是推動(dòng)電流過大。觀察發(fā)現(xiàn)光柵
右后部,圖像清晰度下降,懷疑因行管推動(dòng)電流不足而使偏轉(zhuǎn)電流線性度下降。
檢查行推動(dòng)級(jí)電路,112V 電源供電正常,R402 由兩個(gè)1.5W 電阻并聯(lián)而成,現(xiàn)其中一
個(gè)虛焊,使R402 由2.4K 變成4.8K 。加在T401 上的電源電壓下降,導(dǎo)致推動(dòng)電流不足,行
管發(fā)熱。補(bǔ)焊R402 后行管溫度恢復(fù)正常。
例12. 行線性補(bǔ)償電阻虛焊
故障現(xiàn)象:屏幕上出現(xiàn)一條豎直亮線。
分析與檢修:屏幕有豎直亮線,說明行偏轉(zhuǎn)線路有故障,行掃描已停止,但由回掃變壓
器初級(jí)繞組產(chǎn)生的逆程脈沖還存在,所以才有燈絲電壓和EHT 電壓,豎直亮線才會(huì)顯示出
來。

檢查行偏轉(zhuǎn)線路,見R411 已燒毀,L412 的引腳焊盤燒壞。更換R411 ,檢修L412 引腳
焊盤,故障排除。
這一故障較常見,因L412 比較重,兩腳支撐易引起焊腳松動(dòng)而導(dǎo)致虛焊,迫使偏轉(zhuǎn)電
流全部從R411 流過,將該電阻燒壞。
機(jī)型:AT2575S
問題1:冷機(jī)開機(jī)電源有響聲

解決方案:將R807 由4.7K 1/6W 改為3.9K 1/6W


問題2:場(chǎng)中心偏低。
解決方案:增加R317 1K 1/2W 電阻,并聯(lián)于R311(P411 負(fù)端)到
地之間。
問題3:麗彩效果不明顯。
解決方案:R501 、R505 、R510 由1.5K 改為1.8K 1/6W,R526 由4.7K
改為2.7K 1/6W 。
機(jī)型:AT21S192
問題1:全屏最大亮度不達(dá)標(biāo)

解決方案:將R414 由24K 改為20K 1/6W 的電阻


問題2:高溫老化“不能開機(jī)”。
解決方案:D802 取消;板底加1K 1/6W 從J803 到806(+)端;R806 由4.7K 1/6W 電阻改
為3.3K 1/6W;R807A 由飛線改為820 歐姆1/6W 的電阻;C814 由100pF 50V 改為330pF 50V
的電容。
問題3:高溫老化場(chǎng)幅底部反折。
解決方案:R306 由4.3 歐2W 改為1.8 歐2W 的電阻;工廠數(shù)據(jù)

VCEN 由12 改為06。
問題4:AV 無藍(lán)場(chǎng)。
解決方案:Q202 E 極到地加220uF 16V;由J002 由飛線改為22uH 的電感。
問題5:伴音載頻過調(diào)制時(shí)所引起的伴音通道電壓諧波失真。
解決方案:C603 增加10uF 16V 的電解電容;R006 由8.2K 改為7.5K 1/6W 的電阻。
機(jī)型:AT21S135
問題1:CCTV-4 、惠州點(diǎn)歌臺(tái)轉(zhuǎn)臺(tái)彩色遲出,弱信號(hào)部分臺(tái)轉(zhuǎn)臺(tái)彩色遲出。
解決方案:將C021 、C022 由30pF 50V 改為39pF 50V 。
問題2:拉幕關(guān)機(jī)閃亮線

解決方案:將工廠菜單中的DELAY 項(xiàng)設(shè)為00


機(jī)型:AT21S135
問題1:加大聲音圖像收縮。
解決方案:將R235 39K 改為22K 1/6W,R241 47K 1/6W 改為2.2K 1/6W 。
問題2:轉(zhuǎn)臺(tái)聲音不良。
解決方案:增加電容C612 22uF 16V,Q601(11-SC1815-YB1)改為11-TC124E-SB1,R612
4.7K 取消。
問題3:實(shí)際收看VH 段部分節(jié)目有鄰頻干擾,信號(hào)強(qiáng)度為75dB 以上。
解決方案:進(jìn)入工廠模式將AGC 數(shù)據(jù)從24 改為21。
問題4:實(shí)際收看有部分節(jié)目圖象輸出不同步。
解決方案:將C917 47uF 16V 更改為5mm 飛線。
機(jī)型:AT21S179
問題1:AT21S179 機(jī)型在待機(jī)狀態(tài)下,電源部分發(fā)出較大的交流聲。
解決方案:將R807 由3.9K 歐改為4.3K 歐1/6W;在光耦第2 腳加一個(gè)2.2uF/50V 的電解電
容。]]>
單片機(jī)要自動(dòng)完成計(jì)算,它應(yīng)該具有哪些最重要的部分呢?http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2209&Page=1wangxinxin2010-12-7 14:15:08
  現(xiàn)在,我們用單片機(jī)來完成上述過程,顯然,它首先要有代替算盤進(jìn)行運(yùn)算的部件,這就是“運(yùn)算器”;其次,要有能起到紙和筆作用的器件,即能記憶原始題目、原始數(shù)據(jù)和中間結(jié)果,還要記住使單片機(jī)能自動(dòng)進(jìn)行運(yùn)算而編制的各種命令。這類器件就稱為“存貯器”。此外,還需要有能代替人作用的控制器,它能根據(jù)事先給定的命令發(fā)出各種控制信號(hào),使整個(gè)計(jì)算過程能一步步地進(jìn)行。但是光有這三部分還不夠,原始的數(shù)據(jù)與命令要輸入,計(jì)算的結(jié)果要輸出,都需要按先后順序進(jìn)行,有時(shí)還需等待。

  如上例中,當(dāng)在計(jì)算163×156時(shí),數(shù)字36就不能同時(shí)進(jìn)入運(yùn)算器。因此就需要在單片機(jī)上設(shè)置按控制器的命令進(jìn)行動(dòng)作的“門”,當(dāng)運(yùn)算器需要時(shí),就讓新數(shù)據(jù)進(jìn)入。或者,當(dāng)運(yùn)算器得到最后結(jié)果時(shí),再將此結(jié)果輸出,而中間結(jié)果不能隨便“溜出”單片機(jī)。這種對(duì)輸入、輸出數(shù)據(jù)進(jìn)行一定管理的“門”電路在單片機(jī)中稱為“口”(Port)。在單片機(jī)中,基本上有三類信息在流動(dòng),一類是數(shù)據(jù),即各種原始數(shù)據(jù)(如上例中的36、163等)、中間結(jié)果(如166÷34所得的商4、余數(shù)30等)、程序(命令的集合)等。這樣要由外部設(shè)備通過“口”進(jìn)入單片機(jī),再存放在存貯器中,在運(yùn)算處理過程中,數(shù)據(jù)從存貯器讀入運(yùn)算器進(jìn)行運(yùn)算,運(yùn)算的中間結(jié)果要存入存貯器中,或最后由運(yùn)算器經(jīng)“出入口”輸出。

  用戶要單片機(jī)執(zhí)行的各種命令(程序)也以數(shù)據(jù)的形式由存貯器送入控制器,由控制器解讀(譯碼)后變?yōu)楦鞣N控制信號(hào),以便執(zhí)行如加、減、乘、除等功能的各種命令。所以,這一類信息就稱為控制命令,即由控制器去控制運(yùn)算器一步步地進(jìn)行運(yùn)算和處理,又控制存貯器的讀(取出數(shù)據(jù))和寫(存入數(shù)據(jù))等。第三類信息是地址信息,其作用是告訴運(yùn)算器和控制器在何處去取命令取數(shù)據(jù),將結(jié)果存放到什么地方,通過哪個(gè)口輸入和輸出信息等。

  存貯器又分為只讀存貯器和讀寫存貯器兩種,前者存放調(diào)試好的固定程序和常數(shù),后者存放一些隨時(shí)有可能變動(dòng)的數(shù)據(jù)。顧名思義,只讀存貯器一旦將數(shù)據(jù)存入,就只能讀出,不能更改(EPROM、E2PROM等類型的ROM可通過一定的方法來更改、寫入數(shù)據(jù)——編者注)。而讀寫存貯器可隨時(shí)存入或讀出數(shù)據(jù)。

  實(shí)際上,人們往往把運(yùn)算器和控制器合并稱為中央處理單元——CPU。單片機(jī)除了進(jìn)行運(yùn)算外,還要完成控制功能。所以離不開計(jì)數(shù)和定時(shí)。因此,在單片機(jī)中就設(shè)置有定時(shí)器兼計(jì)數(shù)器,其基本結(jié)構(gòu)與本連載之(二)中的舉例類似。到這里為止,我們已經(jīng)知道了單片機(jī)的基本組成,即單片機(jī)是由中央處理器(即CPU中的運(yùn)算器和控制器)、只讀存貯器(通常表示為ROM)、讀寫存貯器(又稱隨機(jī)存貯器通常表示為RAM)、輸入/輸出口(又分為并行口和串行口,表示為I/O口)等等組成。實(shí)際上單片機(jī)里面還有一個(gè)時(shí)鐘電路,使單片機(jī)在進(jìn)行運(yùn)算和控制時(shí),都能有節(jié)奏地進(jìn)行。另外,還有所謂的“中斷系統(tǒng)”,這個(gè)系統(tǒng)有“傳達(dá)室”的作用,當(dāng)單片機(jī)控制對(duì)象的參數(shù)到達(dá)某個(gè)需要加以干預(yù)的狀態(tài)時(shí),就可經(jīng)此“傳達(dá)室”通報(bào)給CPU,使CPU根據(jù)外部事態(tài)的輕重緩急來采取適當(dāng)?shù)膽?yīng)付措施。

  現(xiàn)在,我們已經(jīng)知道了單片機(jī)的組成,余下的問題是如何將它們的各部分連接成相互關(guān)聯(lián)的整體呢?實(shí)際上,單片機(jī)內(nèi)部有一條將它們連接起來的“紐帶”,即所謂的“內(nèi)部總線”。此總線有如大城市的“干道”,而CPU、ROM、RAM、I/O口、中斷系統(tǒng)等就分布在此“總線”的兩旁,并和它連通。從而,一切指令、數(shù)據(jù)都可經(jīng)內(nèi)部總線傳送,有如大城市內(nèi)各種物品的傳送都經(jīng)過干道進(jìn)行。 

 

單片機(jī)指令系統(tǒng)與匯編語言程序

  前面已經(jīng)講述了單片機(jī)的幾個(gè)主要組成部分,這些部分構(gòu)成了單片機(jī)的硬件。所謂硬件(Hardware),就是看得到,摸得到的實(shí)體。但是,光有這樣的硬件,還只是有了實(shí)現(xiàn)計(jì)算和控制功能的可能性。單片機(jī)要真正地能進(jìn)行計(jì)算和控制,還必須有軟件(Software)的配合。軟件主要指的是各種程序。只有將各種正確的程序“灌入”(存入)單片機(jī),它才能有效地工作。單片機(jī)所以能自動(dòng)地進(jìn)行運(yùn)算和控制,正是由于人把實(shí)現(xiàn)計(jì)算和控制的步驟一步步地用命令的形式,即一條條指令(Instruction)預(yù)先存入到存貯器中,單片機(jī)在CPU的控制下,將指令一條條地取出來,并加以翻譯和執(zhí)行。就以兩個(gè)數(shù)相加這一簡(jiǎn)單的運(yùn)算來說,當(dāng)需要運(yùn)算的數(shù)已存入存貯器后,還需要進(jìn)行以下幾步:


  第一步:把第一個(gè)數(shù)從它的存貯單元(Location)中取出來,送至運(yùn)算器。   第二步:把第二個(gè)數(shù)從它所在的存貯單元中取出來,送至運(yùn)算器; 第三步:相加; 第四步:把相加完的結(jié)果,送至存貯器中指定的單元。

   所有這些取數(shù)、送數(shù)、相加、存數(shù)等等都是一種操作(Operation),我們把要求計(jì)算機(jī)執(zhí)行的各種操作用命令的形式寫下來,這就是指令。但是怎樣才能辨別和執(zhí)行這些操作呢?這是在設(shè)計(jì)單片機(jī)時(shí)由設(shè)計(jì)人員賦予它的指令系統(tǒng)所決定的。一條指令,對(duì)應(yīng)著一種基本操作;單片機(jī)所能執(zhí)行的全部指令,就是該單片機(jī)的指令系統(tǒng)(Iustruction Set),不同種類的單片機(jī),其指令系統(tǒng)亦不同。


  使用單片機(jī)時(shí),事先應(yīng)當(dāng)把要解決的問題編成一系列指令。這些指令必須是選定的單片機(jī)能識(shí)別和執(zhí)行的指令。單片機(jī)用戶為解決自己的問題所編的指令程序,稱為源程序(Source Program)。指令通常分為操作碼(Opcode)和操作數(shù)(Operand)兩大部分。操作碼表示計(jì)算機(jī)執(zhí)行什么操作,即指令的功能;操作數(shù)表示參加操作的數(shù)或操作數(shù)所在的地址(即操作數(shù)所存放的地方編號(hào))。因?yàn)閱纹瑱C(jī)是一種可編程器件,只“認(rèn)得”二進(jìn)碼(0、1)。要單片機(jī)運(yùn)作,單片機(jī)系統(tǒng)中的所有指令,都必須以二進(jìn)制編碼的形式來表示。例如,在Intel公司的MCS-51系列單片機(jī)中,從存貯器中取出一數(shù)到CPU中的累加器(在運(yùn)算器中,參與運(yùn)算、存放運(yùn)算結(jié)果的專用寄存器)的指令代碼為74H,累加器內(nèi)容加立即數(shù)的代碼為24H,再加上立即數(shù)代碼,累加器送數(shù)到內(nèi)部RAM存貯器的代碼為F6H~F7H等。這些指令是用十六進(jìn)制表示二進(jìn)制的機(jī)器碼。

  MCS-51單片機(jī)的字長為8位,有時(shí),要完成某些操作用一個(gè)字節(jié)尚不能充分表達(dá)。所以,在指令系統(tǒng)中有單字節(jié)指令,也有多字節(jié)指令。機(jī)器碼是由一連串的0和1組成,沒有明顯的特征,不好記憶,不易理解,易出錯(cuò)。所以,直接用它來編寫程序十分困難。因而,人們就用一些助記符(Mue monic)——通常是指令功能的英文縮寫來代替操作碼,如MCS-51中數(shù)的傳送常用MOV(Move的縮寫)、加法用Add(Addition的縮寫)來作為助記符。這樣,每條指令有明顯的動(dòng)作特征,易于記憶和理解,也不容易出錯(cuò)。用助記符來編寫的程序稱為匯編語言程序。但是,助記符編寫的程序便于人理解,可單片機(jī)卻只認(rèn)識(shí)二進(jìn)制機(jī)器代碼,因此,為了讓單片機(jī)能“讀懂”匯編語言程序必須再轉(zhuǎn)換成由二進(jìn)制機(jī)器碼構(gòu)成的程序,這種轉(zhuǎn)換過程,就稱為“匯編”。匯編可借助于人工查表法來實(shí)現(xiàn),也可借助PC機(jī)通過所謂“交叉匯編程序”來完成。由機(jī)器碼構(gòu)成的用戶程序一旦“進(jìn)入”了單片機(jī),再“啟動(dòng)”單片機(jī),就可讓它執(zhí)行輸入程序所規(guī)定的任務(wù)。

MCU--51 CPU和存儲(chǔ)器

單片機(jī)8051的CPU由運(yùn)算器和控制器組成。

  一、運(yùn)算器                                       運(yùn)算器以完成二進(jìn)制的算術(shù)/邏輯運(yùn)算部件ALU為核心,再加上暫存器TMP、累加器ACC、寄存器B、程序狀態(tài)標(biāo)志寄存器PSW及布爾處理器。累加器ACC是一個(gè)八位寄存器,它是CPU中工作最頻繁的寄存器。在進(jìn)行算術(shù)、邏輯運(yùn)算時(shí),累加器ACC往往在運(yùn)算前暫存一個(gè)操作數(shù)(如被加數(shù)),而運(yùn)算后又保存其結(jié)果(如代數(shù)和)。寄存器B主要用于乘法和除法操作。標(biāo)志寄存器PSW也是一個(gè)八位寄存器,用來存放運(yùn)算結(jié)果的一些特征,如有無進(jìn)位、借位等。其每位的具體含意如下所示。PSW CY AC FO RS1 RS0 OV - P對(duì)用戶來講,最關(guān)心的是以下四位。

  1進(jìn)位標(biāo)志CY(PSW7)。它表示了運(yùn)算是否有進(jìn)位(或借位)。如果操作結(jié)果在最高位有進(jìn)位(加法)或者借位(減法),則該位為1,否則為0。

  2輔助進(jìn)位標(biāo)志AC。又稱半進(jìn)位標(biāo)志,它反映了兩個(gè)八位數(shù)運(yùn)算低四位是否有半進(jìn)位,即低四位相加(或減)有否進(jìn)位(或借位),如有則AC為1狀態(tài),否則為0。

  3溢出標(biāo)志位OV。MCS-51反映帶符號(hào)數(shù)的運(yùn)算結(jié)果是否有溢出,有溢出時(shí),此位為1,否則為0。

  4奇偶標(biāo)志P。反映累加器ACC內(nèi)容的奇偶性,如果ACC中的運(yùn)算結(jié)果有偶數(shù)個(gè)1(如11001100B,其中有4個(gè)1),則P為0,否則,P=1。
PSW的其它位,將在以后再介紹。由于PSW存放程序執(zhí)行中的狀態(tài),故又叫程序狀態(tài)字?運(yùn)算器中還有一個(gè)按位(bit)進(jìn)行邏輯運(yùn)算的邏輯處理機(jī)(又稱布爾處理機(jī))。其功能在介紹位指令時(shí)再說明。

二、控制器

  控制器是CPU的神經(jīng)中樞,它包括定時(shí)控制邏輯電路、指令寄存器、譯碼器、地址指針DPTR及程序計(jì)數(shù)器PC、堆棧指針SP等。這里程序計(jì)數(shù)器PC是由16位寄存器構(gòu)成的計(jì)數(shù)器。要單片機(jī)執(zhí)行一個(gè)程序,就必須把該程序按順序預(yù)先裝入存儲(chǔ)器ROM的某個(gè)區(qū)域。單片機(jī)動(dòng)作時(shí)應(yīng)按順序一條條取出指令來加以執(zhí)行。因此,必須有一個(gè)電路能找出指令所在的單元地址,該電路就是程序計(jì)數(shù)器PC。當(dāng)單片機(jī)開始執(zhí)行程序時(shí),給PC裝入第一條指令所在地址,它每取出一條指令(如為多字節(jié)指令,則每取出一個(gè)指令字節(jié)),PC的內(nèi)容就自動(dòng)加1,以指向下一條指令的地址,使指令能順序執(zhí)行。只有當(dāng)程序遇到轉(zhuǎn)移指令、子程序調(diào)用指令,或遇到中斷時(shí)(后面將介紹),PC才轉(zhuǎn)到所需要的地方去。8051 CPU碢C指定的地址,從ROM相應(yīng)單元中取出指令字節(jié)放在指令寄存器中寄存,然后,指令寄存器中的指令代碼被譯碼器譯成各種形式的控制信號(hào),這些信號(hào)與單片機(jī)時(shí)鐘振蕩器產(chǎn)生的時(shí)鐘脈沖在定時(shí)與控制電路中相結(jié)合,形成按一定時(shí)間節(jié)拍變化的電平和時(shí)鐘,即所謂控制信息,在CPU內(nèi)部協(xié)調(diào)寄存器之間的數(shù)據(jù)傳輸、運(yùn)算等操作。

三、存儲(chǔ)器

  存儲(chǔ)器是單片機(jī)的又一個(gè)重要組成部分,圖6給出了一種存儲(chǔ)容量為256個(gè)單元的存儲(chǔ)器結(jié)構(gòu)示意圖。其中每個(gè)存儲(chǔ)單元對(duì)應(yīng)一個(gè)地址,256個(gè)單元共有256個(gè)地址,用兩位16進(jìn)制數(shù)表示,即存儲(chǔ)器的地址(00H~FFH)。存儲(chǔ)器中每個(gè)存儲(chǔ)單元可存放一個(gè)八位二進(jìn)制信息,通常用兩位16進(jìn)制數(shù)來表示,這就是存儲(chǔ)器的內(nèi)容。存儲(chǔ)器的存儲(chǔ)單元地址和存儲(chǔ)單元的內(nèi)容是不同的兩個(gè)概念,不能混淆。

一、程序存儲(chǔ)器
  程序是控制計(jì)算機(jī)動(dòng)作的一系列命令,單片機(jī)只認(rèn)識(shí)由“0”和“1”代碼構(gòu)成的機(jī)器指令。如前述用助記符編寫的命令MOV A,#20H,換成機(jī)器認(rèn)識(shí)的代碼74H、20H:(寫成二進(jìn)制就是01110100B和00100000B)。在單片機(jī)處理問題之前必須事先將編好的程序、表格、常數(shù)匯編成機(jī)器代碼后存入單片機(jī)的存儲(chǔ)器中,該存儲(chǔ)器稱為程序存儲(chǔ)器。程序存儲(chǔ)器可以放在片內(nèi)或片外,亦可片內(nèi)片外同時(shí)設(shè)置。由于PC程序計(jì)數(shù)器為16位,使得程序存儲(chǔ)器可用16位二進(jìn)制地址,因此,內(nèi)外存儲(chǔ)器的地址最大可從0000H到FFFFH。8051內(nèi)部有4k字節(jié)的ROM,就占用了由0000H~0FFFH的最低4k個(gè)字節(jié),這時(shí)片外擴(kuò)充的程序存儲(chǔ)器地址編號(hào)應(yīng)由1000H開始,如果將8051當(dāng)做8031使用,不想利用片內(nèi)4kROM,全用片外存儲(chǔ)器,則地址編號(hào)仍可由0000H開始。不過,這時(shí)應(yīng)使8051的第{31}腳(即EA腳)保持低電平。當(dāng)EA為高電平時(shí),用戶在0000H至0FFFH范圍內(nèi)使用內(nèi)部ROM,大于0FFFH后,單片機(jī)CPU自動(dòng)訪問外部程序存儲(chǔ)器。

二、數(shù)據(jù)存儲(chǔ)器

  單片機(jī)的數(shù)據(jù)存儲(chǔ)器由讀寫存儲(chǔ)器RAM組成。其最大容量可擴(kuò)展到64k,用于存儲(chǔ)實(shí)時(shí)輸入的數(shù)據(jù)。8051內(nèi)部有256個(gè)單元的內(nèi)部數(shù)據(jù)存儲(chǔ)器,其中00H~7FH為內(nèi)部隨機(jī)存儲(chǔ)器RAM,80H~FFH為專用寄存器區(qū)。實(shí)際使用時(shí)應(yīng)首先充分利用內(nèi)部存儲(chǔ)器,從使用角度講,搞清內(nèi)部數(shù)據(jù)存儲(chǔ)器的結(jié)構(gòu)和地址分配是十分重要的。因?yàn)閷碓趯W(xué)習(xí)指令系統(tǒng)和程序設(shè)計(jì)時(shí)會(huì)經(jīng)常用到它們。8051內(nèi)部數(shù)據(jù)存儲(chǔ)器地址由00H至FFH共有256個(gè)字節(jié)的地址空間,該空間被分為兩部分,其中內(nèi)部數(shù)據(jù)RAM的地址為00H~7FH(即0~127)。而用做特殊功能寄存器的地址為80H~FFH。在此256個(gè)字節(jié)中,還開辟有一個(gè)所謂“位地址”區(qū),該區(qū)域內(nèi)不但可按字節(jié)尋址,還可按“位(bit)”尋址。對(duì)于那些需要進(jìn)行位操作的數(shù)據(jù),可以存放到這個(gè)區(qū)域。從00H到1FH安排了四組工作寄存器,每組占用8個(gè)RAM字節(jié),記為R0~R7。究竟選用那一組寄存器,由前述標(biāo)志寄存器中的RS1和RS0來選用。在這兩位上放入不同的二進(jìn)制數(shù),即可選用不同的寄存器組,如附表1所示。

三、特殊功能寄存器

  特殊功能寄存器(SFR)的地址范圍為80H~FFH。在MCS-51中,除程序計(jì)數(shù)器PC和四個(gè)工作寄存器區(qū)外,其余21個(gè)特殊功能寄存器都在這SFR塊中。其中5個(gè)是雙字節(jié)寄存器,它們共占用了26個(gè)字節(jié)。各特殊功能寄存器的符號(hào)和地址見附表2。其中帶*號(hào)的可位尋址。特殊功能寄存器反映了8051的狀態(tài),實(shí)際上是8051的狀態(tài)字及控制字寄存器。用于CPU PSW便是典型一例。這些特殊功能寄存器大體上分為兩類,一類與芯片的引腳有關(guān),另一類作片內(nèi)功能的控制用。與芯片引腳有關(guān)的特殊功能寄存器是P0~P3,它們實(shí)際上是4個(gè)八位鎖存器(每個(gè)I/O口一個(gè)),每個(gè)鎖存器附加有相應(yīng)的輸出驅(qū)動(dòng)器和輸入緩沖器就構(gòu)成了一個(gè)并行口。MCS-51共有P0~P3四個(gè)這樣的并行口,可提供32根I/O線,每根線都是雙向的,并且大都有第二功能。其余用于芯片控制的寄存器中,累加器A、標(biāo)志寄存器PSW、數(shù)據(jù)指針DPTR等的功能前已提及,而另一些寄存器的功能在后面有關(guān)部分再作進(jìn)一步介紹

單片機(jī)的指令系統(tǒng)和尋址方式
單片機(jī)要正常運(yùn)作,事先需編制程序,再把程序放入存貯器中,然后由CPU執(zhí)行該程序。程序是由指令組成的,指令的基本組成是操作碼和操作數(shù)。單片機(jī)的品種很多,設(shè)計(jì)時(shí)怎樣表示操作碼和操作數(shù),都有各自的規(guī)定,再有指令代碼也各不相同,因此,必須對(duì)所選單片機(jī)的全部指令,也就是所謂“指令系統(tǒng)”,有足夠的了解。各個(gè)系列的單片機(jī)雖然有不同的指令系統(tǒng),但也有其共同性。掌握一種單片機(jī)的指令系統(tǒng),對(duì)其它系列單片機(jī)可以起到觸類旁通的作用。MCS-51單片機(jī)應(yīng)用廣泛,派生品種多,具有代表性,所以,這里以MCS-51系列的指令系統(tǒng)為例說明“指令”的組成和應(yīng)用。

1、MOV A,#20H
  這條指令表示把20H這個(gè)數(shù)送入累加器A中(一個(gè)特殊功能寄存器)。


2、ADD A,70H
  這條指令表示把累加器A中的內(nèi)容(在上例中送入的#20H)和存貯器中地址為70H單元中的內(nèi)容(也是一個(gè)數(shù)字),通過算術(shù)邏輯單元(英文縮寫為ALU)相加,并將結(jié)果保留在A中。這里MOV、ADD等稱為操作碼,而A、#20H、70H等均稱為操作數(shù)。在匯編語言程序中,操作碼通常由英文單詞縮寫而成,這樣有助于記憶,所以又稱助記符。如MOV就是英文單詞MOVE的縮寫,含有搬移的意思;而ADD即為英文單詞,其意為相加。因此,對(duì)于略懂英語的用戶,掌握單片機(jī)指令的含意是較為方便的。操作數(shù)有多種表示法,如以上的#20H稱為立即數(shù),即20H就是真正的操作數(shù)。而70H是存貯器中某個(gè)單元的地址,在該單元中,放著操作數(shù)(比如說是3AH),ADD A,70H不是將70H和A中的內(nèi)容相加,而是從存貯器70H單元中將3AH取出和A中的內(nèi)容相加。由上可知,要找到實(shí)際操作數(shù),有時(shí)就要轉(zhuǎn)個(gè)彎,甚至轉(zhuǎn)幾個(gè)彎,這個(gè)過程稱為尋址,MCS-51共有7種尋址方式,現(xiàn)介紹如下:


一、立即尋址:                                     操作數(shù)就寫在指令中,和操作碼一起放在程序存貯器中。把“#”號(hào)放在立即數(shù)前面,以表示該尋址方式為立即尋址,如#20H。


二、寄存器尋址:                                    操作數(shù)放在寄存器中,在指令中直接以寄存器的名字來表示操作數(shù)的地址。例如MOV A,R0就屬于寄存器尋址,即將R0寄存器的內(nèi)容送到累加器A中。


三、直接尋址:                                     操作數(shù)放在單片機(jī)的內(nèi)部RAM某單元中,在指令中直接寫出該單元的地址。如前例的ADD A,70H中的70H。

]]>
關(guān)于“單片機(jī)初中級(jí)...”的內(nèi)容http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2208&Page=1wangxinxin2010-12-7 14:06:01MOV TH1,R1          ;
MOV TL1,R0          ;
CPL P3.7            ;
RET1                ;
ORG 100H            ;
START:MOV TMOD,#10H ;
MOV IE,#88H         ;
MOV DPTR,#TAB       ;
LOOP:CLR A          ;
INC DPTR            ;
CLR A               ;
MOVC A,@A+DPTR      ;
MOV R0,A            ;
ORL A,R1            ;
JZ NEXT0            ;
ANL A,R1            ;
CJNE A,#OFFH,NEXT   ;
SJMP START          ;
NEXT:MOV TH1,R1     ;
MOV TL1,R0          ;
SETB TR1            ;
SJMP NEXT1          ;
NEXT0:CLR TR1       ;
NEXT1:CLR A         ;
INC DPTR            ;
MOVC A,@A+DPTR      ;
MOV R2,A            ;
LOOP1圖片點(diǎn)擊可在新窗口打開查看CALL D200    ;
DJNZ R2,LOOP1       ;
INC DPTR            ;
D200:MOV R4,#81H    ;
D200B:MOV A,#OFFH   ;
D200A圖片點(diǎn)擊可在新窗口打開查看EC A         ;
JNZ D200A           ;
DEC R4              ;
CJNZ R4,#00H,D200B  ;
RET

TAB:  DB OFEH,25H,02H,OFEH,25H,02H;    DB OFEH,84H,02H,OFEH,84H,02H;
      DB OFEH,84H,04H,OFEH,25H,04H;    DB OFEH,25H,02H,OFEH,84H,02H;
      DB OFEH,OCOH,04H,OFEH,OCOH,04H;  DB OFEH,98H,002H,OFEH,84H,02H;
      DB OFEH,57H,08H,00H,00H,04H;     DB OFFH,OFFH;
      END.]]>
單片機(jī)抗干擾技術(shù)及應(yīng)用http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2207&Page=1wangxinxin2010-12-7 14:04:18
工業(yè)環(huán)境中的干擾一般是以脈沖形式進(jìn)入微機(jī)系統(tǒng),渠道主要有三條,如圖1所示。

空間干擾(場(chǎng)干擾),電磁信號(hào)通過空間輻射進(jìn)入系統(tǒng)。

過程通道干擾,干擾通過與系統(tǒng)相連的前向通道、后向通道及與其它系統(tǒng)的相互通道進(jìn)入。

供電系統(tǒng)干擾,電磁信號(hào)通過供電線路進(jìn)入系統(tǒng)。

一般情況下空間干擾在強(qiáng)度上遠(yuǎn)小于其它兩種,故微機(jī)系統(tǒng)中應(yīng)重點(diǎn)防止過程通道與供電系統(tǒng)的干擾。

抗干擾措施有硬件措施和軟件措施。硬件措施如果得當(dāng),可將絕大部分干擾拒之門外,但仍然會(huì)有少數(shù)干擾進(jìn)入微機(jī)系統(tǒng),故軟件措施作為第二道防線必不可少。由于軟件抗干擾措施是以CPU為代價(jià)的,如果沒有硬件消除絕大多數(shù)干擾,CPU將疲于奔命,無暇顧及正常工作,嚴(yán)重影響系統(tǒng)的工作效率和實(shí)時(shí)性。因此,一個(gè)成功的抗干擾系統(tǒng)是由硬件和軟件相結(jié)合構(gòu)成的。

筆者設(shè)計(jì)的激光打標(biāo)控制系統(tǒng)由于現(xiàn)場(chǎng)使用環(huán)境較惡劣,各種干擾因素較多,如交流噪聲、電網(wǎng)干擾及其它電磁干擾等,因此必須采取有效的抗干擾措施以確保系統(tǒng)穩(wěn)定工作,下面介紹我們?cè)谠撓到y(tǒng)硬件、軟件和CPU上采取的抗干擾措施。

硬件措施

光電隔離

在輸入和輸出通道上采用光電隔離器來進(jìn)行信息傳輸是很有好處的,它將微機(jī)系統(tǒng)與各種傳感器、開關(guān)、執(zhí)行機(jī)構(gòu)從電氣上隔離開來,很大一部分干擾將被阻擋。本系統(tǒng)中步進(jìn)電機(jī)驅(qū)動(dòng)電路采用了光電隔離器4N33。電路如圖2所示。

過壓保護(hù)電路

在輸入輸出通道上應(yīng)采用一過壓保護(hù)電路,以防引入高電壓,傷害微機(jī)系統(tǒng)。過壓保護(hù)電路由限流電阻和穩(wěn)壓管組成,限流電阻選擇要適宜,太大會(huì)引起信號(hào)衰減,太小起不到保護(hù)穩(wěn)壓管的作用。穩(wěn)壓管的選擇也要適宜,其穩(wěn)壓值以略高于最高傳送信號(hào)電壓為宜,太低將對(duì)有效信號(hào)起限幅效果,使信號(hào)失真。步進(jìn)電機(jī)驅(qū)動(dòng)電路即采用過壓保護(hù)電路。

抗干擾電源

微機(jī)系統(tǒng)供電線路是干擾的主要來源,電源采用隔離變壓器接入電網(wǎng),可以防止電網(wǎng)的干擾侵入微機(jī)系統(tǒng)。隔離變壓器與普通變壓器的不同之處在于它在初級(jí)和次級(jí)之間加了一層屏蔽層,并將它和鐵芯一起接地。

配置去耦電容

原則上每個(gè)集成電路芯片都應(yīng)安置一個(gè)0.01mF的陶瓷電容器,可以消除大部分高頻干擾。

良好接地

本系統(tǒng)既有模擬電路又有數(shù)字電路,因此數(shù)字地與模擬地要分開,最后只在一點(diǎn)相連,如果兩者不分,則會(huì)互相干擾。

軟件措施

單片機(jī)在輸出信號(hào)時(shí),外部干擾有可能使信號(hào)出錯(cuò)。本系統(tǒng)中單片機(jī)發(fā)出的驅(qū)動(dòng)步進(jìn)電機(jī)的信號(hào)經(jīng)鎖存器鎖存后傳送給驅(qū)動(dòng)電路,鎖存器對(duì)干擾非常敏感,當(dāng)鎖存線上出現(xiàn)干擾時(shí),會(huì)盲目鎖存當(dāng)前數(shù)據(jù),而不管是否有效。因此首先應(yīng)將鎖存器與單片機(jī)安裝在同一電路板上,使傳輸線上傳送的是已經(jīng)鎖存好的控制信號(hào)。在軟件上,最有效的方法就是重復(fù)輸出同一個(gè)信號(hào),只要重復(fù)周期盡可能短,鎖存器接收到一個(gè)被干擾的錯(cuò)誤信號(hào)后還來不及作出有效的反應(yīng),一個(gè)正確的輸出信號(hào)又來到,就可以及時(shí)防止錯(cuò)誤動(dòng)作的產(chǎn)生。

CPU抗干擾措施

前面幾項(xiàng)抗干擾措施是針對(duì)I/O通道,干擾還未作用到單片機(jī)本身,這時(shí)單片機(jī)還能正確無誤地執(zhí)行各種抗干擾程序,當(dāng)干擾作用到單片機(jī)本身時(shí)(通過干擾三總線等),單片機(jī)將不能按正常狀態(tài)執(zhí)行程序,從而引起混亂。如何發(fā)現(xiàn)單片機(jī)受到干擾,如何攔截失去控制的程序流向,如何使系統(tǒng)的損失減小,如何恢復(fù)系統(tǒng)的正常運(yùn)行,這些就是CPU抗干擾需要解決的問題。我們采用了以下幾種方法。

人工復(fù)位

對(duì)于失控的CPU,最簡(jiǎn)單的方法是使其復(fù)位,程序自動(dòng)從0000H開始執(zhí)行。為此只要在單片機(jī)的RESET端加上一個(gè)高電平信號(hào),并持續(xù)10ms以上即可。

掉電保護(hù)

電網(wǎng)瞬間斷電或電壓突然下降將使微機(jī)系統(tǒng)陷入混亂狀態(tài),電網(wǎng)電壓恢復(fù)正常后,微機(jī)系統(tǒng)難以恢復(fù)正常。對(duì)付這一類事故的有效方法就是掉電保護(hù)。掉電信號(hào)由硬件電路檢測(cè)到,加到單片機(jī)的外部中斷輸入端。軟件中斷將掉電中斷規(guī)定為高級(jí)中斷,使系統(tǒng)及時(shí)對(duì)掉電作出反應(yīng)。在掉電中斷子程序中,首先進(jìn)行現(xiàn)場(chǎng)保護(hù),保存當(dāng)時(shí)重要的狀態(tài)參數(shù),當(dāng)電源恢復(fù)正常時(shí),CPU重新復(fù)位,恢復(fù)現(xiàn)場(chǎng),繼續(xù)未完成的工作。

睡眠抗干擾

CMOS型的51系列單片機(jī)具有睡眠狀態(tài),此時(shí)只有定時(shí)/計(jì)數(shù)系統(tǒng)和中斷系統(tǒng)處于工作狀態(tài)。這時(shí)CPU對(duì)系統(tǒng)三總線上出現(xiàn)的干擾不會(huì)作出任何反應(yīng),從而大大降低系統(tǒng)對(duì)干擾的敏感程度。

我們仔細(xì)分析系統(tǒng)軟件后發(fā)現(xiàn),CPU很多情況下是在執(zhí)行一些等待指令和循環(huán)檢查程序,由于這時(shí)CPU雖沒有重要工作,但卻是清醒的,很容易受干擾。讓CPU在沒有正常工作時(shí)休眠,必要時(shí)再由中斷系統(tǒng)來喚醒它,之后又處于休眠。采用這種安排之后,大多數(shù)CPU可以有50~95%的時(shí)間用于睡眠,從而使CPU受到隨機(jī)干擾的威脅大大降低,同時(shí)降低了CPU的功耗。

指令冗余

當(dāng)CPU受到干擾后,往往將一些操作數(shù)當(dāng)作指令碼來執(zhí)行,引起程序混亂。這時(shí)我們首先要盡快將程序納入正軌(執(zhí)行真正的指令系列)。MCS-51系統(tǒng)中所有指令都不超過3個(gè)字節(jié),而且有很多單字節(jié)指令。當(dāng)程序彈飛到某一條單字節(jié)指令上時(shí),便自動(dòng)納入正軌。當(dāng)彈飛到某一雙字節(jié)或三字書指令上時(shí),有可能落到其操作數(shù)上,從而繼續(xù)出錯(cuò)。因此,我們應(yīng)多采用單字節(jié)指令,并在關(guān)鍵的地方人為地插入一些單字節(jié)指令(NOP),或?qū)⒂行巫謺噶钪貜?fù)書寫,這便是指令冗余。

在雙字節(jié)和三字節(jié)指令之后插入兩條NOP指令,可保護(hù)其后的指令不被拆散。或者說,某指令前如果插入兩條NOP指令,則這條指令就不會(huì)被前面沖下來的失控程序拆散,并將被完整執(zhí)行,從而使程序走上正軌。但不能加入太多的冗余指令,以免明顯降低程序正常運(yùn)行的效率。因此,常在一些對(duì)程序流向起決定作用的指令之前插入兩條NOP指令,以保證彈飛的程序迅速納入正確的控制軌道。此類指令有:RET、RETI、LCALL、SJMP、JZ、CJNE等。在某些對(duì)系統(tǒng)工作狀態(tài)至關(guān)重要的指令(如SETB EA之類)前也可插人兩條NOP指令,以保證被正確執(zhí)行。上述關(guān)鍵指令中,RET和RETI本身即為單字書指令,可以直接用其本身來代替NOP指令,但有可能增加潛在危險(xiǎn),不如NOP指令安全。

軟件陷阱

指令冗余使彈飛的程序安定下來是有條件的,首先彈飛的程序必須落到程序區(qū),其次必須執(zhí)行到冗余指令。當(dāng)彈飛的程序落到非程序區(qū)(如EPROM中未使用的空間、程序中的數(shù)據(jù)表格區(qū))時(shí)前一個(gè)條件即不滿足,當(dāng)彈飛的程序在沒有碰到冗余指令之前,已經(jīng)自動(dòng)形成一個(gè)死循環(huán),這時(shí)第二個(gè)條件也不滿足。對(duì)付前一種情況采取的措施就是設(shè)立軟件陷阱,對(duì)于后一種情況采取的措施是建立程序運(yùn)行監(jiān)視系統(tǒng)(WATCHDOG)。

所謂軟件陷阱,就是一條引導(dǎo)指令,強(qiáng)行將捕獲的程序引向?qū)Τ绦虺鲥e(cuò)進(jìn)行處理的程序。如果我們把這段程序的入口標(biāo)號(hào)稱為ERR的話,軟件陷阱即為一條LJMP ERR指令,為加強(qiáng)其捕捉效果,一般還在它前面加兩條NOP指令,因此,真正的軟件陷阱由三條指令構(gòu)成:

NOP

NOP

LJIMP ERR

軟件陷阱安排在下列四種地方:

(1)未使用的中斷向量區(qū)。當(dāng)干擾使未使用的中斷開放,并激活這些中斷時(shí),就會(huì)進(jìn)一步引起混亂。如果在這些地方布上陷阱,就能及時(shí)捕捉到錯(cuò)誤中斷。

(2)未使用的大片ROM空間。現(xiàn)在使用EPROM都很少將其全部用完。對(duì)于剩余的大片未編程的ROM空間,一般均維持原狀(0FFH),0FFH對(duì)于指令系統(tǒng),是一條單字節(jié)指令(MOV R7,A),程序彈飛到這一區(qū)域后將順流而下,不再跳躍(除非受到新的干擾)我們只要每隔一段設(shè)置一個(gè)陷阱,就一定能捕捉到彈飛的程序。軟件陷阱一定要指向出錯(cuò)處理過程ERR。我們可以將ERR字排在0030H開始的地方,程序不管怎樣修改,編譯后ERR的地址總是固定的(因?yàn)樗懊娴闹袛嘞蛄繀^(qū)是固定的)。這樣我們就可以用00 00 02 00 30五個(gè)字節(jié)作為陷阱來填充ROM中的未使用空間,或者每隔一段設(shè)置一個(gè)陷阱(02 00 30),其它單元保持0FFH不變。

(3)表格。有兩類表格,一類是數(shù)據(jù)表格,供MOVC A,@A+PC指令或MOVC A,@A+DPTR指令使用,其內(nèi)容完全不是指令。另一類是散轉(zhuǎn)表格,供JMP @A+DPTR指令使用,其內(nèi)容為一系列的三字節(jié)指令 LJMP或兩字節(jié)指令 AJMP。由于表格內(nèi)容和檢索值有一一對(duì)應(yīng)關(guān)系,在表格中間安排陷阱將會(huì)破壞其連續(xù)性和對(duì)應(yīng)關(guān)系,只能在表格的最后安排五字節(jié)陷阱(NOP NOP LJMP ERR)。

(4)程序區(qū)。程序區(qū)是由一串串執(zhí)行指令構(gòu)成的,在這些指令串之間常有一些斷裂點(diǎn),正常執(zhí)行的程序到此便不會(huì)繼續(xù)往下執(zhí)行了,這類指令有JMP、RET等。這時(shí)PC的值應(yīng)發(fā)生正常跳變。如果還要順次往下執(zhí)行,必然就出錯(cuò)了。當(dāng)然,彈飛來的程序剛好落到斷裂點(diǎn)的操作數(shù)上或落到前面指令的操作數(shù)上(又沒有在這條指令之前使用冗余指令),則程序就會(huì)越過斷裂點(diǎn),繼續(xù)往前沖。我們?cè)谶@種地方安排陷阱之后,就能有效地捕捉住它,而又不影響正常執(zhí)行的程序流程。例如:

……

AJMP ABC

NOP

NOP

LJMP ERR

……

ABC:MOV A,R2

RET

NOP

NOP

LJMP ERR

ERR: ……

由于軟件陷阱都安排在程序正常執(zhí)行不到的地方,故不會(huì)影響程序執(zhí)行效率。

 

結(jié)語

綜上所述,通過對(duì)單片機(jī)應(yīng)用系統(tǒng)的軟硬件全面考慮,并針對(duì)不同的情況采取不同的技術(shù)措施,保證了系統(tǒng)準(zhǔn)確、可靠運(yùn)行。激光打標(biāo)控制系統(tǒng)采用了上述抗干擾措施后,系統(tǒng)可靠性大大增強(qiáng),運(yùn)行穩(wěn)定,效果理想,現(xiàn)已批量生產(chǎn),取得了良好的經(jīng)濟(jì)效益。■

]]>
看門狗”電路DS1232在單片機(jī)產(chǎn)品中的應(yīng)用http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2206&Page=1wangxinxin2010-12-7 14:01:17關(guān)鍵詞:看門狗; DS1232; 接口;
分類號(hào):TN722 文獻(xiàn)標(biāo)識(shí):B 文章編號(hào):1006-6977(2000)04-0020-02
 
  隨著計(jì)算機(jī)技術(shù)的發(fā)展,單片微型計(jì)算機(jī)在工業(yè)自動(dòng)化領(lǐng)域和智能化產(chǎn)品中得到了廣泛的應(yīng)用。如何提高單片機(jī)產(chǎn)品的抗干擾能力是產(chǎn)品開發(fā)和設(shè)計(jì)人員所面臨和必須解決的問題。關(guān)于抗干擾的具體方法在很多書籍和文章中都有較為詳盡的論述,本文不再贅述。美國DALLAS公司生產(chǎn)的“看門狗(WATCHDOG)”集成電路DS1232具有性能可靠、使用簡(jiǎn)單、價(jià)格低廉的特點(diǎn),應(yīng)用在單片機(jī)產(chǎn)品中能夠很好的提高硬件的抗干擾能力,我們?cè)鴮S1232應(yīng)用到“糧食中心庫糧倉溫度監(jiān)測(cè)系統(tǒng)”、“銀行利率顯示屏”、“多功能電腦時(shí)鐘”、“電廠皮帶秤測(cè)速系統(tǒng)”和“全自動(dòng)限電計(jì)量系統(tǒng)”中,在實(shí)際使用中收到了良好的效果。
1. DS1232的結(jié)構(gòu)及特點(diǎn)
1.1 引腳功能及內(nèi)部結(jié)構(gòu)
  DS1232是由美國DALLAS公司生產(chǎn)的微處理器監(jiān)控電路,采用8腳DIP封裝,如圖1所示。
  各引腳功能如下:
  PBRST:按鈕復(fù)位輸入端;
  TD:看門狗定時(shí)器延時(shí)設(shè)置端;
  TOL:5%或10%電壓監(jiān)測(cè)選擇端;
  GND:電源地;
  RST:高電平有效復(fù)位輸出端;
  RST:低電平有效復(fù)位輸出端;
  ST:周期輸入端;
  Vcc:電源。
1.2 DS1232的內(nèi)部結(jié)構(gòu)
   DS1232的內(nèi)部結(jié)構(gòu)框圖如圖2所示。
1.3 主要特點(diǎn)
  DS1232具有如下特點(diǎn):
  ●具有8腳DIP封裝和16腳SOIC貼片封裝兩種形式,可以滿足不同設(shè)計(jì)要求;
  ●在微處理器失控狀態(tài)下可以停止和重新啟動(dòng)微處理器;
  ●微處理器掉電或電源電壓瞬變時(shí)可自動(dòng)復(fù)位微處理器;
  ●精確的5%或10%電源供電監(jiān)視;
●不需要分立元件;
  ●適應(yīng)溫度范圍寬,-40~+85℃。
2. DS1232的功能
2.1 電源電壓監(jiān)視
  DS1232能夠?qū)崟r(shí)監(jiān)測(cè)向微處理器供電的電源電壓,當(dāng)電源電壓VCC低于預(yù)置值時(shí),DS1232的第5腳和第6腳輸出互補(bǔ)復(fù)位信號(hào)RST和RST。預(yù)置值通過第3腳(TOL)來設(shè)定;當(dāng)TOL接地時(shí),RST 和RST信號(hào)在電源電壓跌落至4.75V以下時(shí)產(chǎn)生;當(dāng)TOL與VCC相連時(shí),只有當(dāng)VCC跌落至4.5V以下時(shí)才產(chǎn)生 RST和RST信號(hào)。當(dāng)電源恢復(fù)正常后, RST和RST信號(hào)至少保持250ms,以保證微處理器的正常復(fù)位。
2.2 按鍵復(fù)位
  在單片機(jī)產(chǎn)品中,最簡(jiǎn)單的按鍵復(fù)位電路是由電阻和電容構(gòu)成的,如果系統(tǒng)擴(kuò)展存在需要和微處理器同時(shí)復(fù)位的其他接口芯片,這種簡(jiǎn)單的阻容復(fù)位電路往往不能滿足整體復(fù)位的要求。DS1232提供了可直接連接復(fù)位按鍵的輸入端PBRST(第1腳),在該引腳上輸入低電平信號(hào),將在RST和RST端輸出至少250ms的復(fù)位信號(hào),具體電路如圖3所示。
2.3 看門狗定時(shí)器
  在DS1232內(nèi)部集成有看門狗定時(shí)器,當(dāng)DS1232的ST端在設(shè)置的周期時(shí)間內(nèi)沒有有效信號(hào)到來時(shí),DS1232的RST和RST端將產(chǎn)生復(fù)位信號(hào)以強(qiáng)迫微處理器復(fù)位。這一功能對(duì)于防止由于干擾等原因造成的微處理器死機(jī)是非常有效的。看門狗定時(shí)器的定時(shí)時(shí)間由DS1232的TD引腳確定,詳見表1。
  看門狗定時(shí)器的周期輸入信號(hào)ST可以從微處理器的地址信號(hào)、數(shù)據(jù)信號(hào)或控制信號(hào)中獲得,不論哪種信號(hào)都必須能夠周期性的訪問DS1232,對(duì)于MCS51系列單片機(jī),推薦使用ALE信號(hào)。
3. DS1232典型應(yīng)用電路
  DS1232與MCS51系列單片機(jī)的典型接口電路如圖3所示。
4. 使用注意事項(xiàng)
  DS1232雖然具有與微處理器接口簡(jiǎn)單的特點(diǎn),但在使用中也應(yīng)注意以下幾點(diǎn):
  (1)ST除了可以和MCS51單片機(jī)的ALE相連接外,也可以和其它信號(hào)線相連,但是必須保證在看門狗定時(shí)器計(jì)數(shù)溢出前復(fù)位看門狗定時(shí)器。
  (2)DS1232內(nèi)部第6引腳沒有上拉電阻,如果單片機(jī)的其它外圍接口芯片需要用到低電平復(fù)位信號(hào),那么,必須在該引腳上外接一個(gè)上拉電阻,如圖3中的R。
  (3)如果用仿真器調(diào)試用戶目標(biāo)板,并且ST端與單片機(jī)的ALE相連,那么最好先不要插上DS1232芯片,因?yàn)樵诜抡嫫髋cPC機(jī)相連單步運(yùn)行程序時(shí),單片機(jī)的ALE信號(hào)并不是連續(xù)供給的,容易造成非正常復(fù)位,影響調(diào)試工作的進(jìn)行。]]>
關(guān)于單片機(jī)串口通信的“詳細(xì)”工作原理的討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2205&Page=1wangxinxin2010-12-7 13:58:03 案例:
文本框中有4個(gè)字節(jié)數(shù)據(jù),點(diǎn)command后mscomm控件將這4個(gè)字節(jié)發(fā)送給了AT89S52,MCU接到數(shù)據(jù),我的下位機(jī)程序利用中斷處理了這4個(gè)字節(jié)數(shù)據(jù)(我一直在說字節(jié)哦)。
疑問:
單片機(jī)每次只能接收一個(gè)字節(jié)數(shù)據(jù)(SBUF只能裝一個(gè),否則會(huì)被后來的數(shù)覆蓋),雖然MSCOMM是一次發(fā)了4個(gè),但單片機(jī)收到一個(gè)字節(jié)后就應(yīng)該中斷(是收一個(gè)而不是4個(gè)都收到后才中斷置位RI吧?),等我的程序把數(shù)據(jù)從SBUF后取走并清0RI后,它再接收下一個(gè)字節(jié)(是因?yàn)槭盏絊BUF中數(shù)被移走的信號(hào)還是收到RI為0的信號(hào)?)直到4個(gè)都收到。但在MCU端中斷時(shí)MSCOMM仍在發(fā)數(shù)據(jù),這部分?jǐn)?shù)豈不是會(huì)漏掉?另外我說的通信流程對(duì)嗎?
這種情況通常不會(huì)出現(xiàn),因?yàn)椋?br/>
    1、單片機(jī)每“次”的確只能接收1個(gè)字節(jié),但由于串口的速度實(shí)在太低,通常都在115200bps以下(即使用了同步方式也“只能”達(dá)到1Mbps)。注意,是bps,位/秒,而不是“字節(jié)/秒”,這就是“串”行通信,要至少8個(gè)“bps時(shí)間”才能接收一個(gè)完整的字符,事實(shí)上,加上起始位等,8個(gè)位往往傳送不了一個(gè)字節(jié)(不知道我的理解是不是有偏差),這就是說,速度至少還要再慢上8倍。

    2、帶有USART的單片機(jī)里USART一般都是做為“外部設(shè)備”,獨(dú)立于MCU進(jìn)行收發(fā)工作,即其收發(fā)過程中的串-并和并-串轉(zhuǎn)換以及數(shù)據(jù)IO過程都是“自主”和“自動(dòng)”的,不需要CPU逐位進(jìn)行收發(fā)處理,因此,在CPU將數(shù)據(jù)送到SBUF后,便可以放手不管了,USART收發(fā)器會(huì)自動(dòng)將SBUF的內(nèi)容轉(zhuǎn)換成串行數(shù)據(jù)發(fā)送出去。接收時(shí)也是由USART將串行數(shù)據(jù)轉(zhuǎn)成并行數(shù)據(jù)并存放到SBUF后才會(huì)通知MCU(產(chǎn)生接收中斷)。MCU所需要做的只是往SBUF送數(shù)或從SBUF中取數(shù)(都只要1個(gè)指令周期)。

    3、設(shè)置串口參數(shù)的時(shí)候應(yīng)該能看出,為了適應(yīng)串口的慢,不得不動(dòng)用定時(shí)器進(jìn)行延時(shí),以“產(chǎn)生”所需要的波特率,而這個(gè)“延時(shí)”通常都要給8位甚至16位定時(shí)器設(shè)置初值,定時(shí)器每一次計(jì)數(shù)都需要一個(gè)指令周期,即CPU可以執(zhí)行一條指令的時(shí)間,而定時(shí)器兩次串口溢出才僅僅接收或發(fā)送一個(gè)“位”,接收一個(gè)字節(jié)需要數(shù)倍于此的時(shí)間,那么這么長的時(shí)間對(duì)CPU來說,足以從容地從SBUF里取出數(shù)據(jù)并對(duì)其進(jìn)行處理了。

    4、即使CPU的任務(wù)相當(dāng)繁重,或?qū)邮盏降拿總(gè)字節(jié)都需要進(jìn)行相當(dāng)復(fù)雜的處理,我們也完全可以通過建立接收緩沖區(qū)的方式將暫時(shí)來不及處理的數(shù)據(jù)暫存起來,等CPU空閑時(shí)再做處理。而從SBUF取出數(shù)據(jù)并保存到緩沖區(qū)只需要很少的幾條指令就能完成,不會(huì)影響到串口繼續(xù)接收。

    5、標(biāo)準(zhǔn)的RS-232協(xié)議并非只有TX、RX和GND三個(gè)引腳,即便是最簡(jiǎn)單的9針插口,也專門設(shè)計(jì)了檢測(cè)傳輸狀態(tài)和收發(fā)請(qǐng)求的針腳。如果單片機(jī)真的實(shí)在無法及時(shí)完成收發(fā)動(dòng)作,也完全可以利用一個(gè)口線作為狀態(tài)標(biāo)識(shí),使PC能夠知道單片機(jī)什么時(shí)候可以接收數(shù)據(jù),而不會(huì)任由數(shù)據(jù)丟失。

    6、為了增加數(shù)據(jù)傳輸?shù)目煽啃裕罅繑?shù)據(jù)傳輸時(shí)通常都會(huì)采用CRC校驗(yàn)方式,并以“包”或“幀”的方式發(fā)送有格式約定的字節(jié)流,而非單個(gè)字符,這樣一來,完全可以通過約定一些“通信協(xié)議”的方式,使收發(fā)雙方都能夠及時(shí)知道接收的數(shù)據(jù)是否完整,并及時(shí)重發(fā)新發(fā)送出錯(cuò)的數(shù)據(jù)。

   現(xiàn)在所能想到的暫時(shí)就這么多,思路較亂,文字表述也挺羅索,謹(jǐn)供參考,歡迎交流。
]]>
單片機(jī)代碼優(yōu)化深入討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2204&Page=1wangxinxin2010-12-7 13:56:33
1、優(yōu)化代碼采用匯編就是啦,何必在用C語言呢?
答:代碼的優(yōu)化是建立在于程序結(jié)構(gòu)最優(yōu)化之上的,好的程序結(jié)構(gòu),代碼優(yōu)化才有價(jià)值,是優(yōu)中優(yōu);反之糟糕的程序結(jié)構(gòu),代碼優(yōu)化只能在最差的程序結(jié)構(gòu)中得到最好代碼,是差中優(yōu)。所以優(yōu)中優(yōu)>差中優(yōu)。C語言是一種高級(jí)語言(有的叫中級(jí)語言)在描述程序結(jié)構(gòu)的與匯編沒有區(qū)別,更直觀。
2、現(xiàn)在單片機(jī)速度很快,為什么要優(yōu)化的程序結(jié)構(gòu)呢?
答:比如我在編寫定時(shí)器和計(jì)數(shù)器的程序的時(shí)候,由于這個(gè)函數(shù)使用頻繁,這個(gè)中斷以后還要加入類似PLC的IO數(shù)據(jù)刷新程序(把PLC程序的結(jié)果送入單片機(jī)的IO端口,或從IO端口中讀入數(shù)據(jù))和系統(tǒng)變量數(shù)據(jù)函數(shù)(如秒脈沖,100ms秒脈沖,等),所以這個(gè)中斷函數(shù)負(fù)擔(dān)很重。所以每個(gè)算法必須最優(yōu)化。現(xiàn)在單片機(jī)速度很快,但是具體某一個(gè)固定功能的函數(shù)優(yōu)化一下,可以把單片機(jī)資源更多的用于用戶程序。比如PLC的單片機(jī)必須解釋用戶程序。必須在定期完成。比如PLC周期是100ms,比如12M的8051,1/10的振蕩周期內(nèi)完成。1.2M/12=100kHZ,平均下來,10萬指令條不到,還是比較緊張的。稍微好一點(diǎn)的PLC,周期數(shù)可以達(dá)到10ms。即使采用AVR這種RISC的,在10ms完成一個(gè)PLC掃描周期,也是很吃緊的。
3、怎么才能得到最優(yōu)的程序結(jié)構(gòu)?
答:這個(gè)問題很廣,算法=程序+數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)優(yōu)化,可以學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的書籍,里面全是最優(yōu)的結(jié)構(gòu),依賴于計(jì)算機(jī)。程序的優(yōu)化,一般獨(dú)立于計(jì)算機(jī),要自己有一個(gè)好的思路。
比如我在處理定時(shí)器和計(jì)數(shù)器函數(shù)是,畫了狀態(tài)圖,根據(jù)狀態(tài)圖,編程序一目了然,基本是最優(yōu)結(jié)構(gòu)了。除非開發(fā)專用硬件或查表法。請(qǐng)參看我的另一個(gè)帖子:http://www.stmfans.com/bbs/viewt ... &extra=page%3D1
4、你的那個(gè)帖子,首先發(fā)的效率不是還可以嗎?
C語言精簡(jiǎn)不等于編譯出來的東西會(huì)精簡(jiǎn)。
5、為什么呀?
我首先貼出來的的C程序,沒有跟我畫出來的狀態(tài)圖一一對(duì)應(yīng)。沒有充分利用各bit量的信息。
比如,定時(shí)器從S1轉(zhuǎn)到S2,只需判斷T_EN=1;維持狀態(tài):T_EN=0
S2轉(zhuǎn)到S1,只需判斷T_EN=0。S2維持,須判斷T_ACC<T_SET=1。S2轉(zhuǎn)到S3,須判斷T_ACC<T_SET=0;
S3轉(zhuǎn)到S1,T_EN=0;S3維持,T_EN=1;這個(gè)時(shí)候T_ACC<T_SET是個(gè)無關(guān)量,不需要重復(fù)運(yùn)算了。

我還設(shè)置tmp中間量,其實(shí)T_OUT的狀態(tài)已經(jīng)表明T_ACC<T_SET=0,tmp是畫蛇添足的,浪費(fèi)空間。
6、條件表達(dá)式不是比if else要好嗎?
在大多情況下,進(jìn)行簡(jiǎn)單的運(yùn)算,要好一點(diǎn)(微弱),語句復(fù)雜的話,編譯出來的東西不一定高效。況且條件表達(dá)式中,
無法加入break等語句。
7、我看了關(guān)于編程優(yōu)化的書籍,要減少跳轉(zhuǎn)的,你后面的程序跳轉(zhuǎn)很多呀?尤其是那個(gè)計(jì)數(shù)器,嵌套了好幾層呀?
由于很多編程優(yōu)化的書籍是針對(duì)PC機(jī)的:減少跳轉(zhuǎn),可以提高CPU緩存的命中率。由于緩存速度很快,與CPU同步的。如intel的扣肉
分一級(jí)緩存,二級(jí)緩存。當(dāng)跳轉(zhuǎn)的時(shí)候如果跳出了二級(jí)緩存的范圍,會(huì)到內(nèi)存中讀取數(shù)據(jù),由于內(nèi)存的速度比CPU慢一個(gè)數(shù)量級(jí)。
所以效率不高。

而我們的單片機(jī)編程的時(shí)候,flash與RAM都是與CPU同步的。單片機(jī)的RAM全部是SRAM(緩存也是SRAM),跳轉(zhuǎn)只能在單片機(jī)的資源以內(nèi),相當(dāng)于PC的CPU中只能在緩存空間內(nèi)跳。所以單片機(jī)的命中率是100%,除非出錯(cuò)。圖片點(diǎn)擊可在新窗口打開查看OL所以跳轉(zhuǎn)語句只是單片機(jī)的一個(gè)普通指令,處理周期數(shù)不是最高的,比如51的跳轉(zhuǎn)都是2個(gè)機(jī)器周期。比如ADD,SUB,MOV等指令都要2個(gè)周期。
8、你后面發(fā)的程序,為什么是最優(yōu)呢?
我把后面的程序由編譯器編譯出來的指令貼出來:
;        d:\MYDOCU~1\51_proj\timer.c:28: if(T0_EN)
        jnb        _T0_EN,00105$   ;對(duì)應(yīng)狀態(tài)圖S2   t2
;        d:\MYDOCU~1\51_proj\timer.c:30: if(T0_OUT);
        jb        _T0_OUT,00106$        ;對(duì)應(yīng)狀態(tài)圖S2   t2
;        d:\MYDOCU~1\51_proj\timer.c:32: {T0_OUT=++T0_ACC>=T0_SET;}
        inc        _T0_ACC           ;對(duì)應(yīng)狀態(tài)圖S2 t1
        clr        c                                t1
        mov        a,_T0_ACC                        t2
        subb        a,#0x14                                t2
        mov  b0,c                                t2
        cpl        c                                t1
        mov        _T0_OUT,c        ;對(duì)應(yīng)狀態(tài)圖S3  t2
        sjmp        00106$                                t2
00105$:
;        d:\MYDOCU~1\51_proj\timer.c:36: T0_OUT=0;T0_ACC=0;
        clr        _T0_OUT                ;對(duì)應(yīng)狀態(tài)圖S1  t1
        mov        _T0_ACC,#0x00                   t2
00106$:

即使沒采用匯編語言,C編譯器已經(jīng)為我們產(chǎn)生出來很精簡(jiǎn)的語句,當(dāng)然32至36之間的代碼還可以采用匯編優(yōu)化。
所以首先程序優(yōu)化,然后在進(jìn)行匯編,難度降低了很多。因?yàn)槌绦騼?yōu)化后,C編譯出來的匯編,在進(jìn)行優(yōu)化工作量很小了。
其中計(jì)數(shù)器的代碼變化最大,優(yōu)化了10行之多。給我可以自己用編譯器試驗(yàn)一下。

9、這個(gè)是最快的嗎?
不是,最快的應(yīng)該是查表法。對(duì)這個(gè)定時(shí)器來說:
方案一:
輸入:T_EN,T_ACC,T_SET
輸出:T_OUT,T_ACC
建立一個(gè)數(shù)據(jù)表格,然后在中斷函數(shù)中用查表法,大概兩條指令搞定。不過占用的空間也是嚇人。圖片點(diǎn)擊可在新窗口打開查看OL

10、在使用if else語句注意什么?
采用if else語句避免()中進(jìn)行多目運(yùn)算。也不要進(jìn)行取反運(yùn)算,因?yàn)檫@樣代碼會(huì)增加好幾行。
如果直接用bit量,這樣編譯器會(huì)用 jnb或jb,

由于本人水平有限,舉例采用的是8051(因?yàn)槲业碾娔X是P3 800,運(yùn)行proteus正好)。希望對(duì)大家有參考作用]]>
關(guān)于對(duì)51單片機(jī)端口上拉電阻的討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=55&ID=2203&Page=1wangxinxin2010-12-7 13:54:23前一段時(shí)間,看到實(shí)驗(yàn)室有個(gè)學(xué)弟設(shè)計(jì)了一個(gè)電路,其中還有一個(gè)鍵盤電路,取其原理是這樣子的:

圖片點(diǎn)擊可在新窗口打開查看

        據(jù)這位師弟的意思是:在沒有按下按鍵的時(shí)候,端口上是低電平,按下按鍵的時(shí)候端口上接上了高電平.

         事實(shí)上,電路是不工作的.

        問題比較多:

       首先,將電源直接接到端口上是絕對(duì)不可以的.當(dāng)按下按鍵的時(shí)候,會(huì)有很大的電流進(jìn)入單片機(jī).在工程上,這種往往應(yīng)該加限流電阻的.一般選擇1K的就可以.如果選擇太大的電阻也不好,因?yàn)殡娮枭厦鎵航堤?造成輸入比應(yīng)有的高電平低,造成錯(cuò)誤.

      其次,就算加了限流,這個(gè)電路也是不能工作的.檢查AT89C51的DataSheet就會(huì)發(fā)現(xiàn).技術(shù)手冊(cè)中說:P0口是沒有上拉電阻的端口;P1,P2,P3口帶有上拉電阻.問題就出在這里,什么是上拉電阻,來看看圖:

圖片點(diǎn)擊可在新窗口打開查看

上面這個(gè)圖,是紅外線接收的電路圖,看上面的這個(gè)電阻,就是上拉電阻.我們可以試圖理解一下51單片機(jī)P2口的這個(gè)上拉電阻為這種形式:

圖片點(diǎn)擊可在新窗口打開查看

其中的R就是上拉電阻.如果像我的那個(gè)師弟那樣設(shè)計(jì)電路,電路就成了以下這種形式了:

圖片點(diǎn)擊可在新窗口打開查看

看,從這個(gè)電路上,我們可以清晰的看出,不管你按鍵是否按下,IO端口上都是高電平.問題就在這里,我讓我的這個(gè)師弟測(cè)測(cè)IO端口的電平在按下按鍵前后的變化,結(jié)果果然不出所料:不管他是否按下按鍵,都是高電平!!

        從這里我們可以看出:DataSheet還是有用的,在設(shè)計(jì)的時(shí)候,有很多細(xì)節(jié),需要注意,否則,可能功虧一簣.

]]>
主站蜘蛛池模板: 亚洲精品在线免费 | 欧美一级二级三级视频 | 免费91最新地址永久入口 | 免费一级毛片在级播放 | 欧美成人区 | 中文在线日韩 | 亚洲国产小视频 | 天天做天天爱夜夜大爽完整 | 91久久香蕉国产线看 | 日本一极毛片兔费看 | 台湾三级在线播放 | 久草在线资源视频 | 亚洲情a成黄在线观看动 | 在线观看国产一级强片 | 日韩视频欧美视频 | 性欧美videos高清精品 | 亚洲精品一区二区手机在线 | 视频一区欧美 | 亚洲欧美视频在线播放 | 亚洲天堂2017| 欧美精品在线一区 | 亚洲国产一区二区a毛片日本 | 欧美日本一区二区三区道 | 国产欧美日韩精品第二区 | 国产啪在线| 午夜丝袜美腿福利视频在线看 | 日本免费一区二区三区三州 | 成人欧美一区二区三区视频xxx | 欧美性xxxx极品高清 | 久草手机在线播放 | 国产日韩一区二区三区在线观看 | 国产欧美日韩综合精品一区二区 | 国产九九视频在线观看 | 欧美激情一级欧美精品 | 国产深夜福利视频在线播放 | 欧美色视频日本片高清在线观看 | 久久久国产99久久国产一 | 亚洲视屏在线 | 精品久久香蕉国产线看观看亚洲 | 一区二区三区久久精品 | 欧美日韩精品一区二区三区视频 |