久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3391|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

怎么用AT24C02存一個(gè)大于256的數(shù)?附單片機(jī)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:867963 發(fā)表于 2020-12-26 22:07 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
是設(shè)計(jì)一個(gè)紅外計(jì)數(shù)器的,就差這個(gè)計(jì)數(shù)器計(jì)數(shù)的保存 存到AT24C02里面好像就最多就255,一到256就清零了
初學(xué)者有很多不太懂,at24c02 程序是直接搬書里的 我覺得關(guān)鍵就在我寫的那個(gè)中斷1那里 有大神可以幫看看程序嗎

單片機(jī)源程序如下:
  1. #include <reg52.h> //51頭文件
  2. # include <intrins.h>  
  3. #define uchar unsigned char//宏定義
  4. #define uint  unsigned int //宏定義
  5. #define AT24C02_ADDR  0xa0 //AT24C02地址
  6. sbit we = P2^7; //位定義數(shù)碼管位選鎖存器接口
  7. sbit du = P2^6; //位定義數(shù)碼管段選鎖存器接口
  8. sbit SDA = P2^0;
  9. sbit SCL = P2^1;
  10. sbit key = P2^5;//清零鍵
  11. sbit LED = P1^2;//指示燈,若燈亮說明IIC數(shù)據(jù)寫入成功
  12. long uint n;
  13. void delay_5us()  
  14. {
  15. _nop_();
  16. _nop_();
  17. _nop_();
  18. _nop_();
  19. _nop_();
  20. }
  21. /*1Ms延時(shí)*/
  22. void delay(uint z)
  23. {
  24. uint x,y;
  25. for(x = z; x > 0; x--)
  26.   for(y = 114; y > 0 ; y--);
  27. }
  28. /*I2C初始化*/
  29. void I2C_init()
  30. {
  31. SDA = 1;
  32. _nop_();
  33. SCL = 1;
  34. _nop_();
  35. }
  36. /*I2C起始信號(hào)*/
  37. void I2C_Start()  
  38. {
  39. SCL = 1;
  40. _nop_();
  41. SDA = 1;
  42. delay_5us();
  43. SDA = 0;
  44. delay_5us();
  45. }
  46. /*I2C終止信號(hào)*/
  47. void I2C_Stop()
  48. {
  49. SDA = 0;
  50. _nop_();
  51. SCL = 1;
  52. delay_5us();
  53. SDA = 1;
  54. delay_5us();
  55. }
  56. /*主機(jī)發(fā)送應(yīng)答*/
  57. void Master_ACK(bit i)  
  58. {
  59. SCL = 0; // 拉低時(shí)鐘總線允許SDA數(shù)據(jù)總線上的數(shù)據(jù)變化
  60. _nop_(); // 讓總線穩(wěn)定
  61. if (i)  //如果i = 1 那么拉低數(shù)據(jù)總線 表示主機(jī)應(yīng)答
  62. {
  63.   SDA = 0;
  64. }
  65. else  
  66. {
  67.   SDA = 1;  //發(fā)送非應(yīng)答
  68. }
  69. _nop_();//讓總線穩(wěn)定
  70. SCL = 1;//拉高時(shí)鐘總線 讓從機(jī)從SDA線上讀走 主機(jī)的應(yīng)答信號(hào)
  71. delay_5us();
  72. SCL = 0;//拉低時(shí)鐘總線, 占用總線繼續(xù)通信
  73. _nop_();
  74. SDA = 1;//釋放SDA數(shù)據(jù)總線。
  75. _nop_();
  76. }
  77. /*檢測(cè)從機(jī)應(yīng)答*/
  78. bit Test_ACK()
  79. {
  80. SCL = 1;
  81. delay_5us();
  82. if (SDA)
  83. {
  84.   SCL = 0;
  85.   _nop_();
  86.   I2C_Stop();
  87.   return(0);
  88. }
  89. else
  90. {
  91.   SCL = 0;
  92.   _nop_();
  93.   return(1);
  94. }
  95. }
  96. /*發(fā)送一個(gè)字節(jié)*/
  97. void I2C_send_byte(uchar byte)
  98. {
  99. uchar i;
  100. for(i = 0 ; i < 8 ; i++)
  101. {
  102.   SCL = 0;
  103.   _nop_();
  104.   if (byte & 0x80)
  105.   {   
  106.    SDA = 1;
  107.    _nop_();      
  108.   }   
  109.   else
  110.   {
  111.    SDA = 0;
  112.    _nop_();
  113.   }
  114.   SCL = 1;
  115.   _nop_();
  116.   byte <<= 1; // 0101 0100B
  117. }
  118. SCL = 0;
  119. _nop_();
  120. SDA = 1;
  121. _nop_();
  122. }

  123. /*I2C 讀一字節(jié)*/
  124. uchar I2C_read_byte()
  125. {
  126. uchar dat,i;
  127. SCL = 0;
  128. _nop_();
  129. SDA = 1;
  130. _nop_();
  131. for(i = 0 ; i < 8 ; i++)
  132. {
  133.   SCL = 1;
  134.   _nop_();
  135.   if (SDA)      
  136.   {
  137.     dat |= 0x01; //
  138.   }
  139.   else
  140.   {
  141.    dat &=  0xfe; //1111 1110
  142.   }
  143.   _nop_();
  144.   SCL = 0 ;
  145.   _nop_();
  146.   if(i < 7)
  147.   {
  148.    dat = dat << 1;
  149.   }
  150. }
  151. return(dat);
  152. }
  153. /*I2C發(fā)送數(shù)據(jù)*/
  154. bit I2C_TransmitData(uchar ADDR, DAT)
  155. {
  156. I2C_Start();
  157. I2C_send_byte(AT24C02_ADDR+0);
  158. if (!Test_ACK())
  159. {
  160.   return(0);
  161. }
  162. I2C_send_byte(ADDR);
  163. if (!Test_ACK())
  164. {
  165.   return(0);
  166. }
  167. I2C_send_byte(DAT);
  168. if (!Test_ACK())
  169. {
  170.   return(0);
  171. }
  172. I2C_Stop();
  173. return(1);
  174. }
  175. /*I2C接收數(shù)據(jù)*/
  176. uchar I2C_ReceiveData(uchar ADDR)
  177. {
  178. uchar DAT;
  179. I2C_Start();
  180. I2C_send_byte(AT24C02_ADDR+0);
  181. if (!Test_ACK())     //檢測(cè)從機(jī)應(yīng)答
  182. {
  183.   return(0);
  184. }
  185. I2C_send_byte(ADDR);   //發(fā)送需要讀取的數(shù)據(jù)所在的地址
  186. Master_ACK(0);
  187. I2C_Start();
  188. I2C_send_byte(AT24C02_ADDR+1);
  189. if (!Test_ACK())
  190. {
  191.   return(0);
  192. }
  193. DAT = I2C_read_byte();
  194. Master_ACK(0);      //主機(jī)發(fā)應(yīng)答
  195. I2C_Stop();
  196. return(DAT);
  197. }
  198. //數(shù)碼管段選表
  199. uchar code leddata[]={
  200.                 0x3F,  //"0"
  201.                 0x06,  //"1"
  202.                 0x5B,  //"2"
  203.                 0x4F,  //"3"
  204.                 0x66,  //"4"
  205.                 0x6D,  //"5"
  206.                 0x7D,  //"6"
  207.                 0x07,  //"7"
  208.                 0x7F,  //"8"
  209.                 0x6F,  //"9"
  210.                          };
  211. uchar code WS[]={
  212.       0x7f,
  213.       0xbf,
  214.       0xdf,
  215.       0xef,
  216.       0xf7,
  217.       0xfb,
  218.       0xfd,
  219.       0xfe  //1111 1110
  220.     };
  221. void T0_int() interrupt 1
  222. {
  223. n++;
  224. TH0 = 65535/256;  //重裝初值
  225. TL0 = 65535%256; //從15536開始計(jì)數(shù)
  226. if(!I2C_TransmitData(6,n%1000)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
  227. delay(5);
  228. if(!I2C_TransmitData(5,n/1000%1000)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
  229. delay(5);
  230. if(!I2C_TransmitData(4,n/1000/1000)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;高八位
  231. delay(5);
  232. if(n>10000000) //計(jì)數(shù)次數(shù)達(dá)到1000W
  233. {
  234. P2 = WS[13];   //數(shù)碼管顯示E代表計(jì)數(shù)已達(dá)上限
  235. P0 = leddata[1];
  236. }
  237. }
  238. void INT0_int() interrupt 2
  239. {
  240. if(!I2C_TransmitData(6,0)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
  241. delay(5);
  242. if(!I2C_TransmitData(5,0)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;低八位
  243. delay(5);
  244. if(!I2C_TransmitData(4,0)); //往AT24C02第255個(gè)單元中寫入數(shù)據(jù),1000 0000的2進(jìn)制為3個(gè)八位,16進(jìn)制為0x98 96 80,1000 0000%256=80;高八位
  245. delay(5);
  246. }
  247. void main()
  248. {
  249. uchar a,b,c,d,e,f,g,h,i,j,k;
  250. TH0 = 65535/256;
  251. TL0 = 65535%256; //從15536開始計(jì)數(shù)
  252. TMOD = 0x05 ;//設(shè)置T0為計(jì)數(shù)器模式,工作方式1,16位計(jì)數(shù)器
  253. TR0 = 1; //啟動(dòng)T0
  254. EA = 1;
  255. EX1 = 1;
  256. IT1 = 1;
  257. ET0 = 1;//允許T0溢出中斷
  258. I2C_init();//I2C初始化
  259.   while(1)
  260.   {   
  261.    i = I2C_ReceiveData(4);//從AT24C02單元中讀取數(shù)據(jù),高八位
  262.    j = I2C_ReceiveData(5);//從AT24C02單元中讀取數(shù)據(jù),中八位
  263.    k = I2C_ReceiveData(6);//從AT24C02單元中讀取數(shù)據(jù),低八位
  264.    n = i*10000+j*100+k;
  265.    a = n%10;
  266.    b = n/10%10;
  267.    c = n/100%10;
  268.    d = n/1000%10;
  269.    e = n/10000%10;
  270.    f = n/100000%10;
  271.    g = n/1000000%10;
  272.    h = n/10000000;
  273.    P0 = WS[0];
  274.    we = 1;//打開位選
  275.    we = 0; //關(guān)閉位選
  276.    P0 = leddata[a];
  277.    du = 1; //打開段選
  278.    du = 0; //關(guān)閉段選
  279.    delay(2);//延時(shí)
  280.    
  281.    we = 1; //打開位選
  282.    P0 = WS[1];//1111 1101  只選通第二位數(shù)碼管
  283.    we = 0; //關(guān)閉位選
  284.    
  285.    P0 = leddata[b]; //顯示2
  286.    du = 1;//打開段選
  287.    du = 0; //關(guān)閉段選
  288.    delay(2);//延時(shí)
  289.    
  290.    P0 = WS[2];// 1111 1011只選通第三位數(shù)碼管
  291.    we = 1; //打開位選
  292.    we = 0; //關(guān)閉位選
  293.    
  294.    P0 = leddata[c]; //顯示3
  295.    du = 1;//打開段選
  296.    du = 0; //關(guān)閉段選
  297.    delay(2);//延時(shí)
  298.    
  299.    P0 = WS[3];//1111 0111  只選通第四位數(shù)碼管
  300.    we = 1; //打開位選
  301.    we = 0; //關(guān)閉位選
  302.         
  303.    P0 = leddata[d]; //顯示4
  304.    du = 1;//打開段選
  305.    du = 0; //關(guān)閉段選
  306.    delay(2);//延時(shí)
  307.    
  308.    P0 = WS[4];//1110 1111  只選通第五位數(shù)碼管
  309.    we = 1; //打開位選
  310.    we = 0; //關(guān)閉位選
  311.    
  312.    P0 = leddata[e];
  313.    du = 1;//打開段選
  314.    du = 0; //關(guān)閉段選
  315.    delay(2);//延時(shí)
  316.    
  317.    P0 = WS[5];//1101 1111  只選通第六位數(shù)碼管
  318.    we = 1; //打開位選
  319.    we = 0; //關(guān)閉位選
  320.    
  321.    P0 = leddata[f]; //顯示6
  322.    du = 1;//打開段選
  323.    du = 0; //關(guān)閉段選
  324.    delay(2);//延時(shí)
  325.    
  326.    we = 1; //打開位選
  327.    P0 = WS[6];//1011 1111  只選通第七位數(shù)碼管
  328.    we = 0; //關(guān)閉位選
  329.    
  330.    P0 = leddata[g];
  331.    du = 1;//打開段選
  332.    du = 0; //關(guān)閉段選
  333.    delay(2);//延時(shí)
  334.    
  335.    P0 = WS[7];//0111 1111  只選通第八位數(shù)碼管
  336.    we = 1; //打開位選
  337.    we = 0; //關(guān)閉位選
  338.    
  339.    P0 = leddata[h];
  340.    du = 1;//打開段選
  341.    du = 0; //關(guān)閉段選
  342.    delay(2);//延時(shí)
  343.   }
  344. }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2020-12-26 22:37 | 只看該作者
大于255的數(shù)分解為兩個(gè)字節(jié)保存,讀取后再合并。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:235200 發(fā)表于 2020-12-26 22:48 | 只看該作者
24C02k的一個(gè)字節(jié)是8位,能夠存的最大數(shù)是255,所以在存入時(shí)要判斷,當(dāng)計(jì)數(shù)值小于255時(shí),直接存一次,當(dāng)計(jì)數(shù)值大于255時(shí),要把計(jì)數(shù)值/256存一次,計(jì)數(shù)值%256再存一次

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:420836 發(fā)表于 2020-12-27 09:32 | 只看該作者
8位存儲(chǔ)器最多可以存儲(chǔ)255,如果該數(shù)字大于255,則必須將其存儲(chǔ)在低半字節(jié)和高半字節(jié)中。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:57657 發(fā)表于 2020-12-27 12:38 | 只看該作者
csmyldl 發(fā)表于 2020-12-26 22:48
24C02k的一個(gè)字節(jié)是8位,能夠存的最大數(shù)是255,所以在存入時(shí)要判斷,當(dāng)計(jì)數(shù)值小于255時(shí),直接存一次,當(dāng)計(jì) ...

還可以用C語(yǔ)言的union

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:867963 發(fā)表于 2020-12-27 14:18 | 只看該作者
wulin 發(fā)表于 2020-12-26 22:37
大于255的數(shù)分解為兩個(gè)字節(jié)保存,讀取后再合并。

具體是怎么分解 合并呀
回復(fù)

使用道具 舉報(bào)

7#
ID:553941 發(fā)表于 2020-12-28 15:50 | 只看該作者
善良的00yy 發(fā)表于 2020-12-27 14:18
具體是怎么分解 合并呀

當(dāng)你寸一個(gè)數(shù)的時(shí)候,比如temp的值是257,先計(jì)算一個(gè)temp_h=temp/256,存入一個(gè)地址。再計(jì)算一個(gè)temp_l=temp%256,放入下一個(gè)地址。當(dāng)要讀這個(gè)數(shù)的時(shí)候,分別讀這兩個(gè)數(shù)據(jù),然后temp=temp_h*256+temp_l;
回復(fù)

使用道具 舉報(bào)

8#
ID:867963 發(fā)表于 2020-12-31 22:35 | 只看該作者
13303022280 發(fā)表于 2020-12-28 15:50
當(dāng)你寸一個(gè)數(shù)的時(shí)候,比如temp的值是257,先計(jì)算一個(gè)temp_h=temp/256,存入一個(gè)地址。再計(jì)算一個(gè)temp_l=t ...

成功啦 謝謝啦
回復(fù)

使用道具 舉報(bào)

9#
ID:399179 發(fā)表于 2021-11-22 09:28 來自手機(jī) | 只看該作者
善良的00yy 發(fā)表于 2020-12-31 22:35
成功啦 謝謝啦

樓主能不能分享一下成功的源代碼?我也遇到了這樣的問題,我是比菜鳥還菜的菜鳥,只會(huì)照搬 先謝謝了!
回復(fù)

使用道具 舉報(bào)

10#
ID:399179 發(fā)表于 2021-11-22 11:06 來自手機(jī) | 只看該作者
善良的00yy 發(fā)表于 2020-12-31 22:35
成功啦 謝謝啦

樓主能不能分享一下成功后程序代碼?造福我等菜鳥,謝謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区精品在线观看 | 一区二区国产精品 | 亚洲二区在线 | 国产一区二区三区在线 | 99re视频精品 | 日韩在线看片 | av激情在线 | 欧美一级在线免费观看 | 久久久久久久久久久久久久国产 | 在线免费观看黄色网址 | 一区二区三区视频在线免费观看 | www.五月婷婷.com | 精品中文字幕视频 | www.日韩免费 | 亚洲欧美日韩网站 | 日韩免费高清视频 | 国产精品欧美一区二区三区不卡 | 一区二区免费 | 毛片一区 | 日韩一区二区黄色片 | www.欧美 | 午夜精品久久久久久久99黑人 | 精品久久久久久久久久久 | 精品免费国产一区二区三区四区介绍 | 九一在线| 久久区二区 | 国产成人小视频 | 欧美精品一区三区 | 久草欧美视频 | 亚洲成人av| 国产精品伦理一区二区三区 | 欧美一区二区三区国产 | 中文字幕在线观看第一页 | 性一交一乱一透一a级 | 欧美一区精品 | 久久精品国产免费 | 成人欧美一区二区三区在线播放 | 欧美人妇做爰xxxⅹ性高电影 | 夜操| 亚洲午夜精品久久久久久app | 天天干夜夜操 |