📄 at93c46.c
字号:
//注意:该程序考虑的是8位数据的情况。
//通过DATASHEET发现,AT93C46的读操作每次只能读、写一个字节。
#include"reg51.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit cs_93c46=P3^6; //高电平有效
sbit ck_93c46=P3^7; //上升沿数据输入、输出
sbit di_93c46=P3^4;
sbit do_93c46=P3^5;
uchar code READ_93C46=0x06;
uchar code EWEN_93C46=0x04;
uchar code ERAL_93C46=0x04;
uchar code WRITE_93C46=0x05;
void wr_addr_93c46(uchar addr);
//uchar rd_byte_93c46(uchar addr);
void wr_code_93c46(uchar op_code);
uchar rd_93c46(void);
void ewen(void);
void erase_all(void);
void wr_93c46(uchar dat);
void delay_1ms(void);
void delay_nms(uint n);
uchar buf_4byte[4]={0,0,0,0};
void main(void)
{
uchar i=0;
cs_93c46=1; //向AT93C46输入起始位和操作码110
di_93c46=0;
do_93c46=0;
_nop_();
//ewen();
/******************************
cs_93c46=1;
wr_code_93c46(WRITE_93C46);
wr_addr_93c46(0x00);
wr_93c46(0xaa);
cs_93c46=0;
delay_1ms();
delay_nms(10); 注意:对AT93C46的写操作,写完所有的数据之后,片选清零,且持续至少10ms
//_nop_();
*******************************/
//erase_all();
//-----------------------------
while(i<4)
{
cs_93c46=1;
wr_code_93c46(READ_93C46);
wr_addr_93c46(i);
buf_4byte[i]=rd_93c46();
cs_93c46=0;//取消片选
i++;
}
//ewen();
//erase_all();
//cs_93c46=0;
_nop_();
}
/**********************
//以下是子函数体
void delay_4us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
************************/
void wr_code_93c46(uchar op_code)
{
uchar i=3;
op_code<<=5;
while(i>0)
{
ck_93c46=0;
if((op_code&0x80)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
op_code<<=1;
i--;
}
}
//功能:向AT93C46写入任意存储字节的7位地址
void wr_addr_93c46(uchar addr)
{
uchar i=7;
addr<<=1;
while(i>0)
{
ck_93c46=0;
if((addr&0x80)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
addr<<=1;
i--;
}
}
//功能:从AT93C46读出一个字节的数据,仅仅是读操作。
uchar rd_93c46(void)
{
uchar temp=0;
uchar i=8;
while(i>0)
{
ck_93c46=0;
temp<<=1;
ck_93c46=1;
_nop_();
if(do_93c46==1)
temp|=0x01;
i--;
}
return(temp);
}
//功能:从AT93C46读出一个字节的数据,包含了之前的写入起始位、操作码和地址。
/***********************************
uchar rd_byte_93c46(uchar addr)
{
//下面三段程序完成写入起始位和操作码
uchar i;
uchar temp;
cs_93c46=1; //向AT93C46输入起始位和操作码110
ck_93c46=0;
di_93c46=0;
do_93c46=0;
_nop_();
di_93c46=1;
ck_93c46=1;
_nop_();
ck_93c46=0;
di_93c46=1;
ck_93c46=1;
_nop_();
ck_93c46=0;
di_93c46=0;
ck_93c46=1;
_nop_();
addr<<=1;
i=7;
while(i>0)
{
ck_93c46=0;
if((addr&0x80)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
_nop_();
addr<<=1;
i--;
}
i=8;
temp=0;
while(i>0)
{
ck_93c46=0;
temp<<=1;
ck_93c46=1;
_nop_();
if(do_93c46==1)
temp|=0x01;
i--;
}
ck_93c46=0;
_nop_();
cs_93c46=0;
return(temp);
}
***********************/
/*****************************************
原型:void wr_93c46(uchar dat)
行参:uchar dat
返回值:无
功能:向AT93c46写入一个字节,纯粹的写操作。
********************************************/
void wr_93c46(uchar dat)
{
uchar i=8;
while(i>0)
{
ck_93c46=0;
if((dat&0x80)==0)
di_93c46=0;
else
di_93c46=1;
ck_93c46=1;
dat<<=1;
i--;
}
}
/*****************************************
原型:void erase_all(void)
行参:无
返回值:无
功能:擦除AT93C46的所有内容
********************************************/
void erase_all(void)
{
cs_93c46=1;
di_93c46=0;
do_93c46=0;
_nop_();
wr_code_93c46(ERAL_93C46);
wr_addr_93c46(0x40);
cs_93c46=0;
}
/*****************************************
原型:void ewen(void)
行参:无
返回值:无
功能:向AT93C46写入擦写命令,使之可以写入新的内容
注意:该函数包含了完整的开始和结束条件
********************************************/
void ewen(void)
{
cs_93c46=1;
di_93c46=0;
do_93c46=0;
_nop_();
wr_code_93c46(EWEN_93C46);
wr_addr_93c46(0x60);
cs_93c46=0;
}
/************************************************************
原型:void delay_1ms(void)
行参:无
返回值:无
功能:延时大约1ms
************************************************************/
void delay_1ms(void)
{
uchar i;
for(i=125;i>0;i--);
}
/******************************
原型:void delay_nms(uint n)
行参:uint n
返回值:无
功能:延时n ms
*****************************/
void delay_nms(uint n)
{
uchar i;
for(;n>0;n--)
{
for(i=125;i>0;i--)
{
;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -