冰楓論壇

 找回密碼
 立即註冊
搜索
查看: 604|回覆: 0
打印 上一主題 下一主題

[討論] STM8S103F3P6製作4 位數字時鐘

[複製鏈接]

2609

主題

0

好友

1004

積分

金牌會員

Rank: 6Rank: 6

UID
373967
帖子
9013
主題
2609
精華
0
積分
1004
楓幣
0
威望
981
存款
35926
贊助金額
0
推廣
0
GP
1205
閱讀權限
70
在線時間
460 小時
註冊時間
2023-1-12
最後登入
2024-12-23

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

跳轉到指定樓層
1
發表於 2023-3-31 19:52:13 |只看該作者 |倒序瀏覽
STM8S103F3P6製作4 位數字時鐘
需要以下材料:

STM8S103F3P6微控制器
4位共陰極數碼管
DS1302實時時鐘模塊
20MHz晶振
電容:2 x 22pF,1 x 100nF
電阻:1 x 10kΩ,1 x 330Ω
2個按鈕開關
面包板
杜邦線
接線方式如下:


PA1 -> 時鐘的SCLK
PA2 -> 時鐘的DAT
PA3 -> 時鐘的CE
PB0-PB3 -> 4位共陰極數碼管的控制端
PA4, PA5 -> 按鈕開關的控制端
PC3 -> 晶振的X1
PC4 -> 晶振的X2
其中,按鈕開關用於設置時間和調整時鐘的時間。

程式碼如下:


#include <stdio.h>
#include <stdlib.h>
#include "stm8s.h"
#include "stm8s_gpio.h"
#include "stm8s_tim1.h"
#include "stm8s_clk.h"
#include "stm8s_spi.h"

#define DIGIT1 GPIO_PIN_0
#define DIGIT2 GPIO_PIN_1
#define DIGIT3 GPIO_PIN_2
#define DIGIT4 GPIO_PIN_3

#define CE_PIN GPIO_PIN_3
#define SCLK_PIN GPIO_PIN_1
#define DAT_PIN GPIO_PIN_2

#define BTN1_PIN GPIO_PIN_4
#define BTN2_PIN GPIO_PIN_5

#define RTC_WRITE_MODE 0x8E
#define RTC_READ_MODE 0x8F

static const uint8_t DIGITS[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };

uint8_t hour = 12;
uint8_t minute = 0;

void GPIO_Config(void);
void TIM1_Config(void);
void SPI_Config(void);
void RTC_Init(void);
void RTC_ReadTime(void);
void RTC_WriteTime(void);

