关于上电读取保存数据的问题

[复制链接]
3610|10
 楼主| jj89816657 发表于 2011-8-8 18:08 | 显示全部楼层 |阅读模式
  1. 设计一个1s的间隔时钟,能用串口修改实时修改数据。时钟具有掉电保存的功能(上电后读取保存数据)。
  2. #include <reg52.h>
  3. #define uchar unsigned char
  4. #define unit unsigned int
  5. uchar bai,shi,ge,aa,flag;
  6. int shu,qq;
  7. sbit scl=P2^1;
  8. sbit sda=P2^0;
  9. sbit dula=P2^6;
  10. sbit wela=P2^7;
  11. uchar code table[]={
  12. 0x3f,0x06,0x5b,0x4f,
  13. 0x66,0x6d,0x7d,0x07,
  14. 0x7f,0x6f,0x77,0x7c,
  15. 0x39,0x5e,0x79,0x71};
  16. void delay()
  17. { ;; }
  18. void delay1(uchar z)
  19. {
  20. uchar q,w;
  21. for(q=z;q>0;q--)
  22. for(w=110;w>0;w--);
  23. }
  24. void star()
  25. {
  26. scl=1;
  27. delay();
  28. sda=1;
  29. delay();
  30. sda=0;
  31. delay();
  32. }
  33. void stop()
  34. {
  35. sda=0;//这里也有个悲剧,模拟I2C总线的原理,scl是时钟线,sda是数据线,把这里的sda和下面的scl一换就又不
  36. delay();//能正常工作了~~附图看上面
  37. scl=1://看图上的时序,只要scl是高,sda的上升沿前后保持一段时间就好了啊,可就是不对,求解释~~
  38. delay();
  39. sda=1;
  40. delay();
  41. }
  42. void yingda()
  43. {
  44. // uchar i;
  45. scl=1;
  46. delay();
  47. //while((sda==1)&&(i<250))i++;
  48. //delay();
  49. scl=0;
  50. delay1(1);
  51. }
  52. void write_byte(uchar date)
  53. {
  54. uchar a,i;
  55. a=date;
  56. for(i=0;i<8;i++)
  57. {
  58. a=a<<1;
  59. scl=0;
  60. delay();
  61. sda=CY;
  62. delay();
  63. scl=1;
  64. delay();
  65. }
  66. scl=0;
  67. delay();
  68. sda=1;
  69. delay();
  70. }
  71. uchar read_byte()
  72. {
  73. uchar i,k;
  74. /* scl=0;
  75. delay();
  76. sda=1;
  77. delay();*/
  78. for(i=0;i<8;i++)
  79. {
  80. scl=0;
  81. delay();
  82. k=(k<<1)|sda;
  83. scl=1;
  84. delay();
  85. }
  86. return k;
  87. }
  88. void write_add(uchar addrss,uchar com)
  89. {
  90. star();
  91. write_byte(0xa0);
  92. yingda();
  93. write_byte(addrss);
  94. yingda();
  95. write_byte(com);
  96. yingda();
  97. stop();
  98. }
  99. uchar read_add(uchar ak)
  100. {
  101. uchar date;
  102. star();
  103. write_byte(0xa0);
  104. yingda();
  105. write_byte(ak);
  106. yingda();
  107. star();
  108. write_byte(0xa1);
  109. yingda();
  110. date=read_byte();
  111. stop();
  112. return date;
  113. }
  114. void init()
  115. {
  116. scl=1;
  117. sda=1;
  118. qq=0;
  119. shu=0;

  120. TMOD=0x21;
  121. TH0=(65536-50000)/256;
  122. TL0=(65536-50000)%256;
  123. EA=1;
  124. ET0=1;
  125. TR0=1;
  126. //shu=read_add(2);

  127. TH1=0xfd;
  128. TL1=0xfd;
  129. TR1=1;
  130. REN=1;
  131. SM0=0;
  132. SM1=1;
  133. EA=1;
  134. ES=1;
  135. }
  136. void display(uchar bai,uchar shi,uchar ge)
  137. {
  138. dula=1;
  139. P0=table[bai];
  140. dula=0;
  141. P0=0xff;
  142. wela=1;
  143. P0=0xfe;
  144. wela=0;
  145. delay1(1);

  146. dula=1;
  147. P0=table[shi];
  148. dula=0;
  149. P0=0xff;
  150. wela=1;
  151. P0=0xfd;
  152. wela=0;
  153. delay1(1);

  154. dula=1;
  155. P0=table[ge];
  156. dula=0;
  157. P0=0xff;
  158. wela=1;
  159. P0=0xfb;
  160. wela=0;
  161. delay1(1);
  162. }
  163. void main()
  164. {
  165. init();
  166. shu=read_add(2); → →//这里有个问题就是为什么这个读取保存数据的语句放在初始化init()里就是
  167. while(1) //不行呢,一上电就是255再上电又是255似乎始终里面存的都是255
  168. { //可是放到初始化外面,一切都又正常了~~~新人求解释~~~!!!!!!!

  169. bai=shu/100;
  170. shi=shu%100/10;
  171. ge=shu%10;
  172. display(bai,shi,ge);

  173. }
  174. }
  175. void timer0() interrupt 1
  176. {
  177. uchar aa;
  178. TH0=(65536-50000)/256;
  179. TL0=(65536-50000)%256;
  180. aa++;
  181. if(aa==20)
  182. {
  183. aa=0;
  184. shu++;
  185. write_add(2,shu);
  186. if(shu==1000)
  187. shu=0;
  188. }
  189. }
  190. void ser() interrupt 4
  191. {
  192. RI=0;
  193. qq=SBUF;
  194. shu=qq;
  195. }

 楼主| jj89816657 发表于 2011-8-8 18:10 | 显示全部楼层
627949841 发表于 2011-8-8 22:40 | 显示全部楼层
uchar read_byte()
和你定义这函数是否有关,uchar范围是0—255.
新人看法,
邪恶猛男 发表于 2011-8-8 22:52 | 显示全部楼层
 楼主| jj89816657 发表于 2011-8-9 20:15 | 显示全部楼层
3# 627949841
果断不是这个原因,经测试后发现
qwe70007 发表于 2011-8-9 20:51 | 显示全部楼层
本帖最后由 qwe70007 于 2011-8-9 21:10 编辑

关于终止信号,图上表明在SCL拉高前,SDA就需要为低的,然后拉高。
若先置SCL=1,再SDA=0,无法确定SCL=1前SDA是低是高,我是这样理解的,不知道对不.
 楼主| jj89816657 发表于 2011-8-9 21:06 | 显示全部楼层
7# qwe70007
还有个问题呢,你看看能琢磨懂不
jy1975jy1975 发表于 2011-8-10 21:27 | 显示全部楼层
问题是什么,看不明白
 楼主| jj89816657 发表于 2011-8-11 21:52 | 显示全部楼层
这个我结贴啦,哎~~~
hukepig 发表于 2011-8-24 21:16 | 显示全部楼层
各位  突然掉电怎么保证数据不丢啊/???
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

43

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部