看到網(wǎng)上都是用 LCD1602作為輸出的,參考一些論壇的文章,拼成STM32+ADXL345+OLED 計步器。
制作出來的實物圖如下:
1.jpg (237.08 KB, 下載次數(shù): 61)
下載附件
2022-10-14 00:02 上傳
單片機源程序如下:
- /*
- STM32F103C8T6
- iic通信0.96寸OLED顯示屏;顯示中英文、數(shù)字、圖片
- 18B20溫度傳感器
- HC-SR04超聲波傳感器
- OLED接線定義:
- VCC--3.3V/5V
- GND--GND
- SCL--PB8
- SDA--PB9
- 18B20接線定義:
- DQ--PA5
- HC-SR04超聲波接線定義:
- Trig--PB7
- Echo--PB6
- */
- #include "sys.h"
- #include "delay.h"
- #include "oled_iic.h"
- #include "stdio.h"
- #include "wave.h"
- #include "timer.h"
- #include "usart.h"
- #include "ds18b20.h"
- #include "lcd1602.h"
- #include "led.h"
- #include <stdio.h>
- #include "key.h"
- #include "exti.h"
- #include "adxl345.h"
- //Add bgn
- unsigned char ReadAdxl345; //定時讀取adxl345數(shù)據(jù)
- unsigned char ErrorNum=0; //記錄錯誤次數(shù)
- unsigned char CheckNum=0; //檢測次數(shù)
-
- char dis0[16];//液晶數(shù)組顯示暫存
- char dis1[35];
- unsigned int xlTab[5];//心率數(shù)組
- unsigned char count=0; //心率濾波計數(shù)
- unsigned int xinLater=0;// 心率延時處理
- unsigned int xinLv =0; //心率值
- unsigned int BuShu=0;//步數(shù)
- unsigned int Normal_num=0; //正常次數(shù)
- unsigned int Error_num=0; //傾斜次數(shù)
- unsigned int disBuShu = 0; //顯示步數(shù)
- float disJuLi = 0;//顯示距離
- float temperature; //溫度
- unsigned char readTemp = 0; //讀取溫度標志
- //Add end
- int main(void)
- {
-
- //Add bgn
- delay_init(); //延時函數(shù)初始化
- uart_init(9600); //串口初始化為9600
- TIM3_Int_Init(49,7199);//50ms
- //EXTIX_Init(); // 初始化外部中斷
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- //lcd_GPIO_init(); //初始化lcd引腳
- //lcd_Init(); //初始化lcd屏幕
- delay_ms(200);
-
- Init_ADXL345();
- if(Single_Read_ADXL345(0X00)==0xe5)
- {
- delay_ms(5);
- }
- else
- {
- delay_ms(3);
- }
- //Add end
-
- u8 a=0;
- u8 t=20;//trig引腳高電平持續(xù)時間
- double temperature;
- // u8 Distance;
- // u8 disFlag=0;
-
- uart_init(115200);//串口初始化
- Wave_SRD_Init();//初始化超聲波
- Timer_SRD_Init(9998,7199);//定時器初始化
- extern const u8 BMP1[];
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
- delay_init();
- OLED_Init(); //OLED屏幕初始化
- DS18B20_Init(); //DS18B20初始化
-
- while(Wave_SRD_Strat(t))
- {
- }
-
- OLED_Clear();
-
- while(1)
- {
- ReadAdxl345= 1;
- //Add bgn
- if(ReadAdxl345== 1) //定時讀取adxl345數(shù)據(jù)
- {
- ReadAdxl345= 0;
- ReadData_x(); //三軸檢測函數(shù)
- CheckNum++;
- if((temp_Y>450)||(temp_Y<-450)) //查看正常次數(shù)
- {
- Normal_num++; //正常次數(shù)++
- }
- else
- {
- Error_num++;//傾斜次數(shù)
- }
- if((Error_num!=0)&&(Normal_num!=0))//檢測到步數(shù)
- // if (Normal_num!=0)//檢測到步數(shù)
- {
- BuShu++; //步數(shù)脈沖量++
- Error_num=0; //清除一個周期檢測
- Normal_num=0;
- }
- }
-
- if(disFlag==1) //顯示標志
- {
- disFlag = 0;
- readTemp++; //定時計數(shù)
- if(readTemp >= 8)//約800ms處理一次數(shù)據(jù) 溫度
- {
- readTemp =0;//重新計數(shù)
- temperature=(float)DS18B20_Get_Temp()/10; //縮小10倍為實際值
- }
-
- disBuShu = BuShu/2; //顯示步數(shù)
- disJuLi = disBuShu*0.45;//顯示距離
-
- sprintf(dis0,"X:%03d/min %4.1f C",xinLv,temperature);//打印
- Lcd_Puts(0,0,(unsigned char *)dis0); //顯示
- Lcd_1Put(14,0,0xdf);//顯示符號
- sprintf(dis1,"BS:%03d JL:%4.1fm ",disBuShu,disJuLi);//打印
- Lcd_Puts(0,1,(unsigned char *)dis1); //顯示
-
- }
-
- //Add end
-
-
-
- //18B20讀取溫度
- if(a%10==0) //每100ms讀取一次
- {
- temperature=DS18B20_Get_Temp();
- if(temperature<0)
- {
- OLED_ShowCH(50,6,"-"); //顯示負號
- temperature=-temperature; //轉為正數(shù)
- }else{
- OLED_ShowCH(50,6," "); //去掉負號
- }
- // OLED_ShowNum(60,6,temperature/10,2,16); //顯示整數(shù)部分
- // OLED_ShowNum(60+28,6,temperature%10,1,16); //顯示小數(shù)部分
- }
- delay_ms(10);
- a++;
- if(a==20)
- {
- a=0;
- }
- // OLED_ShowCH(15,0,"屏幕顯示測試y2"); //測試顯示中文
- OLED_ShowCH(0,0,"BuShu:"); //測試顯示中文
- OLED_ShowNum(50,0,BuShu,6,16);
- OLED_ShowCH(0,3,"Dist.: "); //顯示英文
- OLED_ShowNum(50,3,disJuLi,6,16);
- // //產(chǎn)生高于10Us的高電平與OLED上顯示超聲波所測距離
- // Wave_SRD_Strat(t);
- // Distance = TIM_GetCounter(TIM3)*340/200.0;
- // if(Distance>0)
- // {
- // OLED_ShowNum(50,3,Distance,6,16); //顯示超聲波測量距離
- // delay_ms(10);
- // }
- /*
- OLED_DrawBMP(0,0,128,8,(u8 *)BMP1); //測試顯示圖片
- */
- }
- }
復制代碼
Keil代碼下載:
Keil代碼.7z
(212.43 KB, 下載次數(shù): 83)
2022-10-14 00:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|