void main()
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  GPIO_Config();
  TIM1_Config();
  SPI_Config();
  RTC_Init();
  
  enableInterrupts();
  
  while(1)
  {
    RTC_ReadTime();
   
    GPIO_WriteLow(GPIOB, DIGIT1);
    GPIO_Write(GPIOB, DIGITS[hour / 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT1);
    GPIO_WriteLow(GPIOB, DIGIT2);
    GPIO_Write(GPIOB, DIGITS[hour % 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT2);
    GPIO_Write

#include <stdio.h>
#include <stdlib.h>
#include "stm8s.h"
#include "stm8s_gpio.h"
#include "stm8s_tim1.h"
#include "stm8s_clk.h"
#include "stm8s_spi.h"

#define DIGIT1 GPIO_PIN_0
#define DIGIT2 GPIO_PIN_1
#define DIGIT3 GPIO_PIN_2
#define DIGIT4 GPIO_PIN_3

#define CE_PIN GPIO_PIN_3
#define SCLK_PIN GPIO_PIN_1
#define DAT_PIN GPIO_PIN_2

#define BTN1_PIN GPIO_PIN_4
#define BTN2_PIN GPIO_PIN_5

#define RTC_WRITE_MODE 0x8E
#define RTC_READ_MODE 0x8F

static const uint8_t DIGITS[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };

uint8_t hour = 12;
uint8_t minute = 0;

void GPIO_Config(void);
void TIM1_Config(void);
void SPI_Config(void);
void RTC_Init(void);
void RTC_ReadTime(void);
void RTC_WriteTime(void);

void main()
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  GPIO_Config();
  TIM1_Config();
  SPI_Config();
  RTC_Init();
  
  enableInterrupts();
  
  while(1)
  {
    RTC_ReadTime();
   
    GPIO_WriteLow(GPIOB, DIGIT1);
    GPIO_Write(GPIOB, DIGITS[hour / 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT1);
    GPIO_WriteLow(GPIOB, DIGIT2);
    GPIO_Write(GPIOB, DIGITS[hour % 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT2);
    GPIO_WriteLow(GPIOB, DIGIT3);
    GPIO_Write(GPIOB, DIGITS[minute / 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT3);
    GPIO_WriteLow(GPIOB, DIGIT4);
    GPIO_Write(GPIOB, DIGITS[minute % 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT4);
  }
}

void GPIO_Config()
{
  GPIO_DeInit(GPIOA);
  GPIO_DeInit(GPIOB);
  GPIO_DeInit(GPIOC);
  
  GPIO_Init(GPIOB, DIGIT1|DIGIT2|DIGIT3|DIGIT4, GPIO_MODE_OUT_PP_LOW_FAST);
  
  GPIO_Init(GPIOA, SCLK_PIN|DAT_PIN|CE_PIN|BTN1_PIN|BTN2_PIN, GPIO_MODE_IN_PU_NO_IT);
  
  GPIO_Init(GPIOC, GPIO_PIN_3|GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);
}

void TIM1_Config()
{
  TIM1_DeInit();
  TIM1_TimeBaseInit(0, TIM

#include <stdio.h>
#include <stdlib.h>
#include "stm8s.h"
#include "stm8s_gpio.h"
#include "stm8s_tim1.h"
#include "stm8s_clk.h"
#include "stm8s_spi.h"

#define DIGIT1 GPIO_PIN_0
#define DIGIT2 GPIO_PIN_1
#define DIGIT3 GPIO_PIN_2
#define DIGIT4 GPIO_PIN_3

#define CE_PIN GPIO_PIN_3
#define SCLK_PIN GPIO_PIN_1
#define DAT_PIN GPIO_PIN_2

#define BTN1_PIN GPIO_PIN_4
#define BTN2_PIN GPIO_PIN_5

#define RTC_WRITE_MODE 0x8E
#define RTC_READ_MODE 0x8F

static const uint8_t DIGITS[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90 };

uint8_t hour = 12;
uint8_t minute = 0;

void GPIO_Config(void);
void TIM1_Config(void);
void SPI_Config(void);
void RTC_Init(void);
void RTC_ReadTime(void);
void RTC_WriteTime(void);

void main()
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  GPIO_Config();
  TIM1_Config();
  SPI_Config();
  RTC_Init();
  
  enableInterrupts();
  
  while(1)
  {
    RTC_ReadTime();
   
    GPIO_WriteLow(GPIOB, DIGIT1);
    GPIO_Write(GPIOB, DIGITS[hour / 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT1);
    GPIO_WriteLow(GPIOB, DIGIT2);
    GPIO_Write(GPIOB, DIGITS[hour % 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT2);
    GPIO_WriteLow(GPIOB, DIGIT3);
    GPIO_Write(GPIOB, DIGITS[minute / 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT3);
    GPIO_WriteLow(GPIOB, DIGIT4);
    GPIO_Write(GPIOB, DIGITS[minute % 10]);
    TIM1_Cmd(ENABLE);
    while(!TIM1_GetFlagStatus(TIM1_FLAG_UPDATE));
    TIM1_ClearFlag(TIM1_FLAG_UPDATE);
   
    GPIO_WriteHigh(GPIOB, DIGIT4);
  }
}

void GPIO_Config()
{
  GPIO_DeInit(GPIOA);
  GPIO_DeInit(GPIOB);
  GPIO_DeInit(GPIOC);
  
  GPIO_Init(GPIOB, DIGIT1|DIGIT2|DIGIT3|DIGIT4, GPIO_MODE_OUT_PP_LOW_FAST);
  
  GPIO_Init(GPIOA, SCLK_PIN|DAT_PIN|CE_PIN|BTN1_PIN|BTN2_PIN, GPIO_MODE_IN_PU_NO_IT);
  
  GPIO_Init(GPIOC, GPIO_PIN_3|GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);
}

void TIM1_Config()
{
  TIM1_DeInit();
  TIM1_TimeBaseInit(0, TIM

  TIM1_OC1Init(TIM1_OCMODE_PWM1, TIM1_OUTPUTSTATE_ENABLE, TIM1_OUTPUTNSTATE_DISABLE,
               500, TIM1_OCPOLARITY_HIGH, TIM1_OCNPOLARITY_LOW, TIM1_OCIDLESTATE_RESET,
               TIM1_OCNIDLESTATE_RESET);
  
  TIM1_Cmd(DISABLE);
  TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
}

void SPI_Config()
{
  SPI_DeInit();
  SPI_Init(SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_2, SPI_MODE_MASTER, SPI_CLOCKPOLARITY_LOW,
           SPI_CLOCKPHASE_1EDGE, SPI_DATADIRECTION_1LINE_TX, SPI_NSS_SOFT, 0x07);
  SPI_Cmd(ENABLE);
}

void RTC_Init()
{
  SPI_Write(GPIOC, CE_PIN, RTC_WRITE_MODE);
  SPI_Write(GPIOC, DAT_PIN, 0x00);
  SPI_Write(GPIOC, DAT_PIN, 0x80);
  SPI_Write(GPIOC, DAT_PIN, 0x86);
  SPI_Write(GPIOC, CE_PIN, RTC_READ_MODE);
}

void RTC_ReadTime()
{
  uint8_t hour_bcd, min_bcd;
  
  SPI_Write(GPIOC, CE_PIN, RTC_READ_MODE);
  
  hour_bcd = SPI_Read(GPIOC, DAT_PIN);
  min_bcd = SPI_Read(GPIOC, DAT_PIN);
  
  hour = ((hour_bcd & 0x30) >> 4) * 10 + (hour_bcd & 0x0F);
  minute = ((min_bcd & 0x70) >> 4) * 10 + (min_bcd & 0x0F);
}

void RTC_WriteTime()
{
  uint8_t hour_bcd, min_bcd;
  
  hour_bcd = ((hour / 10) << 4) | (hour % 10);
  min_bcd = ((minute / 10) << 4) | (minute % 10);
  
  SPI_Write(GPIOC, CE_PIN, RTC_WRITE_MODE);
  SPI_Write(GPIOC, DAT_PIN, 0x00);
  SPI_Write(GPIOC, DAT_PIN, hour_bcd);
  SPI_Write(GPIOC, DAT_PIN, min_bcd);
}

INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
  
  if(!GPIO_ReadInputPin(GPIOA, BTN1_PIN))
  {
    hour++;
    if(hour > 23) hour = 0;
    RTC_WriteTime();
  }
  
  if(!GPIO_ReadInputPin(GPIOA, BTN2_PIN))
  {
    minute++;
    if(minute > 59) minute = 0;
    RTC_WriteTime();
  }
}
這段程式碼使用SPI通訊與RTC進行溝通,並使用定時器和GPIO驅動4位7段顯示器。還有兩個按鈕用於調整時間。您需要將此代碼編譯並燒錄到您的STM8S103F3P6單片機上,才能使用它來製作4位數字時鐘。
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1鑰匙
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們管群招募本站規範DMCA隱私權政策

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

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

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

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

GMT+8, 2024-12-24 03:53

回頂部