中文字幕亚洲综合久久,亚洲精品综合久久中文字幕,亚洲美免无码中文字幕在线http://www.bjzhda.cnzh-cn曙海教育集團論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團論壇單片機學習的基本過程http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=55&ID=2228&Page=1wangxinxin2010-12-7 15:10:46經常有單片機愛好者問我們,如何學習單片機?學習單片機的步驟是什么?我們初略總結了一下,單片機學習的過程基本上可分四個階段:


第一階段


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


第二階段


 
就是了解二進位數字、十六進位數和軟件方面的內容。盡管有很多高級語言可用于單片機的編程,但我覺得初學還是以匯編語言為好,更有利于和硬件結合,掌握硬件結構。知道匯編語言、機器語言、
指令、
程序等概念后,就從MOV指令開始,學習匯編語言和編程,在此如51的MCU匯編語言系統有111條指令,簡單又好理解它們怎
樣和硬件聯系,更有助于一般學習單片機的指令整合與運用.因此其方法可先了
解幾條基本的MOV指令和它的機器語言,大致建立起單片機的硬件和軟件概念,
來知道單片機的硬件是由指令控制指揮的。


第三階段


按照編程環境的使用手冊,熟悉使用編程環境。現在的編程環境一般都和電腦相連,只要具備基本電腦知識的人都可很快掌握操作步驟。


第四階段



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

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

 

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

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

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

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

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

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

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

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

  二 電路原理

  一般12位D/A轉換器在手冊中給出的精度為±1/2LSB,溫度漂移的綜合指標在20—50ppm/℃,上述兩項指標在0.2級儀表中是可以滿足要求的,下面給出的電路可以達到上述兩項指標。

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

圖片點擊可在新窗口打開查看

圖片點擊可在新窗口打開查看

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

圖片點擊可在新窗口打開查看

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

圖片點擊可在新窗口打開查看

  圖中的曲線1表示理想值,曲線2表示實測值。由圖中可見,曲線2的根部不太理想。這是因為所使用的電容不是純電容,其中含有一定的電感。在占空比極小時,由于脈沖非常窄,它產生的高次諧波的頻率很高,電感對高次諧波的感抗較大,因此在脈沖沿的位置上,盡管電壓變化很大,但實際實際給電容充電卻很小。這樣就在窄脈沖時產生非線性。當采用無感電容時,這種非線性有較大改善,但仍不能完全吻合。由于無感電容容量太小,價格也較高,所以在大時間常數濾波電路中沒有實際意義。在實際使用中解決這一問題的方法是舍棄根部非線性部分,只用線性部分,在工業儀表中,標準的信號一般為1—5V或4—20mA。而曲線2的非線性部分在0.4V以下,所以當采用1—5V輸出信號時,精度為0.03%完全滿足12位D/A要求。

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

  三 實測數據

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

  由以上數據可知,滿量程的線性度為0.04%,滿量程的溫度漂移為0.033%/10℃,系統響應時間約為2.2s,輸出信號與標準值相差0.1%時所用的時間為11s。

圖片點擊可在新窗口打開查看

  四 結束語

  上面所介紹的D/A電路結構簡單,原理易懂,在8098及8031單片機上都可以應用,筆者采用8098單片機的四路高速輸入輸出同時控制四路精密D/A輸出。后面加一級V/I轉換電路,構成標準的4—20mA電流輸出,電路經一年多的現場實際應用,效果很好,適于目前0.2級儀表的全部要求。

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

  圖4為主程序狀態流程圖。可見主程序只負責進行走時或調整時間的運算及顯示,而判斷按鍵輸入則放在T1定時中斷(10mS)服務子程序中。T0作為走時的基準被設置為100mS定時中斷。這種設計的優點是大大簡化了主程序設計,并且CPU會定時關心鍵盤,只要定時中斷時間足夠短(如為幾十mS),就不會漏掉每一次的按鍵輸入。
  
下面為判斷按鍵輸入的T1定時中斷服務子程序,序號為解釋方便而加。

序號  
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圖片點擊可在新窗口打開查看[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圖片點擊可在新窗口打開查看3=j;
        
48:}
  
