導航:首頁 > 操作系統 > 單片機軟計時

單片機軟計時

發布時間:2023-03-15 06:09:28

① 51單片機怎麼實現計時

嘿嘿 還是讓俺來幫你解決吧
1 關於定時器定時時間的計算問題:
如果使用的是12M晶振計算,指令周期1uS,定時器是加1計數器,即是對內部時鍾即指令周期脈沖計數 每當1uS到時,計數器加1。
假設 定時器的初始值=X,則每到1uS 計數器的值就加1 ,則計數器值=X+1+1+...+1 值越來越大,最後達到FFFFH+1 就會產生溢出 結果計數器值回0(FFFFH+1=65536)
可以推出 定時時間=計數的1的個數×1uS=(65536—X )1 uS
結論: 定時時間跟初始值即時間常數X有關。
如果要定時0.5毫秒=500uS 根據定時時間公式 500=(65536—X )
即X=(65536-500) 一般把高8位送TH0 即 (65536-500)/256
把 (65536-500)%256即除上256後的余數 即低8位數送給TL0
每當定時時間到 計數器值都回0 必須重新送時間常數X
2每條指令的時間怎麼算? 答復:
可以查指令表 每一條指令的執行時間的周期數 都是固定的 如 NOP 為一個機器周期
MOV R6,#200; 為2個機器周期
機器周期=12/晶振頻率 如果晶振頻率=12MHZ 則機器周期=1 uS
就可以知道 ; 執行NOP指令的執行時間為 1 uS
執行MOV R6,#200指令的執行時間為 2 uS
因此 是可以精確計算出指令的延時時間的
呵呵 就介紹這些吧 滿意就 給加分吧

② 單片機如何計時

2個按鈕分別接在2個中斷口上,為單片機擴展一個數碼管,2位還是4位看你需要顯示多少了,或者使用6位,分別顯示時,分,秒
程序是:單片機啟動,初始化,循環等待
中斷0中斷,開始啟動定時器,定時50毫秒,計數20次,計數的值為秒;
秒>60,則分+1,分>60,則時+1.
分別把時分秒數據送到數碼管,數碼管刷新
中斷1中斷,中斷1服務子程序取消定時器中斷,計時停止。

電路硬體:
1、at89c51
2、常開按鈕(輕觸開關)2隻
3、共陰數碼管,6隻。
4、單片機最小系統必須的晶振1塊,電容30pF,2隻,復位電路需要的10u電解電容1隻,電阻10K一隻,開關1隻,供電另計
因為外部器件不多,就直接用P2送數碼管位碼,沒有擴展顯示晶元。

③ 51單片機軟體延時和定時器的區別

區別就是用單片機軟體定時,CPU循環執行一小段延時程序,浪費CPU的精力,用定時器定時,CPU就可以干別的。

如果是程序延時的話,時間消耗在(延時程序+剩下的代碼);計時器中斷則相當於把延時程序交給定時器,此時CPU可以干別的事情,提高了效率。就類似於電腦打游戲時把圖形處理任務交給顯卡,CPU的壓力就小。

單片機進中斷後執行中斷里的程序,比如你進定時中斷,執行完後退出中斷後做其他事,但定時還在計數,這樣計數和做其他事情兩不誤。

你的程序中本來就沒做其他事情,你的LED移動就是等待中斷計數到10才操作的,LED動作的先決條件就是中斷計數結束。

(3)單片機軟計時擴展閱讀

1、軟體循環延時:採用循環語句,如for,while等,進行長時間的空操作,或者空語句。


優點:程序理解簡易,入手快,新手必備武器。


缺點:時間精度不高,且佔用單片機大量時間資源,引發其它子函數的不流暢(卡滯、遲鈍),導致系統實時反應能力下降。


2、定時延時:採用定時器定時,如T0,T1;


優點:時間精度高,提高系統程序執行的高效性,不影響子函數的正常運行。

缺點:需佔用1個定時器資源(可以復用),需良好程序構架支持,入手難。


個人建議:一旦學會定時器,就不應該再使用「循環延時」函數,採用定時器才是正道。如果對延時精度要求不高,建議使用結構體組成多個延時體。

④ 利用51單片機,4個數碼管設計一個計時器,要求在數碼管上顯示的數據從0開始每1秒鍾加1。

共陽數碼管中斷程序:

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

uchar code table[]=

{

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x83,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e};

uint num,a;

uchar ,shi,ge;

void init();

void delay(uint);

void display(uchar,ucharshi,ucharge);

uint fb();

uint fs();

uint fg();

void main()

{

init();

while(1)

{

display(fb(),fs(),fg());

}

}

void init()

{

num=0;

a=0;

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

void display(uchar,ucharshi,ucharge)

{

P1=0xfd;

P0=table[];

delay(1);

P1=0xfb;

P0=table[shi];

delay(1);

P1=0xf7;

P0=table[ge];

delay(1);

}

void timeoff() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65526-50000)%256;

