當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]STC89C51、52內(nèi)部都自帶有2K字節(jié)的EEPROM,54、55和58都自帶有16K字節(jié)的EEPROM,STC單片機(jī)是利用IAP技術(shù)實(shí)現(xiàn)的EEPROM,內(nèi)部Flash擦寫次數(shù)可達(dá)100,000 次以上,先來介紹下ISP與IAP的區(qū)別和特點(diǎn)。ISP:In System Prog

STC89C51、52內(nèi)部都自帶有2K字節(jié)的EEPROM,54、55和58都自帶有16K字節(jié)的EEPROM,STC單片機(jī)是利用IAP技術(shù)實(shí)現(xiàn)的EEPROM,內(nèi)部Flash擦寫次數(shù)可達(dá)100,000 次以上,先來介紹下ISP與IAP的區(qū)別和特點(diǎn)。

ISP:In System Programable 是指在系統(tǒng)編程,通俗的講,就是片子已經(jīng)焊板子上,不用取下,就可以簡單而方便地對其進(jìn)行編程。比如我們通過電腦給STC單片機(jī)下載程序,或給AT89S51單片機(jī)下載程序,這就是利用了ISP技術(shù)。

IAP:In Application Programable 是指在應(yīng)用編程,就是片子提供一系列的機(jī)制(硬件/軟件上的)當(dāng)片子在運(yùn)行程序的時(shí)候可以提供一種改變flash數(shù)據(jù)的方法。通俗點(diǎn)講,也就是說程序自己可以往程序存儲(chǔ)器里寫數(shù)據(jù)或修改程序。這種方式的典型應(yīng)用就是用一小段代碼來實(shí)現(xiàn)程序的下載,實(shí)際上單片機(jī)的ISP功能就是通過IAP技術(shù)來實(shí)現(xiàn)的,即片子在出廠前就已經(jīng)有一段小的boot程序在里面,片子上電后,開始運(yùn)行這段程序,當(dāng)檢測到上位機(jī)有下載要求時(shí),便和上位機(jī)通信,然后下載數(shù)據(jù)到存儲(chǔ)區(qū)。大家要注意千萬不要嘗試去擦除這段ISP引導(dǎo)程序,否則恐怕以后再也下載不了程序了。STC單片機(jī)內(nèi)部有幾個(gè)專門的特殊功能寄存器負(fù)責(zé)管理ISP/IAP功能的,見表1。

表1 ISP/IAP相關(guān)寄存器列表

名稱

地址

功能描述

D7

D6

D5

D4

D3

D2

D1

D0

復(fù)位值

ISP_DATA

E2h

Flash數(shù)據(jù)寄存器









1111 1111

ISP_ADDRH

E3h

Flash高字節(jié)地址寄存器









0000 0000

ISP_ADDRL

E4h

Flash低字節(jié)地址寄存器









0000 0000

ISP_CMD

E5h

Flash命令模式寄存器

--

--

--

--

--

MS2

MS1

MS0

xxxx x000

ISP_TRIG

E6h

Flash命令觸發(fā)寄存器









xxxx xxxx

ISP_CONTR

E7h

ISP/IAP 控制寄存器

ISPEN

SWBS

SWRST

--

--

WT2

WT1

WT0

000x x000

ISP_DATA:ISP/IAP操作時(shí)的數(shù)據(jù)寄存器。

ISP/IAP從Flash讀出的數(shù)據(jù)放在此處,向Flash寫入的數(shù)據(jù)也需放在此處。

ISP_ADDRH:ISP/IAP操作時(shí)的地址寄存器高八位。

ISP_ADDRL:ISP/IAP操作時(shí)的地址寄存器低八位。

ISP_CMD:ISP/IAP操作時(shí)的命令模式寄存器,須命令觸發(fā)寄存器觸發(fā)方可生效。命令模式如表2所示。表2 ISP_CMD寄存器模式設(shè)置

D7

D6

