电压表的问题,请帮忙!


这是我做的一个仿真电压表,但是却不能显示, 可能是扫描的问题哦,但不知道怎样修改,请高手帮忙看下!先谢啦
源程序如下:    把仿真文件也贴上来了
#include <reg52.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};
unsigned char dispbuf[8]={10,10,10,10,0,0,0,0};
unsigned char dispcount;
unsigned char getdata;
unsigned int temp;
unsigned char i;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit CLK=P3^3;
void main(void)
{
ST=0;
OE=0;
ET0=1;
ET1=1;
EA=1;
TMOD=0x12;    //T1为定时器,工作在方式1;T0为计数器,工作在方式2
TH0=216;
TL0=216;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TR1=1;
TR0=1;
ST=1;
ST=0;          //开始转换
while(1)
  {
   if(EOC==1)
    {
     OE=1;
     getdata=P0;
     OE=0;
     temp=getdata*235;          //这个地方是否正确??
     temp=temp/128;
     i=5;
       dispbuf[0]=10;
       dispbuf[1]=10;
       dispbuf[2]=10;
       dispbuf[3]=10;
       dispbuf[4]=10;
       dispbuf[5]=0;
       dispbuf[6]=0;
       dispbuf[7]=0;
       while(temp/10)
           {
            dispbuf=temp%10;
            temp=temp/10;
            i++;
           }
            dispbuf=temp;
            ST=1;
            ST=0;
     }
  }
}
void t0(void) interrupt 1 using 0
{
  CLK=~CLK;
}
void t1(void) interrupt 3 using 0
{
  TH1=(65536-4000)/256;
  TL1=(65536-4000)%256;
  P1=dispcode[dispbuf[dispcount]];
  P2=dispbitcode[dispcount];
  if(dispcount==7)
   {
     P1=P1 | 0x80;
   }
    dispcount++;
  if(dispcount==8)
   {
     dispcount=0;
   }
}


[ 本帖最后由 wscsyyych 于 2008-7-31 12:55 编辑 ]

电压表.rar
(2008-07-24 18:00:00, Size: 29.6 KB, Downloads: 4)


我也来说两句 查看全部回复

最新回复

  • panhearii (2008-7-24 17:13:40)

    要人帮忙还收钱。。。。。你给回扣吗???
  • liaoguobao00 (2008-7-26 14:30:26)

    你是看到了某个网站上的AD转换程序吧,那程序我也看到了,我可以明确的告诉你,那程序太烦锁,且仿真还通不过,电路连接也有问题,我给你一个程序及仿真图,你自己去试下,我用是没问题的


    1.jpg


    #include <AT89X52.H>
    unsigned char code dispbitcode[]={0xfd,0xfb,0xf7,0xef};
    unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    //延时1ms子程序
    void delay1ms()
    {
    unsigned char a,b;
    for(a=0;a<110;a++)
    for (b=0;b<3;b++);
    }
    void main()
    {
    unsigned char temp1,temp2,temp3;
    unsigned int getdata;
    while(1)
       {//下面这句的意思是  MOV DPTR,#0xFEF0;   CLR A;   MOVX @DPTR,A;启动A/D转换
    *((unsigned char xdata*)0xfef0)=0;
        if(P3_0==1)//判断是否转换完成
        {
           getdata=P0;//完成后读出转换后的数据
           }
        temp3=getdata*5/255; //整数部分
        temp2=(getdata*5%255)*10/255; //小数点后第一位
    temp1=((getdata*5%255)*10%255)*10/255;//小数点后第二位
       if((((getdata*5%255)*10%255)*10%255)*10/255>=5)//四舍五入
        {
        temp1++;
        if(temp1==10)
        {
        temp1=0;
        temp2++;
        if(temp2==10)
           {
        temp2=0;
        temp3++;
        }
        }
        }
        ///////////////////在数码管上显示出来**********************
        P1=dispcode[temp3];
           P2=dispbitcode[3];
        delay1ms();
        P1=0;
           P1=0x40;
           P2=dispbitcode[2];
           delay1ms();
        P1=0;
        P1=dispcode[temp2];
           P2=dispbitcode[1];
        delay1ms();
           P1=0;
           P1=dispcode[temp1];
           P2=dispbitcode[0];
        delay1ms();
           P1=0;
       }
    }
  • liuliya21c (2008-7-27 13:27:52)

    好好学习%                                 
  • wscsyyych (2008-7-31 12:53:40)

    非常感谢liaoguobao00,谢谢帮助!
  • sunrain710 (2008-8-02 18:57:40)

    学习学习!!!!!!!!!!!!!!!!!!