查看: 3532|回复: 3

基于12864简易示波器程序和图

[复制链接]
  • TA的每日心情
    奋斗
    2016-6-12 21:59
  • 签到天数: 647 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-11-17 02:08:20 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 QQ哥 于 2012-11-17 02:10 编辑


    #include <reg51.h>
    #include <intrins.h>
    #include <ADC0808.c>
    sbit DI=P2^2; // 数据\指令选择
    sbit RW=P2^1; // \选择
    sbit E=P2^0; // \写使能
    sbit CS1=P2^4; // 片选1
    sbit CS2=P2^3; // 片选2
    sbit busy=P1^7;
    sbit jia=P3^7;
    sbit jian=P3^3;
    sbit jia1=P3^0;
    sbit jian1=P3^1;
    unsigned int i;
    unsigned char ye,lei,shu;
    unsigned char a[94];
    char code t[]={      


                            0x00,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x80,0x40,0x60,0x80,0x00,0x7F,0xFF, //
                    0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x06,0x00,0x00,0x00,0x00,0x00,

                                0x00,0x80,0x00,0x80,0x00,0x82,0x00,0x82,0x00,0x82,0x40,0x82,0x80,0x82,0x7F,0xE2, //
                    0x00,0xA2,0x00,0x92,0x00,0x8A,0x00,0x86,0x00,0x80,0x00,0xC0,0x00,0x80,0x00,0x00,

                                0x00,0x40,0x00,0x60,0x3F,0x5E,0x01,0x48,0x01,0x48,0xFF,0xFF,0x11,0x48,0x21,0x4C, //
                    0x1F,0x68,0x00,0x40,0x07,0xF8,0x40,0x00,0x80,0x00,0x7F,0xFF,0x00,0x00,0x00,0x00,

                                0x00,0x80,0x00,0x40,0x00,0x20,0xFF,0xF8,0x00,0x87,0x00,0x40,0x00,0x30,0x00,0x0F, //
                   0xFF,0xF8,0x08,0x88,0x08,0x88,0x08,0xC8,0x0C,0x88,0x08,0x0C,0x00,0x08,0x00,0x00,
                                };



    void checkstate()
    {
           //bitdat;
           DI=0;
           RW=1;
           //P1=0x00;
           do
           {
             E=1;
             E=0;
                                       //仅当第7位为0时才可操作(判别busy信号)
           }while(busy==1);
    }
      void writecommand(unsigned char command)      //写命令
    {
           checkstate();
           DI=0;
           RW=0;
           P1=command;
           E=1;
           E=0;
           }
    voidwritedate(unsigned char date)            //写数据
    {
      checkstate();
      DI=1;
      RW=0;
      P1=date;
      E=1;
      E=0;
    }

    voidpianxuan(unsigned int i)
    {
    if(i==1)
    CS1=0,CS2=1;
    if(i==2)
    CS1=1,CS2=0;
    if(i==3)
    CS1=0,CS2=0;
      }
    void cleanscreen()                                         //清屏
    {
           unsignedchar page,i;
           for(page=0xb8;page<0xc0;page++)
           {
                  writecommand(page);
                  writecommand(0x40);
                  for(i=0;i<64;i++)
                  writedate(0x00);
           }

    }
    void init(void)   //开显示,起始行0
    {     
       writecommand(0xc0);
           writecommand(0x3f);
    }
    void delay_50us(uint t)
    {
    uchar j;
    for(;t>0;t--)   
    for(j=19;j>0;j--)
       ;
    }
    voidshuju()
    {
    pianxuan(i);
    writecommand(ye);
    writecommand(lei);
    writedate(shu);
      }
    voidqing()
    {
      uchar i;
    for(i=0xb8;i<=0xbf;i++)
      {
       ye=i;
           shu=0x00;
           shuju();
           }
      }
    voidmain()
    {


       uint r,j,g=0,q,dianya=1,k,p;
       uchar U,m,l;
           pianxuan(3);
       cleanscreen();
        init();
           pianxuan(2);

         l=0xb8;
           for(k=0;k<4;k++,l=l+0x02)
           {
           ye=l;
           lei=0x70;
           for(r=0;r<16;r++)
       {
       shu=t[2*r+1+32*k];
           shuju();
           lei++;
           }
           ye=l+0x01;
           lei=0x70;
           for(r=0;r<16;r++)
       {
       shu=t[2*r+32*k];
           shuju();
           lei++;
           }
           }


    while(1)
      {
    uchar d1,d2,d3,d4,d5;
    aaa:do
           {
           adc();
            }while((AD!=128)&&(AD!=129)&&(AD!=130));
       U=AD;
           adc();
           if(U>AD)
           gotoaaa;
    while(jia==0)
    {
    while(jia==0);
    g=g+1;
    }
    while(jian==0)
    {
    while(jian==0);
    if(g!=0) g=g-1;
    }
    while(jia1==0)
    {
    while(jia1==0);
    dianya=dianya+1;
    }
    while(jian1==0)
    {
    while(jian1==0);
    if(dianya!=1) dianya=dianya-1;
    }
    for(j=0;j<94;j++) //AD采样
    {
    adc();
    a[j]=AD;
    delay_50us(g);
      }
       lei=0x40;
       for(r=0,j=0;r<94;r++,j++)
           {
         if(j<64) i=1;
           if(j==64)lei=0x40;
           if(j>=64)i=2;
           qing();                //清掉之前的内容
       AD=a[j]*0.196/dianya;  //计算在12864的电压值
       if(AD<=7)       ye=0xbf,shu=(0x80>>AD);
           elseif(AD<=15) ye=0xbe,shu=0x80>>(AD-8);
       else if(AD<=23) ye=0xbd,shu=0x80>>(AD-16);
       else if(AD<=31) ye=0xbc,shu=0x80>>(AD-24);
       else if(AD<=39) ye=0xbb,shu=0x80>>(AD-32);
       else if(AD<=47) ye=0xba,shu=0x80>>(AD-40);
       else if(AD<=55) ye=0xb9,shu=0x80>>(AD-48);
           elseif(AD<=63) ye=0xb8,shu=0x80>>(AD-56);
      if(r==0)
           {
           d1=shu;
           d2=ye;
           }
           if(r!=0)
           {
            d3=shu;
            d4=ye;
            if(ye==d2)
            {
             if(shu>d1)
            {
            d5=shu;
            d5=d5>>1;
            while(d5!=d1)
            {d5=d5>>1;
            shu=shu|(shu>>1);}
            }
            if(shu<d1)
            {
            d5=shu;
            d5=d5<<1;
            while(d5!=d1)
            {d5=d5<<1;shu=shu|(shu<<1);}
            }
           }

       if(ye<d2)
            {
                for(q=0;q<7;q++)
                {
                    shu=shu|(shu<<1);
                    }
                    shuju();
                   ye++;
                    while(ye<d2) {shu=0xff,shuju(),ye++;}
                    if(ye==d2){
                                shu=0x01;
                                         if(shu<d1)
                           {
                            d5=shu;
                            d5=d5<<1;
                            while(d5!=d1)
                           {d5=d5<<1;shu=shu|(shu<<1);}
                             }
                                         }
          }
             if(ye>d2)
            {
               for(q=0;q<7;q++)
                   {
                        shu=shu|(shu>>1);
                       }
                    shuju();
                   ye--;
                    while(ye>d2) {shu=0xff,shuju(),ye--;}
                    if(ye==d2){
                                shu=0x80;
                                         if(shu>d1)
                              {
                            d5=shu;
                            d5=d5>>1;
                            while(d5!=d1)
                           {d5=d5>>1;shu=shu|(shu>>1);}
                               }
                                        }
         }
             }
           if(r!=0)
           {
            d1=d3;
            d2=d4;
            }
       shuju();
       if(lei!=0x7f)lei++;
           }
            }
            }












    ADC0808.c
    #define uchar unsigned char
    #define uchar unsigned char
    #define uint  unsigned int
    sbit START=P3^4;
    sbit OE=P3^6;
    sbit EOC=P3^5;
    uint AD;
    void adc()
    {
    START=1;
    START=0;
    while(EOC==0)
      {
      OE=1;
        }
       AD=P0;
           OE=0;
           }


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-4 08:32
  • 签到天数: 773 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-11-23 15:30:47 | 显示全部楼层
    支持一个,但图不清晰啊。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-6-12 21:59
  • 签到天数: 647 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-11-23 16:08:35 | 显示全部楼层
    louyj 发表于 2012-11-23 15:30
    支持一个,但图不清晰啊。

    图可以自己画的~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-5-28 19:02
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2012-11-23 18:05:41 | 显示全部楼层
    不写注释的坏毛病~~~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 08:58 , Processed in 0.150442 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.