永发信息网

adc0832电压测量 0-15v 四位数码管显示 小数精确到两位 哪位大虾知道下面这段主程序是如何处理显示结果的小数精度的问题,以及在读出ad芯片的结果时,为何读了两次,小弟在此先感谢了!

答案:2  悬赏:30  手机版
解决时间 2021-04-24 10:04

以下是主程序和相关子程序

#include<AT89X51.h>
#include<intrins.h>
#include<ADC08322.h>
unsigned char code LED[]={ 0xC0,  //"0"
                0xF9,  //"1"
                0xA4,  //"2"
                0xB0,  //"3"
                0x99,  //"4"
                0x92,  //"5"
                0x82,  //"6"
                0xF8,  //"7"
                0x80,  //"8"
                0x90,  //"9"
    0xFF};
unsigned char dis[4]={0xFF,0x40,0xC0,0xC0};
unsigned char sflag=0xFE,k=0;
unsigned char  tem[60];
unsigned char AVVolt()
{
    unsigned char i,j,temp;
 unsigned int n=0;
 for(i=0;i<60;i++)
   for(j=i+1;j<60;j++)
     {   
     if(tem[i]<tem[j])
           {
        temp=tem[i];
     tem[i]=tem[j];
     tem[j]=temp;
     }
  }
 for(i=25;i<35;i++)
   n=n+tem[i];
    return (n/10);

}

void delay(unsigned int t)
{
   while(--t);
}
void initTimer(void)
{
    TMOD=0x1;
    TH0=0xfc;
    TL0=0x18;
    EA=1;
    TR0=1;
    ET0=1;
}

 

void main ()
{   
 unsigned char i,temp;
 unsigned int U,V;
 float T;
 initTimer();
 while(1)
 {
       for(i=0;i<60;i++)
      tem[i]=adc0832(0x10)/256;
    temp=AVVolt();    
    T=temp*15/256;    
    U=(int)T;     
    V=(T-U)*100;    
    dis[3]=LED[V%10];
    dis[2]=LED[V/10];
    dis[1]=LED[U%10]&0x7F;
    if(U/10==0)
  dis[0]=LED[10];
    else
     dis[0]=LED[U/10];
   delay(50000);

 }
}
void timer0(void) interrupt 1
{
    TH0=0xfc;
    TL0=0x18;
    P2=0xFF;
 P0=dis[k];
 P2=sflag;
 sflag=_crol_(sflag,1);
 
 if(++k==5)
    {
  k=0;
  sflag=0xFE;
 }


}

 

以下是adc0832的头文件

#include<AT89X51.h>

#define uchar unsigned char
#define uint  unsigned int

sbit spi_cs = P1^0;
sbit spi_clk= P1^1;
sbit spi_io = P1^2;

void spiStart()       
{
    spi_clk = 0;       //说明当开始位为1,0时 为“1” 、 “0”时,只对 CH0 进行单通道转换。
    spi_io = 1;        // 当 开始位为“1” 、 “1”时,只对 CH1进行单通道转换。当 开始位为“0” 、
    _nop_();       // “0”时,将 CH0作为正输入端 IN+,CH1作为负输入端 IN-进行输入。当开始位
    spi_cs = 0;       // 为“0” 、 “1”时,将 CH0作为负输入端 IN-,CH1 作为正输入端 IN+进行输入
    _nop_(); _nop_();
}

void spiEnd()                                      
{
    spi_cs = 1;    
    spi_io = 1;
    spi_clk = 1;
    _nop_(); _nop_();
}

void spiSend(uchar op)
{
    uchar i,om;
 if(op==0x00) om=4;
 if(op==0x01) om=5;
 if(op==0x10) om=6;   
 if(op==0x11) om=7;
    om = om<<5;
    for( i=0 ; i<3 ; i++ )
    {
        spi_io = om&0x80;
        spi_clk = 1;
        _nop_();
        spi_clk = 0;
        om = om<<1;
    }
    spi_io = 1;
}

uint adc0832(uchar channel)     //注:channel等于 0x00为双通道模式,且CH0为正输入端 IN+,CH1为负输入端 IN-

           //              0x01为双通道模式,且CH1为正输入端 IN+,CH0为负输入端 IN-
    uchar i,ndat=0;        //               0x10为只对 CH0 进行单通道转换。
    uint dat=0;      //              0x11为只对 CH1 进行单通道转换。
  EA=0;
    spiStart();
    spiSend(channel);
    _nop_();
    if( spi_io )
        return 0;
    spi_io = 1;
    for( i=0 ; i<8 ; i++ )
    {
        spi_clk = 1; _nop_();
        spi_clk = 0; _nop_();
        dat = dat<<1;
        if( spi_io )
            dat |= 0x0100;
    }
    for( i=0 ; i<8 ; i++ )
    {
        spi_clk = 1; _nop_();
        spi_clk = 0; _nop_();
        ndat = ndat>>1;
        if( spi_io )
            ndat |= 0x80;
    }
    spiEnd();
    dat += ndat;
 EA=1;
    return dat;
}

最佳答案
看不懂 是撒啊
全部回答
 你看这里 T=temp*15/256;     U=(int)T;     V=(T-U)*100; 也就是说,T为真实电压值,而U为真实电压值的整数部分,T-U就是小数部分了。V=(T-U)*100把小数部分扩大了100倍,然后用处理整数的方法 dis[3]=LED[V%10]; dis[2]=LED[V/10]; 把十分位,百分位提取出来了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
中国现在最高的人是不是2.32米
战队宣传语我们战队叫 巨石★Ayers
没有情人的情人节我该怎么过?
QQ飞车的手机网址是多少?
为什么我会在乎那么多
本人欲求MP4要求价格便宜质量好且能在伊宁市
dnf里邪龙卡多多少钱??
张艺兴喜欢吃什么零食,张艺兴的生活习惯
为什么我的服务器Windos防火墙打不开,提示的
鑫卓越v668外壳 价钱
我想要几首古诗词适合做民族风饰品的文案,例
庞记宜兴斋怎么去啊,有知道地址的么
求两首歌的名字
在大学里应该谈恋爱吗?
梦见自己摘栀子花 好不好呢
推荐资讯
实况足球是里面绿荫传奇怎么获得技能
什么游戏最无聊?
问道从八十级代练到一百一十级要多少钱,另外
怎样可以看出一个人的心情是好是坏呢!
相思啊在见、有这首歌曲么?
宝鸡市陈仓区人口和计划生育服务中心地址有知
我的好友要结婚,送什么礼物好啊
脾虚吃什么药
怎样能专心的学习不受外界的干扰
谁能邀请我去QQ牧场?邀请成功的才给分啊
溢樽香茶业(泗达茶行)我想知道这个在什么地方
十一号青岛去西安的火车票多吗?价钱多少?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?