a++;

if(a%20==0)

{

num++;

if(num==999)

{

num=0;

}

}

}
void delay(uint z)
{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uint fb()

{

=num/100;

return ;

}

uint fs()

{

shi=num%100/10;

return shi;

}

uint fg()

{

ge =num%100%10;

return ge;

}

(4)單片機軟計時擴展閱讀

2個可編程定時/計數器·5個中斷源,2個優先順序(52有6個)

一個全雙工串列通信口

外部數據存儲器定址空間為64kB

外部程序存儲器定址空間為64kB

邏輯操作位定址功能·雙列直插40PinDIP封裝

單一+5V電源供電

CPU:由運算和控制邏輯組成,同時還包括中斷系統和部分外部特殊功能寄存器;

RAM:用以存放可以讀寫的數據,如運算的中間結果、最終結果以及欲顯示的數據;

ROM:用以存放程序、一些原始數據和表格;

I/O口:四個8位並行I/O口,既可用作輸入,也可用作輸出

T/C:兩個定時/記數器,既可以工作在定時模式,也可以工作在記數模式;

五個中斷源的中斷控制系統;

一個全雙工UART(通用非同步接收發送器)的串列I/O口,用於實現單片機之間或單片機與微機之間的串列通信;

片內振盪器和時鍾產生電路,石英晶體和微調電容需要外接。最佳振盪頻率為6M—12M。

參考資料來源:網路-51單片機



⑤ 51單片機用軟體定時來控制舵機,延時函數怎麼寫求解

延時可以用定時器來實現,也可以自己寫延時函數。
這是51單片機定時器初始化示常式序。
TMOD = 0x10f; //GATE=0 01010001
//C/T=0--定時/計數器1工作於定時方式
//M1=1;M0=0--選擇工作模式1,構成最大定時器
//T0:在此程序不使用
TL1 = 0x13; TH1 = 0x2C; //指定定時時間為50ms 65536-50/(11.0592/12)=11283=2C13h
EA = 1; //開總中斷
TF1 = 0;
ET1 = 1; //開定時器中斷
TR1 = 1; //開始計時
如果用延時函數,要精確計算時間。
這是精確定時1ms的程序,你可以參考一下。
void delay1ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}

⑥ 51單片機十秒簡易計時器

因為樓主說,(不要太大面積修改)。
所以,就沒有敢進行大面積的修改。

只簡單的改改,未必能好用,僅供參考:

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

sbit key1=P2^7;
sbit key2=P2^6;
sbit weiH=P3^0;
sbit weiM=P3^1;
sbit weiL=P3^2;

uint num=0,ge=0,shi=0,fen=0,k;
//num用來計數,ge為各位顯示,shi為十位顯示,fen為分鍾顯示

void delayms(uint xms) //i=xms即延時約xms毫秒
{
uint i,j;
for(i=xms;i>0;i--) for(j=110;j>0;j--);
}

uchar key1scan()
{
if(key1==0) {
delayms(10);
if(key1==0) {
while(!key1) showtime();//等待釋放期間,也進行顯示
return 1;
}
}
return 0;//添上了返回值
}

uchar key2scan()
{
if(key2==0) {
delayms(10);
if(key2==0) {
while(!key2) showtime();
return 1;
}
}
return 0;//添上了返回值
}

void showtime() //時間顯示
{

//這里去掉了while(1) ,避免了死循環

P1=0xff; weiL=1; P1=table[ge]; delayms(5); weiL=0;//顯示秒的個位
P1=0xff; weiM=1; P1=table[shi]; delayms(5); weiM=0;//顯示秒的十位
P1=0xff; weiH=1; P1=table[fen]; delayms(5); weiH=0;//顯示分鍾,
}

閱讀全文

與單片機軟計時相關的資料

熱點內容
海牛微視app怎麼用 瀏覽:70
單片機怎樣選變壓器 瀏覽:829
癌症pdf 瀏覽:725
雲伺服器鏡像批量部署環境 瀏覽:683
安卓手機瀏覽器能訪問什麼網站 瀏覽:254
找不到網站的伺服器ip地址該如何解決 瀏覽:743
演算法十個數降序排列 瀏覽:95
基於單片機的老年人健康監測系統 瀏覽:706
python入門經典pdf下載 瀏覽:17
東芝變頻2p空調壓縮機 瀏覽:227
自家wifi怎麼能加密 瀏覽:644
紅米k40加密門禁卡 瀏覽:847
什麼樣的源碼好看 瀏覽:156
手機主伺服器有什麼用 瀏覽:612
程序編寫命令 瀏覽:597
android發送心跳包 瀏覽:385
指標源碼和原理 瀏覽:700
汽車空調壓縮吸盤 瀏覽:208
崽崽因app版本不同不能邀請怎麼辦 瀏覽:686
poa演算法得到的解為全局最優解 瀏覽:926