找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3559|回复: 3
收起左侧

想在这个电路中加个AT24C02存储芯片,程序应该怎么改,求哪位大神帮助!

[复制链接]
ID:301069 发表于 2018-4-6 00:03 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. //这是需要修改的程序,真的不懂。
  2. #include <AT89X52.h>
  3. #include <intrins.h>
  4. //12864控制引脚定义
  5. sbit DI = P2 ^ 2; //数据\指令选择引脚
  6. sbit RW = P2 ^ 1; //读\写选择引脚
  7. sbit E= P2 ^ 0;   //读\写使能引脚
  8. sbit CS1 = P2 ^ 4;    //片选1引脚
  9. sbit CS2 = P2 ^ 3;    //片选2引脚
  10. sbit BUSY= P1 ^ 7;    //忙标志位
  11. //按键控制定义
  12. sbit Y1 = P3 ^ 0;
  13. sbit Y2 = P3 ^ 1;
  14. sbit X1 = P3 ^ 3;
  15. sbit X2 = P3 ^ 7;
  16. //ADC0832控制引脚
  17. sbit START=P3^4;
  18. sbit OE=P3^6;
  19. sbit EOC=P3^5;
  20. unsigned int ADdata;    //AD采集值
  21. unsigned int Ldata;
  22. unsigned char ye,lei,shu;
  23. unsigned char ADViewdata[91]; //AD显示数据存储区
  24. char code FrameData[]={              //提示字符存储区                  
  25. 0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x01,0x00,
  26. 0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x41,0x02,0x81,0x02,0x05,0x00,0x02,0x00,    //示
  27. 0x00,0x20,0x20,0x20,0x10,0x20,0x13,0xFE,0x82,0x22,0x42,0x24,0x4A,0x20,0x0B,0xFC,
  28. 0x12,0x84,0x12,0x88,0xE2,0x48,0x22,0x50,0x22,0x20,0x24,0x50,0x24,0x88,0x09,0x06,  //波  
  29. 0x00,0x00,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C,0x01,0x20,0x01,0x10,0xFF,0xFE,
  30. 0x02,0x80,0x0C,0x60,0x30,0x18,0xC0,0x06,0x3E,0x7C,0x22,0x44,0x22,0x44,0x3E,0x7C,    //器
  31. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  32. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,    //" "
  33. };
  34. //AD转换软件
  35. void ADCChage()
  36. {
  37.   START=1;
  38.   START=0;
  39.   while(EOC==0)  //等待转换完成
  40. {
  41.    OE=1;
  42. }
  43.   ADdata = P0;   //读取AD数据
  44. OE=0;
  45. }
  46. //检查12864液晶状态                 
  47. void CheckState()
  48. {
  49.   DI=0;
  50. RW=1;
  51. do
  52. {
  53.    E=1;
  54.    E=0;
  55.    //仅当第7位为0时才可操作(判别busy信号)
  56. }while(BUSY==1);
  57. }
  58. //向12864写入一个字节的命令
  59. void WriteCommand(unsigned char cmd)  
  60. {
  61. CheckState();         //检查当前的12864状态
  62. DI = 0;
  63. RW = 0;
  64. P1 = cmd;             //送出相应的命令
  65. E = 1;
  66. E = 0;
  67. }  
  68. //向12864写入一个字节的数据
  69. void WriteData(unsigned char dat)  
  70. {
  71.    CheckState();   //检查当前的12864状态
  72.    DI = 1;
  73.    RW = 0;
  74.    P1 = dat;       //送出相应的数据
  75.    E = 1;
  76.    E = 0;
  77. }
  78. //12864液晶的选择控制引脚
  79. void LCMCSControl(unsigned int csl)
  80. {
  81.   if(csl==1)    //根据参数不同判断当前的12864控制引脚状态
  82.   {
  83.     CS1=0,
  84.     CS2=1;
  85.   }
  86.   if(csl==2)
  87.   {
  88.     CS1=1,
  89.     CS2=0;
  90.   }
  91.   if(csl==3)
  92.   {
  93.     CS1=0,
  94.     CS2=0;
  95.   }
  96. }
  97. //12864显示函数
  98. void LCMView()
  99. {
  100.   LCMCSControl(Ldata);     //先发送控制命令
  101.   WriteCommand(ye);
  102.   WriteCommand(lei);
  103.   WriteData(shu);         //然后发送数据
  104. }
  105. //12864的清屏函数
  106. void CleanScreen()      
  107. {
  108. unsigned char page,i;
  109. LCMCSControl(3);
  110. for(page=0xb8;page<=0xbf;page++)
  111. {   
  112.   WriteCommand(page);
  113.   WriteCommand(0x40);
  114.   for(i=0;i<64;i++)
  115.     {
  116.     WriteData(0x00);
  117.     }
  118. }
  119. LCMCSControl(1);
  120.   lei=0x40;
  121. for(ye=0xb8;ye<0xbf;ye++)
  122. {
  123.   shu=0xff;
  124.   LCMView();
  125. }
  126. ye=0xb8;
  127. for(lei=0x40;lei<=0x7f;lei++)
  128. {
  129.    shu=0x80;
  130.    LCMView();
  131. }
  132. ye=0xbf;
  133. for(lei=0x40;lei<=0x7f;lei++)
  134. {
  135.    shu=0x01;
  136.    LCMView();
  137. }
  138.   LCMCSControl(2);
  139.   ye=0xb8;
  140. for(lei=0x40;lei<=0x5b;lei++)
  141.   {
  142.    shu=0x80;
  143.    LCMView();
  144. }
  145. ye=0xbf;
  146. for(lei=0x40;lei<=0x5b;lei++)
  147. {
  148.    shu=0x01;
  149.    LCMView();
  150. }
  151. lei=0x5b;
  152. for(ye=0xb9;ye<=0xbe;ye++)
  153. {
  154.   shu=0xff;
  155.   LCMView();
  156. }
  157. }
  158. //12864的初始化函数
  159. void InitLCM(void)   
  160. {
  161.   WriteCommand(0xc0);
  162. WriteCommand(0x3f);
  163. }
  164. //50us的延时函数
  165. void Delay50us(unsigned int t)
  166. {
  167. unsigned char j;  
  168. for(;t>0;t--)   
  169.   for(j=19;j>0;j--);
  170. }
  171. //刷新12864液晶
  172. void RefreshLCM()
  173. {
  174.   unsigned char i;
  175.   for(i=0xb9;i<=0xbe;i++)
  176.   {
  177.     ye=i;
  178.    shu=0x00;
  179.    LCMView();
  180. }
  181. }
  182. //主函数
  183. void main()
  184. {
  185.     unsigned int r,j,q,k;
  186.     unsigned int Xaxis =0;
  187.     unsigned int Yaxis = 1;
  188.     unsigned char l;
  189.     unsigned char d1,d2,d3,d4,d5;
  190.     CleanScreen();
  191.     InitLCM();
  192.    LCMCSControl(2);
  193.    l=0xb8;
  194.    for(k=0;k<4;k++,l=l+0x02)         //首先显示右侧的提示
  195.    {
  196.      ye=l;
  197.      lei=0x70;
  198.      for(r=0;r<16;r++)
  199.       {
  200.         shu=FrameData[2*r+1+32*k];
  201.        LCMView();
  202.        lei++;
  203.      }
  204.      ye=l+0x01;
  205.      lei=0x70;
  206.      for(r=0;r<16;r++)
  207.       {
  208.         shu=FrameData[2*r+32*k];
  209.        LCMView();
  210.        lei++;
  211.      }
  212. }
  213.   while(1)
  214.   {
  215.     while(X2==0)      //调节X轴
  216.     {
  217.       while(X2==0);
  218.       Xaxis = Xaxis + 1;
  219.     }
  220.     while(X1==0)
  221.     {
  222.       while(X1==0);
  223.       if(Xaxis!=0)
  224.       {
  225.         Xaxis = Xaxis - 1;
  226.       }
  227.     }
  228.     while(Y1==0)     //调节Y轴
  229.     {
  230.       while(Y1==0);
  231.       Yaxis = Yaxis + 1;
  232.     }
  233.     while(Y2==0)
  234.     {
  235.       while(Y2==0);
  236.       if(Yaxis!=1)
  237.       {
  238.         Yaxis=Yaxis-1;
  239.       }
  240.     }
  241.     for(j=0;j<90;j++) //AD采样最大值
  242.     {
  243.       ADCChage();
  244.       ADViewdata[j]=ADdata;
  245.       if(ADViewdata[j]>ADViewdata[91])
  246.       {
  247.         ADViewdata[91]=ADViewdata[j];
  248.       }
  249.       Delay50us(Xaxis);
  250.     }
  251.     while(ADdata!=ADViewdata[91])    //如果采集值不相等,则继续
  252.     {
  253.       ADCChage();
  254.     }
  255.     for(j=0;j<90;j++)      //连续采样90次
  256.     {
  257.        ADCChage();
  258.        ADViewdata[j]=ADdata;
  259.        Delay50us(Xaxis);
  260.     }
  261.     lei=0x41;
  262.     for(r=0,j=0;r<90;r++,j++)
  263.    {
  264.       if(j<63)
  265.       {
  266.         Ldata=1;
  267.       }
  268.      if(j==63)
  269.       {
  270.         lei=0x40;
  271.       }
  272.      if(j>=63)
  273.       {
  274.         Ldata=2;
  275.       }
  276.      RefreshLCM();     //刷新当前显示
  277.      if(ADViewdata[j>=127])//正电压
  278.      {                             
  279.         ADdata=(ADViewdata[j]-127)*0.196/Yaxis;  //计算电压值
  280.         if(ADdata<=7)      
  281.         {
  282.           ye=0xbb;
  283.           shu=(0x80>>ADdata);
  284.         }
  285.        else if(ADdata<=15)
  286.         {
  287.           ye=0xba;
  288.           shu=(0x80>>(ADdata-8));
  289.         }
  290.         else if(ADdata<=23)
  291.         {
  292.           ye=0xb9;
  293.           shu=(0x80>>(ADdata-16));
  294.          }
  295.         else if(ADdata<=31)
  296.         {
  297.           ye=0xb9;
  298.           shu=(0x80>>(ADdata-24));
  299.         }
  300.      }
  301.      if(ADViewdata[j]<127)     //负电压
  302.      {
  303.          ADdata=(127-ADViewdata[j])*0.196/Yaxis;    //计算电压值
  304.           if(ADdata<=7)
  305.           {
  306.               ye=0xbc;
  307.               shu=(0x01<<(ADdata));
  308.           }
  309.           else if(ADdata<=15)
  310.           {
  311.               ye=0xbd;
  312.               shu=(0x01<<(ADdata-8));
  313.           }
  314.           else if(ADdata<=23)
  315.           {
  316.               ye=0xbe;
  317.               shu=(0x01<<(ADdata-16));
  318.           }
  319.          else if(ADdata<=31)
  320.           {
  321.               ye=0xbe;
  322.               shu=(0x01<<(ADdata-24));
  323.           }
  324.      }
  325.       if(r==0)//判断正负
  326.      {
  327.        d1=shu;
  328.        d2=ye;
  329.       }
  330.       if(r!=0)
  331.      {
  332.        d3=shu;
  333.        d4=ye;
  334.        if(ye==d2)  //如果相等,则判断是否显示完成
  335.        {
  336.          if(shu>d1)
  337.          {
  338.            d5=shu;
  339.            d5=d5>>1;
  340.            while(d5!=d1)
  341.            {
  342.               d5=d5>>1;
  343.              shu=shu|(shu>>1);
  344.             }
  345.          }
  346.          if(shu<d1)
  347.          {
  348.            d5=shu;
  349.            d5=d5<<1;
  350.            while(d5!=d1)
  351.           {
  352.               d5=d5<<1;
  353.               shu=shu|(shu<<1);
  354.            }
  355.          }
  356.        }
  357.         if(ye<d2)
  358.        {  
  359.          for(q=0;q<7;q++)
  360.          {
  361.           shu=shu|(shu<<1);
  362.         }
  363.       LCMView();
  364.        ye++;
  365.       while(ye<d2)
  366.         {
  367.           shu=0xff;
  368.           LCMView();
  369.           ye++;
  370.         }
  371.       if(ye==d2)
  372.         {
  373.           shu=0x01;
  374.        if(shu<d1)
  375.            {
  376.              d5=shu;
  377.              d5=d5<<1;
  378.              while(d5!=d1)
  379.              {
  380.                 d5=d5<<1;
  381.                 shu=shu|(shu<<1);
  382.                }
  383.             }
  384.        }
  385.         }
  386.        if(ye>d2)
  387.        {
  388.          for(q=0;q<7;q++)
  389.          {
  390.           shu=shu|(shu>>1);
  391.         }
  392.       LCMView();
  393.        ye--;
  394.       while(ye>d2) {shu=0xff,LCMView(),ye--;}
  395.       if(ye==d2)
  396.         {
  397.           shu=0x80;
  398.        if(shu>d1)
  399.            {
  400.              d5=shu;
  401.              d5=d5>>1;
  402.              while(d5!=d1)
  403.              {
  404.                 d5=d5>>1;
  405.                 shu=shu|(shu>>1);
  406.                }
  407.             }
  408.     }
  409.       }
  410.    }
  411.    if(r!=0)
  412.    {
  413.      d1=d3;
  414.      d2=d4;
  415.    }
  416.     LCMView();
  417.     if(lei!=0x7f)
  418.     {
  419.       lei++;
  420.     }
  421.    }
  422. }
  423. }

  424.    
  425.    
复制代码



011933b822jj8oock1v13n.png
回复

使用道具 举报

ID:111634 发表于 2018-4-6 08:09 | 显示全部楼层
实例49  读写AT24C02
Proteus仿真一下,确认有效。
实例49 读写IIC AT24C02.rar (38.96 KB, 下载次数: 20)

评分

参与人数 1黑币 +5 收起 理由
1606036198 + 5

查看全部评分

回复

使用道具 举报

ID:302345 发表于 2018-4-6 09:15 | 显示全部楼层
zl2168 发表于 2018-4-6 08:09
实例49  读写AT24C02
先Proteus仿真一下,确认有效。

好牛叉 大神哈
回复

使用道具 举报

ID:301069 发表于 2018-4-6 20:06 | 显示全部楼层
zl2168 发表于 2018-4-6 08:09
实例49  读写AT24C02
先Proteus仿真一下,确认有效。

谢啦,大神同志
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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