标题: 24C04怎么用单片机程序存数据 [打印本页]

作者: 老来所学    时间: 2017-5-12 21:44
标题: 24C04怎么用单片机程序存数据
用24C04芯片,依照24C02教程的I2C写法存数据,比如数码管显示69696,这个数已经超过无符号整形unsigned int的范围65535,定义用unsigned long int无符号整形32位的,我不知道怎么拆这个32位的,拆4个8位的,还是拆分三个去存到24C04里面去.
网上找了一些32位拆4个8位的,编译没错,仿真及单片机开发板上运行就像死机了一样.不知道是什么问题.
网上找的方法是这样的.
        sec1=(uchar)(sec>>24&0xff);        
        sec2=(uchar)(sec>>16&0xff);
        sec3=(uchar)(sec>>8&0xff);
        sec4=(uchar)sec&0xff;

sec1~4是8位的,sec是32位的.
哪位大哥教一下怎么拆这个32位的,
麻烦给一个例程.非常感谢.

作者: zl2168    时间: 2017-5-13 08:33
本帖最后由 zl2168 于 2017-5-13 15:51 编辑

给你个参考案例。实例49  读写AT24C02
Proteus仿真一下,确认有效。
实例49 读写IIC AT24C02.rar (38.96 KB, 下载次数: 34) 实例50 非零地址读写AT24C02.rar (39.09 KB, 下载次数: 10)

以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版.。书中电路和程序设计有详细说明,程序语句条条有注解。仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。

作者: angmall    时间: 2017-5-13 09:54
是这样的

  1.         sec4=(uchar)(sec & 0xff);      
  2.         sec3=(uchar)((sec >>8 )& 0xff);
  3.         sec2=(uchar)((sec >>16)& 0xff);
  4.         sec1=(uchar)((sec >>24)& 0xff);
复制代码


8位到 整形32位的
sec1~4,sec是32位的.

  1. sec = ((sec4 << 0) & 0xFF) + ((sec3 << 8) & 0xFFFF) + ((sec2 << 16) & 0xFFFFFF) + ((sec1 << 24) & 0xFFFFFFFF);
复制代码


作者: yzwzfyz    时间: 2017-5-13 12:59
最呆的办法:存1234567890,你就存10次,一次存一位数,10次靠近存;回读时再读10次,拼在一起,重新组成1234567890.
作者: yzwzfyz    时间: 2017-5-13 13:04
拆法,除以10,9次每次取余,剩余1次可免除直接取。
拼法,乘以10,9次每次相加,剩余1次可免乘直接加。
这是笨方法啊,懂了之后你改进。
作者: 老来所学    时间: 2017-5-13 18:07
yzwzfyz 发表于 2017-5-13 13:04
拆法,除以10,9次每次取余,剩余1次可免除直接取。
拼法,乘以10,9次每次相加,剩余1次可免乘直接加。
...

不懂,需要请教师傅
或者写一段代码参考一下.
作者: 老来所学    时间: 2017-5-13 18:09
angmall 发表于 2017-5-13 09:54
是这样的

你拆的方法和我的一样,昨晚试了一下,sec1=(uchar)(sec>>24&0xff);,这个拆不出来,显示都是0.
作者: 老来所学    时间: 2017-5-13 18:11
angmall 发表于 2017-5-13 09:54
是这样的

合并我是这样的,sec=(sec1<<24|sec2<<16|sec3<<8|sec4);
就是sec4没拆出来,合并出来3万多.




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1