大家帮忙看个程序(一个数字电压表的)
我用12mhz的晶振,但数码管显示不正常(乱码),当我把晶振设得很小[color=#FF0000][/color]时,才能正常显示电压的值,说明adc0808工作正常,但数码管显示是一位一位的平移,我把数码管的延时时间设长一些,数数码管显示正常了,但显示的数值却又不对了,我怀疑是显示单元出了问题,可是找不出来,我把代码贴出了:
#include<stdlib.h>#include<stdio.h>#include<reg51.h>unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; //位显unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00};//图形显,共阴极,从0到9,最后是熄灭符unsigned char dispbuf[8]={0,0,0,10,10,10,10,10};unsigned int dispcount=0;unsigned char getdata; //存放ad转换的结果unsigned int temp;//存放具体物理量的值unsigned char i;unsigned char x,y;void delay();sbit st=P3^0; //启动下一次ad转换的信号sbit oe=P3^1; //使得转换结果输出的控制信号sbit eoc=P3^2;//是否在转换sbit clk=P3^3;//时钟断void main(){ st=0; oe=0; ET0=1; ET1=1; EA=1; TMOD=0x02; TH0=236;//用于时钟脉冲 TL0=236; TR0=1;//启动t0,t1 st=1;//下降沿 st=0; while(1) { if(eoc==1)//表示转换结束 { oe=1; //输出结果 getdata=P0;//获取数据,(可能有错) oe=0;//封锁输出 temp=getdata *250; temp=temp/128; i=0; dispbuf[0]=0;//初始化位0 dispbuf[1]=0; dispbuf[2]=0; dispbuf[3]=10; dispbuf[4]=10;//存放熄灭符 dispbuf[5]=10; dispbuf[6]=10; dispbuf[7]=10; while(temp/10) { dispbuf[i]=temp%10; temp=temp/10; i++; } dispbuf[i]=temp; st=1; st=0; } while(1) //循环显示,总共三位 { P1=dispcode[dispbuf[dispcount]];//显示具体的图形,其中用dispbuf[]表示型符 P2=dispbitcode[dispcount];//控制显示的位 delay(); //延时 if(dispcount==2)//控制小数点的显示,本例中,最高位小数点常亮 { P1=P1|0x80; dispcount=0; break;//到了第三位,跳出循环 } dispcount++; } }} void t0() interrupt 1 //时钟程序 { clk=~clk; } void delay() { for(x=10000;x>0;x--) ; }