📄 shiyan4.c
字号:
//**程序设计**作者hyg214**网名**展凌**
//程序功能:利用I2C总线写或读E2PROM
//向E2PROM写n个数据,再按头尾地址读出
//当然你也可以设置n=1;那就只写读一个数据
//************************************
//********************************************
#include<reg52.h>
#include<intrins.h>//空操作需要的头文件
#define uchar unsigned char
sbit sda=P2^0;//声明控制信号
sbit scl=P2^1;
uchar idata tab[]={
//数码显示从0-9数字,读ROM时
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar idata sdate[50];//接收数据的数组变量
uchar tn=0;//从那个地址开始读
uchar m=10;//读出时要读几个数据
//你可以只读一个(m=1),但这个程序让它循环显示
uchar n=10;//写入数据的个数
uchar idata mdate[10]={53,28,37,45,69,74,56,82,30,99};//要写入的数据
//*********************************************
//----------------------------------
void delay()//延时函数
{//约等于5us用于控制信号SDA,SCL的延时
uchar i;i++;
}
//----------------------------------
void delay_ms(uchar z)//延时函数
{//约等于z*0.5ms
//用于写、读间时;数码动态显示间时
uchar i,j;
for(i=z;i>0;i--)
for(j=222;j>0;j--);
}
//----------------------------------
void intc()//初始化函数
{
sda=1;//控制信号拉高
scl=1;
P0=0x00;//数码管不显示
}
//----------------------------------
void start()//起始信号函数
{//向ROM发送一个开始的信号
sda=1;
scl=1;
delay();
sda=0;
delay();
scl=0;
}
//----------------------------------
void stop()//停止信号函数
{//向ROM发送一个停止的信号
sda=0;
scl=1;
delay();
sda=1;
delay();
scl=0;
}
//----------------------------------
void respons()//产生应答信号函数
{//接收一数据后应答
sda=0;
scl=1;
delay();
scl=0;
sda=1;
}
//----------------------------------
void no_respons()//产生非应答信号函数
{//接收一数据没应答,则强制
sda=0;
scl=1;
delay();
scl=0;
sda=1;
}
//----------------------------------
void write_date(uchar date)//向E2PEOM写数据函数
{//向E2PROM写一字节数据
uchar i,temp;
temp=date;
for(i=0;i<8;i++)//总共写入8次位=1字节=1个数据
{
temp=temp<<1;//要存的数据左移1位,最高位给CY了
scl=0; //数据可以改变
delay();
sda=CY; //写入一位
delay();
scl=1; //数据稳定,不能写了
delay();
}
scl=0;
delay();
sda=1;//稳定数据
delay();
}
//----------------------------------
uchar read_date()//从E2PROM读出数据函数
{//根据
uchar i,k;
scl=0;//数据改变
delay();
sda=1;//可读信号
for(i=0;i<8;i++)//读出8次位=1字节=1个数据
{
scl=1;//数据稳定,可从sda读出一位
delay();
k=(k<<1)|sda;//写入时是从高位写,读出时也一行
scl=0;//数据改变(准备下一位)
delay();
}
delay();
return k;//返回读出的一个数据
}
//----------------------------------
void write_sword(uchar sta,uchar n,uchar *date)//写入串数据函数
{//根据起始地址、数据个数及数据写入E2PEOM中
uchar i;//计数变量
start();//起始
write_date(0xa0);//E2PROM地址(ATC02为oxa0)
respons();//应答
write_date(sta);//写入数据要存放的地址
respons();//应答
for(i=0;i<n;i++)
{
write_date(date[i]);//写入数据
respons();//应答
}
stop();//停止
}
//-----------------------------------
uchar read_sword(uchar sta,uchar n)//读出串数据函数
{//根据起始地址和读出个数,从E2PROM读出一串数据
uchar i;//计数个数
start();//起始
write_date(0xa0);//AO表示主机向从机写数据
respons();//应答
write_date(sta);//数据地址
respons();//应答
start();//起始
write_date(0xa1);//A1表示从机从主机读取数据
for(i=0;i<n;i++)
{
respons();//应答
*(sdate+i)=read_date();//读出数据存入数组
}
no_respons();//非应答
stop();//停止
return 1;//返回读出的数组数据
}
//----------------------------------
void display(uchar *dat)//数码管显示函数
{//从E2PROM读出的数据在数码管显示出来
uchar i,j,k,tem1,tem0,temp;
//计数变量,2个延时用,十位和个位,传值变量
for(i=0;i<m;i++)
{
temp=*(dat+tn++);
if(tn==n){tn=0;}//这里让它循环显示
tem1=temp/10;//十位
tem0=temp%10;//个位
for(j=8;j>0;j--)
for(k=8;k>0;k--)//大约1s一个数据
{
P2=0x10;//选通二个数码管
P0=tab[tem1];//显示十位
delay_ms(20);//延时10ms,动态显示时暂停时间
//太快,不够亮,太慢,不稳定(闪烁),一般10ms
P2=0x20;
P0=tab[tem0];
delay_ms(20);
}
}
}
//----------------------------------
void main()//主函数
{//功能:初始化,写数据,读数据,显示数据
uchar i=0,temp;//i表示开始读的地址
intc();//初始化
write_sword(i,n,mdate);//根据起始地址和个数,串数据写入E2PROM
delay_ms(100);//延时,写入和读出要有个时间的
temp=read_sword(i,n);//根据地址读出一串数据
while(temp)
{
display(sdate);//读出的数据用数码管显示出来
}
}
//-----------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -