冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 470|回覆: 0

[討論] STM8S103F3P6製作電子秤

[複製鏈接]

2179

主題

0

好友

925

積分

高級會員

Rank: 4

UID
373967
帖子
6420
主題
2179
精華
0
積分
925
楓幣
4694
威望
907
存款
20000
贊助金額
0
推廣
0
GP
1146
閱讀權限
50
在線時間
360 小時
註冊時間
2023-1-12
最後登入
2024-2-29

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

發表於 2023-3-27 18:42:37 |顯示全部樓層
#include <stm8s.h>

#define CLK_FREQ 16000000UL   // 定義系統時鐘頻率

void main(void)
{
  // 初始化系統時鐘
  CLK_DeInit();
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  // 16MHz
  
  // 初始化GPIO
  GPIO_Init(GPIOA, GPIO_PIN_1, GPIO_MODE_IN_FL_NO_IT);   // 負載細胞接口+
  GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_FL_NO_IT);   // 負載細胞接口-
  GPIO_Init(GPIOD, GPIO_PIN_4, GPIO_MODE_IN_PU_IT);      // 按鈕接口
  GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);  // LED顯示燈
  
  // 初始化I2C
  I2C_DeInit();
  I2C_Init(100000, 0x02, I2C_DUTYCYCLE_2, I2C_ACK_CURR,
           I2C_ADDMODE_7BIT, CLK_FREQ);   // I2C頻率100KHz
  
  // 初始化計時器
  TIM4_DeInit();
  TIM4_TimeBaseInit(TIM4_PRESCALER_128, 125);  // 溢出頻率1kHz
  
  // 啟用中斷
  enableInterrupts();
  
  while(1)
  {
    // 讀取負載細胞數據
    uint16_t weight = getWeight();
   
    // 顯示數據
    displayWeight(weight);
  }
}

uint16_t getWeight()
{
  uint16_t weight = 0;
  uint16_t adcVal = 0;
  
  // 讀取ADC數據
  ADC1_DeInit();
  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_3,
            ADC1_PRESSEL_FCPU_D8, ADC1_EXTTRIG_TIM, DISABLE,
            ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL3, DISABLE);
  ADC1_Cmd(ENABLE);
  ADC1_StartConversion();
  while(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == RESET);
  adcVal = ADC1_GetConversionValue();
  
  // 轉換數據到重量值
  weight = (adcVal

return weight;
}

void displayWeight(uint16_t weight)
{
// 將數字轉換為字元
char weightStr[6];
sprintf(weightStr, "%05d", weight);

// 顯示數字
uint8_t i = 0;
for(i = 0; i < 5; i++)
{
sendDigit(weightStr[i]);
}
}

void sendDigit(char digit)
{
// 顯示器地址
const uint8_t addr = 0x3F;

// 字元數字表
const uint8_t numTable[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66,
0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// 轉換字元為數字
uint8_t num = 0;
if(digit >= '0' && digit <= '9')
{
num = numTable[digit - '0'];
}

// 發送數字到顯示器
I2C_GenerateSTART(ENABLE);
while(!I2C_CheckEvent(I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(addr << 1, I2C_DIRECTION_TX);
while(!I2C_CheckEvent(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(num);
while(!I2C_CheckEvent(I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(ENABLE);
}
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-2-29 17:34

回頂部