打印

24C02读写问题.....求教育

[复制链接]
2762|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sin0725|  楼主 | 2012-12-29 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想把一个大于255的数分成高低八位分开储存进24C02,然后再读出来运算后恢复成原来的数, 但是读出来后发现高八位丢失了.求教育
拆分高低八位后储存进24c02:
                wx3=wx;             //wx就是那个大于255的数
                w1=wx3&0x00FF;
                wx3=wx3>>8;
                w2=wx3&0x00FF;
                write_add(5,w1);  //储存进24C02
                write_add(7,w2);
读出w1,w2后恢复数据:
          w1=read_add(5);
        w2=read_add(7);
        wx=(w2<<8)|w1;
  结果...运算后wx只有低八位,高八位没了.

相关帖子

沙发
ayb_ice| | 2012-12-29 11:28 | 只看该作者
typedef unsigned int U16;
typedef unsigned char U8;


U16 u16;
U8 x,k;

        u16 = 0x1234;
       
        write_add(5+0, u16/256);
        write_add(5+1, u16%256);

        x = read_add(5+0);
        k = read_add(5+1);

        u16 = x*256 + k;

使用特权

评论回复
评论
sin0725 2012-12-29 12:38 回复TA
十分感谢,,原来是字符型不对,,我还以为是别的地方出问题了.十分感谢 
板凳
sin0725|  楼主 | 2012-12-29 11:33 | 只看该作者

typedef unsigned int U16;
typedef unsigned char U8;


U16 u16;
U8 x,k;
这是啥?求教育

使用特权

评论回复
地板
sin0725|  楼主 | 2012-12-29 11:35 | 只看该作者
只看了郭天祥10天学会单片机..基础薄弱 求教育

使用特权

评论回复
5
huangxz| | 2012-12-29 12:36 | 只看该作者
sin0725 发表于 2012-12-29 11:33
typedef unsigned int U16;
typedef unsigned char U8;

U16相当于unsigned int
U8 相当于 unsigned char

使用特权

评论回复
6
sin0725|  楼主 | 2012-12-29 12:39 | 只看该作者
版主大哥, 可以结贴了

使用特权

评论回复
7
sin0725|  楼主 | 2012-12-29 13:15 | 只看该作者
ayb_ice 发表于 2012-12-29 11:28
typedef unsigned int U16;
typedef unsigned char U8;

有时候读出来的数据是错的 多10几到20几 这怎么解决?

使用特权

评论回复
8
ayb_ice| | 2012-12-29 13:28 | 只看该作者
sin0725 发表于 2012-12-29 13:15
有时候读出来的数据是错的 多10几到20几 这怎么解决?

那是你的读写基本程序有问题吧

使用特权

评论回复
9
sin0725|  楼主 | 2012-12-29 13:36 | 只看该作者
ayb_ice 发表于 2012-12-29 13:28
那是你的读写基本程序有问题吧

#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^0;
#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;
uchar a;
void delay0()
{ ;; }
void start()  //开始信号
{       
        sda=1;
        delay0();
        scl=1;
        delay0();
        sda=0;
        delay0();
}

void stop()   //停止
{
        sda=0;
        delay0();
        scl=1;
        delay0();
        sda=1;
        delay0();
}

void respons()  //应答
{
        uchar i;
        scl=1;
        delay0();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay0();
}

void init24c02()
{
        sda=1;
        delay0();
        scl=1;
        delay0();
}

void write_byte(uchar date)
{
        uchar i,temp;
        temp=date;


        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;
            delay0();
                sda=CY;
                delay0();
                scl=1;
                delay0();
        //        scl=0;
     //   delay();
        }
        scl=0;
        delay0();
        sda=1;
        delay0();
}

uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay0();
        sda=1;
        delay0();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay0();       
                k=(k<<1)|sda;
                scl=0;
                delay0();       
        }
        return k;
}

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

void write_add(uchar address,uchar date)
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}

uchar read_add(uchar address)
{
        uchar date;
        start();
        write_byte(0xa0);  //0xa0和下面的0xa1为控制字,读还是写
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
}
这个是我用的头文件, 求帮忙

使用特权

评论回复
10
JerryWu75| | 2012-12-29 13:44 | 只看该作者
WX3和WX是什么类型的变量,使8位字符变量,还是16位整形变量?另外你是怎样写入24C02的,需要注意的是20C02写入时,是需要分页的,20C02内部的地址寄存器分为页寄存器和地址指针寄存器,地址指针寄存器是3位的,地址指针能够表示的地址从0到7共8个字节.你检查一下你的低8位和高8位是不是分开在两个页面了?

使用特权

评论回复
11
sin0725|  楼主 | 2012-12-29 13:50 | 只看该作者
JerryWu75 发表于 2012-12-29 13:44
WX3和WX是什么类型的变量,使8位字符变量,还是16位整形变量?另外你是怎样写入24C02的,需要注意的是20C02写入 ...

怎么看有没有分开在两个页面/ WX3是unsigned char WX是 unsigned int

使用特权

评论回复
12
JerryWu75| | 2012-12-29 13:54 | 只看该作者
24C02的地址是8位的:11111000, 11111是页地址,000是页内指针,如果11111不同,就表示跨页了!

使用特权

评论回复
13
JerryWu75| | 2012-12-29 13:56 | 只看该作者
另外你的程序有问题:
                  wx3=wx;             //wx就是那个大于255的数
          w1=wx3&0x00FF;
                 wx3=wx3>>8;  WX3是8位的,所以高8位没有了!!!这句要改成wx3=wx>>8
                 

使用特权

评论回复
14
sin0725|  楼主 | 2012-12-29 13:59 | 只看该作者
JerryWu75 发表于 2012-12-29 13:54
24C02的地址是8位的:11111000, 11111是页地址,000是页内指针,如果11111不同,就表示跨页了! ...


typedef unsigned int U16;
typedef unsigned char U8;


U16 u16;
U8 x,k;

        u16 = 0x1234;
        
        write_add(5+0, u16/256);
        write_add(5+1, u16%256);

        x = read_add(5+0);
        k = read_add(5+1);

        u16 = x*256 + k;
我现在用 ayb_ice 大哥说的方法,应该不用分页了吧?

使用特权

评论回复
15
sin0725|  楼主 | 2012-12-29 14:00 | 只看该作者
JerryWu75 发表于 2012-12-29 13:56
另外你的程序有问题:
                  wx3=wx;             //wx就是那个大于255的数
          w1=wx3&0 ...

!!! 你是哥

使用特权

评论回复
16
sin0725|  楼主 | 2012-12-29 16:21 | 只看该作者
我哭啊..原来早就行了..刚次啊尝试性地在2个写入程序之间插入一个延时,结果2402读写就变得很稳定了 哈哈

使用特权

评论回复
17
amwrdfe| | 2012-12-29 16:45 | 只看该作者
huangxz 发表于 2012-12-29 12:36
U16相当于unsigned int
U8 相当于 unsigned char

在8位,16位系统中可以这么做.在32位中这么做就是错误的.
标准点u16  = unsigned short int

使用特权

评论回复
18
anazel| | 2012-12-29 17:17 | 只看该作者
晕,写入后当然需要加延时了

使用特权

评论回复
19
sin0725|  楼主 | 2012-12-29 18:33 | 只看该作者
anazel 发表于 2012-12-29 17:17
晕,写入后当然需要加延时了

我是新手菜鸟..呵呵

使用特权

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

本版积分规则

2

主题

17

帖子

0

粉丝