找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7053|回復(fù): 3
收起左側(cè)

MCS51單片機(jī)學(xué)習(xí)經(jīng)驗(yàn)[轉(zhuǎn)帖]新手進(jìn)階篇

[復(fù)制鏈接]
ID:3262 發(fā)表于 2009-8-12 23:53 | 顯示全部樓層 |閱讀模式

第一次寫這種東西,不好的地方大家多補(bǔ)充...........

    目的:參加了個(gè)群,里面菜鳥好多,這沒什么,高手都是曾經(jīng)的菜鳥,這里只是給個(gè)學(xué)習(xí)的提綱,大家共同提高.還希望大家不要罵我,汗~~

    適用人群:8051系列單片機(jī)的初學(xué)者,有一點(diǎn)使用經(jīng)驗(yàn)的人群,如果你是高手就請(qǐng)多多指教咯,俺們一起完善吧,希望能給新手帶來(lái)指引。

    提到的范圍:8051系列硬件,擴(kuò)展接口,匯編,C51編程什么的,反應(yīng)好的話就貼點(diǎn)做過的項(xiàng)目和同志們探討下.....注意,這只是學(xué)習(xí)要注意的地方,絕對(duì)不是教科書,千萬(wàn)不要光看這個(gè),沒什么用的.
   
    關(guān)于更新:本人不是無(wú)業(yè)游民,因此時(shí)間有限,有精力的話會(huì)努力更新的,有時(shí)候忙起來(lái)沒空照顧我的電子工程師博客,還請(qǐng)大大們不要見怪.以后有空的話會(huì)寫些16位的以及高級(jí)C編程方面的東西,看時(shí)間吧

    經(jīng)驗(yàn)之談:要學(xué)習(xí)單片機(jī),最好的方法是做項(xiàng)目,先看些基本的書籍,不要太精細(xì),然后找個(gè)不太復(fù)雜的已經(jīng)做好的的項(xiàng)目,拿來(lái)仔細(xì)看,這樣能夠在一個(gè)月之內(nèi)得到很大的提高,至少比在課堂學(xué)習(xí)一學(xué)期要好得多.然后接觸些復(fù)雜的工程快速提高自己.為什么要做項(xiàng)目,就是在實(shí)踐中找問題,遇到問題不要慌,有了問題是好事,現(xiàn)在網(wǎng)絡(luò)非常發(fā)達(dá),相關(guān)的資料也非常多,可以去找,去論壇上問,QQ群里問,要注意搜集積累資料,這里推薦一個(gè)不錯(cuò)的論壇:電子工程論壇:http://bbs.eetzone.com .很多資料下載,基本沒有什么無(wú)聊的帖子夾在里面,我比較喜歡,人氣還很不錯(cuò)。還有就是多交些志同道合的朋友,切忌一個(gè)人埋頭苦干。

    好了,廢話不多說,讓我們開始正題

一、硬件結(jié)構(gòu)

    很多人不喜歡看這章,其實(shí)這是很重要的地方,其他知識(shí)都是在這里的基礎(chǔ)上產(chǎn)生的,尤其是新人,千萬(wàn)千萬(wàn)要重視硬件,別以為C語(yǔ)言真的可以獨(dú)立于硬件,那樣不可能做個(gè)頂級(jí)的C_er.

    別的不說,引腳圖到處都有,自己去看,強(qiáng)調(diào)下存儲(chǔ)器好了,這里還比較重要.51系列的單片機(jī)里分ROM和RAM,ROM有4KB,主要用來(lái)放程序代碼以及一些不變的常數(shù)和表格什么的,類似于PC匯編中的CODE段的作用.有幾個(gè)比較特殊的地方強(qiáng)調(diào)下,ROM中有7個(gè)單元是有特殊用途的,編寫匯編的時(shí)候要注意下,一個(gè)是0000H,系統(tǒng)復(fù)位后是從這里開始執(zhí)行的,一般在這里加個(gè)強(qiáng)行跳轉(zhuǎn)指令,跳到自己的主程序入口地址,然后是幾個(gè)中斷源地址,可以用:8n+3    n=0,1,2,3,4來(lái)計(jì)算這幾個(gè)中斷地址,往往是在這里添加的無(wú)條件跳轉(zhuǎn)指令,跳到自己些的中斷程序入口.可能這里有些人不大明白,沒關(guān)系,后面C51編程時(shí)要詳細(xì)講到.

    片內(nèi) RAM共計(jì)128Byte,是由用戶自己定義并使用的,運(yùn)算中的變量,堆棧什么的就放在這里了,00H到1FH為工作寄存器組區(qū),分為4個(gè)組,每組有8個(gè)單元,都以R0~R7表示,匯編中可以直接用了,很方便,要換寄存器組的話就更改RSW單元好了.在20H到2FH的區(qū)域中還可以進(jìn)行位尋址(注意:這里很容易被忽視,一定要知道這個(gè)),這里解釋下,可能有些同志不太清楚了,位也就是一個(gè)字節(jié)中的組成部分,一個(gè)字節(jié)有8位,OK,位操作就是指以其中的一個(gè)位進(jìn)行操作,什么把1變成0.0變成1什么的,呵呵,什么狀態(tài)標(biāo)志都在這里咯.后面的直到7FH都是數(shù)據(jù)緩沖區(qū),隨便用了.

   80H到FFH(高128個(gè)Byte)又叫SFR,這里是用于控制單片機(jī),管理片內(nèi)算術(shù)邏輯部件,并行I/O口,串行I/O口,定時(shí)器/計(jì)數(shù)器,中斷系統(tǒng)等功能模塊.你可以更改其中的值,但不能移作它用.具體的東西自己去看教材好了,上面全有.不明白沒關(guān)系,做幾個(gè)項(xiàng)目,什么都明白了.里面也有可以按位操作的,至于具體用途看書,嘿嘿

