锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-02-23 09:00:00 prt温度传感器

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=0
bit 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
/// //

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

相关文章