找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4933|回復(fù): 7
收起左側(cè)

基于51單片機(jī)數(shù)字示波器的設(shè)計(jì) 波形電路

[復(fù)制鏈接]
ID:199666 發(fā)表于 2017-5-11 19:05 | 顯示全部樓層 |閱讀模式
本帖最后由 Nyx影 于 2017-5-11 20:50 編輯

[size=13.3333px] AD574A AT89C52單片機(jī) 19264液晶屏 來(lái)實(shí)現(xiàn)輸入信號(hào)波形顯示[size=13.3333px]proteus仿真不成功 請(qǐng)問(wèn)前輩們,程序錯(cuò)在了哪里。單片機(jī)完全無(wú)法驅(qū)動(dòng)AD
#include <absacc.h>
#include <math.h>
#include <reg51.h>
sfr AUXR=0x8e    ;        /*允許讀寫STC89C52RD+片內(nèi)擴(kuò)展RAM*/
sfr AUXR1=0xa2    ;
char xdata caiyangdata[200] ;         /*采樣值存儲(chǔ)變量,數(shù)組,相鄰兩
                                  個(gè)存儲(chǔ)一個(gè)12位的采樣值,
                                  前為高8位,后為低四位*/

char xdata Vin[100];                 /*采樣點(diǎn)處輸入信號(hào)的電壓值*/

int gao4,zhong4,di4,di8;
float dv;
int COM,DAT;               /*COM為液晶顯示的代碼入口地址,
                                               DAT為數(shù)據(jù)入口地址*/
int b,n,p,d;
int i,j;
sbit C3=P2^5;                  /*右屏片選*/
sbit C2=P2^4;                   /*中屏片選*/
sbit C1=P2^3;                    /*左屏片選*/
sbit E=P2^2;                      /*使能信號(hào)線*/
sbit RW=P2^1;                    /*讀寫信號(hào)線*/
sbit RS=P2^0;                    /*寄存器選擇信號(hào)線*/

sbit CS=P2^7;
sbit A0=P2^6;
sbit RC=P3^4;
sbit CEWR=P3^6;
sbit CERD=P3^7;


void chushiint0()  ;      /*初始化INT0程序*/
void caiyang();                 /*采樣子程序*/
void zhongduanint0();          /*INT0中斷服務(wù)程序*/
void AD574A();               /*啟動(dòng)AD574A*/
void gao4ANDdi8();               /*采樣值高四位和低八位分離子程序*/
void DAC();               /*數(shù)字值到模擬值轉(zhuǎn)換 */

void yejingxianshi();         /*液晶顯示子程序*/
void chushiyejing();        /*液晶顯示初始設(shè)置子程序*/
void wrtDDRAM();
void prcode();      /*寫指令代碼子程序*/
void prcwdata();    /*寫顯示數(shù)據(jù)子程序*/
void prcrdata();     /*讀顯示數(shù)據(jù)子程序*/
void pbusy();        /*判忙子程序*/


void main()
{
chushiint0();              /*調(diào)用初始化INT0程序*/
AD574A();                     /*啟動(dòng)AD574A*/
caiyang();                     /*調(diào)采樣子程序*/
gao4ANDdi8();                        /*采樣值高四位和低八位分
                                        離子程序,數(shù)字值到模擬值轉(zhuǎn)換*/
yejingxianshi();                   /*調(diào)液晶顯示程序*/
}

void chushiint0()
{
IT0=1;
EX0=1;
EA=1;
}

/*ad啟動(dòng)*/
void AD574A()
{
AUXR=0X01;
CEWR=0;
CERD=0;
CS=0;
A0=0;
RC=0;
}

/*ad采樣*/
void caiyang()
{
for(i;i<200;)
{
if(IE0==1)                       /*采用中斷查詢方式*/
{
zhongduanint0();
}
}
}
                 
