📄 6_4_3.c
字号:
//模拟三线制Microwire串行总线的操作源程序:
#include < reg51.h >
#define uchar unsigned char
#define HIGH 1 /* 定义高电平*/
#define LOW 0 /* 定义低电平*/
#define READ_D 0x0C /* 读指令*/
#define WRITE_D 0x0A /* 写指令*/
#define REASE_D 0x0E /* 擦除指令*/
#define EN_D 0x09 /* 擦/ 写允许指令*/
#define EN_RD 0x80
sbit CS = 0x92; /* CS 为P1.2 */
sbit SK = 0x93; /* SK 为P1.3 */
sbit DI = 0x94; /* DI 为P1.4 */
sbit DO = 0x95; /* DO 为P1.5 */
/* * * * 延时函数* * * */
void delay (uchar n)
{
uchar i;
for (i = 0;i > n;i + + )
;
}
/* * * * 时钟函数* * * */
void i_clock (void)
{
SK = LOW;
delay(1) ;
SK = HIGH;
delay(1);
}
/* * * * 输入函数* * * */
/* 输入1 个字节的数据到AT93C66 中*/
void send (uchar i_data)
{
uchar i;
for (i = 0;i < 8;i + + )
{
DI = (bit) ( i_data&0x80);
i_data <<= 1;
i_clock();
}
}
/* * * * 接收函数* * * */
/* 从AT93C66 接收1 个字节的数据*/
uchar recept (void)
{
uchar i_data = 0;
uchar j;
i_clock();
for (j = 0;j < 8;j + + )
{
i_data * = 2;
if (DO) i_data + +;
i_clock();
delay(2);
}
return(i_data);
}
/* * * * 读操作* * * */
/* 发送读指令和地址, 从AT93C66 指定的地址中取出数据*/
uchar read (uchar address)
{
uchar data_r;
CS = 1;
send (READ_D); /* 送读指令*/
send (address); /* 送地址*/
data_r = recept(); /* 接受数据*/
CS = 0;
return (data_r);
}
/* * * * 擦写允许操作* * * */
void enable (void)
{
CS = 1;
send (EN_D);
send (EN_RD);
CS = 0;
}
/* * * * 擦除操作* * * */
/* 擦除AT93C66 中指定地址中的数据*/
void erase (uchar address)
{
DO = 1;
CS = 1;
send ( ERASE_D); /* 送擦除指令*/
end (address);
CS = 0;
delay(4);
CS = 1;
while (!DO); /* 等待擦除完毕*/
CS = 0;
}
/* * * * 写操作* * * */
/* 将1 个数据写入AT93C66 指定的地址中*/
void write (uchar data_2 ,uchar address)
{
enable (); /* 擦写允许*/
erase (address); /* 擦除数据*/
CS = 1;
send (WRITE_D); /* 送写指令*/
send (address);
send (data_2); /* 送数据*/
CS = 0;
delay(4);
CS = 1;
delay(4);
while (!DO); /* 等待写完*/
CS = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -