📄 4.2.4.c
字号:
#include <reg52.h> //头文件
#include <stdio.h>
#define uchar unsigned char
#define High 1 //定义高电平
#define Low 0 //定义高电平
#define READCode 0x0C //AT93C66读指令
#define WRITECode 0x0A //AT93C66写指令
#define ERASECode 0x0E //AT93C66擦除指令
#define EWENCodeH 0x09 //AT93C66擦/写允许指令
#define EWENCodeL 0x80
sbit CS=P2^0; //CS为P2.0
sbit SK=P2^3; //SK为P2.3
sbit DI=P2^2; //DI为P2.2
sbit DO=P2^4; //DO为P2.4
void Delay(uchar n); //延时
void MicrowareClock(void); //时钟函数
void MicrowareSend(uchar senddata); //字节输入函数
uchar MicrowareReceive(void); //字节接收函数
uchar MicrowareRead(uchar addr); //读数据函数
void MicrowareEnable(void); //擦写允许函数
void MicrowareErase(uchar addr); //擦除函数
void MicrowareWrite(uchar addr,uchar Wdata); //写数据函数
void main()
{
uchar Select_Menu; //功能选择
uchar rd;
SCON=0x50; //初始化串行口模式1
TMOD=0x20; //初始化T1为定时功能,模式2
PCON=0x80; //设置SMOD=1
TL1=0xF4; //波特率4800bit/s,初值
TH1=0xF4;
TR1 = 1; //启动T1
TI = 1; //启动发送
while(1)
{
printf("Microware AT93C66 Write and Read!");
printf (" Select Control Menu Option\n"); //菜单信息
printf (" 1. Enable AT93C66.\n");
printf (" 2. Read AT93C66.\n");
printf (" 3. Write AT93C66.\n");
printf (" 4. Erase AT93C66.\n");
printf (" 5. EXIT.\n");
printf (" Please Input Menu Option:\n");
Select_Menu = _getkey(); //从键盘输入选择数字
switch(Select_Menu)
{
case '1': //擦写使能AT93C66
printf ("\n You Select 1. Enable AT93C66\n");
MicrowareEnable();
printf ("\n Enable over\n");
break;
case '2': //读AT93C66
printf ("\n You Select 2. Read AT93C66\n");
rd=MicrowareRead(0x12);
printf("AT93C66 data at 0x12=%d\n",rd);
break;
case '3': //写AT93C66
printf("\n You Select 3. Write AT93C66\n");
MicrowareWrite(0x12,0x56);
printf ("\n Write over\n");
break;
case '4': //搜索擦除AT93C66
printf ("\n You Select 4. Erase AT93C66\n");
MicrowareErase(0x12);
printf ("\n Erase over\n");
break;
case '5': //退出程序
printf ("\n You Select 5. Exit\n");
goto Exit; //转向Exit标号处
break;
default:
printf ("\n Error: Please Select Right Menu Option\n");
break;
};
}
Exit: printf("Exit the program!"); //退出
}
void Delay(uchar n)
{
int i;
for(i=0;i<n;i++); //空延时
}
void MicrowareClock(void)
{
SK=Low; //SK=0
Delay(2);
SK=High; //SK=1
Delay(2);
}
void MicrowareSend(uchar senddata)
{
int i;
for(i=0;i<8;i++) //循环输出一个字节的数据
{
DI=(bit)(senddata&0x80);
senddata<<=1; //移位
MicrowareClock(); //构造时钟
}
}
uchar MicrowareReceive(void)
{
uchar receivedata=0; //接收的字节数据
int i;
MicrowareClock(); //构造时钟
for(i=0;i<8;i++) //循环接收
{
receivedata*=2;
if(DO)receivedata++; //判断DO,接收位数据
MicrowareClock();
Delay(2);
}
return receivedata; //返回数据
}
uchar MicrowareRead(uchar addr)
{
uchar ReadData;
CS=1; //选通
MicrowareSend(READCode); //READ指令
MicrowareSend(addr); //指定地址
ReadData=MicrowareReceive(); //接收数据
CS=0; //选通禁止
return ReadData; //返回数据
}
void MicrowareEnable(void)
{
CS=1; //选通
MicrowareSend(EWENCodeH); //EWEN指令
MicrowareSend(EWENCodeL);
CS=0; //选通禁止
}
void MicrowareErase(uchar addr)
{
DO=1;
CS=1; //选通
MicrowareSend(ERASECode); //ERASE指令
MicrowareSend(addr); //地址
CS=0; //选通禁止
Delay(4);
CS=1; //选通
while(!DO) //判断擦除完毕
{
}
CS=0; //选通禁止
}
void MicrowareWrite(uchar addr,uchar Wdata)
{
MicrowareEnable(); //擦除/写允许
MicrowareErase(addr); //擦除对应地址的数据
CS=1; //选通
MicrowareSend(WRITECode); //写指令
MicrowareSend(addr); //指定地址
MicrowareSend(Wdata); //写数据
CS=0; //选通禁止
Delay(4);
CS=1; //选通
Delay(4);
while(!DO); //查询DO引脚等待写完
{
}
CS=0; //选通禁止
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -