智能车制作

标题: XS128的EEPROM [打印本页]

作者: Tom_xuan    时间: 2010-7-11 21:11
标题: XS128的EEPROM
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit scl=P2^1; //24c16 SCL
  5. sbit sda=P2^0; //24c16 SDA


  6. void x24c16_init() //24c16初始化子程序
  7. {
  8. scl=1;
  9. sda=1;
  10. }

  11. void start() //启动I2C总线
  12. {
  13. sda=1;
  14. scl=1;
  15. sda=0;
  16. scl=0;
  17. }

  18. void stop() //停止I2C总线
  19. {
  20. sda=0;
  21. scl=1;
  22. sda=1;
  23. scl=0;
  24. }

  25. void writex(uchar j) //写一个字节
  26. {
  27. uchar i,temp;
  28. temp=j;
  29. for (i=0;i<8;i++)
  30. {
  31. scl=0;
  32. sda=j&0x80;
  33. scl=1;
  34. j<<=1;
  35. }
  36. scl=0;
  37. }

  38. uchar readx() //读一个字节
  39. {
  40. uchar i,x=0;
  41. scl=0;
  42. sda=1; //释放sda总线
  43. for (i=0;i<8;i++)
  44. {
  45. scl=1;
  46. x=x<<1;
  47. if (sda==1) x=x|0x01;
  48. //while(1)
  49. scl=0;
  50. }
  51. return(x);
  52. }
  53. bit Check_ACK(void) //发送完一个字节后,检验设备的应答信号
  54. {
  55. sda=1;
  56. scl=1;
  57. if(sda==1){scl=0; return(1);}
  58. else {scl=0; return 0;}
  59. }

  60. void MasterAck() //主机发送应答信号
  61. {
  62. sda=1;
  63. scl=0;
  64. sda=0;
  65. scl=1;
  66. scl=0;
  67. sda=1;//ACK发送完毕,释放总线
  68. }



  69. void x24c16_write(uchar add,uchar x) //写单个字节
  70. {
  71. do{
  72. start();//重起IIC
  73. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  74. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  75. writex(add);//2408内部地址
  76. Check_ACK();
  77. writex(x);//向寻到的内部地址写数据
  78. Check_ACK();
  79. stop();//停止IIC
  80. }

  81. uchar x24c16_read(uchar add) //读单个字节
  82. {
  83. uchar i;
  84. do{
  85. start();//重起IIC
  86. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  87. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  88. writex(add);//设置内部地址
  89. Check_ACK();//检查应答
  90. do{
  91. start();//重起总线
  92. writex(0xa1);//器件寻址并设置为读
  93. }while(Check_ACK());//检查应答
  94. i=readx();//读数据
  95. Check_ACK();
  96. stop();//停止IIC
  97. return(i);
  98. }


  99. void x24c16_Nread(uchar add,uint n,uchar *buff) //读多个字节
  100. {
  101. uchar m;
  102. do{
  103. start();//重起IIC
  104. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  105. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  106. writex(add);//设置内部地址
  107. Check_ACK();//检查应答
  108. do{
  109. start();//重起总线
  110. writex(0xa1);//器件寻址并设置为读
  111. }while(Check_ACK());//检查应答
  112. for(m=0;m<n;m++)
  113. {
  114. buff[m]=readx();//读数据
  115. if(m!=n-1) MasterAck();//主机发送应答
  116. }
  117. stop();//停止IIC
  118. }

  119. void x24c16_Nwrite(uchar add,uint n,uchar *buff)//写多个字节
  120. {
  121. uint i;
  122. do{
  123. start();//重起IIC
  124. writex(0xa0);//先器件寻址并设置为写,写入要读的内部地址
  125. }while(Check_ACK());//检查应答 =1,表示无确认,再次发送
  126. writex(add);//2408内部地址
  127. Check_ACK();
  128. for(i=0;i<n;i++)
  129. {
  130. writex(buff[i]);//向寻到的内部地址写数据
  131. Check_ACK();
  132. }
  133. stop();//停止IIC
  134. }

  135. ////////////////////////////////////////////////////
  136. void delay (uchar t)
  137. {
  138. uchar m;
  139. for(;t>0;t--)
  140. for(m=255;m>0;m--)
  141. ;
  142. }


  143. void main ()
  144. {
  145. uchar n;
  146. uchar shuju_in;
  147. // uchar shuju_out;
  148. uchar addr=0x00;

  149. uchar shu[]={1,2,4,8,16,32,64,128};
  150. uchar a[8];

  151. shuju_in=0x00;


  152. if((P3&0x04)==0)
  153. {
  154. while(1)
  155. {
  156. x24c16_Nread(addr,8,a);
  157. for(n=0;n<=7;n++)
  158. {
  159. P0=a[n];
  160. delay(255);
  161. delay(255);
  162. delay(255);
  163. delay(255);
  164. }
  165. }
  166. }
  167. else
  168. {
  169. while(1)
  170. {
  171. x24c16_Nwrite(addr,8,shu);
  172. P0=0xfe;
  173. delay(255);
  174. delay(255);
  175. delay(255);
  176. delay(255);
  177. }
  178. }
  179. }


  180. /*while(1) //单字节读写
  181. {
  182. x24c16_write(addr,shuju_in);
  183. ;;;
  184. shuju_out=x24c16_read(addr);
  185. P1=shuju_out;
  186. delay(255);

  187. shuju_in++;
  188. }*/
  189. /*while(1) //N字节读写
  190. {
  191. x24c16_Nwrite(addr,8,shu);
  192. ;;;
  193. x24c16_Nread(addr,8,a);

  194. for(n=0;n<=7;n++)
  195. {
  196. P0=a[n];
  197. delay(255);
  198. delay(255);
  199. }
  200. }*/
复制代码
有用eeprom的吗?我用51单片机的直接修改一下咋都不行。请高手指点指点。以上是我的51单片机程序。
作者: GhostStalker    时间: 2010-7-15 13:45
用XS128片内的 DataFlash呗~8KB不用外接了...
具体看 DataSheet或者 用EP生成 bean
作者: hdfreejz    时间: 2010-11-6 22:12
好好看看资料了
作者: happygirl    时间: 2011-5-2 21:59
xs128中没有EEPROM的,是用D_FLASH 代替它,所以移植51的程序是不行的。我正在研究,可以讨论

作者: Rblyun027    时间: 2011-7-25 00:14
回复 4# happygirl


    话说弄出来没???
作者: NUM师弟    时间: 2013-9-15 19:35
I2C端口一会输入一会而输出,谁能给个权威的??
作者: 萍^_^家安    时间: 2013-12-23 21:06
GhostStalker 发表于 2010-7-15 13:45
用XS128片内的 DataFlash呗~8KB不用外接了...
具体看 DataSheet或者 用EP生成 bean

请教一下,为什么我的掉电不保存数据呢,能指教下吗




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2