基于51单片机数字示波器的设计 波形电路仿真单片机无反应的问题
时间:10-02
整理:3721RD
点击:
我是采用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;
}
}
#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;
}
}
原理图
/*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();
}
}
caiyangdata 后面有 [ i ] 新人不知为何变成了斜体并没有了 i