找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机怎样把10进制unsigned int数据存入2402芯片?如何拆分与整合?

[复制链接]
跳转到指定楼层
楼主
ID:320097 发表于 2019-5-14 16:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是一个试验程序,4个位是直接分开的,没有整合到一个unsigned int型里面,那样就还要进行一次分离,打算把这4个位分别存入24C02的某个地址,下一次再读回来接着显示,但问题是读回来的数字不能在数码管上正确显示,请教一个各位师傅你们是怎样做的,int型不能直接存入24c02,必然是要拆开的,拆成两个char型(一个高8位,一个低8位)?可是拆了以后,读回来又不知道怎么整合到一起

单片机源程序如下:
  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. sbit SDA=P2^7;
  6. sbit SCL=P2^6;
  7. sbit w1=P3^4;
  8. sbit w2=P3^5;
  9. sbit w3=P3^7;
  10. sbit w4=P3^6;
  11. uchar cc,ge,shi,bai,qian;
  12. uchar code table[ ]={0xc0,0xf9,0xa4,0xb0,0x99,
  13.                      0x92,0x82,0xf8,0x80,0x90 };  //共阳0~9段码
  14. void delay(uint z)
  15.     {
  16.          uint x,y;
  17.          for(x=z;x>0;x--)
  18.              for(y=114;y>0;y--);
  19.         }
  20. void start( )
  21.         {
  22.           SDA=1;       //发送起始条件的数据信号
  23.           _nop_( );
  24.           SCL=1;
  25.           _nop_( );    //起始条件建立时间大于4.7us,延时
  26.           _nop_( );
  27.           _nop_( );
  28.           _nop_( );
  29.           _nop_( );   
  30.           SDA=0;       //发送起始信号
  31.           _nop_( );    //起始条件锁定时间大于4μ
  32.           _nop_( );
  33.           _nop_( );
  34.           _nop_( );
  35.           _nop_( );      
  36.           SCL=0;    //钳住I2C总线,准备发送或接收数据
  37.           _nop_( );
  38.           _nop_( );                        //SCL置低,准备接收或发送数据
  39.         }
  40. void stop( )
  41.         {
  42.           SDA=0;           //发送结束条件的数据信号
  43.           _nop_( );        //发送结束条件的时钟信号
  44.           SCL=1;           //结束条件建立时间大于4μ
  45.           _nop_( );
  46.           _nop_( );
  47.           _nop_( );
  48.           _nop_( );
  49.           _nop_( );
  50.           SDA=1;            //发送I2C总线结束信号
  51.           _nop_( );
  52.           _nop_( );
  53.           _nop_( );
  54.           _nop_( );                //延时保持4.7US以上
  55.         }
  56. void write(uchar a)
  57.         {
  58.          uchar b,shu;
  59.          for(b=0;b<8;b++)           //要传送的数据长度为8位
  60.             {
  61.               shu=a<<b;             //把即将发送的数据的为移到最高位
  62.               if((shu&0x80)!=0)                //判断最高位是否为0
  63.                         SDA=1;                        //不等于0说明最明当前要发送的数据为1
  64.               else  SDA=0;          //否则数据为0     
  65.              SCL=1;                 //置时钟线为高,通知被控器开始接收数据位
  66.               _nop_( );
  67.               _nop_( );             //保证时钟高电平周期大于4μ
  68.               _nop_( );
  69.               _nop_( );
  70.               _nop_( );         
  71.               SCL=0;
  72.             }
  73.         _nop_( );
  74.             SDA=1;               //8位发送完后释放数据线,准备接收应答位
  75.             _nop_( );   
  76.             SCL=1;
  77.             _nop_( );
  78.         }
  79. bit ack( )                                         //等待应答函数
  80.         {
  81.          bit h;
  82.          SDA=1;
  83.          _nop_( );
  84.          SCL=1;                                        //SDA和SCL全部置高
  85.          _nop_( );
  86.          _nop_( );
  87.          _nop_( );
  88.          _nop_( );
  89.          SCL=0;                                  //等待4.7US以上,把SCL置低
  90.          _nop_( );
  91.          _nop_( );
  92.          _nop_( );
  93.          _nop_( );
  94.          h=SDA;                                 //等待4.7SU以上读取SDA应答信号
  95.          return        h;                         //应答成功则是0,没有应答则是1
  96.         }
  97. uchar reade( )                          //接收数据
  98.         {
  99.          uchar d,g;
  100.          SDA=1;                                  //数据线置高电平
  101.          for(d=0;d<8;d++)
  102.                  {
  103.                   _nop_( );
  104.                   _nop_( );
  105.                   SCL=0;
  106.                   _nop_( );
  107.                   _nop_( );
  108.                   _nop_( );
  109.                   _nop_( );                 //SCL低电平,数据变化
  110.                   SCL=1;                 
  111.                   _nop_( );
  112.                   _nop_( );                 //SCL高电平,数据稳定
  113.                   if(SDA==1)
  114.                     g=(g<<1)|0x01; //如果读到的数据是1就是最低位置1
  115.                   else
  116.                     g=g<<1;                //否则读到是0,直接左移1位(左移后右补0)
  117.                 }
  118.           return g;                 //经过8次读取移位,把g返回
  119.         }
  120. void fasong(uchar add , uchar tab)          //发送一个字节
  121.         {
  122.           start( );                  //启动总线
  123.           write(0xa0);          //器件地址(发送)
  124.       ack( );              //等待应答
  125.           write(add);     //发送器件内部地址
  126.       ack( );                  //等待应答
  127.           write(tab);          //发送数据
  128.           ack( );                  //等待应答
  129.           stop( );
  130.         }
  131. uchar jieshou(uchar add)        //接收一个字节
  132.         {
  133.           uchar shu;
  134.           start( );                //读取(开始-器件地址(发)- 器件内部地址 - 开始 - 器件地址(收)- 接收数据 -发应答或停止接收
  135.           write(0xa0);
  136.           ack( );
  137.           write(add);
  138.           ack( );
  139.           start( );
  140.           write(0xa1);
  141.           ack( );
  142.           shu=reade( );
  143.           stop( );
  144.           return shu;
  145.         }
  146. void display(uchar a , uchar b , uchar c , uchar d)
  147.         {
  148.          if(a!=0)
  149.                  {
  150.                  w1=0;
  151.                  P0=table[a];
  152.                  delay(5);
  153.                  P0=0XFF;
  154.                  w1=1;
  155.                 }
  156.          if(a!=0||b!=0)
  157.                  {
  158.                  w2=0;
  159.                  P0=table[b];
  160.                  delay(5);
  161.                  P0=0XFF;
  162.                  w2=1;
  163.                 }
  164.          if(a!=0||b!=0||c!=0)
  165.                  {
  166.                  w3=0;
  167.                  P0=table[c];
  168.                  delay(5);
  169.                  P0=0XFF;
  170.                  w3=1;
  171.                 }
  172.          w4=0;
  173.      P0=table[d];
  174.          delay(5);
  175.          P0=0XFF;
  176.          w4=1;
  177.         }
  178. void main( )
  179.         {
  180.           uchar a1,a2,a3,a4;
  181.           w1=w2=w3=w4=1;
  182.           EA=1;
  183.           ET0=1;
  184.           TMOD=0X01;
  185.           TH0=0X3C;
  186.           TL0=0XB0;
  187.           fasong(0x03,9);
  188.           fasong(0x04,8);
  189.           fasong(0x05,7);
  190.           fasong(0x06,6);
  191.           delay(100);
  192.           a1=jieshou(0x03);
  193.           ge=a1;           
  194.           a2=jieshou(0x04);
  195.           shi=a2;
  196.           a3=jieshou(0x05);
  197.           bai=a3;
  198.           a4=jieshou(0x06);
  199.           qian=a4;
  200.           TR0=1;
  201.           while(1)
  202.           {
  203.            display(qian,bai,shi,ge);
  204.           }
  205.         }
  206. void aa( ) interrupt 1
  207.         {
  208.          TH0=0X3c;
  209.          TL0=0Xb0;
  210.          cc++;
  211.          if(cc==1)
  212.                  {
  213.                  cc=0;
  214.                  ge++;
  215.                  if(ge==10)
  216.                          {
  217.                            ge=0;
  218.                           shi++;
  219.                           if(shi==10)
  220.                                   {
  221.                                  shi=0;
  222.                                  bai++;
  223.                                  if(bai==10)
  224.                                          {
  225.                                          bai=0;
  226.                                          qian++;
  227.                                          if(qian==10)
  228.                                                  {
  229.                                                  qian=0;
  230.                                                 }
  231.                                         }
  232.                                 }
  233.                         }
  234.                 }
  235.         }
复制代码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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