www.openedv.com
您好,欢迎您!    会员注册 | 登入 
公告:欢迎访问www.openedv.com开源电子网,开源共享共同进步,祝您新年快乐,万事如意!
设为首页 | 加入收藏
论坛首页 » AVR单片机 前往: 
我的AVR资料[程序篇]角度传感器T103驱动源码(源码27)
发表人 内容
[Down] [Up]
[楼主位] 正点原子


等级:NO
注册时间:
2010/12/02 10:41
文章: 8090
来自: 湖南
在线

很贵的一个传感器,源码如下: 
#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
 PORTA=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++;
    }   
}




我的淘宝小店:http://shop62103354.taobao.com
[加为好友] 回复 引用回复
[Down] [Up]
[1楼] lixupeng

等级:NO
注册时间:
2011/04/07 18:53
文章: 100
来自: 河北
离线

100多啊mark


[加为好友] 回复 引用回复
 
前往: 

Powered by ALIENTEK工作室 © 粤ICP备12000418号-1