亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
一個(gè)基于STC12單片機(jī)的無(wú)線運(yùn)動(dòng)監(jiān)測(cè)器設(shè)計(jì) 含源碼與視頻
[打印本頁(yè)]
作者:
sanshuige
時(shí)間:
2018-6-25 15:53
標(biāo)題:
一個(gè)基于STC12單片機(jī)的無(wú)線運(yùn)動(dòng)監(jiān)測(cè)器設(shè)計(jì) 含源碼與視頻
畢設(shè)結(jié)束了,本來(lái)是想搞一個(gè)簡(jiǎn)單的計(jì)步器的,這功能加的太多給變成運(yùn)動(dòng)監(jiān)測(cè)器了。使用2個(gè)STC12C5A60S2,4個(gè)HC05,還有NEO-7N,PULSE SENSOR,BMP180,ADXL345以及簡(jiǎn)單的1602和幾個(gè)獨(dú)立按鍵,實(shí)現(xiàn)的功能相當(dāng)全面,具體如下:
有效檢測(cè)人體的運(yùn)動(dòng)狀態(tài)信息,記錄行動(dòng)步數(shù),并且能夠顯示心率,具體定位信息(經(jīng)緯度,時(shí)間,日期,海拔高度,運(yùn)動(dòng)速度),溫度,氣壓。大體原理是:
通過(guò)藍(lán)牙由一個(gè)發(fā)送單片機(jī)將記錄的經(jīng)過(guò)處理的數(shù)據(jù)(步數(shù)信息和心率信息)無(wú)線發(fā)送,接收單片機(jī)一方面通過(guò)藍(lán)牙無(wú)線接收(發(fā)送單片機(jī)發(fā)送的數(shù)據(jù)),另一方面通過(guò)藍(lán)牙無(wú)線接收
GPS
的數(shù)據(jù)。并且將數(shù)據(jù)在
LCD1602
上顯示,獨(dú)立按鍵在接收單片機(jī)上負(fù)責(zé)
LCD1602
顯示翻頁(yè)的功能。
正常本科的畢業(yè)設(shè)計(jì)應(yīng)該不會(huì)用到如此多的功能,選其中幾個(gè)功能實(shí)現(xiàn)一下就可以了,反正就是能混則混。具體的程序,原理圖還有視頻我會(huì)貼出來(lái)的。視頻我發(fā)個(gè)百度網(wǎng)盤(pán)的鏈接吧
https://pan.baidu.com/s/1rQXeFTQxPRO0yWu5yOeLZQ [qq]1851215323[/qq]
單片機(jī)源程序:
#include <stc12c5a60s2.h>
#include <math.h>
#include <stdio.h>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
//**************************************
#define false 0
#define true 1
#define FOSC 11059200L //系統(tǒng)時(shí)鐘
#define BAUD 115200 //波特率
#define T0MS (65536-FOSC/12/500) //500HZ在12T模式下
//**************************************
#define ADC_POWER 0x80 //ADC功率控制位
#define ADC_FLAG 0x10 //ADC完成標(biāo)志
#define ADC_START 0x08; //ADC開(kāi)始控制位
#define ADC_SPEEDLL 0x00 //轉(zhuǎn)換速度控制位SPEED0和SPEED1,共四種狀態(tài),對(duì)應(yīng)四種轉(zhuǎn)換速度
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
#define ADC_MASK 0x01
//**************************************
sbit SCL=P1^1; //IIC時(shí)鐘引腳定義
sbit SDA=P1^2; //IIC數(shù)據(jù)引腳定義
//**************************************
#define SlaveAddress 0xA6 //定義器件在IIC總線中的從地址,根據(jù)ALT ADDRESS地址引腳不同修改
//ALT ADDRESS引腳接地時(shí)地址為0xA6,接電源時(shí)地址為0x3A
typedef unsigned char BYTE;
typedef unsigned short WORD;
#define length 10
uchar buffer[length];
unsigned char ADXL345_FLAG=0;
unsigned char START_FLAG=0;
unsigned char number=0;
unsigned char idata bad_flag[3];
unsigned int idata array0[3]={1,1,1};
unsigned int idata array1[3]={1,1,1};
unsigned int idata array2[3]={0,0,0};
unsigned int idata adresult[3];
unsigned int idata max[3]={0,0,0};
unsigned int idata min[3]={1000,1000,1000};
unsigned int idata dc[3]={500,500,500};
unsigned int idata vpp[3]={30,30,30};
unsigned int idata precision[3]={5,5,5};
unsigned int idata old_fixed[3];
unsigned int idata new_fixed[3];
unsigned int idata STEPS=0;
BYTE BUF[16]; //接收數(shù)據(jù)緩存區(qū)
uchar ge,shi,bai,qian,wan; //顯示變量
void delay(unsigned int n);
void Init_ADXL345(void); //初始化ADXL345
void Send_Byte(unsigned char *temp);
void conversion(uint temp_data);
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //單個(gè)寫(xiě)入數(shù)據(jù)
uchar Single_Read_ADXL345(uchar REG_Address); //單個(gè)讀取內(nèi)部寄存器數(shù)據(jù)
void Multiple_Read_ADXL345(); //連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)
//------------------------------------
void Delay5us();
void Delay5ms();
void ADXL345_Start();
void ADXL345_Stop();
void ADXL345_SendACK(bit ack);
bit ADXL345_RecvACK();
void ADXL345_SendByte(BYTE dat);
BYTE ADXL345_RecvByte();
void ADXL345_ReadPage();
void ADXL345_WritePage();
void UART_init(void);
void ADC_init(unsigned char channel);
void T0_init(void);
//------------------------------------
unsigned char PulsePin = 0; // P1.0為傳感器輸入口
// 這些變量是在中斷服務(wù)程序執(zhí)行期間使用的
volatile unsigned int BPM; // 用于保持脈搏
volatile unsigned int Signal; // 保存?zhèn)魅氲脑紨?shù)據(jù)
volatile unsigned int IBI = 600; // 保存相鄰心跳之間的時(shí)間間隔
volatile bit Pulse = false; // 脈搏波高時(shí)為真,低時(shí)為假
volatile bit QS = false; // 當(dāng)單片機(jī)發(fā)現(xiàn)一個(gè)心跳時(shí)變?yōu)檎?br />
volatile int rate[10]; //數(shù)組,保存最后10個(gè)IBI值
volatile unsigned long sampleCounter = 0; // 用于確定脈沖時(shí)間
volatile unsigned long lastBeatTime = 0; // 用于發(fā)現(xiàn)IBI
volatile int Peak =512; //用于發(fā)現(xiàn)脈搏波峰值
volatile int Trough = 512; // 用于發(fā)現(xiàn)脈搏波谷
volatile int thresh = 512; // 用于發(fā)現(xiàn)心跳的即時(shí)時(shí)刻
volatile int amp = 100; //用于保持脈沖波形的幅度
volatile bit firstBeat = true; // 用于開(kāi)始合理的BPM
volatile bit secondBeat = false;
static unsigned char order=0;
unsigned char DisBuff[4]={0};
//------------------------------------
void conversion(uint temp_data)
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余運(yùn)算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余運(yùn)算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余運(yùn)算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余運(yùn)算
ge=temp_data+0x30;
}
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void Delay5ms()
{
WORD n = 560;
while (n--);
}
void ADXL345_Start() //起始信號(hào)
{
SDA = 1; //拉高數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 0; //產(chǎn)生下降沿
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
}
void ADXL345_Stop() //停止信號(hào)
{
SDA = 0; //拉低數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 1; //產(chǎn)生上升沿
Delay5us(); //延時(shí)
}
void ADXL345_SendACK(bit ack) //發(fā)送應(yīng)答信號(hào) 入口參數(shù):ack(0:ACK 1:NAK)
{
SDA = ack; //寫(xiě)應(yīng)答信號(hào)
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
bit ADXL345_RecvACK() //接收應(yīng)答信號(hào)
{
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
CY = SDA; //讀應(yīng)答信號(hào)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
return CY;
}
void ADXL345_SendByte(BYTE dat) //向IIC總線發(fā)送一字節(jié)數(shù)據(jù)
{
BYTE i;
for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat <<= 1; //移出數(shù)據(jù)的最高位
SDA = CY; //送數(shù)據(jù)口
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
ADXL345_RecvACK();
}
BYTE ADXL345_RecvByte() //從IIC總線接收一字節(jié)數(shù)據(jù)
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat <<= 1;
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
dat |= SDA; //讀數(shù)據(jù)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
return dat;
}
void Single_Write_ADXL345(uchar REG_Address,uchar REG_data) //單字節(jié)寫(xiě)入
{
ADXL345_Start(); //起始信號(hào)
ADXL345_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
ADXL345_SendByte(REG_Address); //內(nèi)部寄存器地址,請(qǐng)參考中文pdf22頁(yè)
ADXL345_SendByte(REG_data); //內(nèi)部寄存器數(shù)據(jù),請(qǐng)參考中文pdf22頁(yè)
ADXL345_Stop(); //發(fā)送停止信號(hào)
}
uchar Single_Read_ADXL345(uchar REG_Address) //單字節(jié)讀取
{ uchar REG_data;
ADXL345_Start(); //起始信號(hào)
ADXL345_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
ADXL345_SendByte(REG_Address); //發(fā)送存儲(chǔ)單元地址,從0開(kāi)始
ADXL345_Start(); //起始信號(hào)
ADXL345_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)
REG_data=ADXL345_RecvByte(); //讀出寄存器數(shù)據(jù)
ADXL345_SendACK(1);
ADXL345_Stop(); //停止信號(hào)
return REG_data;
}
void Multiple_read_ADXL345(void) //連續(xù)讀出ADXL345內(nèi)部加速度數(shù)據(jù),地址范圍0x32~0x37
{ uchar i;
ADXL345_Start(); //起始信號(hào)
ADXL345_SendByte(SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
ADXL345_SendByte(0x32); //發(fā)送存儲(chǔ)單元地址,從0x32開(kāi)始
ADXL345_Start(); //起始信號(hào)
ADXL345_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)
for (i=0; i<6; i++) //連續(xù)讀取6個(gè)地址數(shù)據(jù),存儲(chǔ)中BUF
{
BUF[i] = ADXL345_RecvByte(); //BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù)
if (i == 5)
{
ADXL345_SendACK(1); //最后一個(gè)數(shù)據(jù)需要回NOACK
}
else
{
ADXL345_SendACK(0); //回應(yīng)ACK
}
}
ADXL345_Stop(); //停止信號(hào)
Delay5ms();
}
void Init_ADXL345() //初始化ADXL345,根據(jù)需要請(qǐng)參考pdf進(jìn)行修改
{
Single_Write_ADXL345(0x31,0x0B); //測(cè)量范圍,正負(fù)16g,13位模式
Single_Write_ADXL345(0x2C,0x08); //速率設(shè)定為12.5 參考pdf13頁(yè)
Single_Write_ADXL345(0x2D,0x08); //選擇電源模式 參考pdf24頁(yè)
Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中斷
Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根據(jù)測(cè)試傳感器的狀態(tài)寫(xiě)入pdf29頁(yè)
Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根據(jù)測(cè)試傳感器的狀態(tài)寫(xiě)入pdf29頁(yè)
Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根據(jù)測(cè)試傳感器的狀態(tài)寫(xiě)入pdf29頁(yè)
}
void step_counter(void)
{
static uchar sampling_counter=0;
uchar jtemp;
ADXL345_FLAG=0;
Multiple_read_ADXL345(); //連續(xù)讀取加速度
//--------------------------采樣濾波----------------------//
for(jtemp=0;jtemp<=2;jtemp++) //求平均值,計(jì)算最大值和最小值
{
array2[jtemp]=array1[jtemp]; // array0[3]={1,1,1}
array1[jtemp]=array0[jtemp]; // array1[3]={1,1,1}
array0[jtemp]=BUF[2*jtemp]+(BUF[2*jtemp+1]<<8); // array2[3]={0,0,0}
adresult[jtemp]=array0[jtemp]+array1[jtemp]+array2[jtemp];
adresult[jtemp]=adresult[jtemp]/3; //連續(xù)三個(gè)的平均值
if(adresult[jtemp]>max[jtemp]) //max[3]={0,0,0}
{
max[jtemp]=adresult[jtemp];
}
if(adresult[jtemp]<min[jtemp]) //min[3]={1000,1000,1000}
{
min[jtemp]=adresult[jtemp];
}
}
sampling_counter=sampling_counter+1;
//---------------------------------計(jì)算動(dòng)態(tài)門(mén)限和動(dòng)態(tài)精度-----------------------//
if(sampling_counter>=50) //每50個(gè)采樣更新一次
{
sampling_counter=0;
for(jtemp=0;jtemp<=2;jtemp++)
{
vpp[jtemp]=max[jtemp]-min[jtemp]; //vpp[3]={30,30,30}
dc[jtemp] =min[jtemp]+(vpp[jtemp]>>1); //dc[3]={500,500,500} 動(dòng)態(tài)門(mén)限
min[jtemp]=1023;
bad_flag[jtemp]=0;
if(vpp[jtemp]>=160)
{
precision[jtemp]=vpp[jtemp]/32; //動(dòng)態(tài)精度 precision[3]={5,5,5}
}
else if((vpp[jtemp]>=50)&& (vpp[jtemp]<160))
{
precision[jtemp]=4;
}
else if((vpp[jtemp]>=15) && (vpp[jtemp]<50))
{
precision[jtemp]=3;
}
else
{
precision[jtemp]=2;
bad_flag[jtemp]=1;
}
}
}
//--------------------------線性移位寄存器-------------------------------------
for(jtemp=0;jtemp<=2;jtemp++) //用動(dòng)態(tài)精度來(lái)濾波
{
old_fixed[jtemp]=new_fixed[jtemp];
if(adresult[jtemp]>=new_fixed[jtemp])
{
if((adresult[jtemp]-new_fixed[jtemp])>=precision[jtemp])
{
new_fixed[jtemp]=adresult[jtemp];
}
}
else if(adresult[jtemp]<new_fixed[jtemp])
{
if((new_fixed[jtemp]-adresult[jtemp])>=precision[jtemp])
{
new_fixed[jtemp]=adresult[jtemp];
}
}
}
//------------------------- 動(dòng)態(tài)門(mén)限判決----------------------------------
if((vpp[0]>=vpp[1])&&(vpp[0]>=vpp[2])) //x軸加速度變化最大
{
if((old_fixed[0]>=dc[0])&&(new_fixed[0]<dc[0])&&(bad_flag[0]==0)) //判決是否走步
{
STEPS=STEPS+1;
}
}
else if((vpp[1]>=vpp[0])&&(vpp[1]>=vpp[2])) //y軸加速度變化最大
{
if((old_fixed[1]>=dc[1])&&(new_fixed[1]<dc[1])&&(bad_flag[1]==0))
{
STEPS=STEPS+1;
}
}
else if((vpp[2]>=vpp[1])&&(vpp[2]>=vpp[0])) //z軸加速度變化最大
{
if((old_fixed[2]>=dc[2])&&(new_fixed[2]<dc[2])&&(bad_flag[2]==0))
{
STEPS=STEPS+1;
}
}
conversion(STEPS);
buffer[4] =wan;
buffer[5] =qian;
buffer[6] =bai;
buffer[7] =shi;
buffer[8] =ge;
buffer[9] ='\0'; //終止符
}
void delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<100;j++);
}
void sys_init()
{
UART_init(); //串口初始化
ADC_init(PulsePin);
T0_init(); // 定時(shí)器初始化,設(shè)置為每2ms讀取一次信號(hào)
Init_ADXL345();
}
void main(void)
{
uchar devid;
delay(500); //上電延時(shí)
sys_init(); //系統(tǒng)初始化
devid=Single_Read_ADXL345(0X00);//讀出的數(shù)據(jù)為0XE5,表示正確
while(1)
{
step_counter(); //步數(shù)計(jì)算
buffer[0]='
[/font]
; //判斷標(biāo)志$
if (QS == true)
{ // 當(dāng)單片機(jī)發(fā)現(xiàn)心跳時(shí),量化自標(biāo)記為true
buffer[1] =BPM/100+48;
buffer[2] =BPM%100/10+48;
buffer[3] =BPM%10+48;
QS = false; // 下一次重置量化自標(biāo)記
}
Send_Byte(buffer); //發(fā)送數(shù)據(jù)
}
}
void UART_init(void) //串口初始化
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR |= 0x04; //獨(dú)立波特率發(fā)生器時(shí)鐘為Fosc,即1T
BRT = 0xDC; //設(shè)置獨(dú)立波特率發(fā)生器重裝值
AUXR |= 0x01; //串口一選擇獨(dú)立波特率發(fā)生器為波特率發(fā)生器
AUXR |= 0x10; //啟用獨(dú)立波特率發(fā)生器
}
void Send_Byte(unsigned char *temp) //發(fā)送一串?dāng)?shù)據(jù)
{
unsigned char i=0;
ES=0; //禁止串口中斷
while(temp[i] != '\0')
{
SBUF=*(temp+i);
i++;
while(TI==0); //發(fā)送數(shù)據(jù)完畢時(shí),TI會(huì)自動(dòng)置高
TI=0; //發(fā)送數(shù)據(jù)完畢,將TI清零,準(zhǔn)備下一次發(fā)送
}
ES=1; //清零串口中斷發(fā)送標(biāo)志
}
void T0_init(void) //定時(shí)器初始化
{
TMOD |= 0x01; //16位定時(shí)器
TL0=T0MS;
TH0=T0MS>>8;
TR0=1; //啟動(dòng)定時(shí)器0
ET0=1; //啟用定時(shí)器中斷
EA=1; //確保全局中斷已啟用
}
void ADC_init(unsigned char channel) //ADC初始化
{
P1ASF=ADC_MASK<<channel; //啟用PulsePin作為ADC輸入
ADC_RES=0; //清除之前的ADC結(jié)果
ADC_RESL=0; //清除之前的ADC結(jié)果
AUXR1 |= 0x04; //調(diào)整ADC結(jié)果的格式
ADC_CONTR=channel|ADC_POWER|ADC_SPEEDLL|ADC_START; //開(kāi)啟AFC并開(kāi)始轉(zhuǎn)換
}
unsigned int analogRead(unsigned char channel)
{
unsigned int result;
ADC_CONTR &=!ADC_FLAG; //清除ADC FLAG
result=ADC_RES;
result=result<<8;
result+=ADC_RESL;
ADC_CONTR|=channel|ADC_POWER|ADC_SPEEDLL|ADC_START;
return result;
}
// Timer 0中斷子程序,每2MS中斷一次,讀取AD值,計(jì)算心率值
void Timer0_rountine(void) interrupt 1
{
int N;
unsigned char i;
// 保持最后10個(gè)IBI值的runningtotal
unsigned int runningTotal = 0; // 清除runningTotal變量
EA=0; // 禁用中斷
TL0=T0MS;
TH0=T0MS>>8; //重新加載16位定時(shí)器0
Signal = analogRead(PulsePin); // 讀取傳感器值
sampleCounter += 2; // 以ms為單位跟蹤變量
N = sampleCounter - lastBeatTime; // 監(jiān)視自上次跳動(dòng)以來(lái)的時(shí)間以避免噪音
// 找到脈搏的波峰和波谷
if(Signal < thresh && N > (IBI/5)*3){ // 通過(guò)等待最后IBI的3/5以避免嚴(yán)重的噪音
if (Signal < Trough){ // T是低谷
Trough = Signal; // 跟蹤脈搏波的最低點(diǎn)
}
}
if(Signal > thresh && Signal > Peak){ // thresh條件有助于避免噪音
Peak = Signal; // P是峰值
} // 跟蹤脈搏波的最高點(diǎn)
// 每次出現(xiàn)脈沖信號(hào)時(shí)都會(huì)激增
if (N > 250){ // 避免高頻噪音
if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) )
{
Pulse = true; // 當(dāng)我們認(rèn)為有脈沖時(shí)設(shè)置脈沖標(biāo)志
IBI = sampleCounter - lastBeatTime; //以ms為單位測(cè)量心跳之間的時(shí)間
lastBeatTime = sampleCounter; // 跟蹤下一個(gè)脈沖的時(shí)間
if(secondBeat){ // 如果這是第二次心跳
secondBeat = false; // 清除第二次心跳標(biāo)志
for(i=0; i<=9; i++){ // 在啟動(dòng)時(shí)記錄運(yùn)行總數(shù)以獲得實(shí)際的BPM
rate[i] = IBI;
}
}
if(firstBeat){ // 如果這是我們第一次發(fā)現(xiàn)心跳
firstBeat = false; // 清除第一次心跳標(biāo)志
secondBeat = true; // 設(shè)置第二次心跳標(biāo)志
EA=1; // 再次啟用中斷
return; // IBI值不可靠,丟棄它
}
for(i=0; i<=8; i++){ // 移動(dòng)速率數(shù)組中的數(shù)據(jù)
rate[i] = rate[i+1]; // 放棄最早的IBI值
runningTotal += rate[i]; //加載9個(gè)最早的ibi值
}
rate[9] = IBI; //將最新的IBI添加到速率數(shù)組中
runningTotal += rate[9]; // 將最新的IBI添加到runningtotal
runningTotal /= 10; //求最后10個(gè)IBI的平均值
BPM = 60000/runningTotal; // 一分鐘內(nèi)可以發(fā)現(xiàn)多少個(gè)心跳,這就是BPM
if(BPM>200)BPM=200; //限制BPM最高顯示值
if(BPM<30)BPM=30; //限制BPM最低顯示值
DisBuff[2] = BPM%10+48;//取個(gè)位數(shù)
DisBuff[1] = BPM%100/10+48; //取十位數(shù)
DisBuff[0] = BPM/100+48; //百位數(shù)
if(DisBuff[0]==48)
DisBuff[0]=32;
QS = true; //設(shè)置量化自我標(biāo)志
}
}
if (Signal < thresh && Pulse == true){ // 當(dāng)數(shù)值下降時(shí),心跳結(jié)束
Pulse = false; // 重置脈沖標(biāo)志,以便下次執(zhí)行
amp = Peak - Trough; // 得到脈搏波的幅度
thresh = amp/2 + Trough; // 將幅度設(shè)置為50%
Peak = thresh; // 重置以便下次使用
Trough = thresh;
}
if (N > 2500){ // 如果2.5秒內(nèi)沒(méi)有心跳
thresh = 512; // 設(shè)置thresh默認(rèn)值
Peak = 512; // 設(shè)置P默認(rèn)值
Trough = 512; // 設(shè)置T默認(rèn)值
lastBeatTime = sampleCounter; // 使lastBeatTime保持最新?tīng)顟B(tài)
firstBeat = true; //設(shè)置這些以避免噪聲
secondBeat = false; // 當(dāng)我們得到心跳回來(lái)
}
EA=1; // 完成后啟用中斷
}
#include <stc12c5a60s2.h>
#include <math.h>
#include <stdio.h>
#include <INTRINS.H>
#include <stdlib.h>
//------------------------------------
#define uchar unsigned char
#define uint unsigned int
#define S2RI 0x01 //串口2接收中斷請(qǐng)求標(biāo)志位
#define S2TI 0x02 //串口2發(fā)送中斷請(qǐng)求標(biāo)志位
unsigned char flag2,temp2;
unsigned char Buffer[10];
unsigned char RXCount = 0;
unsigned char Display_Buffer[10];
//------------------------------------
#define BMP180_SlaveAddress 0xee //定義器件在IIC總線中的地址
#define OSS 0 // 過(guò)采樣設(shè)置 代碼未設(shè)置為使用其他oss值
typedef unsigned char BYTE;
typedef unsigned short WORD;
uchar ge,shi,bai,qian,wan,shiwan; //顯示變量
int dis_data; //變量
short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;
//------------------------------------
//按鍵 IO設(shè)置
sbit KEY1 = P2^3;
sbit KEY2 = P2^2;
sbit KEY3 = P2^1;
sbit KEY4 = P2^0;
//LCD1602 IO設(shè)置
#define LCD1602_PORT P0
sbit LCD1602_RS = P2^5; //數(shù)據(jù) 命令選擇
sbit LCD1602_RW = P2^6; //讀 寫(xiě)選擇
sbit LCD1602_EN = P2^7; //使能信號(hào)
//------------------------------------
sbit SCL=P1^4; //IIC時(shí)鐘引腳定義
sbit SDA=P1^5; //IIC數(shù)組引腳定義
//------------------------------------
void gps(void);
void display_receive(void);
extern void LCD1602_delay_ms(unsigned int n);
extern void LCD1602_write_com(unsigned char com);
extern void LCD1602_write_data(unsigned char dat);
extern void LCD1602_write_word(unsigned char *s);
extern void Init_LCD1602();
extern void Delay_ms(unsigned int n);
extern void Uart_Init();
//------------------------------------
unsigned char KEY_NUM = 0;
bit Page;
unsigned char xdata Display_GPGGA_Buffer[68];
unsigned char xdata Display_GPRMC_Buffer[68];
bit Flag_OV = 0;
bit Flag_Calc_GPGGA_OK = 0;
bit Flag_Calc_GPRMC_OK = 0;
unsigned char RX_Buffer[68];
unsigned char RX_Count = 0;
unsigned char Hour = 0,Min_High = 0,Min_Low = 0,Sec_High = 0,Sec_Low = 0;
unsigned char Month = 0,Day = 0,Month_High = 0, Month_Low = 0,Day_Low = 0 ,Day_High = 0, Year_High = 0,Year_Low = 0;
unsigned int Year = 0;
bit Flag_GPS_OK = 0;
unsigned char MaxDay = 0;
extern void Scan_Key();
extern void UTCDate2LocalDate(void);
extern bit IsLeapYear(unsigned int uiYear);
extern unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value);
extern unsigned char RX_Buffer[68];
extern unsigned char RX_Count;
extern unsigned char Hour,Min_High,Min_Low,Sec_High,Sec_Low;
extern unsigned char Month,Day,Month_High, Month_Low,Day_Low ,Day_High, Year_High,Year_Low;
extern unsigned int Year;
extern unsigned char MaxDay;
extern bit Flag_GPS_OK;
//------------------------------------
void conversion(long temp_data);
void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);
uchar Single_Read(uchar REG_Address);
void Multiple_Read(uchar,uchar);
void delay(unsigned int k);
void Delay5us();
void Delay5ms();
void BMP180_Start();
void BMP180_Stop();
void BMP180_SendACK(bit ack);
bit BMP180_RecvACK();
void BMP180_SendByte(BYTE dat);
BYTE BMP180_RecvByte();
void BMP180_ReadPage();
void BMP180_WritePage();
void Init_BMP180(void);
void bmp180Convert(void);
//------------------------------------
void UTCDate2LocalDate(void) //UTC日期和當(dāng)前日期的轉(zhuǎn)換
{
Day = (Day_High - 0x30) * 10 + (Day_Low-0x30) + 1; //日 加一
Month = (Month_High - 0x30) * 10 + (Month_Low - 0x30);
Year = 2000 + (Year_High - 0x30) * 10 + (Year_Low - 0x30);
MaxDay = GetMaxDay(Month,Year); //獲取當(dāng)月 天數(shù) 最大值
if(Day > MaxDay) //溢出
{
Day = 1;
Month += 1;
if(Month > 12)
{
Year+=1;
}
}
Day_High = Day/10 + 0x30; //轉(zhuǎn)換日期值為ASCII
Day_Low = Day%10 + 0x30;
Month_High = Month/10 + 0x30; //轉(zhuǎn)換月份值為ASCII
Month_Low = Month%10 + 0x30;
Year_High = Year%100/10 + 0x30; //轉(zhuǎn)換年份值為ASCII
Year_Low = Year%10 + 0x30;
}
unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value) //獲取當(dāng)月日期的最大值
{
unsigned char iDays;
switch(Month_Value)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
iDays = 31;
}
break;
case 2:
{
//2月份比較特殊,需要根據(jù)是不是閏年來(lái)判斷當(dāng)月是28天還29天
iDays = IsLeapYear(Year_Value)?29:28;
}
break;
case 4:
case 6:
case 9:
case 11:
{
iDays = 30;
}
break;
default : break;
}
return(iDays);
}
bit IsLeapYear(unsigned int uiYear) //閏年檢測(cè)
{
return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0);
}
void Uart_Init() //串口初始化函數(shù)
{
SCON = 0X50; //UART方式1;8位UART
REN = 1; //允許串行口接收數(shù)據(jù)
PCON = 0x00; //SMOD=0;波特率不加倍
TMOD = 0x20; //T1方式2,用于產(chǎn)生波特率
TH1 = 0xFD; //裝初值
TL1 = 0xFD;
TR1 = 1; //啟動(dòng)定時(shí)器1
EA = 1; //打開(kāi)全局中斷控制
ES = 1; //打開(kāi)串行口中斷
AUXR &= 0xF7; //波特率不倍速
S2CON = 0x50; //8位數(shù)據(jù),可變波特率
AUXR &= 0xFB; //獨(dú)立波特率發(fā)生器時(shí)鐘為Fosc/12,即12T
BRT = 0xFD; //設(shè)定獨(dú)立波特率發(fā)生器重裝值
AUXR |= 0x10; //啟動(dòng)獨(dú)立波特率發(fā)生器
IE2 =0x01; //開(kāi)串口二中斷 ES2=1
EA=1;
}
void RECEIVE_DATA(void) interrupt 4 using 3 //串口一中斷接收,接收gps數(shù)據(jù)
{
unsigned char temp = 0;
ES=0;
temp = SBUF;
RI = 0;
if(temp == '
[/font]
)
{
RX_Count = 0;
Flag_GPS_OK = 0;
}
RX_Buffer[RX_Count++] = temp;
if(RX_Count >= 59)
{
RX_Count = 59;
Flag_GPS_OK = 1;
}
ES=1;
}
void UART_2Interrupt(void) interrupt 8 using 1 //串口二中斷接收
{
if(S2CON&S2RI)
{
S2CON&=~S2RI;
flag2=1;
temp2=S2BUF;
Buffer[RXCount++] = temp2;
}
if(S2CON&S2TI)
{
S2CON&=~S2TI;
}
}
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void LCD1602_delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}
void LCD1602_write_com(unsigned char com) //1602寫(xiě)指令
{
LCD1602_RS = 0;
LCD1602_delay_ms(1);
LCD1602_EN = 1;
LCD1602_PORT = com;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
void LCD1602_write_data(unsigned char dat) //1602寫(xiě)數(shù)據(jù)
{
LCD1602_RS = 1;
LCD1602_delay_ms(1);
LCD1602_PORT = dat;
LCD1602_EN = 1;
LCD1602_delay_ms(1);
LCD1602_EN = 0;
}
void LCD1602_write_word(unsigned char *s) //1602連續(xù)寫(xiě)字符
{
while(*s>0)
{
LCD1602_write_data(*s);
s++;
}
}
void Init_LCD1602() //初始化1602
{
LCD1602_EN = 0;
LCD1602_RW = 0; //設(shè)置為寫(xiě)狀態(tài)
LCD1602_write_com(0x38); //顯示模式設(shè)定 16*2顯示 5*7點(diǎn)陣 8位數(shù)據(jù)口
LCD1602_write_com(0x0c); //開(kāi)關(guān)顯示、光標(biāo)有無(wú)設(shè)置、光標(biāo)閃爍設(shè)置
LCD1602_write_com(0x06); //寫(xiě)一個(gè)字符后指針加一
LCD1602_write_com(0x01); //清屏指令
}
void display_receive() //顯示串口二接收到的內(nèi)容,即從另一個(gè)單片機(jī)接收到的步數(shù)和心率數(shù)據(jù)
{
if (Buffer[0]=='
[/font]
)
{unsigned char i;
for( i = 0; i < 10 ; i++)
{
Display_Buffer[i] = Buffer[i];
}
LCD1602_write_com(0X01); //清屏
Delay_ms(50);
LCD1602_write_com(0x80); //指針設(shè)置
LCD1602_write_word("STEPS:");
LCD1602_write_data(Display_Buffer[4]);
LCD1602_write_data(Display_Buffer[5]);
LCD1602_write_data(Display_Buffer[6]);
LCD1602_write_data(Display_Buffer[7]);
LCD1602_write_data(Display_Buffer[8]);
LCD1602_write_com(0x80+0x40); //設(shè)置指針 0xc0
LCD1602_write_word("BPM:");
LCD1602_write_data(Display_Buffer[1]);
LCD1602_write_data(Display_Buffer[2]);
LCD1602_write_data(Display_Buffer[3]);
}
}
void Scan_Key() //掃描按鍵
{
if( KEY1 == 0 ) //按鍵1掃描
{
Delay_ms(10); //延時(shí)去抖
if( KEY1 == 0 )
{
while(KEY1 == 0); //等待松手
KEY_NUM = 3;
Page = ~Page;
LCD1602_write_com(0X01); //清屏
}
}
}
void Delay5000ms() //@11.0592MHz stc12 延時(shí)5秒
{
unsigned char i, j, k;
i = 211;
j = 30;
k = 11;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//------------------------------------
void main() //主程序
{
Init_LCD1602(); //初始化1602
Init_BMP180(); //初始化bmp180
Delay_ms(1000);
LCD1602_write_com(0x80); //顯示歡迎界面
LCD1602_write_word("WELCOME");
LCD1602_write_com(0x80+0x40);
LCD1602_write_word("sanshuige");
Delay_ms(10000);
LCD1602_write_com(0X01); //顯示溫度,氣壓界面
bmp180Convert();
Delay5000ms();
LCD1602_write_com(0X01);
Uart_Init(); //雙串口初始化
while(1)
{
gps(); //處理gps數(shù)據(jù)
Scan_Key(); //按鍵掃描
//顯示gps界面一,按下key1后顯示gps界面二。連續(xù)按key1,在2個(gè)界面之間來(lái)回切換顯示
if (KEY2==0)
{
while(1)
{
display_receive(); //如果按下key2,顯示步數(shù)和心率界面
Delay_ms(2000);
if (KEY1==0) //在步數(shù)和心率界面下按下key1,則跳回gps界面
{
break;
}
}
}
}
}
void gps() //處理和顯示串口一接收到的gps數(shù)據(jù)
{
unsigned char i = 0;
if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.') //確定是否收到"GPGGA"這一幀數(shù)據(jù)
{
for( i = 0; i < 68 ; i++)
{
Display_GPGGA_Buffer[i] = RX_Buffer[i];
}
Hour = (Display_GPGGA_Buffer[7]-0x30)*10+(Display_GPGGA_Buffer[8]-0x30)+8; //UTC時(shí)間轉(zhuǎn)換到北京時(shí)間 UTC+8 0x30為ascii轉(zhuǎn)換為數(shù)字
if( Hour >= 24) //溢出
{
Hour %= 24; //獲取當(dāng)前Hour
Flag_OV = 1; //日期進(jìn)位
}
else
{
Flag_OV = 0;
}
Min_High = Display_GPGGA_Buffer[9];
Min_Low = Display_GPGGA_Buffer[10];
Sec_High = Display_GPGGA_Buffer[11];
Sec_Low = Display_GPGGA_Buffer[12];
Flag_Calc_GPGGA_OK = 1;
}
if(Page == 0 && Flag_Calc_GPGGA_OK == 1)
{
Flag_Calc_GPGGA_OK = 0;
LCD1602_write_com(0x80); //設(shè)置指針
LCD1602_write_data(Hour/10+0x30);
LCD1602_write_data(Hour%10+0x30);
LCD1602_write_data(':');
LCD1602_write_data(Min_High);
LCD1602_write_data(Min_Low);
LCD1602_write_data(':');
LCD1602_write_data(Sec_High);
LCD1602_write_data(Sec_Low);
LCD1602_write_word(" ");
LCD1602_write_data(Display_GPGGA_Buffer[54]);
LCD1602_write_data(Display_GPGGA_Buffer[55]);
LCD1602_write_data(Display_GPGGA_Buffer[56]);
LCD1602_write_data(Display_GPGGA_Buffer[57]);
LCD1602_write_word("m");
LCD1602_write_com(0x80+0x40); //設(shè)置指針
LCD1602_write_data(Display_GPGGA_Buffer[28]); //N 或者 S
LCD1602_write_data(Display_GPGGA_Buffer[17]); //緯度
LCD1602_write_data(Display_GPGGA_Buffer[18]); //緯度
LCD1602_write_data(0xdf); //度
LCD1602_write_data(Display_GPGGA_Buffer[19]); //緯度
LCD1602_write_data(Display_GPGGA_Buffer[20]); //緯度
LCD1602_write_word("'"); //秒
LCD1602_write_data(Display_GPGGA_Buffer[42]); //E 或者 W
LCD1602_write_data(Display_GPGGA_Buffer[30]); //經(jīng)度
LCD1602_write_data(Display_GPGGA_Buffer[31]);
LCD1602_write_data(Display_GPGGA_Buffer[32]);
LCD1602_write_data(0xdf);
LCD1602_write_data(Display_GPGGA_Buffer[33]);
LCD1602_write_data(Display_GPGGA_Buffer[34]);
LCD1602_write_word("'");
}
if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'M' && RX_Buffer[52] == ',' && RX_Buffer[59] == ',') //確定是否收到"GPRMC"這一幀數(shù)據(jù)
{
for( i = 0; i < 68 ; i++)
{
Display_GPRMC_Buffer[i] = RX_Buffer[i];
}
Year_High = Display_GPRMC_Buffer[57];
Year_Low = Display_GPRMC_Buffer[58];
Month_High = Display_GPRMC_Buffer[55];
Month_Low = Display_GPRMC_Buffer[56];
Day_High = Display_GPRMC_Buffer[53];
Day_Low = Display_GPRMC_Buffer[54];
if(Flag_OV == 1) //有進(jìn)位
{
UTCDate2LocalDate(); //UTC日期轉(zhuǎn)換為北京時(shí)間
}
Flag_Calc_GPRMC_OK = 1;
}
if(Page == 1 && Flag_Calc_GPRMC_OK == 1)
{
Flag_Calc_GPRMC_OK = 0;
LCD1602_write_com(0x80); //設(shè)置指針
LCD1602_write_word("20");
LCD1602_write_data(Year_High);
LCD1602_write_data(Year_Low);
LCD1602_write_data('-');
LCD1602_write_data(Month_High);
LCD1602_write_data(Month_Low);
LCD1602_write_data('-');
LCD1602_write_data(Day_High);
LCD1602_write_data(Day_Low);
LCD1602_write_com(0x80+0x40); //設(shè)置指針
LCD1602_write_word("Speed:"); //顯示內(nèi)容
LCD1602_write_data(Display_GPRMC_Buffer[46]);
LCD1602_write_data(Display_GPRMC_Buffer[47]);
LCD1602_write_data(Display_GPRMC_Buffer[48]);
LCD1602_write_data(Display_GPRMC_Buffer[49]);
LCD1602_write_data(Display_GPRMC_Buffer[50]);
LCD1602_write_word("m/s");
}
}
void conversion(long temp_data) //轉(zhuǎn)變函數(shù)
{
shiwan=temp_data/100000+0x30 ;
temp_data=temp_data%100000; //取余運(yùn)算
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000;
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000;
bai=temp_data/100+0x30 ;
temp_data=temp_data%100;
shi=temp_data/10+0x30 ;
temp_data=temp_data%10;
ge=temp_data+0x30;
}
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}
}
}
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void Delay5ms()
{
WORD n = 560;
while (n--);
}
void BMP180_Start() //起始信號(hào)
{
SDA = 1; //拉高數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 0; //產(chǎn)生下降沿
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
}
void BMP180_Stop() //停止信號(hào)
{
SDA = 0; //拉低數(shù)據(jù)線
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SDA = 1; //產(chǎn)生上升沿
Delay5us(); //延時(shí)
}
void BMP180_SendACK(bit ack) //發(fā)送應(yīng)答信號(hào) 入口參數(shù):ack(0:ACK 1:NAK)
{
SDA = ack; //寫(xiě)應(yīng)答信號(hào)
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
bit BMP180_RecvACK() //接收應(yīng)答信號(hào)
{
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
CY = SDA; //讀應(yīng)答信號(hào)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
return CY;
}
void BMP180_SendByte(BYTE dat) //向iic總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)
{
BYTE i;
for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat <<= 1; //移出數(shù)據(jù)的最高位
SDA = CY; //送數(shù)據(jù)口
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
BMP180_RecvACK();
}
BYTE BMP180_RecvByte() //從iic總線接收一個(gè)字節(jié)數(shù)據(jù)
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù)
for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat <<= 1;
SCL = 1; //拉高時(shí)鐘線
Delay5us(); //延時(shí)
dat |= SDA; //讀數(shù)據(jù)
SCL = 0; //拉低時(shí)鐘線
Delay5us(); //延時(shí)
}
return dat;
}
short Multiple_read(uchar ST_Address) //讀出bmp180內(nèi)部數(shù)據(jù) 連續(xù)兩個(gè)
{
uchar msb, lsb;
short _data;
BMP180_Start(); //起始信號(hào)
BMP180_SendByte(BMP180_SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
BMP180_SendByte(ST_Address); //發(fā)送存儲(chǔ)單元地址
BMP180_Start(); //起始信號(hào)
BMP180_SendByte(BMP180_SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)
msb = BMP180_RecvByte(); //BUF[0]存儲(chǔ)
BMP180_SendACK(0); //回應(yīng)ACK
lsb = BMP180_RecvByte();
BMP180_SendACK(1); //最后一個(gè)數(shù)據(jù)需要回NOACK
BMP180_Stop(); //停止信號(hào)
Delay5ms();
_data = msb << 8;
_data |= lsb;
return _data;
}
long bmp180ReadTemp(void)
{
BMP180_Start(); //起始信號(hào)
BMP180_SendByte(BMP180_SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
BMP180_SendByte(0xF4); //寫(xiě)寄存器地址
BMP180_SendByte(0x2E); // 寫(xiě)入溫度的寄存器數(shù)據(jù)
BMP180_Stop(); //發(fā)送停止信號(hào)
delay(10);
return (long) Multiple_read(0xF6);
}
long bmp180ReadPressure(void)
{
long pressure = 0;
BMP180_Start(); //起始信號(hào)
BMP180_SendByte(BMP180_SlaveAddress); //發(fā)送設(shè)備地址+寫(xiě)信號(hào)
BMP180_SendByte(0xF4); // 寫(xiě)寄存器地址
BMP180_SendByte(0x34); // 寫(xiě)入氣壓的寄存器數(shù)據(jù)
BMP180_Stop(); //發(fā)送停止信號(hào)
delay(10);
pressure = Multiple_read(0xF6);
pressure &= 0x0000FFFF;
return pressure;
}
void Init_BMP180() //初始化bmp180
{
ac1 = Multiple_read(0xAA);
ac2 = Multiple_read(0xAC);
ac3 = Multiple_read(0xAE);
ac4 = Multiple_read(0xB0);
ac5 = Multiple_read(0xB2);
ac6 = Multiple_read(0xB4);
b1 = Multiple_read(0xB6);
b2 = Multiple_read(0xB8);
mb = Multiple_read(0xBA);
mc = Multiple_read(0xBC);
md = Multiple_read(0xBE);
}
void bmp180Convert() //讀取并在1602上顯示溫度和氣壓數(shù)據(jù)
{
long ut;
long up;
long x1, x2, b5, b6, x3, b3, p;
unsigned long b4, b7;
long temperature;
long pressure;
ut = bmp180ReadTemp();
ut = bmp180ReadTemp(); //讀取溫度
up = bmp180ReadPressure();
up = bmp180ReadPressure(); //讀取大氣壓
x1 = ((long)ut - ac6) * ac5 >> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
temperature = (b5 + 8) >> 4;
LCD1602_write_com(0X01); //清屏
Delay_ms(50);
conversion(temperature);
LCD1602_write_word("temp:");
LCD1602_write_data(bai);
LCD1602_write_data(shi);
LCD1602_write_word(".");
LCD1602_write_data(ge);
LCD1602_write_data(0XDF); //溫度單位
LCD1602_write_word("C");
b6 = b5 - 4000;
x1 = (b2 * (b6 * b6 >> 12)) >> 11;
x2 = ac2 * b6 >> 11;
x3 = x1 + x2;
b3 = (((long)ac1 * 4 + x3) + 2)/4;
x1 = ac3 * b6 >> 13;
x2 = (b1 * (b6 * b6 >> 12)) >> 16;
x3 = ((x1 + x2) + 2) >> 2;
b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
b7 = ((unsigned long) up - b3) * (50000 >> OSS);
if( b7 < 0x80000000)
p = (b7 * 2) / b4 ;
else
p = (b7 / b4) * 2;
x1 = (p >> 8) * (p >> 8);
x1 = (x1 * 3038) >> 16;
x2 = (-7357 * p) >> 16;
pressure = p + ((x1 + x2 + 3791) >> 4);
LCD1602_write_com(0x80+0x40); //設(shè)置指針
conversion(pressure);
LCD1602_write_word("atm:");
LCD1602_write_data(shiwan);
LCD1602_write_data(wan);
LCD1602_write_data(qian);
LCD1602_write_word(".");
LCD1602_write_data(bai);
LCD1602_write_data(shi);
LCD1602_write_word("Kpa");
}
復(fù)制代碼
全部資料51hei下載地址:
新建文件夾.rar
(936.23 KB, 下載次數(shù): 47)
2018-6-25 15:30 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
xsj1877578806
時(shí)間:
2018-8-28 18:39
感謝分享很實(shí)用
作者:
宇宙浪子521
時(shí)間:
2019-11-26 20:24
這個(gè)是模塊化編程嗎
作者:
宇宙浪子521
時(shí)間:
2019-11-26 20:25
這個(gè)是模塊化編程嗎?
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1