D5

D4

D3

D2

D1

D0

模式選擇

保留

命令選擇


--

--

--

--

--

0

0

0

待機(jī)模式,無ISP操作

--

--

--

--

--

0

0

1

對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)字節(jié)讀

--

--

--

--

--

0

1

0

對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)字節(jié)編程

--

--

--

--

--

0

1

1

對用戶的應(yīng)用程序flash區(qū)及數(shù)據(jù)flash區(qū)扇區(qū)擦除

程序在系統(tǒng)ISP程序區(qū)時(shí)可以對用戶應(yīng)用程序區(qū)/數(shù)據(jù)Flash區(qū)(EEPROM)進(jìn)行字節(jié)讀/字節(jié)編程/扇區(qū)擦除;程序在用戶應(yīng)用程序區(qū)時(shí),僅可以對數(shù)據(jù)Flash區(qū)(EEPROM)進(jìn)行字節(jié)讀/字節(jié)編程/扇區(qū)擦除。STC89C51RC/RD+系列單片機(jī)出廠時(shí)已經(jīng)固化有ISP引導(dǎo)碼,并設(shè)置為上電復(fù)位進(jìn)入ISP程序區(qū),并且出廠時(shí)就已完全加密。

ISP_TRIG:ISP/IAP操作時(shí)的命令觸發(fā)寄存器。

在ISPEN(ISP_CONTR.7)=1時(shí),對ISP_TRIG 先寫入46h,再寫入B9h,ISP/IAP命令才會(huì)生效。

STC89C52RC,STC89LE52RC單片機(jī)內(nèi)部可用DataFlash(EEPROM)的地址如表3所示,其它型號單片機(jī)請查閱相關(guān)資料。

表3STC89C52RC、STC89LE52RC單片機(jī)內(nèi)部EEPROM地址表

第一扇區(qū)

第二扇區(qū)

第三扇區(qū)

第四扇區(qū)

起始地址

結(jié)束地址

起始地址

結(jié)束地址

起始地址

結(jié)束地址

起始地址

結(jié)束地址

2000H

21FFH

2200H

23FFH

2400H

25FFH

2600H

27FFH

第五扇區(qū)

第六扇區(qū)

第七扇區(qū)

第八扇區(qū)

起始地址

結(jié)束地址

起始地址

結(jié)束地址

起始地址

結(jié)束地址

起始地址

結(jié)束地址

2800H

29FFH

2A00H

2BFFH

2C00H

2DFFH

2E00H

2FFFH

每個(gè)扇區(qū)為512字節(jié),建議大家在寫程序時(shí),將同一次修改的數(shù)據(jù)放在同一個(gè)扇區(qū),方便修改,因?yàn)樵趫?zhí)行擦除命令時(shí),一次最少要擦除一個(gè)扇區(qū)的數(shù)據(jù),每次在更新數(shù)據(jù)前都必須要擦除原數(shù)據(jù)方可重新寫入新數(shù)據(jù),不能直接在原來數(shù)據(jù)基礎(chǔ)上更新內(nèi)容。

下面通過一個(gè)例子來講解STC系列單片機(jī)EEPROM的具體用法。

【例】:在實(shí)驗(yàn)板上實(shí)現(xiàn)如下描述,操作STC單片機(jī)自帶的EEPROM,存儲(chǔ)一組按秒遞增的二位數(shù)據(jù),并且將數(shù)據(jù)實(shí)時(shí)顯示在數(shù)碼管上,數(shù)據(jù)每變化一次就往EEPROM中寫入一次,當(dāng)關(guān)閉實(shí)驗(yàn)板電源,再次開啟電源時(shí),從EEPROM中讀取先前存儲(chǔ)的數(shù)據(jù),接著遞增顯示。


#include

#include //52系列單片機(jī)頭文件

#define uchar unsigned char

#define uint unsigned int

#define RdCommand 0x01 //定義ISP的操作命令

