資源簡介
基于單片機的加速度傳感器信號采集 并積分求速度和位移的c語言源碼
代碼片段和文件信息
#include
#include
#define?uchar?unsigned?char
#define?uint?unsigned?int
sfr?P2M0??=?0x95;
sfr?P2M1??=?0x96;
sfr?CLK_DIV?=?0xC7;
sbit?SDA=P2^7;
sbit?SCL=P2^6;
sbit?test=P2^5;
sbit?test1=P2^2;
//-------------------變量初始化-------------------------------
uint?ZuoBiao[2];????//存XY加速度值
uint?s[4];?????????//分別存XY加速度的高低位.
uint?ack;
int?iAccReal[4]={0000};
int?iAccFilter;
int?count=0;
double?ax[4]={0.00.00.00.0}ay[4]={0.00.00.00.0}vx[3]={0.00.00.0}vy[3]={0.00.00.0};
double?LX[2]={0.00.0}LY[2]={0.00.0};
double?ax_temp=0.0ay_temp=0.0vx_temp=0.0vy_temp=0.0;
double?t=0.005926;
//-------------------函數聲明----------------------------------
void?Start_I2c();
void?Stop_I2c();
void?SendByte(uchar?c);
uchar?RcvByte();
void?Ack_I2c(int?a);
void?MXC_init();
void?Delay1us(unsigned?int?us);
void?RS232_init(void);
void?serial_send(uchar?dat);
//-------------------函數定義----------------------------------
void?main(void)
{??
????P2M0=0xC0;?//開漏模式0xC0
????P2M1=0xC0;?
????CLK_DIV=0x00;?
??? TMOD=0x21;//0010?0001
TH0=0x00;//定時
TL0=0x00;
TR0=1;//開啟T0定時器
ET0=1;//允許T0定時器中斷
EA=1;//開啟總中斷允許 ?
???RS232_init(); //串口初始化
MXC_init();??//傳感器初始化??????
???while(1)
???{test=1;test1=0;Delay1us(1);//測試中斷是否執行,中斷時間是否超出TH0/TL0的設定值
???}
}
//-------------------IIC的開始命令-----------------------------
void?Start_I2c()
{
???SDA=1;?????/*發送起始條件的數據信號*/
???Delay1us(1);
???SCL=1;
???Delay1us(2);??????/*起始條件建立時間大于4.7us延時*/??
???SDA=0;?????/*發送起始信號*/
???Delay1us(2);??????/*?起始條件鎖定時間大于4μs*/????
???SCL=0;?????/*鉗住I2C總線,準備發送或接收數據?*/
???Delay1us(2);
}
//-------------------IIC的停止命令-----------------------------
void?Stop_I2c()
{
???SDA=0;????/*發送結束條件的數據信號*/
???Delay1us(2);?????/*發送結束條件的時鐘信號*/
???SCL=1;????/*結束條件建立時間大于4us*/?
???Delay1us(2);
???SDA=1;????/*發送I2C總線結束信號*/
???Delay1us(2);
}
//------------------發送命令的函數-----------------------------
void?SendByte(uchar?c)
{
???uchar?BitCnt;
???ack=0;
???for(BitCnt=0;BitCnt<8;BitCnt++)???/*要傳送的數據長度為8位*/
???{
????if((c< ????else???SDA=0;????????????????
????Delay1us(1);
????SCL=1;????????????????/*置時鐘線為高,通知被控器開始接收數據位*/??????
????Delay1us(2);??????????????/*保證時鐘高電平周期大于4μs*/????????????
????SCL=0;?
???}???
??Delay1us(2);
??SDA=1;?????????????????/*8位發送完后釋放數據線,準備接收應答位*/
??Delay1us(2);???
??SCL=1;
??Delay1us(2);
??if(SDA==1)ack=0;?????
??else?ack=1;?????????/*判斷是否接收到應答信號*/
??SCL=0;
??Delay1us(2);
}
//------------------接收一次數據的函數-------------------------
uchar?RcvByte()
{
???uchar?retc;
???uchar?BitCnt;
???retc=0;?
???SDA=1;????????????????/*置數據線為輸入方式*/
???for(BitCnt=0;BitCnt<8;BitCnt++)
????{
??????Delay1us(1);???
??????SCL=0;???????????????????/*置時鐘線為低,準備接收數據位*/???
??????Delay1us(2);??????????????????/*時鐘低電平周期大于4.7μs*/???
??????SCL=1;???????????????????/*置時鐘線為高使數據線上數據有效*/
??????Delay1us(2);
??????retc=retc<<1;
??????if(SDA==1)retc=retc
- 上一篇:感染EXE文件的VC++源碼請謹慎使用.
- 下一篇:圖的深度遍歷和廣度遍歷
評論
共有 條評論