久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機關于EEPROM的讀寫
[打印本頁]
作者:
內卷1234
時間:
2024-3-2 14:08
標題:
51單片機關于EEPROM的讀寫
首先我們要知道什么是EEPROM
這里要看自己的單片機EEPROM地址大小和起始地址
主要要用到的寄存器并不多,一個是IAP_CMD(C5H),還有的就是IAP_CONTR(C7H)
然后以下就是通過代碼寫命令到寄存器最后進行數據操作即可
單片機源程序如下:
#include "STC15F2kxx.h"
#include "stceeprom.h"
#include <intrins.h>
#include <string.h>
#include "delay.h"
//關閉IAP功能
void IapIdle()
{
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG = 0;
IAP_ADDRH = 0x80;
IAP_ADDRL = 0;
}
//擦除指定地址的扇區
void IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP;//使能IAP
IAP_CMD = CMD_ERASE; //擦除命令
IAP_ADDRL = addr; //指定地址
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_(); //等待
IAP_TRIG = 0xa5;
_nop_();
IapIdle();//關閉IAP功能
}
//往指定地址中寫入一個字節字符數據
void IapWritecChar(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //寫命令
IAP_ADDRL = addr; //指定地址
IAP_ADDRH = addr >> 8;
IAP_DATA = dat;
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
IapIdle();
}
//往指定地址寫入兩個字節數據
void IapWriteInt(WORD addr,unsigned int dat)
{
unsigned char i;
typedef union //設置共用體,用char分攤2字節
{
unsigned int dat1;
char mchar[2];
}NEW_DATA;
NEW_DATA data1;
data1.dat1 = dat;
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //寫命令
for(i = 0; i < 2; i++)
{
IAP_ADDRL = addr; //指定地址
IAP_ADDRH = addr >> 8;
IAP_DATA = data1.mchar[i];
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
addr++;
}
IapIdle(); //關閉IAP功能
}
//往指定地址寫入四個字節數據
void IapWriteI32(WORD addr, unsigned long dat)
{
unsigned char i;
typedef union//設置共用體,用char分攤4字節
{
unsigned long dat1;
char mchar[4];
}NEW_DATA;
NEW_DATA data1;
data1.dat1 = dat;
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //寫命令
for(i = 0; i < 4; i++)
{
IAP_ADDRL = addr; //指定地址
IAP_ADDRH = addr >> 8;
IAP_DATA = data1.mchar[i];
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
addr++;
}
IapIdle(); //關閉IAP功能
}
/*******************************************************************************
* 函數名 : Powerlost_data
* 描述 : 斷電中斷數據寫入函數
* 輸入 : addr 地址 dat 寫入數據
* 輸出 : 無
* 返回值 : 無
* 說明 : 為了應對中斷函數與主函數循環使用IapWriteI32函數沖突
*******************************************************************************/
void Powerlost_data(WORD addr ,unsigned long dat)
{
unsigned char i;
typedef union//設置共用體,用char分攤4字節
{
unsigned long dat1;
char mchar[4];
}NEW_DATA;
NEW_DATA data1;
data1.dat1 = dat;
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //寫命令
for(i = 0; i < 4; i++)
{
IAP_ADDRL = addr; //指定地址
IAP_ADDRH = addr >> 8;
IAP_DATA = data1.mchar[i];
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
addr++;
}
IapIdle(); //關閉IAP功能
}
//往指定起始地址寫入不固定長度的字符串數據
void IapWriteString(WORD addr,BYTE *mString,BYTE n)
{
unsigned char i;
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //寫命令
for(i=0; i<n ;i++)
{
IAP_ADDRL = addr; //指定地址
IAP_ADDRH = addr >> 8;
IAP_DATA = mString[i];
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
addr++;
}
IapIdle(); //關閉IAP功能
}
//向指定地址讀取一個字節的字符數據
char IapReadChar(WORD addr)
{
BYTE dat;
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //讀命令
IAP_ADDRL = addr; //指定地址
IAP_ADDRH = addr >> 8;
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
dat = IAP_DATA;
IapIdle(); //關閉IAP功能
return dat;
}
//向指定地址讀取兩個字節的數字數據
unsigned int IapReadInt(WORD addr)
{
unsigned int dat;
unsigned char i;
typedef union //設置共用體,用char分攤2字節
{
unsigned int dat1;
char mchar[2];
}NEW_DATA;
NEW_DATA data1;
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //讀命令
for(i = 0; i < 2; i++)
{
IAP_ADDRL = (addr + i); //指定地址
IAP_ADDRH = ((addr + i) >> 8);
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
data1.mchar[i]= IAP_DATA;
}
IapIdle(); //關閉IAP功能
dat = data1.dat1;
return dat;
}
//向指定地址讀取四個字節的數字數據
unsigned long IapReadI32(WORD addr)
{
unsigned long dat;
unsigned char i;
typedef union//設置共用體,用char分攤4字節
{
unsigned long dat1;
char mchar[4];
}NEW_DATA;
NEW_DATA data1;
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //讀命令
for(i = 0; i < 4; i++)
{
IAP_ADDRL = (addr + i); //指定地址
IAP_ADDRH = ((addr + i) >> 8);
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
data1.mchar[i] = IAP_DATA;
}
IapIdle();//關閉IAP功能
dat = data1.dat1;
return dat;
}
//向指定地址讀取不定長度的字符串數據
void IapReadString(WORD addr,BYTE *mString, BYTE n)
{
unsigned char i;
memset(mString,0,strlen(mString));
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //讀命令
for(i = 0; i < n; i++)
{
IAP_ADDRL = (addr + i); //指定地址
IAP_ADDRH = ((addr + i) >> 8);
IAP_TRIG = 0x5a; //命令觸發器先寫5ah,再寫a5h命令才能生效
_nop_();
IAP_TRIG = 0xa5;
_nop_();
mString[i] = IAP_DATA;
}
IapIdle();//關閉IAP功能
}
復制代碼
作者:
aidianzi
時間:
2024-3-9 11:49
小數據可以這樣寫分開幾個字節幾個字節的寫,不過建議寫數據可以使用一個結構體把數據和校驗數據都寫進去,使用指針,存儲根據結構體數據sizeof結果直接寫入,讀取時通過結構體數據大小一次性讀取并做校驗,我現在數據量小CRC8做校驗,要是數據量大可以考慮CRC16或32
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品自产av一区二区三区
|
国产一区二区精品在线
|
91亚洲精品国偷拍自产在线观看
|
久久婷婷国产麻豆91
|
精品国产一区二区三区免费
|
精品一级毛片
|
亚洲成人一级
|
一区二区免费看
|
国产精品久久久久久久7777
|
亚洲国产精品福利
|
国产欧美日韩一区二区三区
|
天天操夜夜骑
|
国产高清美女一级a毛片久久w
|
久久这里只有精品首页
|
一区二区三区免费
|
欧美日韩国产精品激情在线播放
|
a级免费观看视频
|
一区观看
|
中文字幕国产精品视频
|
中文字幕成人网
|
午夜精品一区二区三区在线观看
|
亚洲精品一区二区三区四区高清
|
国产区视频在线观看
|
欧美黄色性生活视频
|
在线观看中文字幕一区二区
|
97精品国产97久久久久久免费
|
久久在线
|
欧美午夜精品
|
久久精品欧美一区二区三区不卡
|
国产91久久久久
|
亚洲毛片一区二区
|
欧美日韩高清一区
|
www.中文字幕
|
激情一区
|
男女视频免费
|
亚洲手机视频在线
|
国产激情偷乱视频一区二区三区
|
久久久久久久久久久高潮一区二区
|
成人免费在线电影
|
亚洲在线高清
|
国产一区二区
|