网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
06月07日漏签0天
单片机吧 关注:211,763贴子:1,046,298
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 17回复贴,共1页
<<返回单片机吧
>0< 加载中...

新人在学到i2c总线结构与eeprom时,想了好久都没有搞明白

  • 只看楼主
  • 收藏

  • 回复
  • 哥哥不会水
  • 大尉
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
下面程序就是郭天祥老师书里面的,我也基本明白了总线的工作原理及EEPROM,
但是将程序写入后并没有出现断电后,接上电,还要从上次断电位子继续显示的现象,
这样应该就表明我没有将数据写入EEPROM是吧!
那为什么会出现这样的情况呢,
求大神说说可能出现问题的情况
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
bit write=0;
sbit SCL=P2^0;
sbit SDA=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
uchar second,temp;
uchar code table[]={0x3f,0x30,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay()
{; ; }
void delay_1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start()
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
void stop()
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
void respons()
{
uchar i;
SCL=1;
delay();
while((SDA==1)&&(i<250))
i++;
SCL=0;
delay();
}
void init()
{
SDA=1;
delay();
SCL=1;
delay();
}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay();
SDA=CY;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
uchar read_byte()
{
uchar i,k;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i--)
{
SCL=1;
delay();
k=(k<<1)|SDA;
SCL=0;
delay();
}
return k;
}
void write_add(uchar address,uchar date)
{
start();
write_byte(0xae);
respons();
write_byte(address);
respons();
write_byte(date);
respons();
stop();
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xaf);
respons();
start();
write_byte(address);
respons();
date=read_byte();
stop();
return date;
}
void display(uchar shi,uchar ge)
{
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
delay_1ms(1);
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
delay_1ms(1);
}
void main()
{
init();
second=read_add(2);
if(second<=100)
second=0;
TMOD=0x01;
ET0=1;
EA=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
while(1)
{
display(second/10,second%10);
if(write==1)
{
write_add(2,second);
}
}
}
void t0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
temp++;
if(temp==20)
{
temp=0;
second++;
write=1;
if(second==100)
second=0;
}
}


  • 哥哥不会水
  • 大尉
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


2025-06-07 01:25:39
广告
  • xinxia
  • 列兵
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我搞不明白的是读字节的时候是怎样将写入的字节读进来的


  • xinxia
  • 列兵
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
例如图片上,前面的 sda=1了,k=(k<<1)|sda中的sda不就等于1吗


  • 螃蟹钇
  • 中校
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我学的时候也很迷茫。。你可以先记住。到后来看的多了就明白了


  • TMD神话
  • 上士
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
当scl为低电平时,sda上的数据可以变化,这时的数据不代表要写或读的数据。只有当scl出现高电平时sda上的数据才是要读或写的数据。你看看读时序k=那一句前面是不是将sca拉高了。


  • TMD神话
  • 上士
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
当scl为低电平时,sda上的数据可以变化,这时的数据不代表要写或读的数据。只有当scl出现高电平时sda上的数据才是要读或写的数据。你看看读时序k=那一句前面是不是将sca拉高了。


  • 萨佛131
  • 少将
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
SCL/SDA都是有上拉电阻的总线。所有器件在这个总线上,都是接收主机发出的SCL拉低信号,并在这个信号结束时开始放出自己的信号,象ACK和回传数据。下行和上行的数据都是在SCL升高时传输。主机得到从机ACK和0,都是自己放开SDA时从机拉低该线。
起始信号和结束信号都由主机发出,分别是先拉低SCL后拉低SDA,和先拉低SDA后拉低SCL。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 17回复贴,共1页
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示