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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3649|回復: 3
收起左側

為什么這個89C52單片機程序只顯示255,不顯示num值?

[復制鏈接]
ID:511168 發表于 2020-6-15 16:17 | 顯示全部樓層 |閱讀模式
仿真原理圖.png

單片機源程序如下:
  1. #include "reg51.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit SDA = P2^0;
  5. sbit SCL = P2^1;

  6. /*共陽數碼管的4位控制端口*/
  7. sbit LSA = P2^2;
  8. sbit LSB = P2^3;
  9. sbit LSC = P2^4;
  10. sbit LSD = P2^5;

  11. uchar codeLED[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  12. uchar num = 25;           //存放數據
  13. uchar display_num = 0;  //讀出數據
  14. uchar wei[4] = {0};  //LED數碼管的4位的顯示值

  15. void Delay_10us(void)
  16. {
  17.          unsignedchar a = 0;
  18.    unsigned char b = 0;
  19.          for(b=1;b>0;b--)
  20.          {
  21.                    for(a=2;a>0;a--);
  22.          }
  23. }

  24. void IIC_Start(void)
  25. {
  26.          SDA=1;
  27.          Delay_10us();
  28.          SCL=1;
  29.          Delay_10us();
  30.          SDA=0;
  31.          Delay_10us();
  32.          SCL=0;
  33.          Delay_10us();
  34. }

  35. void IIC_Stop(void)
  36. {
  37.          SDA=0;
  38.          Delay_10us();
  39.          SCL=1;
  40.          Delay_10us();
  41.          SDA=1;
  42.          Delay_10us();
  43. }

  44. unsigned char IIC_SendByte(unsigned chardat)
  45. {
  46.          unsignedchar a = 0;
  47.          unsigned char b = 0;
  48.          for(a=0;a<8;a++)
  49.          {
  50.                    SDA= dat >> 7;
  51.                    dat= dat << 1;
  52.                    Delay_10us();
  53.                    SCL= 1;
  54.                    Delay_10us();
  55.                    SCL= 0;
  56.                    Delay_10us();
  57.          }
  58.          SDA= 1;
  59.          Delay_10us();
  60.          SCL= 1;
  61.          while(SDA)
  62.          {
  63.                    b++;
  64.                    if(b>200)
  65.                    {
  66.                             SCL= 0;
  67.                             Delay_10us();
  68.                             return0;
  69.                    }
  70.          }
  71.          SCL= 0;
  72.          Delay_10us();
  73.          return1;
  74. }

  75. unsigned char IIC_ReadByte(void)
  76. {
  77.          unsignedchar a = 0;
  78.          unsigned char dat = 0;
  79.          SDA= 1;
  80.          Delay_10us();
  81.          for(a=0;a<8;a++)
  82.          {
  83.                    SCL= 1;
  84.                    Delay_10us();
  85.                    dat<<= 1;
  86.                    dat|= SDA;
  87.                    Delay_10us();
  88.                    SCL= 0;
  89.                    Delay_10us();
  90.          }
  91.          returndat;
  92. }

  93. void AT24C02_Write(unsigned charaddr,unsigned char dat)
  94. {
  95.          IIC_Start();
  96.          IIC_SendByte(0xa0);
  97.          IIC_SendByte(addr);
  98.          IIC_SendByte(dat);
  99.          IIC_Stop();
  100. }

  101. unsigned char AT24C02_Read(unsigned charaddr)
  102. {
  103.          unsigned char display = 0;
  104.          IIC_Start();
  105.          IIC_SendByte(0xa0);
  106.          IIC_SendByte(addr);
  107.          IIC_Start();
  108.          IIC_SendByte(0xa1);        
  109.          display = IIC_ReadByte();
  110.          IIC_Stop();
  111.          return display;
  112. }

  113. /*延時函數*/
  114. void Delay(uint i)
  115. {
  116.         while(i--);
  117. }

  118. /*數據處理*/
  119. void Data_Deal(void)
  120. {
  121.          wei[0] = display_num / 1000;
  122.          wei[1] = display_num % 1000 / 100;
  123.          wei[2] = display_num % 1000 % 100 / 10;
  124.          wei[3] = display_num % 1000 % 100 % 10;
  125. }

  126. /*顯示函數*/
  127. void Display(void)
  128. {
  129.    uchar i = 0;
  130.    for(i=0;i<4;i++)
  131.     {
  132.        switch(i)
  133.        {
  134.            case 0: LSA=0; LSB=1; LSC=1; LSD=1; break; //顯示第1位
  135.            case 1: LSA=1; LSB=0; LSC=1; LSD=1; break; //顯示第2位
  136.            case 2: LSA=1; LSB=1; LSC=0; LSD=1; break; //顯示第3位
  137.            case 3: LSA=1; LSB=1; LSC=1; LSD=0; break; //顯示第4位
  138.        }
  139.        P0 = LED[wei[ i]]; //發送段碼
  140.        Delay(100);
  141.     }
  142. }

  143. void main(void)
  144. {
  145.    while(1)
  146.     {
  147.        AT24C02_Write(1,num); //保存地址:1 保存內容:num
  148.        display_num = AT24C02_Read(1); //讀取地址1中的num
  149.        Data_Deal(); //數據處理
  150.        Display();   //數碼管顯示
  151.     }
  152. }
復制代碼


回復

使用道具 舉報

ID:155507 發表于 2020-6-15 22:31 | 顯示全部樓層
uchar num = 25;           //存放數據
uchar display_num = 0;  //讀出數據


display_num 數據類型最大就是255

uchar是8位的,占一個寄存器,  無符號字符型,范圍(0-255)
unsigned char的取值范圍是0-255
char是有長度的,你好好看看書,會有詳細的解釋



回復

使用道具 舉報

ID:24758 發表于 2020-6-16 18:40 | 顯示全部樓層
樓主的意思是存放的數據是25,但讀出來的數據是255,而不是25。

我用proteus簡單仿真了I2C器件(沒接數碼管),發現從I2C讀出的數據為0xFF(即255)。
試了多次發現,在主函數里對I2C讀寫操作太快,以至于無法穩定的讀出25(0x19)(具體原因不清楚)。

你可以在 AT24C02_Write(1,num); 和 display_num = AT24C02_Read(1); 這兩句后面都加個延時 Delay(100);

這樣就可以從I2C里面正確讀出數據了。但我沒接數碼管,不知道數碼管上能不能正常顯示。
后面我貼兩個圖,你看看,希望能有幫助。

如果沒看到圖的話,就是審核沒通過
回復

使用道具 舉報

ID:24758 發表于 2020-6-16 18:44 | 顯示全部樓層
2.png 第一張是沒加延時,讀出來0xFF
1.png

第二張加了延時,讀出和寫入數據一致0x19(25)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片在线免费播放 | 精品国产乱码久久久久久牛牛 | 国产一区二区在线免费观看 | 精品区一区二区 | 欧美一级在线免费 | 欧美成人精品一区二区男人看 | www成人免费视频 | 91美女在线 | av中文在线 | 久久精品视频一区二区 | 性高湖久久久久久久久aaaaa | 狠狠爱综合网 | 国产精品免费大片 | 爱草在线 | 日产精品久久久一区二区福利 | 日韩精品视频一区二区三区 | 亚洲精品一区在线观看 | 亚洲精品无人区 | 国产成人精品午夜 | 区一区二在线观看 | 青青草国产在线观看 | 欧美日韩精品久久久免费观看 | 欧美成人久久 | 天天天天天操 | 天天干视频 | 国精日本亚洲欧州国产中文久久 | 欧美一区二区在线视频 | 免费电影av | 亚洲欧美日韩在线 | 中文字幕高清一区 | 成人午夜精品一区二区三区 | 在线日韩不卡 | 免费视频一区二区 | 一本一道久久a久久精品综合 | 久久久久黄色 | 久久免费福利 | av 一区二区三区 | 国产精品自拍视频 | 久久久久国产 | 亚洲免费在线 | 超碰97人人人人人蜜桃 |