基于51单片机数字示波器的设计 波形电路仿真单片机无反应的问题

2019-07-15 10:50发布

我是采用AD574A AT89C52单片机 19264液晶屏 来实现输入信号波形显示。KEIL测试通过,但是有3个warning,proteus仿真不成功 请问前辈们,程序错在了哪里。单片机完全没有运行的反应#include <absacc.h>#include <math.h>
#include <reg52.h>
sfr AUXR=0x8e    ;        /*允许读写STC89C52RD+片内扩展RAM*/
sfr AUXR1=0xa2    ;
char xdata caiyangdata[200] ;         /*采样值存储变量,数组,相邻两
                                  个存储一个12位的采样值,
                                  前为高8位,后为低四位*/


char xdata Vin[100];                 /*采样点处输入信号的电压值*/


int gao4,zhong4,di4,di8;
float dv;
int COM,DAT;               /*COM为液晶显示的代码入口地址,
                             DAT为数据入口地址*/
int b,n,p,d;
int i,j;
sbit C3=P2^5;                  /*右屏片选*/
sbit C2=P2^4;                   /*中屏片选*/
sbit C1=P2^3;                    /*左屏片选*/
sbit E=P2^2;                      /*使能信号线*/
sbit RW=P2^1;                    /*读写信号线*/
sbit RS=P2^0;                    /*寄存器选择信号线*/


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中断服务程序*/
void AD574A();               /*启动AD574A*/
void gao4ANDdi8();               /*采样值高四位和低八位分离子程序*/
void DAC();               /*数字值到模拟值转换 */


void yejingxianshi();         /*液晶显示子程序*/
void chushiyejing();        /*液晶显示初始设置子程序*/
void wrtDDRAM();
void prcode();      /*写指令代码子程序*/
void prcwdata();    /*写显示数据子程序*/
void prcrdata();     /*读显示数据子程序*/
void pbusy();        /*判忙子程序*/




void main()
{
chushiint0();              /*调用初始化INT0程序*/
AD574A();                     /*启动AD574A*/
caiyang();                     /*调采样子程序*/
gao4ANDdi8();                        /*采样值高四位和低八位分
                                        离子程序,数字值到模拟值转换*/
yejingxianshi();                   /*调液晶显示程序*/
}


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


/*ad启动*/
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_int() interrupt 0 using 1
{
CEWR=0;                 /*读取A/D转换值高8位*/
CERD=0;
CS=0;
A0=0;
RC=1;
caiyangdata=P0;
i++;
CEWR=0;                 /*读取A/D转换值高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()            /*数字值到模拟值转换 */
{
int VFS=10;
Vin[j]=((gao4*256+di8)/2048-1)*VFS/2 ;
}


void yejingxianshi()                    /*调液晶显示程序*/
{
chushiyejing();
for(j=0;j<100;j++)
{
dv=5.0/60.0;           /*相邻两行的电压差*/
n=62-Vin[j]/dv;       /*显示点所在行数*/
p=n/8;              /*显示点所在页数*/
b=n%8;          /*显示点在第P页的第J个单元的第B位*/
d=1;                 /*第P页第J个单元的值*/
i=B;
for(i;i>0;i--)
{
d*=2;
}
wrtDDRAM();
}


}






void chushiyejing()      /*液晶显示设置*/
{
C1=1;               /*左区设置*/
C2=0;
C3=0;
COM=0xc0;           /*设置显示起始行为第一行*/
prcode();
COM=0x3f;            /*开显示设置*/
prcode();
COM=0x40;            /*列地址设置为0*/
prcode();
C1=0;               /*中区设置*/
C2=1;
C3=0;
COM=0xc0;
prcode();
COM=0x3f;
prcode();
COM=0x40;
prcode();
}
void  wrtDDRAM()
{
if(j<64)
{
C1=1;               /*左区显示数据写入*/
C2=0;
C3=0;
COM=P||0xb8  ;        /*或页面地址*/
prcode();
DAT=d;
prcwdata();          /*写入待显示数据*/
}
else if((j>64)&&(j<100))
{
C1=0;               /*右区显示数据写入*/
C2=1;
C3=0;
COM=P||0xb8;          /*或页面地址*/
prcode();
DAT=d;
prcwdata();          /*写入待显示数据*/
}
}


void prcode()    /*写指令代码子程序*/
{
pbusy();
RW=0;
P1=COM;                  /*写指令代码*/
E=1;
E=0;
}


void prcwdata()    /*写显示数据子程序*/
{
pbusy();
RS=1;
RW=0;
P1=DAT;
E=1;
E=0;
}


void prcrdata()     /*读显示数据子程序*/


{
pbusy();
RS=1;
P1=0xff;
E=1;
DAT=P1;
E=0;
}


void pbusy()
{RW=1;
while(ACC^7)        /*判“忙“标志为0否,否再读*/
{
P1=0xff;
E=1;
ACC=P1;
E=0;
}
}


原理图 原理图
0条回答

一周热门 更多>