使用c8051f005通过SPI读取SCA100T角度值的程序
时间:2023-02-23 09:00:00
c8051f005读取SCA100T之程序,SCA100T仍是VI测量范围为角度传感器 具体数据见90~-90度PDF
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 ;
#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();
}
// 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 ;
/* ***************************************************
* 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
/// //