⑴ stm8s的EEPROM讀寫程序如何編寫,需要哪些配置步驟
#define EEPMASS1 0xAE //密碼鑰匙1
#define EEPMASS2 0x56 //密碼鑰匙2
#define EEPADDR 0x4000 //eep地址起始
void eeprom_read(U16 u16Addr, U8 *pdatas, U8 len)
{
U8 *eep=(U8 *)u16Addr;
U8 j;
for(j=0; j<len; j++)
{
pdatas[j]=eep[j];
}
}
void eep_word_write(U16 u16Addr, U8 *pdatas, U8 len)
{
U8 *eep=(U8*)u16Addr;
U8 j;
FLASH_DUKR=EEPMASS1; //鎖1密鑰
FLASH_DUKR=EEPMASS2; //鎖2密鑰
while(!(FLASH_IAPSR&0x08)); //等待解密就緒
DISABLE_MAC_INTERRUPTS();
FLASH_CR2 |= 0x40; //
FLASH_NCR2 &= ~0x40; //設置字編程
for(j=0; j<len; j++)
{
eep[j] = pdatas[j];
}
while(!(FLASH_IAPSR&0x04));
FLASH_IAPSR &=0xf7; // off the eeprom program
ENABLE_MAC_INTERRUPTS();
}
⑵ stc單片機eeprom的程序
#include <reg51.H>
#include <intrins.H>
typedef unsigned char INT8U;
typedef unsigned int INT16U;
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;
#define DEBUG_DATA 0x5A //本測試程序最終存儲在 EEPROM 單元的數值
#define DATA_FLASH_START_ADDRESS 0x00 //STC5Axx 系列 EEPROM 測試起始地址
union union_temp16
{
INT16U un_temp16;
INT8U un_temp8[2];
}my_unTemp16;
INT8U Byte_Read(INT16U add); //讀一位元組,調用前需打開IAP 功能
void Byte_Program(INT16U add, INT8U ch); //位元組編程,調用前需打開IAP 功能
void Sector_Erase(INT16U add); //擦除扇區
void IAP_Disable(); //關閉IAP 功能
void Delay();
void main (void)
{
INT16U eeprom_address;
INT8U read_eeprom;
P1 = 0xF0; //演示程序開始,讓 P1[3:0] 控制的燈亮
Delay(); //延時
P1 = 0x0F; //演示程序開始,讓 P1[7:4] 控制的燈亮
Delay() ; //延時
//將EEPROM 測試起始地址單元的內容讀出
eeprom_address = DATA_FLASH_START_ADDRESS; //將測試起始地址送eeprom_address
read_eeprom = Byte_Read(eeprom_address); //讀EEPROM的值,存到read_eeprom
if (DEBUG_DATA == read_eeprom)
{ //數據是對的,亮 P1.7 控制的燈,然後在 P1 口上將 EEPROM 的數據顯示出來
P1 = ~0x80;
Delay() ; //延時
P1 = ~read_eeprom;
}
else
{ //數據是錯的,亮 P1.3 控制的燈,然後在 P1 口上將 EEPROM 的數據顯示出來
//再將該EEPROM所在的扇區整個擦除,將正確的數據寫入後,亮 P1.5 控制的燈
P1 = ~0x08;
Delay() ; //延時
P1 = ~read_eeprom;
Delay() ; //延時
Sector_Erase(eeprom_address); //擦除整個扇區
Byte_Program(eeprom_address, DEBUG_DATA);//將 DEBUG_DATA 寫入 EEPROM
P1 = ~0x20; //熄滅 P1.3 控制的燈,亮 P1.5 控制的燈
}
while (1); //CPU 在此無限循環執行此句
}
//讀一位元組,調用前需打開IAP 功能,入口:DPTR = 位元組地址,返回:A = 讀出位元組
INT8U Byte_Read(INT16U add)
{
IAP_DATA = 0x00;
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x01; //IAP/ISP/EEPROM 位元組讀命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 後,ISP/IAP 命令立即被觸發起動
_nop_();
//EA = 1;
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處於安全狀態,
//一次連續的IAP 操作完成之後建議關閉IAP 功能,不需要每次都關
return (IAP_DATA);
}
//位元組編程,調用前需打開IAP 功能,入口:DPTR = 位元組地址, A= 須編程位元組的數據
void Byte_Program(INT16U add, INT8U ch)
{
IAP_CONTR = ENABLE_ISP; //打開 IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x02; //IAP/ISP/EEPROM 位元組編程命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
IAP_DATA = ch; //要編程的數據先送進IAP_DATA 寄存器
//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 後,ISP/IAP 命令立即被觸發起動
_nop_();
//EA = 1;
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處於安全狀態,
//一次連續的IAP 操作完成之後建議關閉IAP 功能,不需要每次都關
}
//擦除扇區, 入口:DPTR = 扇區地址
void Sector_Erase(INT16U add)
{
IAP_CONTR = ENABLE_ISP; //打開IAP 功能, 設置Flash 操作等待時間
IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇區擦除命令
my_unTemp16.un_temp16 = add;
IAP_ADDRH = my_unTemp16.un_temp8[0]; //設置目標單元地址的高8 位地址
IAP_ADDRL = my_unTemp16.un_temp8[1]; //設置目標單元地址的低8 位地址
//EA = 0;
IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 觸發寄存器,每次都需如此
IAP_TRIG = 0xA5; //送完A5h 後,ISP/IAP 命令立即被觸發起動
_nop_();
//EA = 1;
IAP_Disable(); //關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處於安全狀態,
//一次連續的IAP 操作完成之後建議關閉IAP 功能,不需要每次都關
}
void IAP_Disable()
{
//關閉IAP 功能, 清相關的特殊功能寄存器,使CPU 處於安全狀態,
//一次連續的IAP 操作完成之後建議關閉IAP 功能,不需要每次都關
IAP_CONTR = 0; //關閉IAP 功能
IAP_CMD = 0; //清命令寄存器,使命令寄存器無命令,此句可不用
IAP_TRIG = 0; //清命令觸發寄存器,使命令觸發寄存器無觸發,此句可不用
IAP_ADDRH = 0;
IAP_ADDRL = 0;
}
void Delay()
{
INT8U i;
INT16U d=5000;
while (d--)
{
i=255;
while (i--);
}
}
⑶ eeprom到底在使用編程的時候怎麼用呢怎麼初始化怎麼編程實現各種功能呢
EEPROM(帶電可擦寫可編程只讀存儲器)是用戶可更改的只讀存儲器EEPROM(ROM),其可通過高於普通電壓的作用來擦除和重編程(重寫)。不像EPROM晶元,EEPROM不需從計算機中取出即可修改。在一個EEPROM中,當計算機在使用的時候可頻繁地反復編程,因此EEPROM的壽命是一個很重要的設計考慮參數。EEPROM是一種特殊形式的快閃記憶體,其應用通常是個人電腦中的電壓來擦寫和重編程。
EEPROM,一般用於即插即用(Plug & Play)。
常用在介面卡中,用來存放硬體設置數據。
也常用在防止軟體非法拷貝的"硬體鎖"上面。
⑷ STC89c52rc單片機中怎麼用EEPROM c語言的
STC89C52RC,有的eepROM。
以下是我寫的一個實例,你看看:
/***************************************************************
作品:EEPROM實驗,開機還原關電前LED的亮滅狀況
單片機:STC89C52RC
晶振:12M
編譯環境:Keil uVision4 V9.00
***************************************************************/
#include <STC89C52RC.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit K1 = P3^2; //按鈕1
sbit K2 = P3^3; //按鈕2
void cc(uint addr);
void xcx(uint addr,uchar dat);
uchar dcx(uint addr);
void Q0();
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main(void)
{
uchar V;
V = dcx(0x2002); // 開機讀取EEPROM區2002h數據,還原關電前LED的亮滅狀況
if(V == 2) {LED1=0;LED2=1;}
else if(V == 6){LED1=0;LED2=0;}
while(1)
{
if(!K1)
{
while(!K1);
LED1=0;LED2=1;
cc(0x2000); // 擦除第1個扇區(2000h~21FFh)
xcx(0x2002,2); // 對EEPROM區2002h寫入2
}
if(!K2)
{
while(!K2);
LED1=0;LED2=0;
cc(0x2000); // 擦除第1個扇區(2000h~21FFh)
xcx(0x2002,6); // 對EEPROM區2002h寫入6
}
}
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:擦除某一扇區(每個扇區512位元組)
入口:addr = 某一扇區首地址
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void cc(uint addr)
{
// 打開 IAP 功能(ISP_CONTR.7)=1:允許編程改變Flash, 設置Flash操作等待時間
// 0x83(晶振<5M) 0x82(晶振<10M) 0x81(晶振<20M) 0x80(晶振<40M)
ISP_CONTR = 0x81;
ISP_CMD = 0x03; // 用戶可以對"Data Flash/EEPROM區"進行扇區擦除
ISP_ADDRL = addr; // ISP/IAP操作時的地址寄存器低八位,
ISP_ADDRH = addr>>8; // ISP/IAP操作時的地址寄存器高八位。
EA =0;
ISP_TRIG = 0x46; // 在ISPEN(ISP_CONTR.7)=1時,對ISP_TRIG先寫入46h,
ISP_TRIG = 0xB9; // 再寫入B9h,ISP/IAP命令才會生效。
_nop_();
Q0(); // 關閉ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:寫一位元組
入口:addr = 扇區單元地址 , dat = 待寫入數據
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void xcx(uint addr,uchar dat)
{
ISP_CONTR = 0x81;
ISP_CMD = 0x02; // 用戶可以對"Data Flash/EEPROM區"進行位元組編程
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
ISP_DATA = dat; // 數據進ISP_DATA
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
Q0(); // 關閉ISP/IAP
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:讀一位元組
入口:addr = 扇區單元地址
出口:dat = 讀出的數據
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
uchar dcx(uint addr)
{
uchar dat;
ISP_CONTR = 0x81;
ISP_CMD = 0x01; // 用戶可以對"Data Flash/EEPROM區"進行位元組讀
ISP_ADDRL = addr;
ISP_ADDRH = addr>>8;
EA = 0;
ISP_TRIG = 0x46;
ISP_TRIG = 0xB9;
_nop_();
dat = ISP_DATA; // 取出數據
Q0(); // 關閉ISP/IAP
return dat;
}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函數:關閉ISP/IAP操作
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Q0()
{
ISP_CONTR = 0; // 關閉IAP功能
ISP_CMD = 0; // 待機模式,無ISP操作
ISP_TRIG = 0; // 關閉IAP功能, 清與ISP有關的特殊功能寄存器
}
STC89C52RC內部EEPROM詳細地址表:
第一扇區 第二扇區 第三扇區 第四扇區
起始地址 結束地址 起始地址 結束地址 起始地址 結束地址 起始地址 結束地址
2000h 21FFh 2200h 23FFh 2400h 25FFh 2600h 27FFH
第五扇區 第六扇區 第七扇區 第八扇區
起始地址 結束地址 起始地址 結束地址 起始地址 結束地址 起始地址 結束地址
2800h 29FFh 2A00h 2BFFh 2C00h 2DFFh 2E00h 2FFFh
⑸ pic單片機EEPROM怎麼編寫程序
在你的C文件里引用EEPROM函數的頭文件,eeprom_routines.h
然後在程序中使用
voideeprom_write(unsignedcharaddr,unsignedcharvalue);
unsignedchareeprom_read(unsignedcharaddr);
這兩個函數了。
這兩個函數一個讀一個寫。比如你想寫0x10到地址為0x55的EEPROM,
就寫:eeprom_write(0x55,0x10);
同理,如果想讀取0x55地址處的值,
就寫:ee_value=eeprom_read(0x55);
如果編譯時編譯器提示找不到eeprom_routines.h,可以在
X:ProgramFilesHI-TECHSoftwarePICC9.81include目錄下找,然後復制到自己項目文件夾下。
對了,我用的是MPLabIDE,編譯器使用的是PICC。