1. bread88lifa利发国际娱乐论坛/
  2. 嵌入式论坛/
    1. 电子论坛综合区
    2. 嵌入式论坛
    3. 电源技术论坛
    4. 硬件设计论坛
    5. 测试测量论坛
    6. 检测技术与质量
    7. EDA设计论坛
    8. 综合技术与应用
    9. 开源硬件
    10. IC设计论坛
    11. 消费电子论坛
    12. 无线通信论坛
    13. 个人版区
    14. 厂商专区
    15. 论坛服务区
    16. 高校联盟
    17. 供求信息发布
  3. 单片机/MCU论坛
    1. ARM技术论坛
    2. Android论坛
    3. Linux论坛
    4. MSP430技术论坛
    5. FPGA|CPLD|ASIC论坛
    6. STM32/STM8技术论坛
    7. NXP MCU 技术论坛
    8. PIC单片机论坛
    9. DSP论坛
    10. 瑞萨单片机论坛
    11. 嵌入式系统论坛
  4. / 51单片机E2PROM读写问题
    关闭提示

[问答] 51单片机E2PROM读写问题

[复制链接]
实习生
发表于 2018-1-6 17:24:24   1078 查看 2 回复 只看该作者 倒序浏览
分享
   I2C 总线上,PCF8591 可以直接在1602上显示, 数据变化正常,但是PCF8591接入E2PROM后,读取出来的数据一直都是0XFF,哪位大神帮忙看看什么原因?
#include <reg52.h>
#include "i2c.h"
#define  DATA P0
sbit rs=P1^3;
sbit rw=P1^4;
sbit en=P1^5;
u8 lcd1602[5];

void write_1602com(u8 com)
{
     rs=0;
         rw=0;
         en=0;
         en=1;
         DATA=com;
         delay(5);
         en=0;
}
void write_1602dat(u8 dat)
{
     rs=1;
         rw=0;
         en=0;
         en=1;
         DATA=dat;
         delay(5);
         en=0;
}
void init()
{
      write_1602com(0x02);
          write_1602com(0x06);
          write_1602com(0x0c);
          write_1602com(0x38);
          write_1602com(0x01);
}
void display(u8 dat)
{
         u16 t;
                 t=dat*(50000.0/255)*2;                                 //        不知道为什么要乘上2,不然最大值只有一半
                 lcd1602[4]=t/10000;                                
         lcd1602[3]=(t-lcd1602[4]*10000)/1000;                  
         lcd1602[2]=(t-lcd1602[4]*10000-lcd1602[3]*1000)/100;                        
         lcd1602[1]=(t-lcd1602[4]*10000-lcd1602[3]*1000-lcd1602[2]*100)/10;         
         lcd1602[0]=t%10;                        
             write_1602com(0x83);
             write_1602dat(lcd1602[4]+'0');
                 delay(2);
                 write_1602com(0x84);
             write_1602dat(lcd1602[3]+'0');
                    delay(2);
                 write_1602com(0x85);
             write_1602dat(lcd1602[2]+'0');
                    delay(2);
                 write_1602com(0x86);
             write_1602dat(lcd1602[1]+'0');
                    delay(2);
                 write_1602com(0x87);
             write_1602dat(lcd1602[0]+'0');
                    delay(2);
}
u8 read_PCF8591()
{
        u8 fun;
                start_i2c();
                write_i2c(0x90);   
             i2c_wait_ack();
                 // return 1;
                write_i2c(0x00);  
                i2c_wait_ack();
                  //return 1;
                start_i2c();
                write_i2c(0x91);
                i2c_wait_ack();
                  //return 1;
                fun=read_i2c();
                ack_i2c(0);
                stop_i2c();
                return fun;
}
void main()
{         
         init();
         while(1)
             {        
           write_i2c_address( 532 ,read_PCF8591());
                 
                display(read_i2c_address( 532 ));
          //        display(read_PCF8591());
                //delay(1000);
          }
}