/*ad讀取AD采樣值*/
void INT0() interrupt 0 using 1
{
CEWR=0;                 /*讀取A/D轉(zhuǎn)換值高8位*/
CERD=0;
CS=0;
A0=0;
RC=1;
caiyangdata=P0;
i++;
CEWR=0;                 /*讀取A/D轉(zhuǎn)換值高4位*/
CERD=0;
CS=0;
A0=1;
RC=1;
caiyangdata=P0;           /*讀取低4位*/
i++;
}
void gao4ANDdi8()                        /*采樣值高四位和低八位分離子程序*/
{
for(i=0,j=0;i<200,j<100;i+2,j++)
{
gao4= caiyangdata&0xf0;
gao4=gao4 >> 4;
zhong4=caiyangdata&0x0f;
zhong4=zhong4 << 4;
di4=caiyangdata[i+1] >> 4;
di8=zhong4+di4;
DAC();
}
}
        
void DAC()            /*數(shù)字值到模擬值轉(zhuǎn)換 */
{
int VFS=10;
Vin[j]=((gao4*256+di8)/2048-1)*VFS/2 ;
}
void yejingxianshi()                    /*調(diào)液晶顯示程序*/
{
chushiyejing();
for(j=0;j<100;j++)
{
dv=5.0/60.0;           /*相鄰兩行的電壓差*/
n=62-Vin[j]/dv;       /*顯示點(diǎn)所在行數(shù)*/
p=n/8;              /*顯示點(diǎn)所在頁(yè)數(shù)*/
b=n%8;          /*顯示點(diǎn)在第P頁(yè)的第J個(gè)單元的第B位*/
d=1;                 /*第P頁(yè)第J個(gè)單元的值*/
i=B;
for(i;i>0;i--)
{
d*=2;
}
wrtDDRAM();
}
}
void chushiyejing()      /*液晶顯示設(shè)置*/
{
C1=1;               /*左區(qū)設(shè)置*/
C2=0;
C3=0;
COM=0xc0;           /*設(shè)置顯示起始行為第一行*/
prcode();
COM=0x3f;            /*開(kāi)顯示設(shè)置*/
prcode();
COM=0x40;            /*列地址設(shè)置為0*/
prcode();
C1=0;               /*中區(qū)設(shè)置*/
C2=1;
C3=0;
COM=0xc0;
prcode();
COM=0x3f;
prcode();
COM=0x40;
prcode();
}
void  wrtDDRAM()
{
if(j<64)
{
C1=1;               /*左區(qū)顯示數(shù)據(jù)寫入*/
C2=0;
C3=0;
COM=P||0xb8  ;        /*或頁(yè)面地址*/
prcode();
DAT=d;
prcwdata();          /*寫入待顯示數(shù)據(jù)*/
}
else if((j>64)&&(j<100))
{
C1=0;               /*右區(qū)顯示數(shù)據(jù)寫入*/
C2=1;
C3=0;
COM=P||0xb8;          /*或頁(yè)面地址*/
prcode();
DAT=d;
prcwdata();          /*寫入待顯示數(shù)據(jù)*/
}
}
void prcode()    /*寫指令代碼子程序*/
{
pbusy();
RW=0;
P1=COM;                  /*寫指令代碼*/
E=1;
E=0;
}
void prcwdata()    /*寫顯示數(shù)據(jù)子程序*/
{
pbusy();
RS=1;
RW=0;
P1=DAT;
E=1;
E=0;
}
void prcrdata()     /*讀顯示數(shù)據(jù)子程序*/
{
pbusy();
RS=1;
P1=0xff;
E=1;
DAT=P1;
E=0;
}
void pbusy()
{RW=1;
while(ACC^7)        /*判“忙“標(biāo)志為0否,否再讀*/
{
P1=0xff;
E=1;
ACC=P1;
E=0;
}
}
Rebuild target 'Target 1'
assembling STARTUP.A51...
compiling boxing.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?PRCRDATA?BOXING
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  ZHONGDUANINT0
    MODULE:  boxing.obj (BOXING)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  ZHONGDUANINT0
    MODULE:  boxing.obj (BOXING)
    ADDRESS: 0D68H
Program Size: data=37.0 xdata=300 code=1517
creating hex file from "boxing"...

"boxing" - 0 Error(s), 3 Warning(s).

QQ圖片20170511190220.png
回復(fù)

