微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > ADC0804 数码管显示数据错误 请指正

ADC0804 数码管显示数据错误 请指正

时间:10-02 整理:3721RD 点击:

  1. /*
  2. 将 ADC0804 的输出变量显示在数码管上
  3. */
  4. #include<reg52.h>
  5. #include<intrins.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. uchar code table[]={
  9. 0x3f,0x06,0x5b,0x4f,
  10. 0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,
  12. 0x39,0x5e,0x79,0x71};
  13. sbit dula=P2^6;
  14. sbit wela=P2^7;
  15. sbit wr=P3^6;
  16. sbit rd=P3^7;
  17. uchar num;
  18. void delayms(uint z)
  19. {
  20.   uint x;
  21.   while(z--)
  22.   {
  23.     for(x=110;x>0;x--);
  24.   }
  25. }

  26. void display(uchar aa,uchar bb,uchar cc)
  27. {
  28.   wela=1;
  29.   P0=0xfe;
  30.   wela=0;
  31.   P0=0xff;
  32.   dula=1;
  33.   P0=table[aa];
  34.   dula=0;
  35.   delayms(3);

  36.   wela=1;
  37.   P0=0xfd;
  38.   wela=0;
  39.   P0=0xff;
  40.   dula=1;
  41.   P0=table[bb];
  42.   dula=0;
  43.   delayms(3);

  44.   wela=1;
  45.   P0=0xfb;
  46.   wela=0;
  47.   P0=0xff;
  48.   dula=1;
  49.   P0=table[cc];
  50.   dula=0;
  51.   delayms(3);
  52. }

  53. void displayNum(uchar num)
  54. {
  55.   uchar aa,bb,cc;
  56.   aa=num/100;
  57.   bb=num%100/10;
  58.   cc=num%10;
  59.   display(aa,bb,cc);
  60. }
  61. void init()
  62. {
  63.   num=0;

  64.   //cs set 0
  65.   wela=1;
  66.   P0=0x7f;
  67.   wela=0;  
  68. }
  69. void getData()
  70. {
  71.   //start conversion
  72.   wr=1;
  73.   wr=0;
  74.   wr=1;
  75.   delayms(10);

  76.   //output  
  77.   P1=0xff;//读取之前写入全1
  78.   rd=0;
  79.   delayms(2); //ns数量级 可以不考虑吧
  80.   num=P1;
  81.   rd=1;
  82.   delayms(2); //ns数量级 可以不考虑吧
  83.   //P1=num;
  84.   //delayms(10);
  85. }
  86. void main()
  87. {
  88.   init();
  89.   while(1)
  90.   {
  91.         displayNum(num);
  92.         getData();
  93.   }
  94. }

复制代码



void main()
{
  uchar temp;
  init();
  while(1)
  {
    //for(temp=15;temp>0;temp--)//延长AD转换时间
      //displayNum(num);
        getData();
  }
}
主函数换成以上代码,调节电位器,P1可以获取数据。
void main()
{
  uchar temp;
  init();
  while(1)
  {
    for(temp=255;temp>0;temp--)//延长AD转换时间
            displayNum(temp);
        //getData();
  }
}
主函数换成以上代码,数码管可以准确动态的显示数据
void main()
{
  init();
  while(1)
  {
        displayNum(num);
        getData();
  }
}
换成这个代码后,P1为0xff,数码管显示255,请问哪里有错误。
另外,getData中的P1=0xff,换成什么,数码管就显示什么数据。

读取时间延时太短,数据尚未读入

  1. /*
  2. 将 ADC0804 的输出变量显示在数码管上
  3. */
  4. #include<reg52.h>
  5. #include<intrins.h>
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. uchar code table[]={
  9. 0x3f,0x06,0x5b,0x4f,
  10. 0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,
  12. 0x39,0x5e,0x79,0x71};
  13. sbit dula=P2^6;
  14. sbit wela=P2^7;
  15. sbit wr=P3^6;
  16. sbit rd=P3^7;
  17. uchar num;
  18. void delayms(uint z)
  19. {
  20.   uint x;
  21.   while(z--)
  22.   {
  23.     for(x=110;x>0;x--);
  24.   }
  25. }

  26. void display(uchar aa,uchar bb,uchar cc)
  27. {
  28.   wela=1;
  29.   P0=0x7e;
  30.   wela=0;
  31.   P0=0xff;
  32.   dula=1;
  33.   P0=table[aa];
  34.   dula=0;
  35.   delayms(2);

  36.   wela=1;
  37.   P0=0x7d;
  38.   wela=0;
  39.   P0=0xff;
  40.   dula=1;
  41.   P0=table[bb];
  42.   dula=0;
  43.   delayms(2);

  44.   wela=1;
  45.   P0=0x7b;
  46.   wela=0;
  47.   P0=0xff;
  48.   dula=1;
  49.   P0=table[cc];
  50.   dula=0;
  51.   delayms(2);
  52. }


  53. void displayNum(uchar num)
  54. {
  55.   uchar aa,bb,cc;
  56.   aa=num/100;
  57.   bb=num%100/10;
  58.   cc=num%10;
  59.   display(aa,bb,cc);
  60. }
  61. void init()
  62. {
  63.   num=0;

  64.   //cs set 0
  65.   wela=1;
  66.   P0=0x7f;
  67.   wela=0;  
  68. }
  69. void getData()
  70. {
  71.   //start conversion
  72.   wr=1;
  73.   wr=0;
  74.   wr=1;
  75.   delayms(2);

  76.   //output  
  77.   rd=0;
  78.   delayms(2);
  79.   num=P1;
  80.   rd=1;
  81.   delayms(2);
  82. }
  83. void main()
  84. {
  85.   init();
  86.   while(1)
  87.   {       
  88.     getData();
  89.     displayNum(num);
  90.   }
  91. }

复制代码


更正的地方:display()函数中的P0的赋值予以修改
仍存在的问题:三位数码管中的百十位数码管亮度大约为个位亮度的60%,仍不知道原因

把你程序中数据输出部分的延时换成um级的,你的延时时间太少,延长一下即可(通常用_nop_()做延时)效果比较好

请问,um级是什么意思,百度没有找到,你这里指的是不是us级的时间呢?
本人不是电子专业的,只是想从计算机转入此行,有很多基础不会,还望指教。
_nop_()表示空循环一个机器指令的时间,12M中表示1us;6M中表示2us;24M中表示0.5us(微妙)
1S=1000ms=1000 000us;

是的,不小心打错了...

上一篇:关于数字时钟。
下一篇:8051单片机请教

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top