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