打印

2402程序读写和编程器读出问题

[复制链接]
1611|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mrainborn|  楼主 | 2008-6-7 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2402读写函数
/////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int 
#define WriteDeviceAddress 0xa0
#define ReadDeviceAddress 0xa1
sbit WP=P1^5;
sbit SCL=P1^6;
sbit SDA=P1^7;
void DelayMs(uint number);
extern void Watchdog();//喂狗
void Start_2402()//启动2402
{
   SDA=1;SDA=1;
   SCL=1;SCL=1;//延迟
   SDA=0;SDA=0;//延迟
   SCL=0;SCL=0;
}
void Stop_2402()//关闭2402
{
   SCL=0;SCL=0;
   SDA=0;SDA=0;//延迟
   SCL=1;SCL=1;//延迟
   SDA=1;SDA=1;
}
bit TestACK()//测试ACK
{
  bit ErrorBit;
  SDA=1;SDA=1;//延迟
  SCL=1;SCL=1;//延迟
  ErrorBit=SDA;
  SCL=0;SCL=0;
  return(ErrorBit);  
}
void NoACK()
{
   SDA=1;SDA=1;
   SDA=1;SDA=1;
   SCL=1;SCL=1;
   SCL=1;SCL=1;
   SCL=0;
}
void Write8Bit(uchar input)//写8bit
{
  uchar temp;
  for(temp=8;temp!=0;temp--)
   {
     SDA=(bit)(input&0x80);
     SCL=1;SCL=1;//延迟
     SCL=0;SCL=0;//延迟
     input=input<<1;
    }
}
void Write2402(uchar ch,uchar address)//写一个字节 
{
   Start_2402();
   Write8Bit(WriteDeviceAddress);//写器件地址
   TestACK();
   Write8Bit(address);//写操作地址
   TestACK();
   Write8Bit(ch);
   TestACK();
   Stop_2402();
   DelayMs(10);
}
uchar Read8bit()//读8bit
{
  uchar temp;
  uchar rbyte=0;
  for(temp=8;temp!=0;temp--)
   {
     SCL=1;SCL=1;
     rbyte=rbyte<<1;
     rbyte=rbyte|((uchar)(SDA));
     SCL=0;
   }
   return(rbyte);
}
uchar Read2402(uchar address)//读一个字节
{
  uchar ch;
  Start_2402();
  Write8Bit(WriteDeviceAddress);//写器件地址
  TestACK();
  Write8Bit(address);
  TestACK();

  Start_2402();
  Write8Bit(ReadDeviceAddress);//写操作地址
  TestACK();
  ch=Read8bit();//读数
  NoACK();
  Stop_2402();
  return (ch);
}
void DelayMs(uint number) 
{
    uchar temp;
    for(;number!=0;number--) 
    {
        for(temp=224;temp!=0;temp--);
    }
}
////////////////////////////////////////////////////////
主函数中的调用部分

写操作

////////////////////////////////////
 if(!(VT100&&VT300&&VT500&&VT700&&VT900))
 {
  if(VT100==0)//写入VT=100
   {
    if(!UP)
    {  
     Write2402(VT,0x00);//写低字节
     DelayMs(20);
     Write2402(VT>>8,0x01);//右移写高字节
     DelayMs(20);
     DISPLAY_VT=100;
    } 
   }
  if(VT300==0)//写入VT=300
   {
    if(!UP)
    {
     Write2402(VT,0x02);//写低字节
     DelayMs(20);  
     Write2402(VT>>8,0x03);//右移写高字节
     DelayMs(20);
     DISPLAY_VT=300;
     }           
    }   
  if(VT500==0)//写入VT=500
   {
    if(!UP)
     {
     Write2402(VT,0x04);//写低字节
     DelayMs(20);
     Write2402(VT>>8,0x05);//右移写高字节
     DelayMs(20); 
     DISPLAY_VT=500;
    }
   }
  if(VT700==0)
   {
    if(!UP)
    {
     Write2402(VT,0x06);//写低字节
     DelayMs(20);
     Write2402(VT>>8,0x07);//右移写高字节
     DelayMs(20); 
     DISPLAY_VT=700;
    }
   }
  if(VT900==0)
  {
   if(!UP)
   {
    Write2402(VT,0x08);//写低字节
    DelayMs(20);
    Write2402(VT>>8,0x09);//右移写高字节
    DelayMs(20); 
    DISPLAY_VT=900;
    }                
   }
 }  


读操作

FLOW_1_LOW=Read2402(0x00);//读出低字节
 DelayMs(20);
 FLOW_1_HIGH=Read2402(0x01);//读出高字节
 DelayMs(20);
 FLOW_1=((FLOW_1_HIGH<<8)+FLOW_1_LOW);//读出VT=100

 FLOW_2_LOW=Read2402(0x02);//读出低字节
 DelayMs(20);
 FLOW_2_HIGH=Read2402(0x03);//读出高字节
 DelayMs(20);  
 FLOW_2=((FLOW_2_HIGH<<8)+FLOW_2_LOW);//读出VT=300

 FLOW_3_LOW=Read2402(0x04);//读出低字节读出
 DelayMs(20);
 FLOW_3_HIGH=Read2402(0x05);//读出高字节
 DelayMs(20);
 FLOW_3=((FLOW_3_HIGH<<8)+FLOW_3_LOW);//VT=500

 FLOW_4_LOW=Read2402(0x06);//读出低字节
 DelayMs(20);
 FLOW_4_HIGH=Read2402(0x07);//读出高字节
 DelayMs(20);
 FLOW_4=((FLOW_4_HIGH<<8)+FLOW_4_LOW);//读出VT=700

 FLOW_5_LOW=Read2402(0x08);//读出低字节
 DelayMs(20);
 FLOW_5_HIGH=Read2402(0x09);//读出高字节
 DelayMs(20);
 FLOW_5=((FLOW_5_HIGH<<8)+FLOW_5_LOW);//读出VT=900



这时写和读的地址是从0X00--0X09的
用编程器读出来的时候也是从0X00开始的

但是在把地址改成0X6000--0X6009的时候,写到的位置还和地址为0X00时一样

后又把地址改成6000==6009,写的位置就不一样了时从70开始的
如下如图
有点不明白,望大虾们提示

相关帖子

沙发
dai_weis| | 2008-6-7 14:27 | 只看该作者

24C02最大寻址才多大?

你弄了个0X6XXX?而且你的地址才是个无符号字符类型,最大才0XFF

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

69

帖子

0

粉丝