久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC89C52在Keil C51中找不到芯片組,解決方法

[復制鏈接]
ID:387837 發(fā)表于 2018-8-19 15:32 | 顯示全部樓層 |閱讀模式

在KEIL中,選擇芯片的時候,是不能選STC系列的。
不過,對于STC的任何一個系列,你都可以選擇AT89S52系列。STC系列兼容51系列的單片機,也就是說,51系列的單片機有的功能STC一般都有。在書寫程序的時候,編譯器的檢錯,是不會具體針對你新建工作程時所選某一塊芯片來檢錯的。雖STC系列兼容AT89S52的功能。但,有也不同之處,因為現(xiàn)在STC系列的大部分單片機都對其功能進行了增強。就連STC系列很普通的單片機都擴展了外部RAM使其數(shù)據(jù)存儲器達到了1280byte  如果你要用到其增強的功能,那就是學會定義頭文件。 萬變不離其宗,學會了定義頭文件,這個問題解決了。以下是我這一陣子,對頭文件的學習及一些體會。可以讓你少走很多彎路。:
            二, reg51.頭文件剖析
   
      我們平時寫單片機應用程序的時候,所使用的頭文件大多都是用的的reg51.h或是用reg52.h。會寫C51的人都會用,但對其頭文件內(nèi)部的定義有所了解的人確并不多。
下面對其內(nèi)部做詳細解釋,方便讀者作進一步的了解,并能運用各類型號的單片機。因為增強型號的單片機的增強功能都是通過特殊功能寄存器控制。
  
打開   reg52.h  頭文件,會發(fā)現(xiàn)是由大量的 sfr ,sbit的聲明組成,甚至于還有sfr16.其實這樣的聲明都是與單片機內(nèi)部功能寄存器(特殊功能寄存器)聯(lián)系起來的,下面對其做出詳細解釋

sfr:  聲明變量
SFR 聲明一個變量,它的聲明與其它的C變量聲明基本相同,唯一的區(qū)別,SFR在聲明的同時為其指定特殊功能寄存器作為存儲地址,而不同于C變量聲明的整型,字符型等等由編譯器自動分配存儲空間。

   如reg52.h頭文件,第一條聲明就是sfr P0    = 0x80;  
此處聲明一個變量P0,并指定其存儲地址為特殊功能寄存器0x80;,在加入reg52.h頭文件后。編寫應用程序時P0就可以直接使用而無需定義,對P0的操作就是,對內(nèi)部特殊功能寄存器(0x80對應用MCU的P0口)的操作,可進行讀寫操作。
如果將第一條聲明改為sfr K0    = 0x80; 那么,如果要把單片機的P0口全部拉低,則不能寫P0=0x00;而應保存后再在應用程序中寫成K0=0x00;否則編譯器會提示“P0為未定義標識符”
   使用方法:
     sfr  [variable]  =  [address]   //為變量分配一個特殊功能寄存器。
   
1  等號右邊,只能是十進制,十六進制整型的數(shù)據(jù)常量,,不允許帶操作符的表達式
      經(jīng)典的8051內(nèi)核支持的SFR地址從0x80H~0xFF 飛利浦80C51MX系列0x180H~0x1FF
   2  SFR不能聲明于任何函數(shù)內(nèi)部,包括main函數(shù)。只能聲明于函數(shù)外。
   3  用SFR聲明一個變量后,不能用取地址運算符&獲取其地址, 編譯無法通過,編譯器會提示非法操作。
   4  有一點須特別注意,51內(nèi)核0x80~0xff,為特殊功能寄存器地址區(qū)間,但并不是所有的地址都有定義,如果說你所用的MCU芯片上對于某個地址沒有定義,那么用sfr在定義變量的時候,不要把變量的地址分配到未定義的特殊功能寄存器上,雖然編譯時能通過,用KEIL仿真時貌似是沒有問題,但下載到芯片里運行時,是會出問題的。比如說,向一個未定義的特殊功能寄存器執(zhí)行讀操作,讀出來的就是一個未知的數(shù)。(讀者可自行測試,先把串口通信調(diào)通,然后做一個簡單的人機交互。讀出一個數(shù)后,再發(fā)給計算機,用串口調(diào)試助手或是串口監(jiān)控查看。這用方法在仿真的時候很有用。)所以具體那些特殊功能寄存器能夠用,就要查看你使用的芯片手冊。
5 若遇到增強性的單片機,只要知道其擴展的特殊功能寄存器的地址,用SFR定
就可以很方便進行編程。



sbit:  聲明變量
   sbit 同樣是聲明一個變量,和SFR 使用方法類似,但是SBIT是用來聲明一個位變量,因為,在51系列的應用中,非常有必要對SFR的單個位進行存取,而通過bit 數(shù)據(jù)類型,使其具備位尋址功能。
      如,在reg52.h中有如下聲明
          sfr IE    = 0xA8;
          sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;
   所以,對EA的操作即是對IE最高位的操作。

但如果想讓 SP   DPL  DPH   PCON   TMOC  TL0  TL1  TH0  TH1  SBUF這些特殊功能寄存器具備位尋址,采用上述如IE類似的定義,是不行的,雖然修改后,在編譯的時候不會出現(xiàn)錯誤,但只要用到你定義的位變量名時就會出錯。原因是,只有特殊功能寄存器的地址是8的倍數(shù)(十六進制以0或8結(jié)尾)才能進行位尋址。
打開reg52.h頭文件可以看到,所有用sbit聲明了的特殊功能寄存器的地址均是以0或8結(jié)尾
如硬要達到上述要求,可用帶參的宏定義來完成。此處不做詳細說明(意義并不大)。

