利用定時器實現51微控制器返回上電執行時間功能
我們知道在windows等作業系統裡可以呼叫API函式獲取系統執行的時間。在Arduino裡也有兩個函式millis()和micros(),可以分別獲得Arduino程式從上電以來累計執行時間的毫秒數和微秒數。我們可以利用51微控制器的定時器中斷實現這個功能。
具體實現的思路是設定1個長整型的全域性時間變數sysRunmillis儲存微控制器上電後的執行時間。讓定時器每1毫秒產生1次中斷,在中斷響應函式裡讓全域性變數sysRunmillis自加1。這個長整型的變數最大值是4294967295毫秒,換算下來就是49天17時2分47秒,然後從0開始繼續計時。
這樣我們可以在程式裡隨時讀取當前時間,實現精確計時、軟體延時等功能。比如要延時n毫秒,我們可以用下面的程式碼實現:
Void delaynmillis(unsigned int n)
{
Unsigned long t;
t=sysRunmillis;//先儲存當前時間
While(sysRunmillis-t<n);迴圈等待直到n毫秒
}
下面的程式實時顯示51微控制器上電執行的時間,其中大部分程式碼用來實現在動態數碼管上顯示時間。
/*
利用定時器中斷實現51微控制器輸出系統上電累計執行時間
****李蘭林,2020年12月6日,甘肅白銀
*/
#include <reg51.h>
#include <intrins.h>
sbit RCK=P3^5;//定義74HC595儲存暫存器時鐘引腳
sbit SCK=P3^6;//定義74HC595移位暫存器時鐘引腳
sbit SER=P3^4;//定義74HC595序列輸入引腳
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
u32 sysRunmillis; //系統執行時間計數,儲存微控制器從上電覆位以來執行的時間,單位是毫秒。該數值由定時器T0的中斷響應子函式更新
u8 hour,min,sec; //當前系統執行時間換算成小時數、分數和秒數
u8 strTime[]={0,0,0,0,0,0,0,0}; //儲存時分秒每1位上的數字(0~9),分隔符‘-’的值是10
u8 DigCode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//共陰極數碼管段碼
//把全域性變數sysRunmillis儲存的毫秒數轉換成時分秒格式,把時分秒的每一位數字(0~9)儲存在陣列strTime裡。
void millis2time()
{
u32 t;
t=sysRunmillis/1000; //毫秒轉換為秒
hour=t/3600%24; //計算小時數
min=(t%3600)/60; //計算分
sec=t%60; //計算秒
//以下處理時、分、秒每1位,如時分秒數值小於10,補加0佔位。
if(hour<10)
{
strTime[0]=0;
strTime[1]=hour;
}
else
{
strTime[0]=hour/10;
strTime[1]=hour%10;
}
if(min<10)
{
strTime[3]=0;
strTime[4]=min;
}
else
{
strTime[3]=min/10;
strTime[4]=min%10;
}
if(sec<10)
{
strTime[6]=0;
strTime[7]=sec;
}
else
{
strTime[6]=sec/10;
strTime[7]=sec%10;
}
}
//給74HC95傳送數碼管位選和段碼資料
void _74HC595SendByte(u8 wei,u8 duan)
{
u8 i;
RCK=0;
for(i=0;i<8;i++)
{
SCK=0;
_nop_();
SER=wei>>7;
SCK=1;
_nop_();
wei<<=1;
}
for(i=0;i<8;i++)
{
SCK=0;
_nop_();
SER=duan>>7;
SCK=1;
_nop_();
duan<<=1;
}
RCK=1;
}
//初始化定時器T0
void InitTimer0()
{
TMOD = 0x01;
TH0 = 0xFC; //計數初值1000,每1毫秒中斷1次
TL0 = 0x18;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x18;
sysRunmillis++; //每1毫秒加1
}
void delaynms(u8 millis) //延時n毫秒
{
u32 temp;
temp=sysRunmillis;
while(millis>sysRunmillis-temp);
}
void main()
{
u8 i;
InitTimer0();
strTime[2]=10;
strTime[5]=10;
while(1)
{
millis2time();
for(i=0;i<8;i++)
{
_74HC595SendByte(~(0x01<<i),DigCode[strTime[i]]);
delaynms(1);
}
}
}
下圖是程式執行結果。
相關文章
- 基於51微控制器的定時器定時器
- 51微控制器內部定時器/計數器實驗定時器
- 51微控制器定時器數碼管顯示定時器
- 【STM32F4】利用定時器實現最基本的定時功能(HAL)定時器
- 使用監聽器實現JavaWeb的定時執行JavaWeb
- 51定時器/計數器齊上陣,借鑑定時器
- 51微控制器實現流水燈
- javaweb使用監聽器實現定時週期性執行任務的功能JavaWeb
- ScheduledThreadPoolExecutor實現定時器和延時載入功能thread定時器
- 51微控制器C語言延時函式C語言函式
- 直播app原始碼,定時開關,實現計時器功能APP原始碼
- Qt中利用定時器QTimer實時顯示當前日期和時間QT定時器
- PHP定時執行任務的實現PHP
- 51模組_定時器與中斷定時器
- Qt中利用定時器QTimer準實時顯示當前日期和時間QT定時器
- Android利用AlarmManager執行定時任務Android
- javascript實現時間器JavaScript
- python 實現計時器,統計執行時長Python
- .NET程式碼樹執行時間計時器
- 初學51微控制器--網上教程(51自學網)
- ios 多執行緒定時器iOS執行緒定時器
- Unity——計時器功能實現Unity
- C51-------時鐘程式(C語言編寫的微控制器時鐘)C語言
- 51微控制器實現數碼管顯示
- angularjs中的interval定時執行功能AngularJS
- C# 中利用執行時編譯實現泛函C#編譯
- python之為函式執行設定超時時間(允許函式執行的最大時間)Python函式
- js如何實現一定時間後去執行一個函式JS函式
- python裝飾器 執行時間Python
- Python使用signal模組實現定時執行Python
- abap執行時間
- 馴服定時器和執行緒定時器執行緒
- Laravel 執行時類的功能擴充套件的實現Laravel套件
- 1、51微控制器實現LED燈的閃爍
- 定時 MYSQL 動作-LINUX下用CRON實現定時執行指令碼(轉)MySqlLinux指令碼
- MySQL定時執行MySql
- 微控制器學習(六)定時器的使用定時器
- 使用ASM框架實現統計函式執行時間ASM框架函式