第一次寫這種東西,不好的地方大家多補充...........
目的:參加了個群,里面菜鳥好多,這沒什么,高手都是曾經的菜鳥,這里只是給個學習的提綱,大家共同提高.還希望大家不要罵我,汗~~
適用人群:8051系列單片機的初學者,有一點使用經驗的人群,如果你是高手就請多多指教咯,俺們一起完善吧,希望能給新手帶來指引。
提到的范圍:8051系列硬件,擴展接口,匯編,C51編程什么的,反應好的話就貼點做過的項目和同志們探討下.....注意,這只是學習要注意的地方,絕對不是教科書,千萬不要光看這個,沒什么用的. 關于更新:本人不是無業游民,因此時間有限,有精力的話會努力更新的,有時候忙起來沒空照顧我的電子工程師博客,還請大大們不要見怪.以后有空的話會寫些16位的以及高級C編程方面的東西,看時間吧
經驗之談:要學習單片機,最好的方法是做項目,先看些基本的書籍,不要太精細,然后找個不太復雜的已經做好的的項目,拿來仔細看,這樣能夠在一個月之內得到很大的提高,至少比在課堂學習一學期要好得多.然后接觸些復雜的工程快速提高自己.為什么要做項目,就是在實踐中找問題,遇到問題不要慌,有了問題是好事,現在網絡非常發達,相關的資料也非常多,可以去找,去論壇上問,QQ群里問,要注意搜集積累資料,這里推薦一個不錯的論壇:電子工程論壇:http://bbs.eetzone.com .很多資料下載,基本沒有什么無聊的帖子夾在里面,我比較喜歡,人氣還很不錯。還有就是多交些志同道合的朋友,切忌一個人埋頭苦干。
好了,廢話不多說,讓我們開始正題
一、硬件結構
很多人不喜歡看這章,其實這是很重要的地方,其他知識都是在這里的基礎上產生的,尤其是新人,千萬千萬要重視硬件,別以為C語言真的可以獨立于硬件,那樣不可能做個頂級的C_er.
別的不說,引腳圖到處都有,自己去看,強調下存儲器好了,這里還比較重要.51系列的單片機里分ROM和RAM,ROM有4KB,主要用來放程序代碼以及一些不變的常數和表格什么的,類似于PC匯編中的CODE段的作用.有幾個比較特殊的地方強調下,ROM中有7個單元是有特殊用途的,編寫匯編的時候要注意下,一個是0000H,系統復位后是從這里開始執行的,一般在這里加個強行跳轉指令,跳到自己的主程序入口地址,然后是幾個中斷源地址,可以用:8n+3 n=0,1,2,3,4來計算這幾個中斷地址,往往是在這里添加的無條件跳轉指令,跳到自己些的中斷程序入口.可能這里有些人不大明白,沒關系,后面C51編程時要詳細講到.
片內 RAM共計128Byte,是由用戶自己定義并使用的,運算中的變量,堆棧什么的就放在這里了,00H到1FH為工作寄存器組區,分為4個組,每組有8個單元,都以R0~R7表示,匯編中可以直接用了,很方便,要換寄存器組的話就更改RSW單元好了.在20H到2FH的區域中還可以進行位尋址(注意:這里很容易被忽視,一定要知道這個),這里解釋下,可能有些同志不太清楚了,位也就是一個字節中的組成部分,一個字節有8位,OK,位操作就是指以其中的一個位進行操作,什么把1變成0.0變成1什么的,呵呵,什么狀態標志都在這里咯.后面的直到7FH都是數據緩沖區,隨便用了.
80H到FFH(高128個Byte)又叫SFR,這里是用于控制單片機,管理片內算術邏輯部件,并行I/O口,串行I/O口,定時器/計數器,中斷系統等功能模塊.你可以更改其中的值,但不能移作它用.具體的東西自己去看教材好了,上面全有.不明白沒關系,做幾個項目,什么都明白了.里面也有可以按位操作的,至于具體用途看書,嘿嘿
累了,待續..........
二,1、單片機編程技巧--功能強大的時鐘中斷 單片機程序設計中,設置一個好的時鐘中斷,將能使一個CPU發揮兩個CPU的功效,大大方便和簡化程序的編制,提高系統的效率與可操作性。我們可以把一些例行的及需要定時執行的程序放在時鐘中斷中,還可以利用時鐘中斷協助主程序完成定時、延時等操作。 下面以6MHz時鐘的AT89C51系統為例,說明時鐘中斷的應用。 定時器初值與中斷周期 時鐘中斷無需過于頻繁,一般取20mS(50Hz)即可。如需要百分之一秒的時基信號,可取10mS(100Hz)。這里取20mS,用定時器T0工作于16位定時器方式(方式1)。T0的工作方式為:每過一個機器周期自動加1,當計滿0FFFFh,要溢出時,便會產生中斷,并由硬件設置相應的標志位供軟件查詢。即中斷時比啟動時經過了N+1個機器周期。所以,我們只要在T0中預先存入一個比滿值0FFFFh小N的數,然后啟動定時器,便會在N個機器周期后產生中斷。這個值便是所謂的“初值”。下面計算我們需要的初值:時鐘為6MHz,12個時鐘周期為一個機器周期,20mS中有10000個機器周期。(10000)10=(2710)16,則0FFFFh-2710h+1=0D8F0h。由于響應中斷、保護現場及重裝初值還需要7~8個機器周期,把這個值再加上7,即T0應裝入的初值是0D8F7h。每次中斷進入后,先把A及PSW的值壓入堆棧,然后即把0D8F7h裝入T0。 設置一個單元,每次中斷加1 我們可以取內部RAM中一個單元,取名為INCPI(Increase Per Interrupt),在中斷中,裝完T0初值后,用INC INCPI指令將其加一。從這個單元中,無論中斷程序還是主程序,都可以從中獲得20mS的1~256之間任意整數倍的信號。例如:有一段向數碼管送顯的程序,需要每0.5秒執行一次以便刷新顯示器,便可以設一單元(稱為等待單元)W_DISP,用/MOV A,INCPI/ADD A,#25/MOV W_DISP,A/語句讓其比當前的INCPI值大25,然后在每次中斷中檢查是否于INCPI值相等。若相等,說明已過了25個中斷周期,便執行送顯程序,并且讓W_DISP再加上25,等待下個0.5秒。我們可以設置多個等待單元,以便取出多個不同的時基信號。讓中斷程序在每次中斷時依次查詢各個等待單元是否與INCPI相等,若相等,則執行相應的處理,并重新設置該等待單元的值,否則跳過。例如:用0.5秒信號刷新或閃爍顯示器,用1秒信號產生實時時鐘,或輸出一定頻率的方波,以一定間隔查詢輸入設備等。 在中斷中讀鍵 通常,我們在主程序中讀鍵盤,步驟為:掃描鍵盤,若有鍵按下,則延時幾十毫秒去抖動,再次確認此鍵確實按下,然后處理該鍵對應的工作,完成后再次重上述步驟。但這有兩點不足:1.處理相應工作時無法鎖存按鍵的輸入,即可能漏鍵。2.延時去抖時CPU無法做其它事情,效率不高。如果把讀鍵放入時鐘中斷中,則可避免上述不足。方法為:如果兩次相鄰的中斷中都讀到同一個鍵按下,則這個鍵是有效的(達到了去抖目的),并將其鎖存到先入先出(隊列)的鍵盤緩沖區,等主程序來處理。這樣,主程序處理按鍵的同時,仍可響應鍵盤的輸入。緩沖區深度通常可設為8級,若鎖存的鍵數多于8個,則忽略新的按鍵,并報警提示用戶新的按鍵將無效。若鍵盤緩沖隊列停滯的時間大大長于主程序處理按鍵所需要的最大時間,說明主程序已出錯或跑飛,可以在中斷用指令將系統復位,起到了看門狗的目的。 主程序中的延時 由于有常開的時鐘中斷,所以當主程序中有需要時間較短、精度較高的延時時,應暫時把時鐘中斷關閉。而程序中需要時間較長、精度不高的延時時,便可仿照下需的寫法,避免多層嵌套的循環延時。 例:在P1.1輸出1秒的高電平脈沖 MOV A,INCPI INC A CJNE A,INCPI$ ;等待一次中斷處理完成 SETB P1.1 ;設P1.1為H,脈沖開始 ADD A,#50 ;50個20mS為1秒 CJNE A,INCPI,$ ;等中斷將INCPI加一50次 CLR P1.1 ;設P1.1為L,脈沖結束 結束語:從上看出,要靈活地應用時鐘中斷,將任務合理分配給中斷和主程序,并且二者要分工明確,接口簡單。這其中的技巧還需要大家在實踐中多多摸索與體會。另外要注意:應盡量縮短中斷處理程序的執行時間,更不要長于20mS。
[此貼子已經被作者于2009-8-12 23:54:11編輯過]
|