累了,待續(xù)..........

二,1、單片機(jī)編程技巧--功能強(qiáng)大的時(shí)鐘中斷
單片機(jī)程序設(shè)計(jì)中,設(shè)置一個(gè)好的時(shí)鐘中斷,將能使一個(gè)CPU發(fā)揮兩個(gè)CPU的功效,大大方便和簡(jiǎn)化程序的編制,提高系統(tǒng)的效率與可操作性。我們可以把一些例行的及需要定時(shí)執(zhí)行的程序放在時(shí)鐘中斷中,還可以利用時(shí)鐘中斷協(xié)助主程序完成定時(shí)、延時(shí)等操作。
  下面以6MHz時(shí)鐘的AT89C51系統(tǒng)為例,說明時(shí)鐘中斷的應(yīng)用。
  定時(shí)器初值與中斷周期 時(shí)鐘中斷無(wú)需過于頻繁,一般取20mS(50Hz)即可。如需要百分之一秒的時(shí)基信號(hào),可取10mS(100Hz)。這里取20mS,用定時(shí)器T0工作于16位定時(shí)器方式(方式1)。T0的工作方式為:每過一個(gè)機(jī)器周期自動(dòng)加1,當(dāng)計(jì)滿0FFFFh,要溢出時(shí),便會(huì)產(chǎn)生中斷,并由硬件設(shè)置相應(yīng)的標(biāo)志位供軟件查詢。即中斷時(shí)比啟動(dòng)時(shí)經(jīng)過了N+1個(gè)機(jī)器周期。所以,我們只要在T0中預(yù)先存入一個(gè)比滿值0FFFFh小N的數(shù),然后啟動(dòng)定時(shí)器,便會(huì)在N個(gè)機(jī)器周期后產(chǎn)生中斷。這個(gè)值便是所謂的“初值”。下面計(jì)算我們需要的初值:時(shí)鐘為6MHz,12個(gè)時(shí)鐘周期為一個(gè)機(jī)器周期,20mS中有10000個(gè)機(jī)器周期。(10000)10=(2710)16,則0FFFFh-2710h+1=0D8F0h。由于響應(yīng)中斷、保護(hù)現(xiàn)場(chǎng)及重裝初值還需要7~8個(gè)機(jī)器周期,把這個(gè)值再加上7,即T0應(yīng)裝入的初值是0D8F7h。每次中斷進(jìn)入后,先把A及PSW的值壓入堆棧,然后即把0D8F7h裝入T0。
  設(shè)置一個(gè)單元,每次中斷加1 我們可以取內(nèi)部RAM中一個(gè)單元,取名為INCPI(Increase Per Interrupt),在中斷中,裝完T0初值后,用INC INCPI指令將其加一。從這個(gè)單元中,無(wú)論中斷程序還是主程序,都可以從中獲得20mS的1~256之間任意整數(shù)倍的信號(hào)。例如:有一段向數(shù)碼管送顯的程序,需要每0.5秒執(zhí)行一次以便刷新顯示器,便可以設(shè)一單元(稱為等待單元)W_DISP,用/MOV A,INCPI/ADD A,#25/MOV W_DISP,A/語(yǔ)句讓其比當(dāng)前的INCPI值大25,然后在每次中斷中檢查是否于INCPI值相等。若相等,說明已過了25個(gè)中斷周期,便執(zhí)行送顯程序,并且讓W(xué)_DISP再加上25,等待下個(gè)0.5秒。我們可以設(shè)置多個(gè)等待單元,以便取出多個(gè)不同的時(shí)基信號(hào)。讓中斷程序在每次中斷時(shí)依次查詢各個(gè)等待單元是否與INCPI相等,若相等,則執(zhí)行相應(yīng)的處理,并重新設(shè)置該等待單元的值,否則跳過。例如:用0.5秒信號(hào)刷新或閃爍顯示器,用1秒信號(hào)產(chǎn)生實(shí)時(shí)時(shí)鐘,或輸出一定頻率的方波,以一定間隔查詢輸入設(shè)備等。
  在中斷中讀鍵 通常,我們?cè)谥鞒绦蛑凶x鍵盤,步驟為:掃描鍵盤,若有鍵按下,則延時(shí)幾十毫秒去抖動(dòng),再次確認(rèn)此鍵確實(shí)按下,然后處理該鍵對(duì)應(yīng)的工作,完成后再次重上述步驟。但這有兩點(diǎn)不足:1.處理相應(yīng)工作時(shí)無(wú)法鎖存按鍵的輸入,即可能漏鍵。2.延時(shí)去抖時(shí)CPU無(wú)法做其它事情,效率不高。如果把讀鍵放入時(shí)鐘中斷中,則可避免上述不足。方法為:如果兩次相鄰的中斷中都讀到同一個(gè)鍵按下,則這個(gè)鍵是有效的(達(dá)到了去抖目的),并將其鎖存到先入先出(隊(duì)列)的鍵盤緩沖區(qū),等主程序來(lái)處理。這樣,主程序處理按鍵的同時(shí),仍可響應(yīng)鍵盤的輸入。緩沖區(qū)深度通?稍O(shè)為8級(jí),若鎖存的鍵數(shù)多于8個(gè),則忽略新的按鍵,并報(bào)警提示用戶新的按鍵將無(wú)效。若鍵盤緩沖隊(duì)列停滯的時(shí)間大大長(zhǎng)于主程序處理按鍵所需要的最大時(shí)間,說明主程序已出錯(cuò)或跑飛,可以在中斷用指令將系統(tǒng)復(fù)位,起到了看門狗的目的。
  主程序中的延時(shí) 由于有常開的時(shí)鐘中斷,所以當(dāng)主程序中有需要時(shí)間較短、精度較高的延時(shí)時(shí),應(yīng)暫時(shí)把時(shí)鐘中斷關(guān)閉。而程序中需要時(shí)間較長(zhǎng)、精度不高的延時(shí)時(shí),便可仿照下需的寫法,避免多層嵌套的循環(huán)延時(shí)。
  例:在P1.1輸出1秒的高電平脈沖
  MOV  A,INCPI
  INC  A
  CJNE  A,INCPI$ ;等待一次中斷處理完成
  SETB  P1.1   ;設(shè)P1.1為H,脈沖開始
  ADD  A,#50   。50個(gè)20mS為1秒
  CJNE  A,INCPI,$ 。坏戎袛鄬NCPI加一50次
  CLR  P1.1   。辉O(shè)P1.1為L(zhǎng),脈沖結(jié)束
  結(jié)束語(yǔ):從上看出,要靈活地應(yīng)用時(shí)鐘中斷,將任務(wù)合理分配給中斷和主程序,并且二者要分工明確,接口簡(jiǎn)單。這其中的技巧還需要大家在實(shí)踐中多多摸索與體會(huì)。另外要注意:應(yīng)盡量縮短中斷處理程序的執(zhí)行時(shí)間,更不要長(zhǎng)于20mS。

[此貼子已經(jīng)被作者于2009-8-12 23:54:11編輯過]
回復(fù)

使用道具 舉報(bào)

ID:14394 發(fā)表于 2009-8-13 07:25 | 顯示全部樓層

贊。。。。。。。。。。!

回復(fù)

使用道具 舉報(bào)

ID:16396 發(fā)表于 2009-8-19 16:35 | 顯示全部樓層
學(xué)習(xí)了!
回復(fù)

使用道具 舉報(bào)

ID:16513 發(fā)表于 2009-8-24 16:26 | 顯示全部樓層

說的很對(duì)啊!

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表