序號1(程序解釋,以下同):聲明定時1中斷函數。
  
序號2:定時1中斷函數開始。
  
序號3:定義i、j為無符號字符型局部變量。將當時的P1口、P3口狀態送i、j暫存。
  
序號4、5:定時器T1重新載入10mS初值。
  
序號6:如變量m等于1,則變量n遞增。說明:m、n為整個程序開始時定義的無符號字符型全局變量。
  
序號7:如變量n大于等于30,則m、n清零。
  
序號8:P3.7置0,準備讀取按鍵輸入。
  
序號9:P1口置全1,準備讀取按鍵輸入。
  
序號10:如果P1口不等于全1,說明4個按鍵中有鍵按下。
  
序號11:進入if(P1!=0xff)語句范圍。
  
序號12:如果n等于0,進入if(n==0)語句,m置1。
  
序號13:如果n等于1,進入if(n==1)語句,同時進行下面的具體判斷按鍵語句。作用效果為:開始時m、n均賦0,一旦有鍵按下,第一次中斷產生時m賦1;第二次中斷產生時n遞增。當n等于1時(第二次中斷產生)進入下面的具體判斷按鍵語句。若持續按下鍵,則第三次中斷產生~第三十一次中斷產生時,程序不進入具體的判斷按鍵語句過程(因這時n不等于1)。由于中斷每10mS產生一次,這樣可實現每0.31秒(31x10=0.31秒)進行一次加法或移位的操作,與人眼的視覺特性相吻合。
  
序號14:進入具體判斷按鍵語句范圍。
  
序號15:如果P1.0等于0(即電路中的set鍵按下),變量set遞增,變量left清0。說明:set、left是為了判斷模式設定及左移而在整個程序開始時定義的無符號字符型全局變量。
  
序號16:如果set大于等于4,則set清0。說明:set值只能在0~3間變化,只有4種工作模式(走時及輸出控制模式、走時調整模式、定時1調整模式、定時2調整模式)。
  
序號17:在set等于1時,向RAM區標志變量flag寫入55H。說明:flag是在整個程序開始時定義的無符號字符型全局變量,用作判斷RAM區是否受干擾的依據。

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

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

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

如圖  我們首先的 有 啟動IIC器件的函數 start(),和停止IIC器件的函數 stop(),由于要對其進行寫地址(SAR/W),和寫寄存器地址,得有個寫1字節的函數 write_byte(),然后就是連續寫的函數write(),和連續讀read(),外加2個檢驗是否聽話的標志位 ack(),ACK,nck(),NCK。

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

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

]]>
在有限資源的單片機上實現模擬系統的討論http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=55&ID=2211&Page=1wangxinxin2010-12-7 14:18:11嵌入式網絡單片機集成式開發系統主模塊模擬家庭網關,并利用其外圍擴展模塊模擬信息家電,從而成功搭建了一個模擬家庭網關和信息家電交互的軟硬件平臺,這種利用一個單片機集成系統對家庭網關和信息家電進行模擬,為研究信息家電的內部體系結構以及家庭網關和信息家電功能分配提供了實驗平臺,同時大大節省了資源和費用。

  2  相關理論研究

  2.1信息家電

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

  2.2家庭網關

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

  家庭網關接口的有效的解決方案,當前比較統一的觀點是開發一個集中式網關,它將提供一個最有效的橋接外部網絡和家庭網絡或設備的解決方案。另外,以PC作為家庭網關,體積過大,環境適應能力差,而且還必須安裝兩個網絡適配器(一個用于連接 Internet,一個用于連接內部網絡),總的費用也比一臺專用網關要高。因此,設計專用網關是完全有必要的。鑒于家庭網關的功能特點,其邏輯結構應如圖1所示。

家庭網關邏輯結構

圖1家庭網關邏輯結構

  3   硬件選型

  3.1 SX52的特點

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

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

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

MCU 據此可判斷已搜索到一個電視頻道。
進一步檢查發現,C207 短路失效,分離電路不能正常工作,MCU 失去了判斷的依據

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

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

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

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

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


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

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


