AD转换与结果结果显示放入死循环 出问题了

henbane   2009-8-7 16:39 楼主
我把AD转换和结果显示放进一个while(1)的死循环,结果显示出现第一个数码管很亮,后面的数码管都很暗很暗,而且显示数值永远不变,如果不把AD转换函数和显示函数放进死循环,整个程序只进行一次AD转换一次显示就不会这样了,为什么?

我用的显示是移位寄存器和锁存器搭配起来的串行送显示码

void main(){
  void display(int *bcd);          //六位数码管显示的函数,
  long ADconvert();                //12位带返回值的AD转换函数

    DDRA=0XFF;
    DDRB=0XFF;
    DDRE=0XFF;
    long ADdata;
                      int  ADbcd[6]={0*6};        //六位显示码码
        
    display(ADbcd);              //显示零

          while(1)
    {

    ADdata=ADconvert();  //进行一次AD转换
   
    ADbcd[2]=ADdata/1000;            //将得到的AD转换数值拆成六位显示码
    ADdata=ADdata%1000;
    ADbcd[3]=ADdata/100;
    ADdata=ADdata%100;
    ADbcd[4]=ADdata/10;
    ADdata=ADdata%10;
    ADbcd[5]=ADdata;


    display(ADbcd);                      //进行显示,一个端口串行送数,用移位寄存器送片选码和显示码
                  }  

回复评论 (5)

AD需要时间的,查询方式需要插入等待时间.


要么,你显示的数字前面一位的值不变化,而后面的值变化很快


你应该检查一下你的子程序才对.
点赞  2009-8-7 23:24
以下是用STC12C5A32S2的AD转换过程,你看看吧

  1.                 ADC_RES = 0;
  2.                 ADC_RESL = 0;
  3.        
  4.                 TempIO=TempIO|7;                        //计算出要选则的IO口寄存器值
  5.                 TempIO=TempIO^(7-KeyIO);
  6.                
  7.                 KeyIO &= 0x07;                                //0000,0111 清0高5位
  8.                 ADC_CONTR = AD_SPEED;
  9.                 nop();
  10.                 ADC_CONTR |= KeyIO;                        //选择 A/D 当前通道
  11.                 nop();
  12.                 ADC_CONTR |= 0x80;                        //启动 A/D 电源
  13.                 delay(1);                       //使输入电压达到稳定
  14.                 ADC_CONTR |= 0x08;              //0000,1000 令 ADCS = 1, 启动A/D转换,
  15.             ReadOver = 0;
  16.                 while (ReadOver ==0 ){                        //等待A/D转换结束
  17.                 ReadOver = (ADC_CONTR & 0x10); //0001,0000 测试A/D转换结束否
  18.             }
  19.                 ADC_CONTR &= 0xE7;              //1111,0111 清 ADC_FLAG 位, 关闭A/D转换
  20.              return (ADC_RES);               //返回 A/D 高 8 位转换结果
点赞  2009-8-8 02:42
在循环里加入几毫秒的延时,在函数display(ADbcd)中每个数码管显示之间也要有延时。
点赞  2009-8-9 13:13
1、AD转换需要时间完成,既第二次AD和第一次AD之间要有足够间隔
2、数码管亮、暗和硬件有关系。检查电路电压是否足够,输出电流是否足够。
点赞  2009-8-10 12:03
我觉得是你显示驱动有问题。
你不要采样AD值,用一个延时逐步增加的变量,看显示是否正常。
点赞  2009-8-10 23:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复