您的位置 首页 技术

关于51单片机模仿IIC总线的程序

下面是一个关于IIC总线的程序,用的是51单片机做控制器,对24c16的EEPROM进行数据的读写,由于51没有IIC总线接口,所以需要根据IIC的协议模

下面是一个关于IIC总线的程序,用的是51单片机做控制器,对24c16的EEPROM进行数据的读写,因为51没有IIC总线接口,所以需求依据IIC的协议模仿它进行数据传输。IIC是一中同步串口总线,scl为时钟线,sda为数据线;scl为低时sda的数据答应改变,scl为高时sda的数据有必要坚持稳定。同一个IIC总线依据器材地址的不同能够一起对多个器材进行读写,例如能够一起接8个24c16系列的EEPROM。

下面的程序是一个时钟程序,当断电时将数据将保存在24c16中。从头上电后先读出24c16中存的数据,之后一直对24c16进行写操作,这样断电就能够坚持最终次数据在14c16里边了。

对24c16系列的EEPROM写的进程:起始信号 写器材地址 应对写地址 应对 写数据…..无应对 中止

对24c16系列的EEPROM写的进程:起始信号写器材地址 应对写地址 应对 从头开端 写器材+1 应对 读出数据中止

#include
#define uchar unsigned char
sbit sda=P2^1;
sbit scl=P2^0;
sbit p1_0=P1^0;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
uchar a,tt;
uchar tem=0;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay()
{ ;; }
void start()//开端信号,scl在高电平时sda由高变低发生开端信号
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}

void stop()//中止信号,scl在高电平时sda由低变高发生中止信号

{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}

void respons()//应对,sda为高时表明从机有应对,没有就默许应对
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}

void init()//初始化定时器
{
sda=1;
delay();
scl=1;
delay();
TMOD=0x01;
TH0=(65536-50000)/256;
TH0=(65536-50000)%6;
EA=1;
ET0=1;
TR0=1;
p1_1=1;
p1_0=1;
}

void write_byte(uchar date)//写一个字节
{
uchar i,temp;
temp=date;

for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;//利用了CY这个移除来写
delay();
scl=1;
delay();
scl=0;
delay();
}
scl=0;
delay();
sda=1;
delay();
}

uchar read_byte()//读一个字节
{
uchar i,k;
scl=0;
delay();
sda=1;//开释sda
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;//读出来的字节存在k中
scl=0;
delay();
}
return k;
}

void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a–)
for(b=110;b>0;b–);
}

void write_add(uchar address,uchar date)//写数据的整个进程

{
start();
write_byte(0xa0);//a0为从机器材地址,最终位为0表明写
respons();
write_byte(address);//要写的地址
respons();
write_byte(date);//要写的数据
respons();
stop();
}

uchar read_add(uchar address))//读数据的整个进程
{
uchar date;
start();
write_byte(0xa0);
respons();
write_byte(address);//待读数据的地址
respons();
start();//由写变为读的进程需求从头履行start的进程
write_byte(0xa1);//最终位为一表明读
respons();
date=read_byte();//读出数据
stop();
return date;
}

void main()
{

uchar shi,ge;
init();

if(read_add(20))
{
tem=read_add(20);
}
else
{
tem=0;
}
while(1)
{

if(tem>99)
{
tem=0;
}

shi=tem/10;
ge=tem;
p1_1=0;
P3=table[shi];
delay1(14);
p1_1=1;
p1_0=0;
P3=table[ge];
delay1(14);
p1_0=1;
}

}
void zhongd() interrupt 1

{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
tt++;
if(tt==20)
{
tt=0;
tem++;
write_add(20,tem);
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/257954.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部