|
请大家帮忙看看这个程序,目的是实现多路数据采集,采集温度,传感器为铂电阻,将采集到的温度经过处理然后显示在数码管上,现在的问题是数码管显示有点不正常,在硬件上上电显示的是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() ;//显示采集的数据
}
}
|
|