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

原创 2007年09月25日 08:43:00

c8051f005读取SCA100T之程序,SCA100T仍是VI出的一款角度传感器,测量范围为+90~-90度,具体资料见其PDF

 

//spi.h
unsigned int SPI_ReadBits( uchar n );
void SPI_WriteByte( uchar wdata );
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 MEAS 0x00 //测量模式
#define RWTR 0x08 //读写温度数据寄存器
#define STX  0x0E //x通道自检
#define STY  0x0F //Y通道自检
#define RDAX 0x10 //读X通道加速度值
#define RDAY 0x11 //读Y通道加速度值

sbit CLK 
= P0^7;
sbit MISO 
= P1^0;
sbit MOSI 
= P1^1;
sbit CSB 
= 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
/////////////////////////////////////////////////////

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C8051F单片机SPI读取程序

  • 2013-12-30 12:59
  • 385KB
  • 下载

总结——STM32F103C8T6通过MAX31865读取PT100电阻值

10月17日——10月23日调试总结 1.MAX31865 (1)简介 MAX31865是简单易用的热敏电阻至数字输出转换器,优化用于铂电阻温度检测器(RTD)。外部电阻设置RTD灵敏度,高精度Δ- ...

C8051F120 SPI通信程序

  • 2013-08-10 08:48
  • 70KB
  • 下载

c8051f020 spi C程序

C8051F340串口通信程序(UART0)

UART0 是一个异步、全双工串口,它提供标准 8051 串行口的方式 1 和方式 3。UART0 具有增强的波特率发生器电路,有多个时钟源可用于产生标准波特率(详见“18.1 增强波特 率发生器”)...
  • mz8800
  • mz8800
  • 2011-03-10 14:11
  • 2534

SCA100T详细使用说明

  • 2013-07-13 17:56
  • 4.59MB
  • 下载

SCA100T中文详细使用说明书

  • 2016-04-07 21:51
  • 1.46MB
  • 下载

C8051F单片机使用注意事项

一、电源和地线方面的处理 1、模拟电源和数字电源要分别供电,可以使用两个稳压源分别供电,但是两个电源之间的电压差必须满足数据手册中的规定( 2、在地线方面,模拟地和数字地要分开布线,然后在一点通过...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)