本帖最后由 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).
|