本帖最后由 Nyx影 于 2017-5-11 20:50 编辑
[size=13.3333px] AD574A AT89C52单片机 19264液晶屏 来实现输入信号波形显示[size=13.3333px]proteus仿真不成功 请问前辈们,程序错在了哪里。单片机完全无法驱动AD #include <absacc.h> #include <math.h> #include <reg51.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() 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; } } 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).
|