㈠ STC89C52單片機如何在運行時向EEPROM內寫入數據,使數據斷電後不消失,下次運行繼續用.
1、首先打開電腦中的keil軟體。
㈡ 單片機自身帶的EEPROM怎麼用,FLASH程序存儲器怎麼用
單片機自身一般只是帶一種程序存儲器,或者是EEPROM,或者是FLASH。
無論帶的什麼類型的程序存儲器,都是來保存程序的。
「下載」的時候,把程序代碼寫入程序存儲器;
「運行」的時候,CPU從程序存儲器取出代碼來執行。
程序存儲器就是這么用。
㈢ 51單片機內部eeprom怎麼使用,求大神指導,查過一些資料,但是看不明白
以下是我一個項目中關於STC12C5A60S2內部EEPROM的相關部分程序
;------------讀寫內部EEPROM定義區-----------------------
P4SW EQU 0BBH
P4 EQU 0C0H
IAP_DATA EQU 0C2H
IAP_ADDRH EQU 0C3H
IAP_ADDRL EQU 0C4H
IAP_CMD EQU 0C5H
IAP_TRIG EQU 0C6H
IAP_CONTR EQU 0C7H
;定義ISP/IAP命令
ISP_IAP_BYTE_READ EQU 1H ;位元組讀
ISP_IAP_BYTE_PROGRAM EQU 2H ;位元組編程,可以將1寫成0,要將1變成0,必須執行位元組編程
ISP_IAP_SECTOR_ERASE EQU 3H ;扇區擦除,可以將0擦成1,要將0變成1,必須擦除整個扇區
ENABLE_IAP EQU 83H ;系統工作時鍾<12MHz時,對IAP_CONTR寄存器設置此值
;------------------------------------------------
;讀一位元組,調用前需打開 IAP 功能,入口:DPTR = 位元組地址,返回:A = 讀出位元組
IAP_READ:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP 功能, 設置 Flash 操作等待時間
MOV IAP_CMD,#ISP_IAP_BYTE_READ ;設置為IAP/ISP/EEPROM位元組讀模式命令
MOV IAP_ADDRH,DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設置目標單元地址的低8位地址
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h後,ISP/IAP命令立即被觸發起動
NOP
MOV A,IAP_DATA ;讀出的數據在IAP_DATA單元中,送入累加器A
LCALL IAP_Disable ;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態,
RET
;------------------------------------------------
;位元組編程,調用前需打開 IAP 功能,入口:DPTR = 位元組地址, A=須編程位元組的數據
IAP_WRITE:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP 功能, 設置 Flash 操作等待時間
MOV IAP_CMD,#ISP_IAP_BYTE_PROGRAM ;設置為IAP/ISP/EEPROM位元組編程模式命令
MOV IAP_ADDRH,DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設置目標單元地址的低8位地址
MOV IAP_DATA,A ;要編程的數據先送進ISP_DATA寄存器
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發寄存器改蘆,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h後,ISP/IAP命令立即被觸發起帆殲旁動
NOP
LCALL IAP_Disable ;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態態橡,
RET
;------------------------------------------------
;擦除扇區, 入口:DPTR = 扇區地址
IAP_Erase:
MOV IAP_CONTR,#ENABLE_IAP ;打開 IAP 功能, 設置 Flash 操作等待時間
MOV IAP_CMD,#03H ;設置為IAP/ISP/EEPROM扇區擦除模式命令
MOV IAP_ADDRH,DPH ;設置目標單元地址的高8位地址
MOV IAP_ADDRL,DPL ;設置目標單元地址的低8位地址
MOV IAP_TRIG,#5AH ;先送5Ah,再送A5h到ISP/IAP觸發寄存器,每次都需如此
MOV IAP_TRIG,#0A5H ;送完A5h後,ISP/IAP命令立即被觸發起動
NOP
LCALL IAP_Disable ;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態,
RET
;------------------------------------------------
IAP_Disable:
;關閉 IAP 功能, 清相關的特殊功能寄存器,使CPU處於安全狀態,
;一次連續的IAP操作完成之後建議關閉IAP功能,不需要每次都關
MOV IAP_CONTR,#0 ;關閉 IAP 功能
MOV IAP_CMD,#0 ;清命令寄存器,使命令寄存器無命令,此句可不用
MOV IAP_TRIG,#0 ;清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
MOV IAP_ADDRH,#0FFH ;送地址高位元組單元為00,指向非EEPROM區
MOV IAP_ADDRL,#0FFH ;送地址低位元組單元為00,防止誤操作
RET
㈣ 51單片機內部EEPROM使用求教
不知道你用的是哪款單片機,你可以看單片機的數據手冊,應該會有詳細到操作時序的介紹
針對STC15F4K系列單片機EEPROM使用實例如下:
單位元組操作,串口發送
#include"reg51.h"
#include"intrins.h"
typedefunsignedcharBYTE;
typedefunsignedintWORD;
//-----------------------------------------------
sfrP1M1=0x91;//PxM1.n,PxM0.n=00--->Standard,01--->push-pull
sfrP1M0=0x92;//=10--->pureinput,11--->opendrain
sfrP0M1=0x93;
sfrP0M0=0x94;
sfrP2M1=0x95;
sfrP2M0=0x96;
sfrP3M1=0xB1;
sfrP3M0=0xB2;
sfrP4M1=0xB3;
sfrP4M0=0xB4;
sfrP5M1=0xC9;
sfrP5M0=0xCA;
sfrP6M1=0xCB;
sfrP6M0=0xCC;
sfrP7M1=0xE1;
sfrP7M0=0xE2;
sfrIAP_DATA=0xC2;//IAP數據寄存器
sfrIAP_ADDRH=0xC3;//IAP地址寄存器高位元組
sfrIAP_ADDRL=0xC4;//IAP地址寄存器低位元組
sfrIAP_CMD=0xC5;//IAP命令寄存器
sfrIAP_TRIG=0xC6;//IAP命令觸發寄存器
sfrIAP_CONTR=0xC7;//IAP控制寄存器
#defineCMD_IDLE0//空閑模式
#defineCMD_READ1//IAP位元組讀命令
#defineCMD_PROGRAM2//IAP位元組編程命令
#defineCMD_ERASE3//IAP扇區擦除命令
#defineURMD0//0:使用定時器2作為波特率發生器
//1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
//2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器
sfrT2H=0xd6;//定時器2高8位
sfrT2L=0xd7;//定時器2低8位
sfrAUXR=0x8e;//輔助寄存器
//#defineENABLE_IAP0x80//ifSYSCLK<30MHz
//#defineENABLE_IAP0x81//ifSYSCLK<24MHz
#defineENABLE_IAP0x82//ifSYSCLK<20MHz
//#defineENABLE_IAP0x83//ifSYSCLK<12MHz
//#defineENABLE_IAP0x84//ifSYSCLK<6MHz
//#defineENABLE_IAP0x85//ifSYSCLK<3MHz
//#defineENABLE_IAP0x86//ifSYSCLK<2MHz
//#defineENABLE_IAP0x87//ifSYSCLK<1MHz
//測試地址
#defineIAP_ADDRESS0x0400
voidDelay(BYTEn);
voidIapIdle();
BYTEIapReadByte(WORDaddr);
voidIapProgramByte(WORDaddr,BYTEdat);
voidIapEraseSector(WORDaddr);
voidInitUart();
BYTESendData(BYTEdat);
voidmain()
{
WORDi;
P0M0=0x00;
P0M1=0x00;
P1M0=0x00;
P1M1=0x00;
P2M0=0x00;
P2M1=0x00;
P3M0=0x00;
P3M1=0x00;
P4M0=0x00;
P4M1=0x00;
P5M0=0x00;
P5M1=0x00;
P6M0=0x00;
P6M1=0x00;
P7M0=0x00;
P7M1=0x00;
P1=0xfe;//1111,1110系統OK
InitUart();//初始化串口
Delay(10);//延時
IapEraseSector(IAP_ADDRESS);//扇區擦除
for(i=0;i<512;i++)//檢測是否擦除成功(全FF檢測)
{
if(SendData(IapReadByte(IAP_ADDRESS+i))!=0xff)
gotoError;//如果出錯,則退出
}
P1=0xfc;//1111,1100擦除成功
Delay(10);//延時
for(i=0;i<512;i++)//編程512位元組
{
IapProgramByte(IAP_ADDRESS+i,(BYTE)i);
}
P1=0xf8;//1111,1000編程完成
Delay(10);//延時
for(i=0;i<512;i++)//校驗512位元組
{
if(SendData(IapReadByte(IAP_ADDRESS+i))!=(BYTE)i)
gotoError;//如果校驗錯誤,則退出
}
P1=0xf0;//1111,0000測試完成
while(1);
Error:
P1&=0x7f;//0xxx,xxxxIAP操作失敗
while(1);
}
/*----------------------------
軟體延時
----------------------------*/
voidDelay(BYTEn)
{
WORDx;
while(n--)
{
x=0;
while(++x);
}
}
/*----------------------------
關閉IAP
----------------------------*/
voidIapIdle()
{
IAP_CONTR=0;//關閉IAP功能
IAP_CMD=0;//清除命令寄存器
IAP_TRIG=0;//清除觸發寄存器
IAP_ADDRH=0x80;//將地址設置到非IAP區域
IAP_ADDRL=0;
}
/*----------------------------
從ISP/IAP/EEPROM區域讀取一位元組
----------------------------*/
BYTEIapReadByte(WORDaddr)
{
BYTEdat;//數據緩沖區
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_READ;//設置IAP命令
IAP_ADDRL=addr;//設置IAP低地址
IAP_ADDRH=addr>>8;//設置IAP高地址
IAP_TRIG=0x5a;//寫觸發命令(0x5a)
IAP_TRIG=0xa5;//寫觸發命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
dat=IAP_DATA;//讀ISP/IAP/EEPROM數據
IapIdle();//關閉IAP功能
returndat;//返回
}
/*----------------------------
寫一位元組數據到ISP/IAP/EEPROM區域
----------------------------*/
voidIapProgramByte(WORDaddr,BYTEdat)
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_PROGRAM;//設置IAP命令
IAP_ADDRL=addr;//設置IAP低地址
IAP_ADDRH=addr>>8;//設置IAP高地址
IAP_DATA=dat;//寫ISP/IAP/EEPROM數據
IAP_TRIG=0x5a;//寫觸發命令(0x5a)
IAP_TRIG=0xa5;//寫觸發命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
扇區擦除
----------------------------*/
voidIapEraseSector(WORDaddr)
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_ERASE;//設置IAP命令
IAP_ADDRL=addr;//設置IAP低地址
IAP_ADDRH=addr>>8;//設置IAP高地址
IAP_TRIG=0x5a;//寫觸發命令(0x5a)
IAP_TRIG=0xa5;//寫觸發命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
初始化串口
----------------------------*/
voidInitUart()
{
SCON=0x5a;//設置串口為8位可變波特率
#ifURMD==0
T2L=0xd8;//設置波特率重裝值
T2H=0xff;//115200bps(65536-18432000/4/115200)
AUXR=0x14;//T2為1T模式,並啟動定時器2
AUXR|=0x01;//選擇定時器2為串口1的波特率發生器
#elifURMD==1
AUXR=0x40;//定時器1為1T模式
TMOD=0x00;//定時器1為模式0(16位自動重載)
TL1=0xd8;//設置波特率重裝值
TH1=0xff;//115200bps(65536-18432000/4/115200)
TR1=1;//定時器1開始啟動
#else
TMOD=0x20;//設置定時器1為8位自動重裝載模式
AUXR=0x40;//定時器1為1T模式
TH1=TL1=0xfb;//115200bps(256-18432000/32/115200)
TR1=1;
#endif
}
/*----------------------------
發送串口數據
----------------------------*/
BYTESendData(BYTEdat)
{
while(!TI);//等待前一個數據發送完成
TI=0;//清除發送標志
SBUF=dat;//發送當前數據
returndat;
}
㈤ pic單片機EEPROM怎麼編寫程序
在你的C文件里引用EEPROM函數的頭文件,eeprom_routines.h
然後在程序中使用
void eeprom_write(unsigned char addr, unsigned char value);
unsigned char eeprom_read(unsigned char addr);
這兩個函數了。
這兩個函數一個讀一個寫。比如你想寫0x10到地址為0x55的EEPROM,
就寫:eeprom_write(0x55,0x10);
同理,如果想讀取0x55地址處的值,
就寫:ee_value = eeprom_read(0x55);
如果編譯時編譯器提示找不到eeprom_routines.h,可以在
X:Program FilesHI-TECH SoftwarePICC9.81include 目錄下找,然後復制到自己項目文件夾下。
對了,我用的是MPLab IDE,編譯器使用的是PICC。