#include<thermocouple.h>
#include<stc15.h>
#include<stdio.h>
#include<intrins.h>
sbit Max31856_CS= P1^2;
sbit Max31856_SDO=P1^3;
sbit Max31856_SDI=P1^4;
sbit Max31856_CLK=P1^5;
long WenDu_Dat;
uint WenDu;
uchar WenDu_Time,Error;
void Max31856_Delay700ms() //@24.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 183;
j = 100;
k = 225;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Max31856_Delay()
{
_nop_();
_nop_();
_nop_();
}
void Max31856_WriteByte(uchar Add,Dat)
{
uchar i;
Max31856_CLK=1;
Max31856_CS=0;
Max31856_Delay();
for(i=0;i<8;i++)
{
Max31856_CLK=0;
Max31856_Delay();
Add<<=1;
Max31856_SDO=CY;
Max31856_Delay();
Max31856_CLK=1;
Max31856_Delay();
}
for(i=0;i<8;i++)
{
Max31856_CLK=0;
Max31856_Delay();
Dat<<=1;
Max31856_SDO=CY;
Max31856_Delay();
Max31856_CLK=1;
Max31856_Delay();
}
Max31856_CS=1;
}
uchar Max31856_ReadByte(uchar Add)
{
uchar i,Dat;
Max31856_CLK=1;
Max31856_CS=0;
Max31856_Delay();
for(i=0;i<8;i++)
{
Max31856_CLK=0;
Max31856_Delay();
Add<<=1;
Max31856_SDO=CY;
Max31856_Delay();
Max31856_CLK=1;
Max31856_Delay();
}
for(i=0;i<8;i++)
{
Max31856_CLK=0;
Max31856_Delay();
Dat<<=1;
Dat|=Max31856_SDI;
Max31856_CLK=1;
Max31856_Delay();
}
Max31856_CS=1;
return Dat;
}
void Max31856_ReadTemp()
{
uchar i,Add;
Max31856_CLK=1;
Max31856_CS=0;
Max31856_Delay();
Add=0x0c;
for(i=0;i<8;i++)
{
Max31856_CLK=0;
Max31856_Delay();
Add<<=1;
Max31856_SDO=CY;
Max31856_Delay();
Max31856_CLK=1;
Max31856_Delay();
}
for(i=0;i<24;i++)
{
Max31856_CLK=0;
Max31856_Delay();
WenDu_Dat<<=1;
WenDu_Dat|=Max31856_SDI;
Max31856_CLK=1;
Max31856_Delay();
}
Max31856_CS=1;
WenDu=WenDu_Dat*Hot+0.5;
}
void Max31856_Read_Error()
{
Error=Max31856_ReadByte(SR_Read);
if(CJ_Range)
{
printf("热电偶超出正常工作范围\n");
}
if(OVUV)
{
printf("热电偶过压或欠压\n");
}
while(CJ_Open) //如果热电偶断开了,就一直等待热电偶连接
{
printf("热电偶已经断开\n");
Max31856_Delay700ms(); //等待温度转换完成
Error=Max31856_ReadByte(SR_Read); //读取故障寄存器
}
}
void Max31856_Init()
{
Max31856_WriteByte(CR1_Write,(AVGSEL&TC_Type_K)); //CR1寄存器16位采样,K型热电偶
Max31856_WriteByte(MASK_Write,MASK_Set); //屏蔽所有故障输出
Max31856_WriteByte(0x81,0x48); //开启转换
Max31856_Delay700ms(); //等待温度转换完成
}
我用读寄存器数据完全正常,只要对哪个寄存器写数据,那个寄存器的数据就会变成0,就好像把数据给他写成0了一样,但是读数据的时候,先写地址,再读数据,也是正常的。哪位大神9命,难道是芯片有问题吗?写不了数据, |