资讯详情

使用c8051f005通过SPI读取SCA100T角度值的程序

c8051f005读取SCA100T之程序,SCA100T仍是VI测量范围为角度传感器 具体数据见90~-90度PDF

//spi.h
unsigned int SPI_ReadBits(ucharn); void SPI_WriteByte(ucharwdata); void SPI_Start( void ); void SPI_Stop( void ); void SPI_Reset( void ); void SPI_Delay(unsigned char );unsigned int SPI_GetX( void );unsigned int SPI_GetY( void ); void SPI_Init( void ); #define MEAS0x00 // 测量模式 #define RWTR0x08 // 读写温度数据寄存器 #define STX0x0E // x通道自检 #define STY0x0F // Y通道自检 #define RDAX0x10 // 读X通道加速度值 #define RDAY0x11 // 读Y通道加速度值 sbitCLK = P0 ^ 7 ;sbitMISO = P1 ^ 0 ;sbitMOSI = P1 ^ 1 ;sbitCSB = P1 ^ 2 ;

// spi.c #include  < c8051f000.h > #include  " defs_c51_manio.h " #include  " spi.h " void  SPI_Stop(  void  ){     CLK  =  LOW;    CSB  =  HIGH;        SPI_Delay( 10 );} void  SPI_Reset( void ){     SPI_Stop();} void  SPI_Delay(uchar n){      while (n -- );} void  SPI_Start( void ){     CLK  =  LOW;    CSB  =  LOW;    SPI_Delay( 10 );} // 主机写一个BYTE到器件 // 最终状态:CLK = LOW void  SPI_WriteByte( uchar wdata ){     uchar i;     for ( i  =   0  ; i  <   8  ;  ++ i ){         CLK  =  LOW;        SPI_Delay( 10 );        MOSI  =  wdata  &   0x80 ;        wdata  =  wdata  <<   1 ;        SPI_Delay( 10 );        CLK  =  HIGH;        SPI_Delay( 10 );    }    CLK  =  LOW;} /* //主机读入一个比特//结束状态: CLK=0bit SPI_ReadBit(void){     CLK = HIGH;    SPI_Delay(10);    CLK = LOW;    SPI_Delay(10);    return MISO;} */ // 主机读入N个比特 // n 限制为16及其以下 // 结束状态 CLK = 0 uint  SPI_ReadBits( uchar n ){      uint  rtemp,i;    MISO  =   1 ;     for ( i  =   0  ; i  <  n ;  ++ i ){         rtemp  <<=   1     ;        SPI_Delay( 10 );         if ( MISO  ==   1  ){             rtemp  |=   0x0001 ;        } else {             rtemp  &=   0xFFFE ;        }        CLK  =  HIGH;        SPI_Delay( 10 );        CLK  =  LOW;        SPI_Delay( 10 );    }     return  rtemp;} uint  SPI_GetX(  void  ){      uint  result;    SPI_Start();    SPI_WriteByte( RDAX );    result  =  SPI_ReadBits( 11 );    SPI_Stop();     return  result;} uint  SPI_GetY(  void  ){      uint  result;    SPI_Start();    SPI_WriteByte( RDAY );    result  =  SPI_ReadBits( 11 );    SPI_Stop();     return  result;} void  SPI_Init(  void  ){     SPI_Start();    SPI_WriteByte( MEAS );    SPI_Stop();}

 

// defs_c51_manio.h // manio's 51 defs #define  TRUE     1 #define  FALSE    0 #define  HIGH    1 #define  LOW        0 #define  uchar   unsigned char #define  uint    unsigned int #define  ulong   unsigned long sbit P0_0  =  P0 ^ 0 ;sbit P0_1  =  P0 ^ 1 ;sbit P0_2  =  P0 ^ 2 ;sbit P0_3  =  P0 ^ 3 ;sbit P0_4  =  P0 ^ 4 ;sbit P0_5  =  P0 ^ 5 ;sbit P0_6  =  P0 ^ 6 ;sbit P0_7  =  P0 ^ 7 ;sbit P1_0  =  P1 ^ 0 ;sbit P1_1  =  P1 ^ 1 ;sbit P1_2  =  P1 ^ 2 ;sbit P1_3  =  P1 ^ 3 ;sbit P1_4  =  P1 ^ 4 ;sbit P1_5  =  P1 ^ 5 ;sbit P1_6  =  P1 ^ 6 ;sbit P1_7  =  P1 ^ 7 ;sbit P2_0  =  P2 ^ 0 ;sbit P2_1  =  P2 ^ 1 ;sbit P2_2  =  P2 ^ 2 ;sbit P2_3  =  P2 ^ 3 ;sbit P2_4  =  P2 ^ 4 ;sbit P2_5  =  P2 ^ 5 ;sbit P2_6  =  P2 ^ 6 ;sbit P2_7  =  P2 ^ 7 ;sbit P3_0  =  P3 ^ 0 ;sbit P3_1  =  P3 ^ 1 ;sbit P3_2  =  P3 ^ 2 ;sbit P3_3  =  P3 ^ 3 ;sbit P3_4  =  P3 ^ 4 ;sbit P3_5  =  P3 ^ 5 ;sbit P3_6  =  P3 ^ 6 ;sbit P3_7  =  P3 ^ 7 ; 

 

// main.c /* *************************************************** * Template for C8051F00x written by Manio, http://blog.csdn.net/manio  * This template aim to make the program more clear * to read and write. * Any other function file should follow this rule. *************************************************** */ #include  < c8051f000.h > #include  " defs_c51_manio.h " #include  " spi.h " /// // //  Include function head file here  /// // /// // //  Define Global macro #define xxx xxxxx /// // /// // //  Define Global var /// // /// // //  DECLARE LOCAL FUNCTION /// // void  MCU_Init( void ); void  LongDelay(  void  ){      uint  i ;     for  ( i  =   0  ; i  <   30  ;  ++ i );}main(){      uint  result;     // CLEAN THE DOG     WDTCN  =   0xde ;                               //  disable watchdog timer     WDTCN  =   0xad ;     // SET THE CRYSTAL     // OSCICN = (OSCICN & 0xf0) | 0x07;         // use the inner crystal and set to 16MHZ     // All the module initial here     MCU_Init();         P1  =   0xf0 ;                             // Initialize the inner reg, etc.interrupt timer pwm...     // Operations     SPI_Reset();    SPI_Delay( 1000 );    SPI_Init();        SPI_Delay( 1000 );     while ( 1 ){         result  =  SPI_GetX();         // P1 = result >>3;         // LongDelay();     }} /// // //  DEFINE FUNCTION USED IN MAIN /// // /* *************************************************** * MCU_Init * Function: initiallize interrupt ,crystal ....  *************************************************** */ void  MCU_Init( void ){      // SET THE CROSSBAR eg. XBR0 XBR1    XBR2      XBR2  =   0x40 ;     // SET THE IO MODE PRTxCF     PRT0CF  =   0xff ;    PRT1CF  =   0xff ;     // Timer Init     // Interrupt Setting     // Interrupt Enable Disable     // Other inner reg setting ,LIKE SMBus PWM PCA...     // Global interrupt Enable or Disable     // EA = 1; } /// // //  DEFINE INTERRUPT FUNCTION /// //

标签: prt温度传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台