具體看附件了,注釋寫的很細。
有個小BUG,重新上電LCD只開背光無顯示。對調試無大影響,不影響稱重部分。估計是由于delay頭文件的問題,不建議折騰。
0.png (12.83 KB, 下載次數: 73)
下載附件
2017-12-3 00:47 上傳
STM32單片機源程序如下:
- //傳感器用的是8Kg 2.0mV/V的如果其它規格,更改轉換公式即可。
- //檢測參數通過串口發送的電腦。
- //可以做程序在電腦上直接顯示。
- //串口選用USART1
- //PB11接HX711數據口浮空輸入
- //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"
- //----------------函數聲明--------------------
- 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 //執行主函數之前的調試函數,不影響最終的release版
- //------------初始化------------下面三個初始化
- delay_init();
- LCD_Init();
- RCC_Configuration();//RCC指時鐘控制預分頻器
- GPIO_Configuration();//初始化GPIO口狀態
- 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,可能是為了等讀數穩定(這個延時是為了穩定,也可以留時間濾波)
-
- adcx=filter();//adcx值由這個子函數讀出,這個數需要由下面兩句轉kg值
- adcx=8388608-adcx;
- LCD_ShowxNum(156,130,adcx,8,16,0);//顯示ADC轉換后的24位二進制數轉十進制數值
-
- adcx=adcx/100;//為節省運算量,將AD值固定縮小100倍
- weight=(float)adcx/429.496+0.005; //實際用的時候需要調試,429.496由于傳感器差異這個系數一般在400到500之間,加0.005是為了四舍五入
- adcx=weight;
- LCD_ShowxNum(156,150,adcx,3,16,0);//顯示重量值整數部分
-
- weight-=adcx;
- weight*=1000;
- LCD_ShowxNum(188,150,weight,3,16,0X80);//顯示重量值小數部分
-
-
- //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--); //這個延時函數的作用是延時dly1個微秒,但這個延時器用來干嘛不清楚
- }
- /*******************************************************************************
- * Function Name : Read_HX711
- * Description : Read weigh
- * Input : None
- * Output : None
- * Return : None
- *******************************************************************************/
- unsigned long Read_HX711(void) //讀HX711芯片輸出的數據。
- {
- unsigned long val = 0; //long型32位
- unsigned char i = 0;
- //DOUT指串行數據輸出,SCK指的是PD_SCK串行時鐘輸入
- GPIO_SetBits(GPIOB,GPIO_Pin_11); //DOUT=1 ,PB11接HX711數據口浮空輸入,還是不懂什么叫浮空輸入,但是連線的話把HX711的數據線口接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執行下面
- 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
- *******************************************************************************/
- //下面這個濾波函數是一個去最大最小后取平均的函數,要使用它,需要將前面的延時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 數據位 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函數 文件流——》串口USART1
- * Input : ch,*f
- * Output : None
- * Return : None
- *******************************************************************************/
- int fputc(int ch, FILE *f) //fputc重復定義!。。∫呀鉀Q
- {
- USART_SendData(USART1, (unsigned char) ch);// USART1 可以換成 USART2 等
- while (!(USART1->SR & USART_FLAG_TXE)); //->指針,傳遞值的一種方式;!邏輯非;&邏輯與
- return (ch);
- }
- // 接收數據
- int GetKey (void) {
- while (!(USART1->SR & USART_FLAG_RXNE));
- return ((int)(USART1->DR & 0x1FF));
- }
復制代碼
所有資料51hei提供下載:
傳感器稱重及LCD顯.rar
(352.37 KB, 下載次數: 502)
2017-12-3 00:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|