OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5156|回复: 4

为什么我的程序,24c02只能读,不能写,我事先用例程写了,读出来是例程存的数

[复制链接]

6

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-6-10
在线时间
39 小时
发表于 2020-4-26 12:39:19 | 显示全部楼层 |阅读模式
10金钱
#include "reg52.h"
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
#define addr_w 0xa0
#define addr_r 0xa1

sbit SCL=P2^1;
sbit SDA=P2^0;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

uchar num=0;
uchar disp[4];
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uchar);
void delay_us();
void IIC_Init();
void II_C_start();
void II_C_end();
uchar II_C_write(uchar dat);
uchar II_C_read();
void AT24_w(uchar dat);
uchar AT24_r();

void datapros()
{
        disp[0]=smgduan[num/1000];//千位
        disp[1]=smgduan[num%1000/100];//百位
        disp[2]=smgduan[num%1000%100/10];
        disp[3]=smgduan[num%1000%100%10];               
}
void DigDisplay()
{
        uchar i;
        for(i=0;i<4;i++)
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//显示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//显示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//显示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//显示第3位       
                }
                P0=disp[3-i];//发送数据
                delay(5); //间隔一段时间扫描       
                P0=0x00;//消隐
        }               
}
void main()
{
        IIC_Init();
        while(1)
        {
                 AT24_w(20);
                delay(10);
                num=AT24_r();
                datapros();         //数据处理函数
                DigDisplay();//数码管显示函数
        }
}
void delay_us()
{_nop_();_nop_();_nop_();_nop_();
}
void delay(uchar xms)
{
        uchar i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);                                                  
}
void IIC_Init()
{
        SCL=1;
        delay_us();
        SDA=1;
        delay_us();
}
void II_C_start()
{       
        SCL=1;
        delay_us();
        SDA=1;
        delay_us();
        SDA=0;
        delay_us();
}
void II_C_end()
{       
        SCL=1;
        delay_us();
        SDA=0;
        delay_us();
        SDA=1;       
}

uchar II_C_write(uchar dat)//写一个字符
{
        uchar i,ack;
        for(i=0;i<8;i++)
        {
                SCL=0;//拉低数据线,低电平期间可写SDA
                delay_us();
                SDA=dat>>7;
                delay_us();
                SCL=1;//上升沿写数据
                delay_us();
                dat<<=1;
        }
        SCL=0;//拉低,允许变化
        delay_us();
        SDA=1;
        delay_us();
        SCL=1;//释放总线
        delay_us();
        ack=SDA;//读ack信号
        SCL=0;
        delay_us();
        return ack;
}
uchar II_C_read()//读一个字节
{
        uchar i,temp;
        SCL=0;//拉低时钟线,为了将数据线拉高
        delay_us();//时不被认为是控制信号
        SDA=1;                //拉高后释放总线,为空闲
        for(i=0;i<8;i++)
        {
                SCL=1;//拉高时钟线,禁止主机数据变化
                delay_us();
                temp=(temp<<1)|SDA;
                SCL=0;//允许数据变化,从而从机能够传数据到SDA上
                delay_us();
        }
        return temp;
}
void AT24_w(uchar dat)
{
        II_C_start();
        II_C_write(addr_w);
        II_C_write(1);
        II_C_write(dat);
        II_C_end();
}
uchar AT24_r()
{
        uchar temp;
        II_C_start();
        II_C_write(addr_w);//写 写器件地址
        II_C_write(1);           //写读取地址
        II_C_start();
        II_C_write(addr_r);//写 读器件地址
        temp=II_C_read();  //读出数据
        II_C_end();       
        return temp;       
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-6-10
在线时间
39 小时
 楼主| 发表于 2020-4-26 12:41:09 | 显示全部楼层
麻烦各位大佬帮我看看,实在没找到问题。。。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2020-4-26 14:47:47 | 显示全部楼层
看下器件地址和你硬件设置的是不是一样,不要只纠结于软件,还有就是看看模拟的时序对不对,一定要按照手册上的来
回复

使用道具 举报

6

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-6-10
在线时间
39 小时
 楼主| 发表于 2020-4-26 15:13:35 | 显示全部楼层
三叶草 发表于 2020-4-26 14:47
看下器件地址和你硬件设置的是不是一样,不要只纠结于软件,还有就是看看模拟的时序对不对,一定要按照手册 ...

器件地址是对的,因为读的时候也要先写地址,但是就是写函数写不进去,
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-4-26 15:24:49 | 显示全部楼层
按照手册,检查模拟时序
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表