問題2:高溫老化“不能開機”。
解決方案: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:高溫老化場幅底部反折。
解決方案:R306 由4.3 歐2W 改為1.8 歐2W 的電阻;工廠數據

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

解決方案:將工廠菜單中的DELAY 項設為00


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

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

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

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

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

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

 

單片機指令系統與匯編語言程序

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


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

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


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

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

MCU--51 CPU和存儲器

單片機8051的CPU由運算器和控制器組成。

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

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

  2輔助進位標志AC。又稱半進位標志,它反映了兩個八位數運算低四位是否有半進位,即低四位相加(或減)有否進位(或借位),如有則AC為1狀態,否則為0。

  3溢出標志位OV。MCS-51反映帶符號數的運算結果是否有溢出,有溢出時,此位為1,否則為0。

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

二、控制器

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

三、存儲器

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

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

二、數據存儲器

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

三、特殊功能寄存器

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

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

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


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


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


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


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

]]>
關于“單片機初中級...”的內容http://www.hufushizhe.com/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圖片點擊可在新窗口打開查看CALL D200    ;
DJNZ R2,LOOP1       ;
INC DPTR            ;
D200:MOV R4,#81H    ;
D200B:MOV A,#OFFH   ;
D200A圖片點擊可在新窗口打開查看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.]]>
單片機抗干擾技術及應用http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=55&ID=2207&Page=1wangxinxin2010-12-7 14:04:18
工業環境中的干擾一般是以脈沖形式進入微機系統,渠道主要有三條,如圖1所示。

空間干擾(場干擾),電磁信號通過空間輻射進入系統。

過程通道干擾,干擾通過與系統相連的前向通道、后向通道及與其它系統的相互通道進入。

供電系統干擾,電磁信號通過供電線路進入系統。

一般情況下空間干擾在強度上遠小于其它兩種,故微機系統中應重點防止過程通道與供電系統的干擾。

抗干擾措施有硬件措施和軟件措施。硬件措施如果得當,可將絕大部分干擾拒之門外,但仍然會有少數干擾進入微機系統,故軟件措施作為第二道防線必不可少。由于軟件抗干擾措施是以CPU為代價的,如果沒有硬件消除絕大多數干擾,CPU將疲于奔命,無暇顧及正常工作,嚴重影響系統的工作效率和實時性。因此,一個成功的抗干擾系統是由硬件和軟件相結合構成的。

筆者設計的激光打標控制系統由于現場使用環境較惡劣,各種干擾因素較多,如交流噪聲、電網干擾及其它電磁干擾等,因此必須采取有效的抗干擾措施以確保系統穩定工作,下面介紹我們在該系統硬件、軟件和CPU上采取的抗干擾措施。

硬件措施

光電隔離

在輸入和輸出通道上采用光電隔離器來進行信息傳輸是很有好處的,它將微機系統與各種傳感器、開關、執行機構從電氣上隔離開來,很大一部分干擾將被阻擋。本系統中步進電機驅動電路采用了光電隔離器4N33。電路如圖2所示。

過壓保護電路

在輸入輸出通道上應采用一過壓保護電路,以防引入高電壓,傷害微機系統。過壓保護電路由限流電阻和穩壓管組成,限流電阻選擇要適宜,太大會引起信號衰減,太小起不到保護穩壓管的作用。穩壓管的選擇也要適宜,其穩壓值以略高于最高傳送信號電壓為宜,太低將對有效信號起限幅效果,使信號失真。步進電機驅動電路即采用過壓保護電路。

抗干擾電源

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

配置去耦電容

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

良好接地

本系統既有模擬電路又有數字電路,因此數字地與模擬地要分開,最后只在一點相連,如果兩者不分,則會互相干擾。

軟件措施

單片機在輸出信號時,外部干擾有可能使信號出錯。本系統中單片機發出的驅動步進電機的信號經鎖存器鎖存后傳送給驅動電路,鎖存器對干擾非常敏感,當鎖存線上出現干擾時,會盲目鎖存當前數據,而不管是否有效。因此首先應將鎖存器與單片機安裝在同一電路板上,使傳輸線上傳送的是已經鎖存好的控制信號。在軟件上,最有效的方法就是重復輸出同一個信號,只要重復周期盡可能短,鎖存器接收到一個被干擾的錯誤信號后還來不及作出有效的反應,一個正確的輸出信號又來到,就可以及時防止錯誤動作的產生。

