2944|2

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

多路数据采集程序问题 [复制链接]

请大家帮忙看看这个程序,目的是实现多路数据采集,采集温度,传感器为铂电阻,将采集到的温度经过处理然后显示在数码管上,现在的问题是数码管显示有点不正常,在硬件上上电显示的是1888,但是仿真显示的是1000.还有帮忙看看2543AD转换的程序是否正确。拜谢!!
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int

//引脚定义.       
//ADC转换.通道0为差值电压.通道1为标准店主电压.
//SPI信号:外接ADC转换芯片TLC2543.
sbit SPI_SCK        = P1^1;                                                //SPI:SCK. 即TLC2543的时钟.
sbit SPI_MISO        = P1^3;                                                //SPI:MISO.即TLC2543的数据输出.
sbit SPI_MOSI        = P1^2;                                                //SPI:MOSI.即TLC2543的数据输入.
sbit SPI_CS_N        = P1^4;                                                //SPI:SPI_CS_N.  即TLC2543片选.

sbit AD_EOC                = P1^0;                                                //TLC2543转换完成后的标志位输出.

//全局变量
uint Temp;//ad转化的值
uchar seg[10] = {0x5f,0x44,0x9d,0xd5,0xc6,0xd3,0xdb,0x45,0xdf,0xd7};//共阴数码管码表
uchar Pos[4] = {0xef,0xdf,0xbf,0x7f};
uchar key_value = 1 ;//按键值
uchar key_state = 1 ;//按键状态值

sbit  key = P3^3;

static const unsigned char AdChannelSelect[]=
{
        0x00,                                                                        //AD Channel 00 select.
        0x10,                                                                        //AD Channel 01 select.
        0x20,                                                                        //AD Channel 02 select.
        0x30,                                                                        //AD Channel 03 select.
        0x40,                                                                        //AD Channel 04 select.
        0x50,                                                                        //AD Channel 05 select.
        0x60,                                                                        //AD Channel 06 select.
        0x70,                                                                        //AD Channel 07 select.
        0x80,                                                                        //AD Channel 08 select.
        0x90,                                                                        //AD Channel 09 select.
        0xA0,                                                                        //AD Channel 10 select.
};

//延时函数
void delay()
{
        uchar t1;
        for(t1 =0;t1<200;t1++)
        ;
}
//数码管显示函数
void ad_show()
{
        //uchar i,shift ,temp;
        //shift = 0x10;
        uint temp;
        uint k=0,i=0;

        temp = Temp;
       
        for(i=0;i<3;i++)//int 转换为 字符类型
        {
            k = temp%10;
                temp=temp/10;
                P0 = seg[k] ;
                P2 = Pos[3-i];   
                delay();
                P2 = 0xff;         
        }
       
        P0 =seg[key_value] ; //显示当前是第几个传感器
        P2 = P2 & 0xef ;//最高位为1
        delay();
        P2 = 0xff;
}
//通道选择函数
void choice_T()   //选通函数
{
        P2 = P2|0x0f;
        P2 = P2 & (key_value); //只改变低四位
}


////////////////////////////////////////////
//要修改的值是 ad_data;

//TLC2543的DataIn的高8位控制字格式如下.
//D7 D6 D5 D4        D3 D2                         D1                                 D0
//通道选择                数据长度选择        前导选择                单双极性选择
//0000-AIN0                00-12Bits                0-MSB First                0-Unipolar
//0001-AIN1                01-8Bits                1-LSB First                1-Bipolar
//        ...                        10-12Bits
//1010-AIN10        11-16Bits
//----------------------------------------------------------------------
//本系统采用16Bits、MSB First、Unipolar模式.
//sbit SPI_SCK        = P1^2;                                                //SPI:SCK. 即TLC2543的时钟.
//sbit SPI_MISO        = P1^4;                                                //SPI:MISO.即TLC2543的数据输出.
//sbit SPI_MOSI        = P1^3;                                                //SPI:MOSI.即TLC2543的数据输入.
//sbit SPI_CS_N        = P1^4;                                                //SPI:SPI_CS_N.  即TLC2543片选.
//sbit AD_EOC                = P1^1;                                                //TLC2543转换完成后的标志位输出.

//---------------------------------------------------------------------
uint Read2543_data(uchar num)//读取AD转化值
{

        unsigned int din;
        unsigned char dout;
        unsigned char i;

        din = 0;
        dout = AdChannelSelect[num];                //选择控制命令.
       
        for( i = 0; i < 120; i++ );         //120个时钟,实际测量约为1mS.   
       
        SPI_SCK        = 0;                                                        //TLC2543的时钟.
        SPI_CS_N = 0;

        for(i=0;i<12;i++)                                               
        {
                if(dout&0x80)                                                //控制命令从MSB-LSB,向AD发数.
                {
                        SPI_MOSI = 1;       
                }
                else
                {
                        SPI_MOSI = 0;
                }
       
                SPI_SCK        = 1;                                                   //对TLC2543输出一个时钟(上升沿有效).
                dout <<= 1;                                                        //准备下一次输出.

                din <<= 1;                                                        //准备接收输入数据.
                if( SPI_MISO==1 )                                         //接收AD数据,从MSB-LSB.
                {
                        din |= 0x0001;
                }

                SPI_SCK        = 0;
        }                                                                                 //End for(i=0;i<16;i++).
       
        SPI_CS_N = 1;                                                        //转换结束,取消片选.
        din <<= 1;
        return  din;                                                //9位精度.               
}

//////////////////////////////////////
//电压转化为温度函数
void ad_datadeal()
{
        uint ad_data1 ,ad_data2;
        ad_data1 =        Read2543_data(0); //电压差
        ad_data2 =        Read2543_data(1) ;
        //转化公式
        Temp = 260*ad_data1 /ad_data2 - 260 ;

}

////////////////////////////////////////////
//按键扫描函数
void key_scan()
{
        //if(key_state)
//        {
                if(key == 0)
                {
                        delay();
                        if(key == 0)
                        {
                        key_value ++ ;
                        if(key_value == 5)
                        {
                         key_value = 1;
                        }
                        //        key_state = 0;
                        key_value = key_value%5;
                        while(key == 0)  ad_show();
                        }
                }
//        }
//        else
//        {
//                if(P3^3 == 1)
//                key_state =  1;       
//                else
//                key_state = 0 ;
//        }
}

//初始化函数
void INT_Function()
{
        key_value = 1;                //通道选择为第一路
        Temp= 0x00 ;        //温度初始值为0,显示也为0
}
///主函数
void main()
{

        INT_Function();
        while(1)
        {
                key_scan();//按键扫描函数
                choice_T();//选通道

                ad_datadeal();//读取AD转化值
                ad_show() ;//显示采集的数据
        }
}

最新回复

数码管显示不正常,是你采集的数据不正常还是就单单因为显示部分造成的不正常呢?先确定采集部分正常不,,,  详情 回复 发表于 2010-5-22 13:05
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看真实的,别看仿真的。。。
只能帮顶,问题面太广。。。
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
数码管显示不正常,是你采集的数据不正常还是就单单因为显示部分造成的不正常呢?先确定采集部分正常不,,,
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表