作業1,秒錶,定時器的實現

2022-06-16 16:21:12 字數 3051 閱讀 3140

主要任務為

1,oled顯示秒錶時間,當前模式

2,秒錶模式可以記錄幾個時間

3,秒錶模式下10ms傳送串列埠資料,當前時間和模式

4,通過按鍵更改,轉換成定時器模式

5,定時器模式下可以自行設定初始時間,並倒計時

6,倒計時情況下燈逐漸熄滅

秒錶部分

if (!flag)}//ks0作為開始按鈕,點選後啟動程式

unsigned ti=0

;//用於記錄當前儲存了多少資料

hal_tim_base_start_it(&htim2);//啟動定時器二

while (1

)

i++;//i為i*100ms

if(i<10)//由於個位特殊性,單獨判斷

else

for(j=cnt;j>=2;j--)oled_shownum((cnt-j)*10,0,num[j],1,1

); oled_showchar((cnt-1)*10,0,'

,',1);oled_shownum(cnt*10,0,num[1],1,1

); }

ks0 =hal_gpio_readpin(k0_gpio_port,k0_pin);//按鈕判斷區域

if(ks0!=gpio_pin_set)//重置

if(ks1!=gpio_pin_set)//繼續

ks4=hal_gpio_readpin(k4_gpio_port,k4_pin);//記錄資料

if(ks4!=gpio_pin_set)

else

for(j=cnt;j>=2;j--)oled_shownum((cnt-j)*10,ti*2,num[j],1,1

); oled_showchar((cnt-1)*10,ti*2,'

,',1);oled_shownum(cnt*10,ti*2,num[1],1,1

); }

}}}}

}

while(1)

}

定時器部分

//初始化,k這裡是作為k*1000ms,因為設定時是1s為精度,開啟時將k乘十作為k*100ms即可
if

(flag)

ks0 =hal_gpio_readpin(k0_gpio_port,k0_pin);

ks1 =hal_gpio_readpin(k1_gpio_port,k1_pin);

ks3 =hal_gpio_readpin(k3_gpio_port,k3_pin);

if(ks0!=gpio_pin_set)

for(j=cnt;j>=1;j--)oled_shownum((cnt-j)*10,0,num[j],1,1

); }}

if(ks1!=gpio_pin_set)

for(j=cnt;j>=1;j--)oled_shownum((cnt-j)*10,0,num[j],1,1

); }}

if(ks3!=gpio_pin_set)

//pwm設為初始低電平

if(k<10)

else

for(j=cnt;j>=2;j--)oled_shownum((cnt-j)*10,0,num[j],1,1

); oled_showchar((cnt-1)*10,0,'

,',1);oled_shownum(cnt*10,0,num[1],1,1

); }

dutycycle=k*1000/maxx;//將當前k與總時間的關係轉化成占空比,達到逐漸熄滅的效果

__hal_tim_set_compare(&htim8, tim_channel_1, 1000-dutycycle);

}hal_tim_base_stop_it(&htim5);}}

}

定時器中斷程式

void hal_tim_periodelapsedcallback(tim_handletypedef *htim)

if (htim->instance ==htim5.instance)

k--;

}

最後是一些初始化變數和標頭檔案

#include "

main.h

"#include

"i2c.h

"#include

"tim.h

"#include

"usart.h

"#include

"gpio.h

"#include

"oled.h

"gpio_pinstate ks0,ks1,ks2,ks3,ks4 ;

unsigned

int di=1,kb1,i=0,k=0,flag=0

; mx_gpio_init();

mx_i2c1_init();

mx_usart1_uart_init();

mx_tim3_init();

mx_tim8_init();

mx_tim2_init();

mx_tim5_init();

oled_init();

hal_tim_pwm_start(&htim8,tim_channel_1);//開啟pwm

printf函式

#include "

stdio.h

"#ifdef __gnuc__

#define putchar_prototype int __io_putchar(int ch)

#else

#define putchar_prototype int fputc(int ch, file *f)

#endif

putchar_prototype

over

使用核心定時器的秒字元裝置

秒字元裝置 秒字元裝置也是字元驅動,所以與之前的字元裝置驅動程式的框架類似,模組編譯,模組載入與解除安裝也與核心模組的編譯,載入解除安裝一致。秒字元裝置驅 second 的實現,建立目錄 second 在該目錄下建立裝置檔案 second.c 內容按下面的 寫即可,在同一目錄下編寫相應的makefi...

利用定時器1實現流水燈

首先要求使用定時器1,且定時1s,那麼先將基礎的初始化函式完成,計算初值為1ms.在服務函式中定義乙個計數變數count並且讓count自增,當count 1000時即達到要求的1s.接著題目要求led燈 先從左至右,再從右至左移動,這一功能通過使用左移函式與右移函式來完成,具體看示例程式 incl...

Linux下定時器的使用及實現秒以下精確定時與休眠

linux下定時器的使用 alarm setitimer 1 alarm 如果不要求很精確的話,用alarm 和signal 就夠了 unsigned int alarm unsigned int seconds 函式說明 alarm 用來設定訊號sigalrm在經過引數seconds指定的秒數後傳...