3278|5

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

AD转换与结果结果显示放入死循环 出问题了 [复制链接]

我把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);                      //进行显示,一个端口串行送数,用移位寄存器送片选码和显示码
                  }  

最新回复

我觉得是你显示驱动有问题。 你不要采样AD值,用一个延时逐步增加的变量,看显示是否正常。  详情 回复 发表于 2009-8-10 23:43
点赞 关注

回复
举报

91

帖子

0

TA的资源

一粒金砂(初级)

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


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


你应该检查一下你的子程序才对.
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
以下是用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 位转换结果
复制代码
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
在循环里加入几毫秒的延时,在函数display(ADbcd)中每个数码管显示之间也要有延时。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
1、AD转换需要时间完成,既第二次AD和第一次AD之间要有足够间隔
2、数码管亮、暗和硬件有关系。检查电路电压是否足够,输出电流是否足够。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

6
 
我觉得是你显示驱动有问题。
你不要采样AD值,用一个延时逐步增加的变量,看显示是否正常。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表