CPU抗干擾措施

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

人工復位

對于失控的CPU,最簡單的方法是使其復位,程序自動從0000H開始執行。為此只要在單片機的RESET端加上一個高電平信號,并持續10ms以上即可。

掉電保護

電網瞬間斷電或電壓突然下降將使微機系統陷入混亂狀態,電網電壓恢復正常后,微機系統難以恢復正常。對付這一類事故的有效方法就是掉電保護。掉電信號由硬件電路檢測到,加到單片機的外部中斷輸入端。軟件中斷將掉電中斷規定為高級中斷,使系統及時對掉電作出反應。在掉電中斷子程序中,首先進行現場保護,保存當時重要的狀態參數,當電源恢復正常時,CPU重新復位,恢復現場,繼續未完成的工作。

睡眠抗干擾

CMOS型的51系列單片機具有睡眠狀態,此時只有定時/計數系統和中斷系統處于工作狀態。這時CPU對系統三總線上出現的干擾不會作出任何反應,從而大大降低系統對干擾的敏感程度。

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

指令冗余

當CPU受到干擾后,往往將一些操作數當作指令碼來執行,引起程序混亂。這時我們首先要盡快將程序納入正軌(執行真正的指令系列)。MCS-51系統中所有指令都不超過3個字節,而且有很多單字節指令。當程序彈飛到某一條單字節指令上時,便自動納入正軌。當彈飛到某一雙字節或三字書指令上時,有可能落到其操作數上,從而繼續出錯。因此,我們應多采用單字節指令,并在關鍵的地方人為地插入一些單字節指令(NOP),或將有效單字書指令重復書寫,這便是指令冗余。

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

軟件陷阱

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

所謂軟件陷阱,就是一條引導指令,強行將捕獲的程序引向對程序出錯進行處理的程序。如果我們把這段程序的入口標號稱為ERR的話,軟件陷阱即為一條LJMP ERR指令,為加強其捕捉效果,一般還在它前面加兩條NOP指令,因此,真正的軟件陷阱由三條指令構成:

NOP

NOP

LJIMP ERR

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

(1)未使用的中斷向量區。當干擾使未使用的中斷開放,并激活這些中斷時,就會進一步引起混亂。如果在這些地方布上陷阱,就能及時捕捉到錯誤中斷。

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

(3)表格。有兩類表格,一類是數據表格,供MOVC A,@A+PC指令或MOVC A,@A+DPTR指令使用,其內容完全不是指令。另一類是散轉表格,供JMP @A+DPTR指令使用,其內容為一系列的三字節指令 LJMP或兩字節指令 AJMP。由于表格內容和檢索值有一一對應關系,在表格中間安排陷阱將會破壞其連續性和對應關系,只能在表格的最后安排五字節陷阱(NOP NOP LJMP ERR)。

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

……

AJMP ABC

NOP

NOP

LJMP ERR

……

ABC:MOV A,R2

RET

NOP

NOP

LJMP ERR

ERR: ……

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

 

結語