使用道具 舉報(bào)

ID:199877 發(fā)表于 2017-5-12 10:59 | 顯示全部樓層
#include<reg52.h>
#include<intrins.h>//循環(huán)函數(shù)的頭文件
#define uint unsigned int
#define uchar unsigned char
uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//從低位往高位移一個(gè)燈
uchar code table1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//從高位往低位移一個(gè)燈
uchar code table2[]={0xfe,0xfa,0xf8,0xf0,0xe0,0xa0,0x80,0x00};//從低位到高位逐步全部點(diǎn)亮
uchar code table3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};//從高位到低位逐步全部點(diǎn)亮
uchar code table4[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};//從低位到高位逐步全部熄滅
uchar code table5[]={0x80,0xa0,0xe0,0xf0,0xf8,0xfa,0xfe,0xff};//從高位到低位逐步全部熄滅
uchar code table6[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//從低位到高位,滅一個(gè)燈移動(dòng)
uchar code table7[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//從高位到低位,滅一個(gè)燈移動(dòng)

uchar i;

void delay(uint z) //延時(shí)函數(shù)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=314;y>0;y--);
}
///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
void deng123()//
{
                for(i=0;i<8;i++)
        {
                P2=table1[i];
                P0=table1[i];
                delay(25);
        }
}
/***********************************************
************************************************/
void deng0()//所有燈亮一會(huì)兒
{
        P0=0x00;P1=0x00;P2=0x00;P3=0x00;
        delay(150);
}
/////////////////////////////////
void deng0_1()//所有燈滅一會(huì)兒
{
        P0=0xff;P1=0xff;P2=0xff;P3=0xff;
        delay(150);
}
//////////////////////////////////////
void deng1()//兩列燈順時(shí)針旋轉(zhuǎn)2遍,然后逐漸降低
{         
          uchar c;
          P1=0x00;P3=0x00;
         
         for(c=2;c>0;c--)
         {
                 deng123();
         }
         ////////////////

        P1=0x03;
        deng123();
        /////////////////               
        P1=0x0f;
        deng123();
        ////////////////
        P1=0x3f;
        deng123();
        ///////////////
        P1=0xff;
        deng123();
        ////////////////////////
        P3=0x03;
        deng123();
        //////////////
        P3=0x0f;
        deng123();
        //////////////
        P3=0x3f;
        deng123();
        /////////////
        P3=0xff;
        deng123();
        P2=0xff;P0=0xff;
               
}

///////////////////////////////////////////////

  void deng2()//四列燈順時(shí)針旋轉(zhuǎn)2遍
{         
          uchar a;
         uchar b;
         b=0x77;
         P2=b;
         P0=b;
         P1=0x00;P3=0x00;
        for(a=4;a>0;a--)
         {
                  for(i=0;i<8;i++)
        {
                b=_cror_(b,1);//循環(huán)左移
                delay(25);
                P2=b;
                P0=b;
        }
         }               
        
        P2=0xff;P0=0xff;P1=0xff;P3=0xff;
               
}
//////////////////////////////////////////////
void deng3()//單層,向上升
{
         P0=0x00;
        P2=0x00;
               
        for(i=0;i<8;i++)
         {
                  P3=table1[i];
                 delay(25);
         }
        P3=0xff;
/*----------------------*/         
         for(i=0;i<8;i++)
         {
                  P1=table1[i];
                 delay(25);
         }
        P1=0xff;
}
/////////////////////////////////////////
void deng4()//單層,向下降
{         
         P2=0x00;P0=0x00;
         for(i=0;i<8;i++)
        {
                P1=table0[i];
                delay(25);
        }
        P1=0xff;
/*----------------------*/
        for(i=0;i<8;i++)
        {
                P3=table0[i];
                delay(25);
        }
        P3=0xff;P1=0xff;P0=0xff;P2=0xff;        
}
/////////////////////////////////////////
void deng5()//從上到下,逐層全部點(diǎn)亮】
{
         P0=0x00;P2=0x00;
        for(i=0;i<8;i++)
        {
                P1=table2[i];
                delay(25);
        }
        for(i=0;i<8;i++)
        {
                P3=table2[i];
                delay(25);
        }
        P0=0xff;P1=0xff;P2=0xff;P3=0xff;
}
////////////////////////////////////////
void deng6()//從上到下,逐層全部熄滅】
{
         P0=0x00;P2=0x00;
        P1=0x00;P3=0x00;
        for(i=0;i<8;i++)
        {
                P1=table4[i];
                delay(25);
        }
        P1=0xff;
        for(i=0;i<8;i++)
        {
                P3=table4[i];
                delay(25);
        }
        P3=0xff;
        P0=0xff;P2=0xff;
}
///////////////////////////////////

void deng7()//四組燈,交替兩次
{
        for(i=2;i>0;i--)
        {
                P1=0x00;P2=0x00;//上左
                delay(40);
                P1=0xff;P2=0xff;
                delay(40);
        
               
        /////////////
        P3=0x00;P0=0x00;//下右
                delay(40);
                P3=0xff;P0=0xff;
                delay(40);
        /////////////
        P3=0x00;P2=0x00;//下左
                delay(40);
                P3=0xff;P2=0xff;
                delay(40);
        /////////////
                P1=0x00;P0=0x00;//上右
                delay(40);
                P1=0xff;P0=0xff;
                delay(40);
          }
               
}
void deng8()//上半先逐步列點(diǎn)亮,然后再向下點(diǎn)點(diǎn)亮
{
        P0=0xff;P2=0xff;P3=0xff;
        P1=0x00;
        for(i=0;i<8;i++)
        {
                P0=table3[i];
            P2=table3[i];
                delay(25);        
        }
         delay(70);
        P1=0x00;P2=0x00;P0=0x00;
        for(i=0;i<8;i++)
        {
                P3=table2[i];
                delay(25);
        }

        
}
//////////////////////////////////////
void deng9()//從中間向上、下點(diǎn)亮,再熄滅
{
        P0=0x00;P2=0x00;
        for(i=0;i<8;i++)
        {
                P1=table3[i];
                P3=table2[i];
                delay(25);
        }
        for(i=0;i<8;i++)
        {
                P1=table4[i];
                P3=table5[i];
                delay(25);
        }
}
///////////////////////////////////////////
void deng10()//從中間向上、下熄滅
{
        P0=0x00;P2=0x00;
        for(i=0;i<8;i++)
        {
                P1=table5[i];
                P3=table4[i];
                delay(25);
        }
        P1=0xff;P3=0xff;

}
void deng11()//逆時(shí)針逐列點(diǎn)亮所有燈
{
        P1=0x00;P3=0x00;
        P0=0xff;P2=0xff;
        for(i=0;i<8;i++)
        {
                P0=table2[i];
                delay(25);
        }
        for(i=0;i<8;i++)
        {
                P2=table2[i];
                delay(25);
        }
        P0=0xff;P2=0xff;P3=0xff;P1=0xff;
}
///////////////////////////////////////////
void deng12()//閃爍
{
        uchar i;
         uchar b;
         b=0xaa;
         P2=b;
         P0=b;
         P1=b;
         P3=b;
        
         for(i=0;i<8;i++)
        {
                b=_cror_(b,1);//循環(huán)左移
                delay(50);
                P2=b;
                P0=b;
                P1=b;
                P3=b;
        
        }
        P0=0xff;P1=0xff;P2=0xff;P3=0xff;
}
void deng13()//兩層燈,分別從中間向上、下移動(dòng)
{
        P2=0x00;P0=0x00;
        for(i=0;i<8;i++)
        {
                P1=table1[i];
                P3=table0[i];
                delay(25);
        }
        P2=0xff;P0=0xff;P1=0xff;P3=0xff;
}
void deng14_1()//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
{        
        P2=0xff;P0=0xff;

        for(i=0;i<8;i++)
        {
                P2=table2[i];
                delay(15);
        }
         
        for(i=0;i<8;i++)
        {
                P0=table2[i];
                delay(15);
        }
         P2=0xff;P0=0xff;
}
///////////////////////////
void deng14()//從下開(kāi)始,點(diǎn)滿一圈后,滅,再上升點(diǎn)亮第二圈
{
        P1=0xff;

        P3=0x7f;//1層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P3=0xbf;//2層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P3=0xdf;//3層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P3=0xef;//4層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P3=0xf7;//5層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P3=0xfb;//6層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P3=0xfd;//7層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P3=0xfe;//8層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        //////////////////
        P3=0xff;

        P1=0x7f;//1層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P1=0xbf;//2層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P1=0xdf;//3層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P1=0xef;//4層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P1=0xf7;//5層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P1=0xfb;//6層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P1=0xfd;//7層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)
        P1=0xfe;//8層
        deng14_1();//點(diǎn)滿一圈的小函數(shù)(限內(nèi)部用)

        P1=0xff;
}

/*====================================================
===================主函數(shù)君===========================
======================================================*/        
void main()
{
        while(1)
        {  
            
        deng0_1();//所有燈滅一會(huì)兒
        deng0_1();//所有燈滅一會(huì)兒        
        deng14();//從下開(kāi)始,點(diǎn)滿一圈后,滅,再上升點(diǎn)亮第二圈        
        deng4();//單層,向下降
        
        deng5();//從上到下,逐層全部點(diǎn)亮
        deng6();//從上到下,逐層全部熄滅】
        deng8();//上半先逐步點(diǎn)亮,然后再向下點(diǎn)亮
        deng0();//所有燈亮一會(huì)

        deng6();//從上到下,逐層全部熄滅】
        deng9();//從中間向上、下點(diǎn)亮,再熄滅
        deng9();//從中間向上、下點(diǎn)亮,再熄滅
        deng0_1();//所有燈滅一會(huì)兒
        deng11();//逆時(shí)針逐列點(diǎn)亮所有燈
        deng10();//從中間向上、下熄滅
        deng0_1();//所有燈滅一會(huì)兒
        deng13();//兩層燈,分別從中間向上、下移動(dòng)
        deng3();//單層,向上升
        deng5();//從上到下,逐層全部點(diǎn)亮
        deng12();//閃爍
        deng12();//閃爍
        deng2();//四列燈順時(shí)針旋轉(zhuǎn)2遍
        deng1();//兩列燈順時(shí)針旋轉(zhuǎn)2遍,然后逐漸降低
        deng0_1();//所有燈滅一會(huì)兒        
        }
}
回復(fù)

使用道具 舉報(bào)

ID:162136 發(fā)表于 2017-5-12 11:35 | 顯示全部樓層
之前想過(guò)用51做示波器,看了我又想起來(lái)了。
回復(fù)

使用道具 舉報(bào)

ID:199666 發(fā)表于 2017-5-12 13:20 | 顯示全部樓層
666562323 發(fā)表于 2017-5-12 10:59
#include
#include//循環(huán)函數(shù)的頭文件
#define uint unsigned int

您好。。這個(gè)和我的有關(guān)系么~如果我沒(méi)猜錯(cuò)的話,前面看出來(lái)這是點(diǎn)亮數(shù)碼管的程序吧~
回復(fù)

使用道具 舉報(bào)

ID:189987 發(fā)表于 2017-5-12 15:04 | 顯示全部樓層
雖然很長(zhǎng) 但也看完了
回復(fù)

使用道具 舉報(bào)

ID:199666 發(fā)表于 2017-5-12 17:43 | 顯示全部樓層
經(jīng)過(guò)修改,最后發(fā)現(xiàn)      void prcrdata() 函數(shù) 沒(méi)有被程序調(diào)用。。。請(qǐng)問(wèn)前輩們,這個(gè)函數(shù)應(yīng)該插入到哪里呢?
回復(fù)

使用道具 舉報(bào)

ID:191024 發(fā)表于 2017-5-12 21:39 | 顯示全部樓層
很好,做得借鑒。
回復(fù)

使用道具 舉報(bào)

ID:199666 發(fā)表于 2017-5-13 15:40 | 顯示全部樓層
sad,沒(méi)有一個(gè)人解答 。。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表