找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2573|回复: 3
打印 上一主题 下一主题
收起左侧

为什么这个89C52单片机程序只显示255,不显示num值?

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  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. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 | 只看该作者
第一张是没加延时,读出来0xFF


第二张加了延时,读出和写入数据一致0x19(25)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表