首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

大家帮忙看个程序(一个数字电压表的)解决方法

2012-05-14 
大家帮忙看个程序(一个数字电压表的)我用12mhz的晶振,但数码管显示不正常(乱码),当我把晶振设得很小[color

大家帮忙看个程序(一个数字电压表的)
我用12mhz的晶振,但数码管显示不正常(乱码),当我把晶振设得很小[color=#FF0000][/color]时,才能正常显示电压的值,说明adc0808工作正常,但数码管显示是一位一位的平移,我把数码管的延时时间设长一些,数数码管显示正常了,但显示的数值却又不对了,我怀疑是显示单元出了问题,可是找不出来,我把代码贴出了:

C/C++ code
#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--)  ;                  }


[解决办法]
你的0808的时钟是又T0产生的?你的ad采样只能采样一次呀!!你说数值不对应该这个有问题!采样要不停的采样,你可以放到定时器1里面采样。
[解决办法]
检查一下ADC0808的CLK信号来源,这个信号的频率不能高。
[解决办法]

热点排行