📄 陀螺仪.c
字号:
#include<avr/io.h>
#include<stdio.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define RDY (PINA&_BV(5))
#define RES_1 PORTA|=_BV(5)
#define RES_0 PORTA&=~_BV(5)
static uint g_aAdValue[100]; //A/D 转换缓冲区
unsigned long int results=0;
uint jiaodu,zhong;
uint adc;
int vjiao;
long fx;
/*----------------------------------------------------------------------------
延时一些时间
------------------------------------------------------------------------------*/
void delay10ms(unsigned int x)
{
unsigned char i,j,k;
for(i=0;i<x;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++);
}
void delay(unsigned int x)
{
while(x--)
{;}
}
/*----------------------------------------------------------------------------
初始化IO口
------------------------------------------------------------------------------*/
void IoInit(void)
{
DDRA=0X0F;
PORTA=0Xff;
//DDRD=0Xff;
//PORTD=0Xff;
}
void InitS() //初始化串口
{
UBRRL=51;//设置波特率为9600
UCSRB|=_BV(RXEN)|_BV(TXEN);//允许串口接受
// UCSR1B|=_BV(RXCIE);//允许串口中断
}
void SPI_SET(void) //SPI初始化
{
DDRB=0XBE; //DRDY接PB1,设置PB1为输入口
PORTB=0XFF;
PORTB=0XEF&PORTB; //复位接PB4,此处为拉低PB4
SPCR=0X5c; //设置SPI使能,工作于主机状态,
//并设CPOL=0,CPHA=1,SPR1=0,SPR2=0
//SCK为对11.0592晶振的1/4分频
}
void WRITE_DATA(uchar i) //SPI发送数据
{
uchar CLEAR;
SPDR=i;
while(!(SPSR&0X80));
CLEAR=SPSR;
CLEAR=SPDR;
}
uchar READ_DATA(void) //SPI接收数据
{
uchar data,clear;
SPDR=0x00;
while(!(SPSR&0x80));
clear=SPSR;
data=SPDR;
return(data);
}
void putbyte(uchar x)
{
while( !(UCSRA & (1<<UDRE)) );
UDR=x;
}
////////////////////////////////////////////////////////////////////////////////
uchar num(uchar x)
{
switch(x)
{
case 0:x='0';break;
case 1:x='1';break;
case 2:x='2';break;
case 3:x='3';break;
case 4:x='4';break;
case 5:x='5';break;
case 6:x='6';break;
case 7:x='7';break;
case 8:x='8';break;
case 9:x='9';break;
}
return x;
}
uint AD(void)
{
uint result1,result2,ad;
RES_1;
while(RDY);
WRITE_DATA(0x38);
while(RDY);
result1=READ_DATA();
result2=READ_DATA();
RES_0;
ad=(result1<<8)+result2;
return ad;
}
void InitTLY(void)
{
uchar i;
for(i=0;i<200;i++)
{
results+=AD();
}
zhong=results/200;
}
//****************************************************************************//
// //
// 主函数 //
// //
//****************************************************************************//
int main(void)
{
uchar i;
IoInit();
InitS();
SPI_SET();
while(1)
{
adc=AD()/16;
putbyte(0x58);
putbyte(adc>>8);
putbyte(adc&0xff);
//vjiao=AD()-zhong;
//if(vjiao>50){fx+=(vjiao*0.0461);}
//else {vjiao=~vjiao+1;if(vjiao>50){fx-=(vjiao*0.0461);}}
// putbyte(num(adc/10000));
//putbyte(num(adc%10000/1000));
//putbyte(num(adc%1000/100));
//putbyte(num(adc%100/10));
//putbyte(num(adc%10));
//putbyte('\n');
delay10ms(1);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -