久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM32與HX711作200KG電子秤源碼 帶詳細注釋
[打印本頁]
作者:
azd1997
時間:
2017-12-2 16:19
標題:
STM32與HX711作200KG電子秤源碼 帶詳細注釋
具體看附件了,注釋寫的很細。
有個小BUG,重新上電LCD只開背光無顯示。對調試無大影響,不影響稱重部分。估計是由于delay頭文件的問題,不建議折騰。
0.png
(12.83 KB, 下載次數(shù): 73)
下載附件
2017-12-3 00:47 上傳
STM32單片機源程序如下:
//傳感器用的是8Kg 2.0mV/V的如果其它規(guī)格,更改轉換公式即可。
//檢測參數(shù)通過串口發(fā)送的電腦。
//可以做程序在電腦上直接顯示。
//串口選用USART1
//PB11接HX711數(shù)據口浮空輸入
//PB12接HX711CLK
//PA11為測試程序時用過的。可刪除
//HX711輸入電子稱電壓調稱為22K 10K 調壓為4V輸出
//輸出結果最后一位為0.1g
//我們的傳感器50kg,靈敏度1mv/v
//HX711模塊R1=20k歐,R2=8.2k歐,所以HX711給傳感器供電電壓為(20+8.2)/8.2*1.25=4.3V,注意萬用表測得會比這個值低,模塊為了降低功耗只在采樣時會用到4.3輸出電壓
/*Include---------------------------*/
#include <stm32f10x.h> //包含所有的頭文件
#include <stdio.h>
#include "sys.h"
#include "usart.h"
#include "lcd.h"
//#include "adc.h"
//#include "led.h"
//#include "delay.h"
//----------------函數(shù)聲明--------------------
void Delay_MS(u16 dly);
void delay_us(u16 dly1);
void RCC_Configuration(void);
void GPIO_Configuration(void);
unsigned long Read_HX711(void);
void USART_Configuration(void);
int fputc(int ch,FILE *f);
int GetKey (void);
long double filter(void);
USART_InitTypeDef USART_InitStructure;
ErrorStatus HSEStartUpStatus;
//void u32tostr(unsigned long dat,char *str) ;
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
u32 adcx;
float weight;
#ifdef DEBUG
debug();
#endif //執(zhí)行主函數(shù)之前的調試函數(shù),不影響最終的release版
//------------初始化------------下面三個初始化
delay_init();
LCD_Init();
RCC_Configuration();//RCC指時鐘控制預分頻器
GPIO_Configuration();//初始化GPIO口狀態(tài)
USART_Configuration( ); //初始化串口配置
//uart_init(9600); //串口初始化為9600
POINT_COLOR=RED;//設置字體為紅色
LCD_ShowString(60,50,200,16,16,"Mini STM32");
LCD_ShowString(60,70,200,16,16,"WEIGHT SCALE");
LCD_ShowString(60,90,200,16,16,"ZHILV@EIGER");
LCD_ShowString(60,110,200,16,16,"2017/11/25");
POINT_COLOR=BLUE;//設置字體為藍色
LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");
LCD_ShowString(60,150,200,16,16,"ADC_CH1_WEI:000.000kg");
while(1) //恒運行下面的程序
{
Delay_MS(1000);//延時1s,可能是為了等讀數(shù)穩(wěn)定(這個延時是為了穩(wěn)定,也可以留時間濾波)
adcx=filter();//adcx值由這個子函數(shù)讀出,這個數(shù)需要由下面兩句轉kg值
adcx=8388608-adcx;
LCD_ShowxNum(156,130,adcx,8,16,0);//顯示ADC轉換后的24位二進制數(shù)轉十進制數(shù)值
adcx=adcx/100;//為節(jié)省運算量,將AD值固定縮小100倍
weight=(float)adcx/429.496+0.005; //實際用的時候需要調試,429.496由于傳感器差異這個系數(shù)一般在400到500之間,加0.005是為了四舍五入
adcx=weight;
LCD_ShowxNum(156,150,adcx,3,16,0);//顯示重量值整數(shù)部分
weight-=adcx;
weight*=1000;
LCD_ShowxNum(188,150,weight,3,16,0X80);//顯示重量值小數(shù)部分
//GPIO_SetBits(GPIOA,GPIO_Pin_11); //沒看懂,大概是對PA11進行設置,但不清楚作什么設置 從后面推敲應該set置1,reset置0
//printf("%d\n",weight); //打印weight值,串口調試用的
}
}
/*******************************************************************************
* Function Name : Delay_Ms
* Description : delay 1 ms.
* Input : dly (ms)
* Output : None
* Return : None
*******************************************************************************/
void Delay_MS(u16 dly)
{
u16 i,j;
for(i=0;i<dly;i++)
for(j=1000;j>0;j--);
}
void delay_us(u16 dly1) //重復定義。。。栴}已解決,在delay.c中注釋掉該定義
{
u16 i;
for(i=dly1;i>0;i--); //這個延時函數(shù)的作用是延時dly1個微秒,但這個延時器用來干嘛不清楚
}
/*******************************************************************************
* Function Name : Read_HX711
* Description : Read weigh
* Input : None
* Output : None
* Return : None
*******************************************************************************/
unsigned long Read_HX711(void) //讀HX711芯片輸出的數(shù)據。
{
unsigned long val = 0; //long型32位
unsigned char i = 0;
//DOUT指串行數(shù)據輸出,SCK指的是PD_SCK串行時鐘輸入
GPIO_SetBits(GPIOB,GPIO_Pin_11); //DOUT=1 ,PB11接HX711數(shù)據口浮空輸入,還是不懂什么叫浮空輸入,但是連線的話把HX711的數(shù)據線口接STM的PB11口
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //SCK=0 ,PB12接HX711CLK
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)); //等待DOUT=0
delay_us(1); //等1us執(zhí)行下面
for(i=0;i<24;i++)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12); //SCK=1
val=val<<1; //左移1位,右補0
delay_us(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //SCK=0
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)) //DOUT=1
val++;
delay_us(1);
}
GPIO_SetBits(GPIOB,GPIO_Pin_12);
val=val^0x800000;//異或。
delay_us(1);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
delay_us(1);
return val;
}
/*******************************************************************************
* Function Name : FILTER
* Description : 限幅中位均值濾波
* Input : None
* Output : None
* Return : None
*******************************************************************************/
//下面這個濾波函數(shù)是一個去最大最小后取平均的函數(shù),要使用它,需要將前面的延時1us改為5us,增大采樣時間。
long double filter(void) //?????ù?????¨·¨????????
{
unsigned long max=0,min=0,SUM,BUF[12],Average;
int i=0;
for(i=0;i<12;i++)
{
BUF[i]=Read_HX711();
//printf("%ld\r\n",BUF);
if(i==0)
{
max=BUF[0];
min=BUF[0];
}
if(i>0)
{
if(BUF[i]>max) max=BUF[i];
if(BUF[i]<min) min=BUF[i];
}
}
for(i=0;i<12;i++)
{
if(!(BUF[i]==max||BUF[i]==min))
{
SUM=SUM+BUF[i];
}
}
Average=SUM/(12-2);
return Average;
}
/*******************************************************************************
* Function Name : RCC_Configuration
* Description : Configures the different system clocks.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RCC_Configuration(void)
{
//----------使用外部RC晶振-----------
RCC_DeInit(); //初始化為缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速時鐘
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速時鐘使能就緒
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source
//---------打開相應外設時鐘--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //使能APB2外設的GPIOA的時鐘
//開啟串口時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}
/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : 初始化GPIO外設
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void GPIO_Configuration(void)
{
//CLK:PB5 CLR:PE11 Data:PE10
GPIO_InitTypeDef GPIO_InitStructure; //聲明一個結構體變量
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //選擇PC.10(TXD) 和 PC.11
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //輸出模式為推挽輸出
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB5
//配置USART1_Tx為復合推挽輸出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置 USART1_Rx 為浮空輸入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //選擇PC.10(TXD) 和 PC.11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //選擇PC.10(TXD) 和 PC.11
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //管腳頻率為50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PB5
}
/*******************************************************************************
* Function Name : USART_Configuration
* Description : 設置串口USART1
* Input : ch,*f
* Output : None
* Return : None
*******************************************************************************/
void USART_Configuration(void)
{
//串口配置: 波特率 115200 數(shù)據位 8 停止位 1 奇偶位 NONE
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//初始化串口
USART_Init(USART1, &USART_InitStructure);
//啟動串口
USART_Cmd(USART1, ENABLE);
}
/*******************************************************************************
* Function Name : fputc
* Description : 重定向這個C庫(stdio)printf函數(shù) 文件流——》串口USART1
* Input : ch,*f
* Output : None
* Return : None
*******************************************************************************/
int fputc(int ch, FILE *f) //fputc重復定義。。!已解決
{
USART_SendData(USART1, (unsigned char) ch);// USART1 可以換成 USART2 等
while (!(USART1->SR & USART_FLAG_TXE)); //->指針,傳遞值的一種方式;!邏輯非;&邏輯與
return (ch);
}
// 接收數(shù)據
int GetKey (void) {
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
復制代碼
所有資料51hei提供下載:
傳感器稱重及LCD顯.rar
(352.37 KB, 下載次數(shù): 502)
2017-12-3 00:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
tt98
時間:
2017-12-4 12:59
下載學習。!
作者:
chen0263
時間:
2018-3-9 15:38
求轉發(fā)源碼給我學習,剛進來下載不了。
作者:
52angle
時間:
2018-9-5 16:50
備注的很詳細,贊
作者:
wangkun123
時間:
2018-11-16 08:59
發(fā)給HX711的脈沖過不去這是怎么回事
作者:
qq459497878
時間:
2018-11-29 17:24
我正好需要這個,非常感謝
作者:
loboko
時間:
2018-12-1 18:57
謝謝大神分享
作者:
yubo2007
時間:
2018-12-2 10:25
備注的很詳細,贊
作者:
jc235
時間:
2019-1-25 15:26
相互學習!
作者:
635808093
時間:
2019-4-10 18:16
學習學習!!
作者:
a371403687
時間:
2019-4-29 15:58
能調試出嘛
作者:
白歌
時間:
2019-4-30 17:15
感謝分享
作者:
irisice008
時間:
2019-5-17 21:11
感謝分享
作者:
luluxiu
時間:
2019-5-19 21:50
下載學習
作者:
r757613823
時間:
2019-6-28 08:11
多謝大神分享
作者:
hellowC8051
時間:
2019-7-18 11:29
下載學習,謝謝樓主
作者:
zhaojun_xf
時間:
2019-7-18 14:21
正在做電子秤,下載學習。
作者:
一顆糖
時間:
2019-7-20 21:05
看不懂 也調試不出來想要的結果 5555
作者:
stm32nb
時間:
2019-7-22 17:42
學習了。
作者:
魚主~
時間:
2019-8-7 09:40
資料很贊
作者:
拉卡拉
時間:
2019-9-14 16:33
感謝大佬
作者:
aaronbin
時間:
2019-10-11 16:58
那個讀取HX711之后,為啥還要用8388608減去它
作者:
冰葑世紀
時間:
2020-5-29 10:55
求轉發(fā)源碼給我學習,剛進來下載不了。
作者:
xeh073
時間:
2022-8-8 10:21
正在做電子秤,下載學習。
作者:
不吃香菜呀
時間:
2022-8-18 17:04
直接下載,贊
作者:
haide1998
時間:
2022-9-12 20:52
收藏,準備以后學習,謝謝分享!
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久久久久中文字幕
|
国产做爰免费观看视频
|
黄网站免费看
|
亚洲福利一区
|
91精品91久久久中77777
|
欧美性猛交xxxx免费看久久久
|
国产精品久久久久久妇女6080
|
97精品国产97久久久久久免费
|
96av视频
|
91福利视频导航
|
一级片免费播放
|
色哟哟av
|
91av在线看
|
国产做爰视频免费播放
|
色婷婷久久综合
|
福利视频午夜
|
日韩美女一区二区三区
|
美女久久久久久
|
国产黄色录像
|
精品一区二区在线播放
|
狠狠干2018
|
久操国产
|
黄色片毛片
|
国产一级片网站
|
欧美精品一区二区三区四区
|
国产一级片网站
|
中文字幕精品在线观看
|
国产呦小j女精品视频
|
日本三级在线视频
|
亚洲h视频
|
国产精品黄
|
成人香蕉网
|
性欧美精品
|
亚洲三级av
|
欧美日韩黄色片
|
欧美日韩一区二区三区视频
|
国产成人精品一区二区三区视频
|
99国产精品99久久久久久粉嫩
|
国产在线观看网站
|
欧美亚洲三级
|
久久精品一区
|