下面對sbit的使用做詳細介紹:
隨著8051的應用,非常有必要對特殊功能寄存器的單個bit位進行存取,C51編譯器通過sbit 數(shù)據(jù)類型,提供了對特殊功能寄存器的位操作。
       以下是sbit的三種應用形式:
一, sbit  name = sfr-name^bit-position;
  sfr   PSW =0xD0;
  sfr   IE  =0xA8;
   
  sbit   OV= PSW^2;
  sbit   CY=PSW^7;
  sbit   EA= IE^7;
二, sbit  name= sft-address^bit-position;
        sbit  OV =0xD0^2;
        sbit  CY =0xD0^7;
        sbit  EA =0xA8^7;
三, sbit  name= sbit-address;
        sbit  OV =0xD2;
        sbit  CY =0xD7;
        sbit  EA =0xAF;


   現(xiàn)對上述三種形式的聲明做必要的說明
       第一種形式sbit  name = sfr-name^bit-position;如sbit   OV= PSW^2;  當中的這個特殊功能寄存器必須在此之前已經(jīng)用sfr 定義,否則編譯會出錯。
bit-position范圍從0~7;
       第二種形式  sbit  name= sft-address^bit-position如sbit  OV =0xD0^2;  與第一種形式不同之外在于,此處直接使用PSW的地址.第一種形式須先定義PSW
       第三種形式.  sbit  name= sbit-address  如sbit  OV =0xD2 是直接用的OV的地址
OV的地址計算方式,是OV所在的寄存器地址加上OV的bit-position
                     
      注意:
             不是所有的SFR都可位尋址。只有特殊功能寄存器的地址是8的倍數(shù)(十六進制以0或8結(jié)尾)才能進行位尋址,并且sbit聲明的變量名,雖可以是任意取,但是最好不要以下劃線開頭,因為以下劃線開頭的都保留給了C51的頭文件做保留字。
      

sfr16: 聲明變量
      許多8051的派生型單片機,用兩個連續(xù)地址的特殊功能寄存器,來存儲一個16bit的值。例如,8052就用了0xCC和0xCD來保存定時/計數(shù)寄存器2的高字節(jié)和低字節(jié)。編譯器提供sfr16這種數(shù)據(jù)類型,來保存兩個字節(jié)的數(shù)據(jù)。虛擬出一個16bit的寄存器。
       如下:
               sfr16 T2 = 0xCC
     存儲方面為小端存儲方式,低字節(jié)在前,高字節(jié)在后。定義時,只寫低字節(jié)地址,如上,則定義T2為一個16位的特殊功能寄存器。 T2L= 0CCh, T2H= 0CDh
    使用方法:
     sfr  [variable]  =  [low_address]      
1  等號右邊,只寫兩個特殊功能寄存器的低地址,且只能是十進制,十六進制的整型數(shù)據(jù)常量,不允許帶操作符的表達式
   2  SFR不能聲明于任何函數(shù)內(nèi)部,包括main函數(shù)。只能聲明于函數(shù)外。
   3  用SFR聲明一個變量后,不能用取地址運算符&獲取其地址, 編譯無法通過,編譯器會提示非法操作。
      4 當你向一個sfr16寫入數(shù)據(jù)的時候,KEIL CX51 編譯器生成的代碼,是先寫高字節(jié),后寫低字節(jié),(可通過返匯編窗口查看)在有些情況下,這并非我們所想要的操作順序。使用時,須注意。
      5 當你所要寫入sfr16的數(shù)據(jù),當是高字節(jié)先寫還是低字節(jié)先寫非常重要的時候,就只能用sfr 這個關(guān)鍵字來定義,并且任意時刻只保存一個字節(jié),這樣操作才能保證寫入正確。

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:76227 發(fā)表于 2018-8-19 17:08 | 顯示全部樓層
寫的不錯!
回復

使用道具 舉報

ID:76227 發(fā)表于 2018-8-19 17:09 | 顯示全部樓層
寫的不錯!
回復

使用道具 舉報

ID:700561 發(fā)表于 2020-3-14 16:00 | 顯示全部樓層
有用的資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品日韩 | 久久婷婷av| 日本精品视频在线 | 国产精品成人一区二区 | 成人福利在线视频 | 午夜爽爽爽男女免费观看影院 | 在线视频中文字幕 | 国产精品亚洲精品日韩已方 | 欧美日韩成人在线 | 久久久久高清 | aaaaa毛片| 国产91在线播放 | 国产精品美女久久久免费 | 国产欧美性成人精品午夜 | 久久国产综合 | 欧美中文视频 | 狠狠骚 | 激情六月天 | 日本成人中文字幕 | 91亚洲欧美 | 国产精品一二三区 | 国产精品久久久久久久粉嫩 | 日韩一二三区视频 | 国产一区免费 | 天天激情综合 | 我要看黄色录像一级片 | 韩日中文字幕 | 日本不卡一区二区三区 | 免费精品视频在线观看 | 91精品一区二区 | 一区免费观看 | 性网站免费 | 日韩波多野结衣 | 久久不卡 | 日韩一级二级片 | 亚洲激情网站 | 亚洲精品久久久久国产 | 一级黄色短片 | 久久精品亚洲精品 | 亚洲国产精品网站 | 色婷婷综合久久久中字幕精品久久 |