找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机对adc0808/0809两路数据比较,程序有问题

[复制链接]
跳转到指定楼层
楼主
ID:949127 发表于 2021-7-7 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大佬们好,最近想做一个利用51单片机对adc0808/0809两路转换数据的比较,但是读完两路数据之后用if语句比较,发现不能实现功能,已经确认两路数据读取正确,求大佬赐教!
  1. #include<reg52.h>
  2. unsigned int i;
  3. unsigned int j;
  4. unsigned int getdata1;
  5. unsigned int getdata2;
  6. unsigned int temp;
  7. unsigned int temp1;
  8. unsigned int temp3[8];
  9. unsigned int temp4[8];
  10. unsigned int bj1;
  11. unsigned int bj2;
  12. sbit ST=P3^0;
  13. sbit OE=P3^1;
  14. sbit EOC=P3^2;
  15. sbit CLK=P3^3;
  16. sbit P17=P1^7;
  17. sbit P25=P2^5;
  18. sbit P26=P2^6;
  19. sbit P27=P2^7;
  20. void TimeInitial();
  21. void Delay(unsigned int i);
  22. void TimeInitial()
  23.     {
  24.          TMOD=0x10;
  25.          TH1=(65536-200)/256;
  26.          TL1=(65536-200)%256;
  27.          EA=1;
  28.          ET1=1;
  29.          TR1=1;
  30.     }

  31. void Delay(unsigned int i)
  32.     {
  33.          unsigned int j;
  34.          for(;i>0;i--)
  35.             {
  36.                 for(j=0;j<125;j++)
  37.                 {;}
  38.             }
  39.     }

  40. void shang()   //读取IN0口数据
  41. {
  42.        P25=P26=P27=0;         //设置读取IN0口
  43.                   ST=0;
  44.           OE=0;
  45.           ST=1;
  46.           ST=0;                                    
  47.           while(EOC==0);
  48.                   OE=1;
  49.                                   getdata1=P0;          //51 P0口接收数据
  50.                   OE=0;
  51.                                   temp=getdata1*1.96;
  52.                   temp3[0]=temp%10;           //计算个位数
  53.                                   temp3[1]=temp/10%10;          //计算十分位
  54.                                   temp3[2]=temp/100;        //计算百分位
  55.                                   bj1=temp3[2]+temp3[1]/10+temp3[0]/100;         //相加进行比较
  56. }

  57. void xia()          //读取IN1口数据
  58. {
  59.           ST=0;
  60.           OE=0;
  61.                   P25=1;P26=P27=0;                 //设置读取IN1口
  62.                   ST=1;
  63.           ST=0;                  
  64.                   while(EOC==0);
  65.                   OE=1;
  66.                                   getdata2=P0;                //51 P0口接收数据
  67.                   OE=0;
  68.                                   temp1=getdata2*1.96;
  69.                   temp4[0]=temp1%10;          //计算个位数
  70.                                   temp4[1]=temp1/10%10;          //计算十分位
  71.                                   temp4[2]=temp1/100;        //计算百分位
  72.                                   bj2=temp4[2]+temp4[1]/10+temp4[0]/100;         //相加进行比较
  73. }


  74. void main()
  75. {
  76.   
  77.   TimeInitial();
  78.   
  79.   while(1)
  80.        {
  81.          
  82.                   shang();
  83.                   xia();
  84.          
  85.                   if(bj1>bj2)                 //对两路数据比较
  86.                                   {
  87.                                         P17=0;                                
  88.                                 }
  89.         }
  90. }

  91. void t1(void) interrupt 3 using 0
  92. {
  93.   TH1=(65536-200)/256;
  94.   TL1=(65536-200)%256;
  95.   CLK=~CLK;
  96.   }
复制代码


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

使用道具 举报

沙发
ID:539024 发表于 2021-7-8 11:35 | 只看该作者
怎么不能实现功能,你可以把两次读出来的数值显示出来,或者通过串口发出来看看,再进行比较
回复

使用道具 举报

板凳
ID:949127 发表于 2021-7-8 11:42 | 只看该作者
1543330241 发表于 2021-7-8 11:35
怎么不能实现功能,你可以把两次读出来的数值显示出来,或者通过串口发出来看看,再进行比较

显示出来的数值没问题,但是比较的时候发现不行。。。比较出来的结果完全是错误的。。
回复

使用道具 举报

地板
ID:176854 发表于 2021-7-8 12:02 | 只看该作者
直接用temp1和temp2比较就可以了。而且bi1,bj2计算也不对。
bj1=temp3[2]*100+temp3[1]*10+temp3[0];
回复

使用道具 举报

5#
ID:94031 发表于 2021-7-8 13:38 | 只看该作者
先弄清楚比较的目的,由于干扰数据跳动很大,直接比较意义不大。
回复

使用道具 举报

6#
ID:949127 发表于 2021-7-8 13:51 | 只看该作者
jjjjjjir 发表于 2021-7-8 12:02
直接用temp1和temp2比较就可以了。而且bi1,bj2计算也不对。
bj1=temp3[2]*100+temp3[1]*10+temp3[0];

直接用temp1和temp2比较也是结果不太对。。
回复

使用道具 举报

7#
ID:949127 发表于 2021-7-8 13:54 | 只看该作者
xuyaqi 发表于 2021-7-8 13:38
先弄清楚比较的目的,由于干扰数据跳动很大,直接比较意义不大。

我打算通过比较两个电压的大小,来确定步进电机的正转反转,如果temp1>temp2,电机就正转,反之就反转,要怎么比较呢?
回复

使用道具 举报

8#
ID:176854 发表于 2021-7-8 16:31 | 只看该作者
lv5211314 发表于 2021-7-8 13:51
直接用temp1和temp2比较也是结果不太对。。

用getdata1,getdata2比较,这两个数据是没有经常处理。
如果还是不对,那就要检查读取的数据是否正确
回复

使用道具 举报

9#
ID:94031 发表于 2021-7-8 16:52 | 只看该作者
lv5211314 发表于 2021-7-8 13:54
我打算通过比较两个电压的大小,来确定步进电机的正转反转,如果temp1>temp2,电机就正转,反之就反转, ...

由于干扰,数据跳动很大,经过滤波再比较。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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