#include "i2c.h"
void delay(u8 n)
{
   u8 x,y;
   for(x=n;x>0;x--)
     for(y=110;y>0;y--);
}
void nops()                  //5ns延时  
{
  do{_nop_();_nop_();_nop_();_nop_();_nop_();} while(0);
}
void start_i2c()         
{
           sda=1;
        nops();
        scl=1;
        nops();
        sda=0;
        nops();
}
void stop_i2c()               
{
    sda=0;
        nops();
        scl=1;
        nops();
        sda=1;
        nops();
}
void ack_i2c(bit ck)   
{
    if(ck)                          
           sda=0;               
        else
           sda=1;               
        nops();
        scl=1;                                
        nops();
        scl=0;                                 
        nops();
        sda=1;                                 
        nops();   
}                        
void i2c_wait_ack()                 
{
         u8 i;  
         scl=1;  
         nops();  
         while((sda==1)&&(i<250)) i++;  
         scl=0;  
         nops();
}
void write_i2c(u8 dat)           
{
    u8 i;
        for(i=0;i<8;i++)           
          {
             scl=0;                        
                 nops();
             if(dat&0x80)         
                  sda=1;                  
                 else
                  sda=0;                 
                  nops();
                  
                  scl=1;                          
                  dat<<=1;                  
                  nops();
          }
}
u8 read_i2c()                        
{

         u8 i,temp=0;  
         scl=0;  
         nops();  
         sda=1;     
         nops();  
         for(i=0;i<8;i++)  
         {   
           temp=temp<<1;   
           scl=1;   
           nops();  
           temp=temp|sda;   
           scl=0;   
           nops();
          }  
          return (temp);
}
void write_i2c_address(u8 add,u8 dat_byte)               
{
    start_i2c();
    write_i2c(0xa2);
        i2c_wait_ack();        
        write_i2c(add/256);
        i2c_wait_ack();
        write_i2c(add%256);
        i2c_wait_ack();
        write_i2c(dat_byte);
        i2c_wait_ack();
        stop_i2c();
        delay(5000);
}
u8 read_i2c_address(u8 read_add)                        
{        
    u8 read_byte=0;
    start_i2c();
        write_i2c(0xa2);
    i2c_wait_ack();
    write_i2c(read_add/256);        
        i2c_wait_ack();
        write_i2c(read_add%256);        
        i2c_wait_ack();
        start_i2c();
        write_i2c(0xa3);
    i2c_wait_ack();
        read_byte=read_i2c();
//        ack_i2c(0);
        stop_i2c();
        return read_byte;
}                        

标签:51单片机 PCF8591
举报
工程师
发表于 2018-1-8 16:14:19  
STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天拍明芯城专业写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。
用串口看看,也可以先把num1写入,再接着读出来然后显示看看是不是之前的数据,确保数据被正确写入
楼主要注意数据类型的使用,num1是(uint)而write_byte(uchar data)
要做到数据类型的统一以免出现莫名奇妙的问题

uchar read_byte(uint byte_add)

{
ISP_TRIG=0XB9;
return ISP_DATA;
ISP_CONTR=0;//这句放在这不会被执行的,如果有用要放到return之前
}
没用过单片机的E2PROM(我一直以为误认为单片机的E2PROM是用来下载存程序代码用的-_-!),百度了才知道啊
回复 点赞 举报
实习生
发表于 2018-1-8 17:39:37    楼主|
iczoom188 发表于 2018-1-8 16:14
STC很多系列的单片机片内都集成了EEPROM存储器(其实是Data Flash),方便用户使用,想得真周到!今天拍明芯城专业写了个小程序,测试了一下,工作正常。下面就上我自己写的源程序。本人在STC89C52RC单片机上试验成功。
用串口看看,也可以先把num1写入,再接着读出来然后显示看看是不是之前的数据,确保数据被正确写入
楼 ...

我外接的E2PROM at24c512  add之前是用的uint型的,后面找错误的时候改成uchar ,忘了改回来!串口接收回来的数据也不对。我感觉应该是read_i2c函数有问题!
回复 点赞 举报
高级模式
您需要登录后才可以回帖 登录 | 注册
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表
  1. time最新主题
  2. recommend推荐主题
  3. hot热门主题
  4. post 我的帖子
-

推荐专区

技术干货集中营

专家问答

方案交易

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

电子展览展会专区

芯片求购|供应发布区

88lifa利发国际娱乐

百度360搜索搜狗搜索