首页 > 用户发贴区 > 编程问题提问区 > 帮看一下这个程序那里出了问题?
2008
06-22

帮看一下这个程序那里出了问题?

#include <reg52.h>
#include <intrins.h>    //延时函数用
#define ad_con P2       //A/D控制口
#define addata P0         //A/D数据记入读入口
#define Disdata P1        //显示数据段码输出口
#define uchar unsigned char 
#define uint unsigned int
sbit ALE=P2^3;            //锁存地址控制位
sbit START=P2^4;             //启动一次转换位
sbit OE=P2^5;                //0809输出数据 控制位
sbit EOC=P3^7;                 //转换结束标志位
sbit DISX=Disdata^7;           //LED小数点
sbit A=P2^7;
sbit BO=P3^5;
sbit CO=P3^6;
//
//
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0×99,0×92,0×82,0xF8,0×80,0×90,0xff};
/*共阳7段LED段码表0.1.2.3.4.5.6.7.8.9.不亮*/
uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};                     //4位列扫描控制字
//11111110
//11111101
//11111011
//11110111
uchar data ad_data[8]={0×00,0×00,0×00,0×00,0×00,0×00,0×00,0×00};  //定义8个数据内存单元
uint data dis[5]={0×00,0×00,0×00,0×00,0×00};                      //定义4个显示数据单元和1个数据存储单元
//
//
/**********1ms延时子函数***********/
delaylms(uint t)    //t=1
 {
  uint i,j;
  for(i=0;i<t;i++)
   for(j=0;j<120;j++)
    ;
 }
//
//
/************显示扫描子函数***************/
scan()
 {
  uchar k,n;
  int h;
  dis[3]=0×01;               //通道初值为1
  for(n=0;n<8;n++)           //每次显示8个数据
   {
    dis[2]=ad_data[n]/51;  //测得值转换为3位BCD码,最大为5.00V
    dis[4]=ad_data[n]%51;  //余数暂存
    dis[4]=dis[4]*10;      //计算小数第一位
    dis[1]=dis[4]/51;     
    dis[4]=dis[4]%51;
    dis[4]=dis[4]*10;      //计算小数第二位
    dis[0]=dis[4]/51;
    if(dis[2]>=4&&dis[1]>6&&dis[0]>=0)
     A=1; 
    else  
     A=0;
    for(h=0;h<500;h++)         //每个通道显示时间控制约为一秒
     {
      for(k=0;k<4;k++)         //4位LED扫描控制
       {
        Disdata=dis_7[dis[k]];
        if(k==2)
         {
          DISX=0;
         }
        P3=scan_con[k];   //P3.O-P3.3控制四个数码管的输出 即控制输出电平的高低
        delaylms(1);
        P3=0xff;
       }  
     }
   dis[3]++;                 //通道值加1
   }
 }
//
//
/*************通道选择函数*********************/
tongdao(uint n)
  {
   uint m,i;
   dis[3]=n+1;
   dis[2]=ad_data[n]/51;  //测得值转换为3位BCD码,最大为5.00V
   dis[4]=ad_data[n]%51;  //余数暂存
   dis[4]=dis[4]*10;      //计算小数第一位
   dis[1]=dis[4]/51;     
   dis[4]=dis[4]%51;
   dis[4]=dis[4]*10;      //计算小数第二位
   dis[0]=dis[4]/51;
   if(dis[2]>=4&&dis[1]>6&&dis[0]>=0)
    A=1; 
   else
    A=0;
   for(m=0;m<500;m++)        //每个通道显示时间控制约为一秒
    {
     for(i=0;i<4;i++)         //4位LED扫描控制
      {
       Disdata=dis_7[dis[i]];
       if(i==2)
        {
         DISX=0;
        }
       P3=scan_con[i];   //P3.O-P3.3控制四个数码管的输出 即控制输出电平的高低
       delaylms(1);
       P3=0xff;
      }  
    }
  }
  /*************0809转换子函数*******************/
test()
 { 
  uchar m;
  uchar s=0×00;
  ad_con=s;
  for(m=0;m<8;m++)
   {
    ALE=1;
    _nop_();
    _nop_();
    ALE=0;    //转换通道地址锁存
    START=1;
    _nop_();
    _nop_();
    START=0; //开始转换命令
    _nop_();
    _nop_();
    _nop_();
    _nop_(); //延时4US
    while(EOC==0);                    //等待转换结束
    OE=1;
    ad_data[m]=addata;
    OE=0;
    s++;
    ad_con=s;  //取A/D值,地址加1
   }
  ad_con=0×00;//控制复位
 }
//
//
main()
 {
  uint n,i,j;
  n=0;
  P0=0xff;             //初始化窗口
  P1=0×00;
  P2=0xff;
  P3=0xff;
  i=BO;
    while()
   {
    test();             //测量转换一次
      if(i==0)
      for(;;)
      { j=CO;
       if(j==0)
        {
        n++;
         }
        tongdao(n);
           if(n>7)
          n=0;    
           if(i==0) break;       
       }   
         else
               {
              scan();       //显示八个通道值一次
               }
    }
 }
// 


留下一个回复