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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機示波器Proteus仿真程序 ADC0808+LCD12864顯示

[復制鏈接]
跳轉到指定樓層
樓主
1、本設計采用52單片機作為主控器。
2、單片機通過ADC0808讀取信號發生器所產生的波形通過12864進行顯示,可顯示方波,三角波,鋸齒波,正弦波等。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. //proteus仿真論壇
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #include <ADC0808.c>
  5. sbit DI=P2^2; // 數據\指令 選擇            AMPIRE12864 RS口
  6. sbit RW=P2^1; // 讀\寫 選擇                                                R/W
  7. sbit E=P2^0; // 讀\寫使能                                                E
  8. sbit CS1=P2^4; // 片選1                                                        CS1
  9. sbit CS2=P2^3; // 片選2                                                        CS2
  10. sbit busy=P1^7;                                                              //DB7
  11. sbit jia=P3^7;                                                                  //gg按鍵接地(x軸加調節)
  12. sbit jian=P3^3;                                                                  // 按鍵接地 (x軸減調節)
  13. sbit jia1=P3^0;                                                                  //按鍵接地 (y軸加調節)
  14. sbit jian1=P3^1;                                                          //按鍵接地 (y軸減調節)
  15. unsigned int i;
  16. unsigned char ye,lei,shu;
  17. unsigned char a[91];
  18. char code t[]={        
  19.                
  20.                                                                                                                                                                  
  21.                             0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x40,0x60,0x80,0x00,0x7F,0xFF, //小
  22.                 0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,

  23.                                 0x00,0x80,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x80,0x82,0x7F,0xE2, //子
  24.                 0x00,0xA2,0x00,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,
  25.                                                                                                                                                                                                 
  26.                                 0x00,0x40,0x00,0x60,0x3F,0x5E,0x01,0x48,0x01,0x48,0xFF,0xFF,0x11,0x48,0x21,0x4C, //制
  27.                 0x1F,0x68,0x00,0x40,0x07,0xF8,0x40,0x00,0x80,0x00,0x7F,0xFF,0x00,0x00,0x00,0x00,
  28.                                 
  29.                                 0x00,0x80,0x00,0x40,0x00,0x20,0xFF,0xF8,0x00,0x87,0x00,0x40,0x00,0x30,0x00,0x0F, //作
  30.                 0xFF,0xF8,0x08,0x88,0x08,0x88,0x08,0xC8,0x0C,0x88,0x08,0x0C,0x00,0x08,0x00,0x00,
  31.                                 };           //沒看懂


  32.                               
  33. void checkstate()           //檢查控件選中狀態,都能判斷是否選中控件
  34. {
  35.     DI=0;          // 數據\指令 選擇            AMPIRE12864 RS口
  36.         RW=1;          // 讀\寫 選擇                                                R/W
  37.         do
  38.         {
  39.           E=1;
  40.           E=0;
  41.                                         //僅當第7位為0時才可操作(判別busy信號)
  42.         }while(busy==1);
  43. }
  44.    void writecommand(unsigned char command)         //寫命令
  45. {
  46.         checkstate();
  47.         DI=0;//高電平:數據D0~D7將送入顯示RAM;低電平D0~D7將送入指令寄存器執行
  48.         RW=0;//高電平讀數據,低電平寫數據
  49.         P1=command;
  50.         E=1;        //高電平有效,低電平鎖定數據
  51.         E=0;
  52.         }
  53. void writedate(unsigned char date)                //寫數據
  54. {
  55.    checkstate();   //忙檢測
  56.    DI=1;
  57.    RW=0;
  58.    P1=date;
  59.    E=1;
  60.    E=0;
  61. }

  62. void pianxuan(unsigned int i) //選擇左右屏
  63. {
  64.   if(i==1)
  65.   CS1=0,CS2=1; //左屏                        
  66.   if(i==2)
  67.   CS1=1,CS2=0;        //右屏
  68.   if(i==3)
  69.   CS1=0,CS2=0;          //全屏
  70.   }
  71.   void shuju()
  72. {
  73.   pianxuan(i);         //選屏
  74.   writecommand(ye);           //寫命令(頁)
  75.   writecommand(lei);        //寫命令列
  76.   writedate(shu);                //寫數據
  77.   }
  78.   void cleanscreen()                                                 //清屏                 ???
  79. {
  80.         unsigned char page,i;
  81.         pianxuan(3);
  82.          for(page=0xb8;page<=0xbf;page++)        //從0頁到7頁
  83.         {   
  84.                 writecommand(page);         
  85.                 writecommand(0x40);                   //第0列
  86.                 for(i=0;i<64;i++)                 //0~63列
  87.                 writedate(0x00);          //清0
  88.                
  89.     }
  90.         pianxuan(1);                           //左屏
  91.     lei=0x40;                                         //第0列
  92.         for(ye=0xb8;ye<0xbf;ye++)         //從第0頁到第七頁
  93.         {
  94.          shu=0xff;
  95.          shuju();
  96.          }
  97.          ye=0xb8;
  98.          for(lei=0x40;lei<=0x7f;lei++)
  99.          {
  100.           shu=0x80;
  101.           shuju();                 //0x80
  102.           }
  103.          ye=0xbf;
  104.          for(lei=0x40;lei<=0x7f;lei++)
  105.          {
  106.           shu=0x01;
  107.           shuju();
  108.           }
  109.     pianxuan(2);
  110.     ye=0xb8;
  111.         for(lei=0x40;lei<=0x5b;lei++)
  112.          {
  113.           shu=0x80;
  114.           shuju();
  115.           }
  116.           ye=0xbf;
  117.          for(lei=0x40;lei<=0x5b;lei++)
  118.          {
  119.           shu=0x01;
  120.           shuju();
  121.           }
  122.          lei=0x5b;
  123.           for(ye=0xb9;ye<=0xbe;ye++)
  124.         {
  125.          shu=0xff;
  126.          shuju();
  127.          }
  128.          
  129. }                                                                                 
  130. void init(void)   //開顯示,起始行0行
  131. {        
  132.     writecommand(0xc0);                                                         //開啟顯示0011 1111
  133.         writecommand(0x3f);                                                         //設置起始行1100 0000  第0行
  134. }
  135. void delay_50us(uint t)                                                          //延時50us
  136. {                                                                                                                                                         
  137. uchar j;  
  138. for(;t>0;t--)   
  139.   for(j=19;j>0;j--);
  140. }

  141. void qing()                                                                           //清掉七頁
  142. {
  143.   uchar i;
  144.   for(i=0xb9;i<=0xbe;i++)                                        //第二頁到第六頁
  145.   {
  146.     ye=i;
  147.         shu=0x00;
  148.         shuju();
  149.         }
  150.   }
  151. void main()
  152. {

  153.         
  154.     uint r,j,g=0,q,dianya=1,k,p;                   //定義無符號整型
  155.     uchar m,l;                                                                //定義字符型m l
  156.         //pianxuan(3);
  157.     cleanscreen();                                                        //清屏
  158.     init();                                                                        //開啟顯示
  159.         pianxuan(2);                                                        //選右屏
  160.         l=0xb8;                                                                        //選第0頁l                1011 1000
  161.         for(k=0;k<4;k++,l=l+0x02)                                //l跳兩頁加頁,0頁跳2頁,跳4頁,跳6頁
  162.         {
  163.         ye=l;
  164.         lei=0x70;                                                                 // 0111 0000           右屏第47列
  165.         for(r=0;r<16;r++)                                                 // 跳著填數據,第0頁從t{}中每跳2個寫數據(右屏47~63列)
  166.         {
  167.          shu=t[2*r+1+32*k];
  168.              shuju();
  169.               lei++;
  170.             }
  171.         ye=l+0x01;                                                                             //當前頁加1頁
  172.         lei=0x70;                                                                                   //第47列
  173.         for(r=0;r<16;r++)                                                                  // 跳著填數據,第0頁從t{}中每跳2個寫數據(右屏47~63列)
  174.          {
  175.            shu=t[2*r+32*k];
  176.                shuju();
  177.                lei++;
  178.               }
  179.         }
  180.         /*void shuju()
  181. {
  182.   pianxuan(i);         //選屏
  183.   writecommand(ye);           //寫命令(頁)
  184.   writecommand(lei);        //寫命令列
  185.   writedate(shu);                //寫數據
  186.   }*/
  187.   while(1)
  188.   {
  189. uchar d1,d2,d3,d4,d5,d6;
  190. while(jia==0)
  191.       {
  192.        while(jia==0);                          //空函數保持當前狀態
  193.         g=g+1;                                                 //g=1
  194.        }
  195. while(jian==0)
  196.        {
  197.           while(jian==0);
  198.            if(g!=0) g=g-1;         //讓g=0
  199.         }
  200. while(jia1==0)
  201.        {
  202.         while(jia1==0);
  203.         dianya=dianya+1;          //電壓變0??
  204.        }
  205. while(jian1==0)
  206.        {
  207.         while(jian1==0);
  208.         if(dianya!=1) dianya=dianya-1;          //電壓變1
  209.        }
  210. for(j=0;j<90;j++) //AD采樣最大值
  211. {
  212.    adc();
  213.    a[j]=AD;                //存儲數字量
  214.    if(a[j]>a[91])
  215.      {
  216.       a[91]=a[j];  //最大量放最后
  217.      }
  218.   delay_50us(g);
  219. }
  220.   
  221. while(AD!=a[91])         //判斷AD是否與最大值相等
  222. {
  223.    adc();
  224. }
  225. for(j=0;j<90;j++) //AD采樣
  226.        {
  227.         adc();                         //采樣90個
  228.         a[j]=AD;
  229.         delay_50us(g);
  230.         }
  231.     lei=0x41;           //第一列
  232.     for(r=0,j=0;r<90;r++,j++)   
  233.         {
  234.            if(j<63) i=1;                         //選屏
  235.         if(j==63) lei=0x40;                  //j:列   i:屏(左右)   頁:l     
  236.         if(j>=63)i=2;                           
  237.         qing();          //清7頁
  238.         if(a[j>=127])//正電壓          ??????
  239.         {                             
  240.     AD=(a[j]-127)*0.196/dianya;  //計算在12864的電壓值                  鄭學長?
  241.     if(AD<=7)       ye=0xbb,shu=(0x80>>AD);
  242.         else if(AD<=15) ye=0xba,shu=(0x80>>(AD-8));
  243.     else if(AD<=23) ye=0xb9,shu=(0x80>>(AD-16));
  244.     else if(AD<=31) ye=0xb9,shu=(0x80>>(AD-24));
  245.         }
  246.         if(a[j]<127)//負電壓
  247.         {
  248.         AD=(127-a[j])*0.196/dianya;
  249.     if(AD<=7)       ye=0xbc,shu=(0x01<<(AD));
  250.     else if(AD<=15) ye=0xbd,shu=(0x01<<(AD-8));
  251.     else if(AD<=23) ye=0xbe,shu=(0x01<<(AD-16));
  252.         else if(AD<=31) ye=0xbe,shu=(0x01<<(AD-24));
  253.         }
  254.    if(r==0)                          //第一次循環把shu給d1,ye給d2
  255.         {
  256.           d1=shu;                 //shu是t{}里面。
  257.              d2=ye;                 //最后一頁
  258.         }
  259.         if(r!=0)                                   //除了第一次循環外
  260.         {
  261.           d3=shu;
  262.           d4=ye;
  263.             if(ye==d2)                                //判斷d2與d4是否相等(是否在同一頁)
  264.             {
  265.                if(shu>d1)                  //把shu向右移         趨近d1                                       
  266.                 {
  267.                   d5=shu;
  268.                   d5=d5>>1;
  269.                   while(d5!=d1)
  270.                     {d5=d5>>1;shu=shu|(shu>>1);}
  271.                 }
  272.                if(shu<d1)
  273.                 {
  274.                   d5=shu;
  275.                   d5=d5<<1;
  276.                   while(d5!=d1)
  277.                    {d5=d5<<1;shu=shu|(shu<<1);}
  278.                 }
  279.             }

  280.       if(ye<d2)
  281.              {
  282.                for(q=0;q<7;q++)
  283.                  {
  284.                           shu=shu|(shu<<1);
  285.                        }
  286.                      shuju();
  287.                       ye++;
  288.                      while(ye<d2) {shu=0xff,shuju(),ye++;}
  289.                  if(ye==d2)
  290.                           {
  291.                          shu=0x01;
  292.                                  if(shu<d1)
  293.                         {
  294.                          d5=shu;
  295.                          d5=d5<<1;
  296.                          while(d5!=d1)
  297.                          {d5=d5<<1;shu=shu|(shu<<1);}
  298.                         }
  299. ……………………

  300. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

仿真程序51hei附件下載:
簡易示波器修改版.7z (105.68 KB, 下載次數: 57)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:1061404 發表于 2023-9-2 16:48 | 只看該作者
厲害,我以后也要學學proteus仿真,對想法先用軟件仿真出來,再把電路做出來
回復

使用道具 舉報

板凳
ID:641483 發表于 2023-9-5 15:19 | 只看該作者
謝謝樓主分享,先收藏 慢慢學習
回復

使用道具 舉報

地板
ID:477512 發表于 2023-9-10 10:43 | 只看該作者
這個仿真文件是哪個版本仿真軟件創建的?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人春色在线 | 国产精品一区二区三区四区 | 国产中文 | 91在线电影| 免费视频一区 | 国产做a爱片久久毛片 | 亚洲福利精品 | 伊人二区 | 成人午夜影院 | 国产在线a | 97超碰人人草 | 国产精品免费一区二区三区 | 九九精品在线 | 欧美一区二区三区视频 | 五月激情综合网 | 欧美激情久久久 | 在线观看毛片网站 | 国产日产精品一区二区三区四区 | 亚洲人一区| 欧美精品一区二区免费 | 欧美日韩在线综合 | 免费视频99 | 国产精品日韩高清伦字幕搜索 | 色久在线| 亚洲欧洲精品在线 | 狠狠操在线 | 国产精品1区2区 | 黄色免费看 | 亚洲国产成人av好男人在线观看 | 一区二区三区久久 | 亚洲视频在线观看免费 | 国产成人综合一区二区三区 | 午夜精品导航 | 久久国产精品一区二区三区 | 黄色在线免费观看 | 日韩精品免费一区 | 中文字幕一区二区三区精彩视频 | 色天天综合 | 国产精品日本一区二区在线播放 | 国产精品一区二区欧美黑人喷潮水 | www.伊人.com |