我STC12C5A60S2芯片的P1口接收ADC0832芯片反馈回来的数字信号,不知道为什么总是在LCD上显示不出来,同样的程序我用stc89C52芯片反而能显示出来。我知道本芯片的P1口本身有AD转换功能,但由于电路设计原因,我这里只需要其作为单片机普通的I/O就足够了,问题是,收不到数据,还是收到显示不出?是不是芯片内部周期太快了,AD没返回数据?还是什么问题呀???跪求请教?????大侠呀!!!!!!!以下是所写的程序#include<reg52.h>//用LCD1602显示AD转换#define uint unsigned int#define uchar unsigned char//sbit en=P2^4;//使能//sbit rs=P2^2;//数据命令//sbit rw=P2^3;//读写sbit en=P2^5;//使能sbit rs=P2^3;//数据命令sbit rw=P2^4;//读写//sbit cs=P1^4;//AD三个IO口//sbit clk=P1^5;//sbit DI=P1^6;//sbit DO=P1^6;sbit cs=P1^4;sbit clk=P1^5;sbit DI=P1^6;sbit DO=P1^6;sbit guanmin=P1^7;sbit deng1=P2^6;uchar code table1[]="shu zhi=:";uchar code table2[]="mo ni =:";uchar code table3[]=".";void delay(uint z)//时间延迟函数{ uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);}void write_com(uchar com)//led1602写指令、命令初始化函数{ rs=0; P0=com; delay(5); en=1; delay(5); en=0;}void write_datae(uchar datae)//led1602写数据初始化函数{ rs=1; P0=datae; delay(5); en=1; delay(5); en=0;}void init_LCD()//初始化LCD{ en=0; rw=0; write_com(0x38);//显示模式控制 write_com(0x0c);//显示开关及光标控制 write_com(0x06);//数据指针设置 write_com(0x01);//清零 write_com(0x80);}uint init_AD()//初始化并读出AD的数{ uint a=0; uint b=0; uint i; cs = 1;//关掉AD; clk = 0; DI = 0; cs = 0;//开启芯片 DI = 1;//开始位 clk = 0; clk = 1; DI = 1;//并分/单通道 clk =0; clk = 1; DI= 0;//通道选择位 clk = 0; clk = 1; DI = 1;//空闲位 clk = 0; clk = 1; //读取数据 for(i=0;i<8;i++)//读第一次数据 { clk=1; clk=0; if(DI) a|= 0x80 >> i; } for(i=0;i<8;i++)//读第一次数据 { if(DI) b|= 0x01 << i; clk=1; clk=0; } cs=1; if(a==b)//两次数据校验 return a; else return 0;}void write_AD(uchar add,uchar num){ write_com(0x80+add); write_datae(0x30+num); }void main(){ uint d6=0,d5=0,d4=0,d2=0,d1=0,d0=0,j=0,k=0,n=0,i=0; uint m=0; init_LCD(); while(1) { if(guanmin==1) { write_com(0x80+14); write_datae(0x30+1); } else { write_com(0x80+14); write_datae(0x30+0); } m=init_AD(); d6=m/100; d5=m/10%10; d4=m%10; n=m*1.0*5*100/255; d2=n/100; d1=n/10%10; d0=n%10; write_com(0x80+0x40); for(i=0;i<9;i++) { write_datae(table1[i]); } write_AD(9+0x40,d6); write_AD(10+0x40,d5); write_AD(11+0x40,d4); write_com(0x80); for(j=0;j<8;j++) { write_datae(table2[j]); } write_com(0x80+0x09); write_datae(table3[k]); write_AD(8,d2); write_AD(10,d1); write_AD(11,d0); }} |