/*********************************************************************
通過調(diào)試的AT93C46讀寫程序(C語言)
* 程序說明:本程序?qū)崿F(xiàn)51系列單片機對AT93C46的讀寫,ORG端接地
* 版本: v1.1
*********************************************************************/
#include
#include
unsigned char uchar;
#define READ_D 0xc0//讀指令
#define WRITE_D 0xa0//寫指令
#define ERASE_D 0xe0//擦除指令
#define EWEN_D 0x98//擦/寫允許指令
#define EW_D 0x80//擦/寫禁止指令
sbit CS = P1^0;
sbit SK = P1^1;
sbit DI = P1^2;
sbit DO = P1^3;
//時鐘函數(shù)
void at93c46_clock(void)
{
SK=0;
_nop_();
SK=1;
}
//輸入函數(shù);in_data為數(shù)據(jù),d_bit為輸入數(shù)據(jù)的位數(shù)。
void send(uchar in_data,uchar d_bit)
{
uchar i;
for(i=0;i
DI=(bit)(in_data&0x80);
in_data<<=1;
at93c46_clock();
}
}
//接收函數(shù)
uchar receive(void)
{
uchar in_data=0;
uchar j;
DO=1;
while(DO) at93c46_clock();
for(j=0;j<8;j++)
{
at93c46_clock();
in_data=(in_data<<1)|DO;
}
at93c46_clock();
return(in_data);
}
//發(fā)送讀指令和地址,從AT93C46指定的地址中讀取數(shù)據(jù)
uchar read(uchar addr)
{
uchar data_r;
addr<<=1;
send(READ_D,3);//送讀指令
send(addr,7);//送地址
data_r=receive();//接收數(shù)據(jù)
CS=0;
return(data_r);
}
//擦除操作函數(shù)
void erase(uchar addr)
{
DO=1;
CS=1;
addr<<=1;
send(ERASE_D,3);
send(addr,7);
CS=0;
CS=1;
while(!DO);//等待擦除完畢
CS=0;
}
//將一個字節(jié)數(shù)據(jù)寫入AT93C46指定的地址中。
void wirite(uchar addr,uchar eData)
{
CS=1;//擦/寫允許
send(EWEN_D,10);
CS=0;
_nop_();
erase(addr);//寫數(shù)據(jù)前擦除同樣地址的數(shù)據(jù)
addr<<=1;
CS=1;
send(WRITE_D,3);//送寫指令
send(addr,7);//送地址
send(eData,8);
CS=0;
_nop_();
CS=1;
while(!DO) at93c46_clock(); //等待寫完
CS=0;
//********擦/寫禁止********
_nop_();
CS=1;
send(EW_D,10);
CS=0;
}