#define PrgCommand 0x02

#define EraseCommand 0x03

#define Error 1

#define Ok 0

#define WaitTime 0x01 //定義CPU的等待時(shí)間

sfr ISP_DATA=0xe2;//寄存器申明

sfr ISP_ADDRH=0xe3;

sfr ISP_ADDRL=0xe4;

sfr ISP_CMD=0xe5;

sfr ISP_TRIG=0xe6;

sfr ISP_CONTR=0xe7;

sbit dula=P2^6;//申明U1鎖存器的鎖存端

sbit wela=P2^7;//申明U2鎖存器的鎖存端

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

uchar num;

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)//i=xms即延時(shí)約xms毫秒

for(j=110;j>0;j--);

}

void display(uchar shi,uchar ge)//顯示子函數(shù)

{

dula=1;

P0=table[shi];//送十位段選數(shù)據(jù)

dula=0;

P0=0xff;//送位選數(shù)據(jù)前關(guān)閉所有顯示,防止打開位選鎖存時(shí)

wela=1;//原來段選數(shù)據(jù)通過位選鎖存器造成混亂

P0=0xfe;//送位選數(shù)據(jù)

wela=0;

delayms(5); //延時(shí)

dula=1;

P0=table[ge];//送個(gè)位段選數(shù)據(jù)

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delayms(5);

}

void ISP_IAP_enable(void)

{

EA = 0;

ISP_CONTR =ISP_CONTR & 0x18;

ISP_CONTR =ISP_CONTR | WaitTime;

ISP_CONTR =ISP_CONTR | 0x80;

}

void ISP_IAP_disable(void)

{

ISP_CONTR =ISP_CONTR & 0x7f;

ISP_TRIG = 0x00;

EA=1;

}

void ISPgoon(void)

{

ISP_IAP_enable();

ISP_TRIG =0x46;

ISP_TRIG =0xb9;

_nop_();

}

unsigned char byte_read(unsigned int byte_addr)

{

ISP_ADDRH =(unsigned char)(byte_addr >> 8);

ISP_ADDRL =(unsigned char)(byte_addr & 0x00ff);

ISP_CMD= ISP_CMD & 0xf8;

ISP_CMD= ISP_CMD | RdCommand;

ISPgoon();

ISP_IAP_disable();

return(ISP_DATA);

}

void SectorErase(unsigned int sector_addr)

{

unsigned intiSectorAddr;

iSectorAddr =(sector_addr & 0xfe00);

ISP_ADDRH =(unsigned char)(iSectorAddr >> 8);

ISP_ADDRL =0x00;

ISP_CMD =ISP_CMD & 0xf8;

ISP_CMD = ISP_CMD| EraseCommand;

ISPgoon();

ISP_IAP_disable();

}

void byte_write(unsigned int byte_addr, unsigned charoriginal_data)

{

ISP_ADDRH =(unsigned char)(byte_addr >> 8);

ISP_ADDRL =(unsigned char)(byte_addr & 0x00ff);

ISP_CMD= ISP_CMD & 0xf8;

ISP_CMD= ISP_CMD | PrgCommand;

ISP_DATA =original_data;

ISPgoon();

ISP_IAP_disable();

}

void main()

{

uchar a,b,num1;

TMOD=0x01; //設(shè)置定時(shí)器0為工作方式1(0000 0001)

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

EA=1;

ET0=1;

TR0=1;

num1=byte_read(0x2000);//程序開始時(shí)讀取EEPROM中數(shù)據(jù)

if(num1>=60)//防止首次上電時(shí)讀取出錯(cuò)

num1=0;

while(1)

{

if(num>=20)

{

num=0;

num1++;

SectorErase(0x2000);//擦除扇區(qū)

byte_write(0x2000,num1);//重新寫入數(shù)據(jù)

if(num1==60)

{

num1=0;

}

a=num1/10;

b=num1;

}

display(a,b);

}

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

num++;

}


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