|
仿真电路图如下,通道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·······。请问各位大佬这是什么原因?怎么解决?
代码如下:
- #include<reg51.h>
- #include <intrins.h>
- #define addo (5.0/4096.0)
- #define LED_Data P2
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- #define LED_slect P3
- sbit CLOCK=P1^3; /*2543时钟*/
- sbit D_IN=P1^1 ;/*2543输入*/
- sbit D_OUT=P1^0; /*2543输出*/
- sbit _CS=P1^2; /*2543片选*/
- sbit LED1=P3^0;
- sbit LED2=P3^1;
- sbit LED3=P3^2;
- sbit LED4=P3^3;
- sbit dp=P3^5;
- static uchar dispdata[3];//3位显示读取的数据,1位显示通道号
- unsigned char code num[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x3e
- };
- void delay(uchar n)
- {
- uchar i;
- for(i=0;i<n;i++)
- {
- _nop_();
- }
- }
- uint read2543(uchar port)
- {
- uint ad=0,i;
- CLOCK=0;
- _CS=0;
- port<<=4;
- for(i=0;i<12;i++)
- {
- if(D_OUT) ad|=0x01;
- D_IN=(bit)(port&0x80);
- CLOCK=1;
- delay(3);
- CLOCK=0;
- delay(3);
- port<<=1;
- ad=ad<<1;
- }
- _CS=1;
- ad>>=1;
- return(ad);
- delay(100);
- } //port是通道号,根据通道号读取AD数据,并且发送出去
- void decodenum(float adv,uchar chn)
- {
- ulong temp;
- temp=((ulong)adv * 5000) / 4096; //显示数字放大1000倍
- temp=temp+10;
- dispdata[0]=temp / 1000; //个位
- dispdata[1]=(temp / 100) % 10; //小数点后1位
- dispdata[2]=(temp / 10) % 10; //小数点后2位
- dispdata[3]=chn;
- } //adv是数据,chn是通道号,获取数据和通道号,赋予数组dispdata中元素值
- void select(uchar LED)
- {
- switch(LED)
- {
- case 0:LED1=0;break;
- case 1:LED2=0;break;
- case 2:LED3=0;break;
- case 3:LED4=0;break;
- default: LED_slect=0xff;
- }
- }
- void dispone(uchar LED,bit ifpoint,uchar number)
- {
- select(LED);
- if(ifpoint)
- dp=1;
- else
- dp=0;
- LED_Data=num[number]|0x80;
- delay(200);
- LED_slect=0xff;
- }
- void disp()
- {
- uchar i;
- bit point;
- for(i=0;i<4;i++)
- {
- if(i==1)
- point=0;
- else
- point=1;
- dispone(i,point,dispdata[i]);
- }
- }
- void main()
- {
- uint cnt=0;
- while(1)
- {
- switch(cnt++)
- {
- case 0: decodenum(read2543(0),0);break;
- case 70: decodenum(read2543(1),1);break;
- case 140:cnt=0;break;
- }
- disp();
- }
- }
复制代码
|
|