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
///
//