綜上所述,通過對單片機應用系統的軟硬件全面考慮,并針對不同的情況采取不同的技術措施,保證了系統準確、可靠運行。激光打標控制系統采用了上述抗干擾措施后,系統可靠性大大增強,運行穩定,效果理想,現已批量生產,取得了良好的經濟效益。■

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

    1、單片機每“次”的確只能接收1個字節,但由于串口的速度實在太低,通常都在115200bps以下(即使用了同步方式也“只能”達到1Mbps)。注意,是bps,位/秒,而不是“字節/秒”,這就是“串”行通信,要至少8個“bps時間”才能接收一個完整的字符,事實上,加上起始位等,8個位往往傳送不了一個字節(不知道我的理解是不是有偏差),這就是說,速度至少還要再慢上8倍。

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

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

    4、即使CPU的任務相當繁重,或對接收到的每個字節都需要進行相當復雜的處理,我們也完全可以通過建立接收緩沖區的方式將暫時來不及處理的數據暫存起來,等CPU空閑時再做處理。而從SBUF取出數據并保存到緩沖區只需要很少的幾條指令就能完成,不會影響到串口繼續接收。

    5、標準的RS-232協議并非只有TX、RX和GND三個引腳,即便是最簡單的9針插口,也專門設計了檢測傳輸狀態和收發請求的針腳。如果單片機真的實在無法及時完成收發動作,也完全可以利用一個口線作為狀態標識,使PC能夠知道單片機什么時候可以接收數據,而不會任由數據丟失。

    6、為了增加數據傳輸的可靠性,大量數據傳輸時通常都會采用CRC校驗方式,并以“包”或“幀”的方式發送有格式約定的字節流,而非單個字符,這樣一來,完全可以通過約定一些“通信協議”的方式,使收發雙方都能夠及時知道接收的數據是否完整,并及時重發新發送出錯的數據。

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

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

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

即使沒采用匯編語言,C編譯器已經為我們產生出來很精簡的語句,當然32至36之間的代碼還可以采用匯編優化。
所以首先程序優化,然后在進行匯編,難度降低了很多。因為程序優化后,C編譯出來的匯編,在進行優化工作量很小了。
其中計數器的代碼變化最大,優化了10行之多。給我可以自己用編譯器試驗一下。

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

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

由于本人水平有限,舉例采用的是8051(因為我的電腦是P3 800,運行proteus正好)。希望對大家有參考作用]]>
關于對51單片機端口上拉電阻的討論http://www.hufushizhe.com/bbs/dispbbs.asp?BoardID=55&ID=2203&Page=1wangxinxin2010-12-7 13:54:23前一段時間,看到實驗室有個學弟設計了一個電路,其中還有一個鍵盤電路,取其原理是這樣子的:

圖片點擊可在新窗口打開查看

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

         事實上,電路是不工作的.

        問題比較多:

       首先,將電源直接接到端口上是絕對不可以的.當按下按鍵的時候,會有很大的電流進入單片機.在工程上,這種往往應該加限流電阻的.一般選擇1K的就可以.如果選擇太大的電阻也不好,因為電阻上面壓降太大,造成輸入比應有的高電平低,造成錯誤.

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

圖片點擊可在新窗口打開查看

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

圖片點擊可在新窗口打開查看

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

圖片點擊可在新窗口打開查看

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

        從這里我們可以看出:DataSheet還是有用的,在設計的時候,有很多細節,需要注意,否則,可能功虧一簣.

]]>
主站蜘蛛池模板: 免费二级毛片免费完整视频| 国产精品污WWW在线观看| 亚洲乱码国产乱码精品精| 爱爱视频天天干| 国产伦精品一区二区三区无广告| av天堂午夜精品一区二区三区| 我两腿被同学摸的直流水| 亚洲一区精品无码| 欧美日韩国产高清视频| 刘伯温致力打造火热全网| 色婷婷综合久久久久中文字幕| 国产精品国产三级在线专区| а√天堂资源官网在线8| 我的娇妻acome| 亚洲av无码一区二区三区dv| 欧美激情综合色综合啪啪五月| 又色又爽又黄的视频女女高清| 豆奶视频官网下载观看| 国产精品揄拍一区二区| 一区二区三区免费电影| 成年18网站免费视频网站| 亚洲av乱码一区二区三区香蕉| 欧美性色19p| 免费国产小视频| 精品性高朝久久久久久久| 国产欧美专区在线观看| 97色精品视频在线观看| 天天操天天干天天摸| 中文字幕无线码一区二区| 日本www.色| 亚洲AV综合色区无码二区偷拍| 欧美人体一区二区三区| 你懂得的在线观看免费视频| 精品丝袜国产自在线拍亚洲| 国产亚洲一区二区三区在线| 靠逼软件app| 国产盗摄在线观看| 99re热久久这里只有精品首页| 大陆三级理论电影有哪些| 中国一级毛片录像| 成人精品一区二区电影|