通过调试的AT93C46读写程序(C语言)
扫描二维码
随时随地手机看文章
/*********************************************************************
通过调试的AT93C46读写程序(C语言)
* 程序说明:本程序实现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;
//时钟函数
void at93c46_clock(void)
{
SK=0;
_nop_();
SK=1;
}
//输入函数;in_data为数据,d_bit为输入数据的位数。
void send(uchar in_data,uchar d_bit)
{
uchar i;
for(i=0;i
DI=(bit)(in_data&0x80);
in_data<<=1;
at93c46_clock();
}
}
//接收函数
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);
}
//发送读指令和地址,从AT93C46指定的地址中读取数据
uchar read(uchar addr)
{
uchar data_r;
addr<<=1;
send(READ_D,3);//送读指令
send(addr,7);//送地址
data_r=receive();//接收数据
CS=0;
return(data_r);
}
//擦除操作函数
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;
}
//将一个字节数据写入AT93C46指定的地址中。
void wirite(uchar addr,uchar eData)
{
CS=1;//擦/写允许
send(EWEN_D,10);
CS=0;
_nop_();
erase(addr);//写数据前擦除同样地址的数据
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;
}