找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2022|回复: 4
打印 上一主题 下一主题
收起左侧

一个关于TLC2543和C51单片机的数据采集问题

[复制链接]
跳转到指定楼层
楼主
仿真电路图如下,通道0的电压是1.00,通道1的电压是1.10,数码管前三位显示电压值,后一位显示通道号。正常情况下,数码管的显示应该是1.00.0,1.10.1,······这样子循环下去。可是第一次采集的数据是1.29?请问大佬们,这是什么原因呢?第二次采集的是1.00.1,数据也对应不上。下一轮开始,数据就变成正确的,1.00.0,1.10.1,1.00.0,1.10.1·······。请问各位大佬这是什么原因?怎么解决?


代码如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define addo (5.0/4096.0)
  4. #define LED_Data P2
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define ulong unsigned long
  8. #define LED_slect  P3

  9. sbit CLOCK=P1^3; /*2543时钟*/
  10. sbit D_IN=P1^1 ;/*2543输入*/
  11. sbit D_OUT=P1^0; /*2543输出*/
  12. sbit _CS=P1^2; /*2543片选*/
  13. sbit  LED1=P3^0;
  14. sbit  LED2=P3^1;
  15. sbit  LED3=P3^2;
  16. sbit  LED4=P3^3;
  17. sbit  dp=P3^5;
  18. static uchar dispdata[3];//3位显示读取的数据,1位显示通道号
  19. unsigned char code num[]={

  20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x3e
  21. };

  22. void delay(uchar n)
  23. {
  24.         uchar i;
  25.         for(i=0;i<n;i++)
  26.         {
  27.            _nop_();
  28.         }
  29. }

  30. uint read2543(uchar port)
  31. {
  32.         uint ad=0,i;
  33.         CLOCK=0;
  34.         _CS=0;
  35.         port<<=4;
  36.         for(i=0;i<12;i++)
  37.         {
  38.           if(D_OUT) ad|=0x01;
  39.           D_IN=(bit)(port&0x80);
  40.           CLOCK=1;
  41.           delay(3);
  42.           CLOCK=0;
  43.           delay(3);
  44.           port<<=1;
  45.           ad=ad<<1;
  46.         }
  47.         _CS=1;
  48.         ad>>=1;
  49.         return(ad);
  50.     delay(100);
  51. }    //port是通道号,根据通道号读取AD数据,并且发送出去

  52. void decodenum(float adv,uchar chn)
  53. {
  54.   ulong temp;
  55.   temp=((ulong)adv * 5000) / 4096;       //显示数字放大1000倍
  56.   temp=temp+10;
  57.   dispdata[0]=temp / 1000;                       //个位
  58.   dispdata[1]=(temp / 100) % 10;                 //小数点后1位
  59.   dispdata[2]=(temp / 10) % 10;                  //小数点后2位
  60.   dispdata[3]=chn;
  61. }     //adv是数据,chn是通道号,获取数据和通道号,赋予数组dispdata中元素值

  62. void select(uchar LED)
  63. {
  64.    switch(LED)
  65.       {
  66.          case 0:LED1=0;break;
  67.          case 1:LED2=0;break;
  68.          case 2:LED3=0;break;
  69.          case 3:LED4=0;break;
  70.          default: LED_slect=0xff;
  71.        }
  72. }

  73. void  dispone(uchar LED,bit ifpoint,uchar number)
  74. {
  75.          select(LED);
  76.        if(ifpoint)
  77.            dp=1;
  78.            else
  79.            dp=0;
  80.       LED_Data=num[number]|0x80;

  81.           delay(200);
  82.           LED_slect=0xff;
  83. }


  84. void disp()
  85. {
  86.    uchar i;
  87.    bit point;
  88.   for(i=0;i<4;i++)
  89.    {
  90.      if(i==1)
  91.       point=0;
  92.      else
  93.       point=1;
  94.      dispone(i,point,dispdata[i]);
  95.     }
  96.         }

  97. void main()
  98. {
  99.   uint cnt=0;
  100.   while(1)
  101.    {
  102.      switch(cnt++)
  103.       {
  104.         case 0:    decodenum(read2543(0),0);break;
  105.         case 70:   decodenum(read2543(1),1);break;
  106.         case 140:cnt=0;break;
  107.        }
  108.      disp();
  109.    }
  110. }      
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2020-4-5 12:25 | 只看该作者
先采后显示就对了,先显示后采,则是显示上次的采样值,看看是不是这个原因。(未细读你的程序)
回复

使用道具 举报

板凳
ID:722619 发表于 2020-4-5 15:37 | 只看该作者
yzwzfyz 发表于 2020-4-5 12:25
先采后显示就对了,先显示后采,则是显示上次的采样值,看看是不是这个原因。(未细读你的程序)

你好,我这里存在两个问题:一个是为什么会有1.29的电压值?我两个通道都没有这个值,而且是第一轮采集才出现这个值;第二个就是第一轮因为有这个1.29所以数据对应不上,但是从第二轮开始,数据就是正确的。如果是你说的这个原因,那么第二轮开始的怎么就对的上呢?
回复

使用道具 举报

地板
ID:123289 发表于 2020-4-11 11:48 | 只看该作者
因为第二轮,读到的是你第一轮的值,第一轮的采样命令是你下的,就对了。
回复

使用道具 举报

5#
ID:591189 发表于 2020-4-13 08:42 | 只看该作者
大佬的意思是你的程序在跑完初始化后先显示了一轮数再读取第一轮数据,所以你的正确的第一轮数据是第二遍才显示的,也就是你用的仿真不然第一遍显示会出现各种奇怪数据。把你的数据采样程序放到显示程序前就好了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表