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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3959|回復: 3
打印 上一主題 下一主題
收起左側

想在這個電路中加個AT24C02存儲芯片,程序應該怎么改,求哪位大神幫助!

[復制鏈接]
跳轉到指定樓層
樓主
單片機源程序如下:
  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 (51.22 KB, 下載次數: 38)

011933b822jj8oock1v13n.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:111634 發表于 2018-4-6 08:09 | 只看該作者
實例49  讀寫AT24C02
Proteus仿真一下,確認有效。
實例49 讀寫IIC AT24C02.rar (38.96 KB, 下載次數: 20)

以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。書中電路和程序設計有詳細說明,程序語句條條有注解。

評分

參與人數 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区免费 | 一区二区三区中文字幕 | 国产成人av一区二区三区 | av一区二区三区 | 狠狠插狠狠操 | 国产精品一区二区三区久久 | 91精品国产91久久久久久 | 欧美成年黄网站色视频 | 欧美一级免费看 | 欧美在线色视频 | 国产日韩视频 | 在线国产视频 | 午夜小电影 | 国产精品一区二区久久久久 | 欧美在线视频一区二区 | 欧美1—12sexvideos | 久久国产精品精品国产色婷婷 | 欧美乱码精品一区二区三区 | 国产视频久久久 | 成人性视频在线播放 | 欧美三区在线观看 | 国产日韩欧美二区 | 久久国产传媒 | 99精品国产一区二区三区 | 国产精品毛片一区二区三区 | 不卡视频一区二区三区 | jizz视频| 久久精品久久综合 | 日韩免费在线观看视频 | 精品国产乱码久久久久久88av | 久草视频在线播放 | 国产欧美日韩精品一区二区三区 | 日韩中文字幕视频在线观看 | 日韩成人免费视频 | 亚洲视频在线观看免费 | 国产精品一区二区三区四区 | 久久久久国| 日韩成人在线网站 | 羞羞视频网站免费观看 | www.黄色在线观看 | 日本一区二区视频 |