新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機一些基礎問題

        單片機一些基礎問題

        作者: 時間:2013-05-16 來源:網絡 收藏

        8051 系列的一些如8052 有附加的128 字節的內部RAM 位于從80H 開始的地址空間中被稱為IDATA 因為IDATA 區的地址和SFRs (特殊功能寄存器)的地址是重疊的通過區分所訪問的存儲區來解決地址重疊問題因為IDATA 區只能通過間接尋址來訪問。8051 的最后一個存儲空間為64K 和CODE 區一樣采用16 位地址尋址稱作外部數據區簡稱XDATA 區這個區通常包括一些RAM 如SRAM 或一些需要通過總線接口的外圍器件。

        8051 可對存儲區直接或間接尋址這些是典型的尋址方式直接尋址是在指令中直接

        包含所須尋址的字節地址直接尋址只能在DATA 區和SFR 中進行。

        SBUF 串行緩沖區 DPTR 數據指針 MOVX 讀入或寫入外部寄存器的數據

        fosc (frequency oscillate)晶振頻率

        指針寄存器而不是直接使用地址

        中斷系統

        基本的8051 支持6 個中斷源兩個外部中斷兩個定時/計數器中斷一個串行口輸

        入/輸出中斷中斷發生后處理器轉到將五個中斷入口處之一執行中斷處理程序中斷向

        量位于代碼段的最低地址出串行口輸入輸出中斷共用一個中斷向量

        reg51.h 詳細說明

        是c51(用于開發的一種c語言)的頭文件。類似于頭文件AT89X52.h。這兩個頭文件基本是一樣的,只是在使用時對位的定義不一樣,at89x52.h文件中對P1.1的操作是寫成P1_1;reg52.h文件中的操作則寫成P1^1。表示方法不一樣而已。另外前者是特指ATMEL公司的52系列,后者指所有52系列的單片機。

        LED3.C(8): error C141: syntax error near '='

        在c51單片機里面不可以用#define LED1 P0^1

        正確的使用sbit LED1=P0^1;

        還有keil編譯器不支持像P0^1=0;或P0^1=1;這樣的賦值

        本征庫(intrinsic routines)和非本征證庫

        C51提供的本征是指編譯時直接將固定的代碼插入當前行,而不是用ACALL和LCALL語句來實現,這樣就大大提供了函數訪問的效率,而非本征函數則必須由ACALL及LCALL調用。

        C51的本征庫函數只有9個,數目雖少,但都非常有用,列如下:

        _crol_(_cror_):將char型變量循環向左(右)移動指定位數后返回

        _iror_(_irol_):將int型變量循環向左(右)移動指定位數后返回

        _lrol_(_lror_):將long型變量循環向左(右)移動指定位數后返回

        _nop_: 相當于插入NOP “空指令”,在x86的CPU中機器碼為0x90(144)。

        _testbit_: 相當于JBC bitvar測試該位變量并跳轉同時清除。

        _chkfloat_: 測試并返回源點數狀態。

        使用時,必須包含#inclucle 一行。

        如不說明,下面談到的庫函數均指非本征庫函數。

        TMOD:定時器/計數器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)

        定時器/計數器模式控制寄存器TMOD是一個逐位定義的8位寄存器,但只能使用字節尋址,其字節地址為89H。

        其格式為:

        工作原理

        其中低四位(即D0 ~ D3)定義定時器/計數器T0,高四位(即D4 ~ D7)定義定時器/計數器T1。各位的說明:

        Ⅰ,GATE——門控制。

        ●GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。

        當INT0引腳為高電平時TR0置位,啟動定時器T0;

        當INT1引腳為高電平時TR1置位,啟動定時器T1。

        ●GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。

        Ⅱ,C/T——功能選擇位

        C/T=0時為定時功能,C/T=1時為計數功能。

        置位時選擇計數功能,清零時選擇定時功能。

        Ⅲ,M0、M1——方式選擇功能

        由于有2位,因此有4種工作方式:

        M1M0工作方式功能說明

        00方式013位定時器/計數器

        01方式116位定時器/計數器

        10方式2自動重裝8位定時器/計數器

        11方式3T0分為2個8位獨立計數器,T1停止計數

        TR0,TR1:分別為T0,T1的運行控制位。1啟動,0停止。

        GATE:門控制位。GATE=0,由TR0或TR1啟動定時器;GATE=1,只有TR0或TR1為1且INT0 或INT1 為高電平時才能啟動定時器。

        單片機中的TH0 TL0

        TH0和TL0是控制定時/計數器T0的,TH1和TL1是針對T1的。也就是用TH0和TL0中的數來控制T0到底定時多久或計數多少再進入中斷,TH1和TL1也一樣。

        16位定時器/計數器的高低位,TL0是低八位,TH0=是高八位,當低八位計數記滿了之后,向高八位進一位,計數器,由于51單片機是8位機,所以要分成兩個八位的寄存器來存儲16位的計數器!

        單片機 TH0=0xd8;TL0=0xf0是什么意思

        這是為 T0 計數器賦初值,(高位)TH0=0xd8(0xffd8,初始地址為0xffff),(低位)TL0=0xf0(0xfff0)

        換成 10 進制是:55536

        那么 65536-55536=10000

        表明 T0 計數器 計數 10000 個機器周期后溢出。

        如果使用 12M 晶振,那么計數 10000 個機器周期使用 10ms,可以作為定時用。

        由于TH0和TL0已知,那么可得T0寄存器中為:0xFF00(16)=65280(10)

        X=65536-T0=65536-65280=256,,X即為定時機器周期數

        如果是12MHz的話,機器周期=1us,那么定時為256us

        如果是6MHz的話,機器周期=2us,那么定時時間為512us

        機器周期=12*晶振周期,晶振周期=1/晶振頻率

        指令周期是看一條指令包含有多少個機器周期,如_nop_就一個機器周期

        延時函數delay()

        c語言里不是那么算的,編譯的時候轉匯編了用匯編才算的出,不用糾結這個的精確延時的話也都用定時器,大致的延時的話用軟件去算就行了

        void delay_ms(unsigned int x)

        {

        unsigned int i,j;

        for(i=0;i

        for(j=0;j125;j++);

        }

        AJMP

        是無條件跳轉指令之一,叫做絕對跳轉。 主要是用來改變程序執行的路線,到需要的指令或程序去執行。 AJMP的范圍為正負2K單元。使用時注意跳的目的地和當前地址的距離范圍不能超過上述值,否則,就會跳過不去。

        $

        $代表它自己所在位置的地址

        中斷允許寄存器IE



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 勃利县| 博爱县| 嘉峪关市| 沾益县| 孟连| 临邑县| 枞阳县| 尉氏县| 阿荣旗| 金平| 翁牛特旗| 牙克石市| 上蔡县| 内丘县| 和龙市| 宣武区| 清河县| 丹江口市| 惠州市| 高平市| 玛沁县| 铜山县| 榆树市| 鱼台县| 阿尔山市| 宜黄县| 玛曲县| 莫力| 马山县| 天长市| 景洪市| 丹巴县| 侯马市| 巴青县| 双鸭山市| 余姚市| 新安县| 清徐县| 清丰县| 两当县| 平遥县|