很贵的一个传感器,源码如下:
#include <mega16.h>
#include <delay.h>
#include <math.h>
#define DOT PORTA.7
//T103接口定义
#define SCK PORTB.0
#define MISO PINB.2
#define MOSI PORTB.3
#define CS PORTB.5
//命令
#define SET 0X00//测量模式设定
#define READT 0X08//读取温度数值
#define STX 0X0E//自测试X
#define STY 0X0F//自测试Y
#define READX 0X10//读取X方向数值
/*--------------开始SPI数据传输---------------*/
void Start() //SPI开始
{
SCK=0;
CS=1;//CS下降沿开始SPI
MOSI=0;
CS=0;
}
/*--------------写一个字节到T103----------------
参数:要写的命令
返回值:无
------------------------------------------------*/
void Write_T103_Byte(unsigned char num) //SPI写数据
{
unsigned char count=0;
Start();
for(count=0;count<8;count++)
{
MOSI=num&0x80;//写入命令
num<<=1;
SCK=0; //上升沿有效
SCK=1;
}
}
/*-------------从T103读出一个数据---------------
参数:无
返回值:T103的数据 0~2047
------------------------------------------------*/
uint Read_T103_Data() //SPI 读数据
{
uchar count=0;
uint Num=0;
for(count=0;count<11;count++)
{
Num<<=1;
SCK=1; //下降沿有效
SCK=0;
Num+=MISO;//读取数值
}
return(Num);
}
/*-------------T103初始化程序------------*/
void T103_Init(void)
{
Write_T103_Byte(0x00);//初始化
CS=1;
}
/*--------------------读T103--------------------
参数:0x08:读温度,0x10:读角度
返回值:角度(rad)或者温度(C)
------------------------------------------------*/
float Read_T103(uchar order)
{
uint data;
delay_us(150); //等待延时
Write_T103_Byte(order);//写命令
data=Read_T103_Data(); //读取数据
CS=1;
if(order==0x08) //温度
{
data>>=3;
return (197-(float)data)*1000/1083;//返回温度值(C)
}
else //角度
{
return asin(((float)data-1024)/1638);//返回角度值(rad)
}
}
void display(unsigned char number,unsigned char position)//digtial show function
{
DDRA=0Xff;//set PORTA output
  ORTA=0XFF;//set PORTA output in high level
switch(position)//choice the position
{
case 1:{PORTA&=0xf8;break;}
case 2:{PORTA&=0xf9;break;}
case 3:{PORTA&=0Xfa;break;}
case 4:{PORTA&=0Xfb;break;}
case 5:{PORTA&=0Xfc;break;}
case 6:{PORTA&=0Xfd;break;}
case 7:{PORTA&=0Xfe;break;}
case 8:{PORTA&=0Xff;break;}
}
switch(number)//show number
{
case 0:{PORTA&=0x87;break;} //0
case 1:{PORTA&=0x8f;break;} //1
case 2:{PORTA&=0x97;break;} //2
case 3:{PORTA&=0x9f;break;} //3
case 4:{PORTA&=0xa7;break;} //4
case 5:{PORTA&=0xaf;break;} //5
case 6:{PORTA&=0xb7;break;} //6
case 7:{PORTA&=0xbf;break;} //7
case 8:{PORTA&=0xc7;break;} //8
case 9:{PORTA&=0xcf;break;} //9
default:{PORTA=0xff;break;} //null
}
}
void main()
{
uchar t;
uint Msb=0;
float temp=0;
DDRA=0XFF;
DDRB=0XFB;
PORTB=0X00;
T103_Init();//初始化T103
while(1)
{
if(t==20)
{
temp=Read_T103(0x10);
temp=temp*180/3.14159;//把弧度转换为角度
if(temp<0)temp=-temp;
Msb=temp*1000;
t=0;
}
else delay_ms(1);
display(Msb%10,8);delay_ms(2);
display((Msb/10)%10,7);delay_ms(2);
display((Msb/100)%10,6);delay_ms(2);
display((Msb/1000)%10,5);DOT=0;delay_ms(2);
DOT=1;
display((Msb/10000)%10,4);delay_ms(1);
t++;
}
} |