❶ 如何用單片機做一個簡單的倒計時器
51單片機實現數碼管99秒倒計時,其實很簡單,就是使用定時器中斷來實現。目的就是學習怎樣用單片機實現倒計時,從而實現一些延時控制類的東西,99秒只是一個例子,你完全可以做出任意倒計時如10秒倒計時程序。定時器定時時間計算公式:初值X=M(最大計時)-計數值。
初值,換算成十六進制,高位給TH0,低位給TL0,如果用定時器0的話。
M(最大計時)如果是16位的,就是2的16次方,最大定時,65535 微秒,實現1秒定時,可以通過定時10毫秒,然後100次改變一次秒值即可。10*100毫秒=1S
計數值:你要定時多長時間,如果定時1毫秒,就是1000微秒,(單位為微秒),如果定時10毫秒,就是10000(微秒),當然,最大定時被定時器本身位數限制了,最大2的16次方(16位定時計數器),只能定時65.535毫秒。定時1S當然不可能1S定時器中斷。
下面為實現99秒倒計時C語言源程序
/*了解定時器,這樣的話,就可以做一些基本的實驗了,如定時炸彈~~,10秒後打開關閉繼電器*/
/*數碼管,12M晶振*/
#include <reg52.h>
#define uchar unsigned char
sbit p11=P1^1; //連的是繼電器。。
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD|=0x01; /*定時器0 16位定時器 X=65535-10000(10毫秒)=55535=D8F0(十六進制)定時10ms
*/
TH0=0xd8;
TL0=0xf0;
IE=0x82; //這里是中斷優先順序控制EA=1(開總中斷),ET0=1(定時器0允許中斷),這里用定時器0來定時
TR0=1; //開定時器0
while(1)
{
P0=shiwei; //99的十位
P2=0; //99的個位,
delay(300); //動態掃描數碼管延時
P0=gewei;
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1 //定時器0中斷
{
static uchar second=99,count; //99隻是一個數,可以任意改,因為這里只學習怎樣實現倒計時
TH0=0xd8; //定時10毫秒
TL0=0xf0;
count++;
if(count==100) //10毫秒定時,10*100=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0)
{
p11=0; //這里讓繼電器動作,當然動作之後,要復位才能等下次倒定時再動作。
second=99; //回到99再循環來,當然,可以做其他的控制,
}
shiwei=tab[second/10]; //數碼管10位
gewei=tab[second%10]; //數碼管個位
}
❷ 單片機100秒倒計時程序(兩位數碼管,設置復位和開始兩個按鈕)
簡單說兩句,這個也不是很難,有很多種方案,說一個吧,首先是兩位數碼管的驅動,可以選擇單片機帶max7219然後外擴兩個led數碼管,硬體連接既簡單也成熟,並且單片機驅動程序也是很成熟的,這樣通過程序可以隨時改變數碼管顯示,然後就是復位鍵和開始鍵,可以使用中斷或查詢方式,如果是中斷,直接將其連接到外部中斷和1上,如果是查詢直接連到單片機的兩個GPIO上,最好做個防抖動電路,防止多次運行,具體程序應該也不是很困難,呵呵,就是有點麻煩。
❸ 匯編語言 51單片機 倒計時器程序
這是一個倒計時案例,你可以參考一下:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB ET0
SETB EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#9
CLR 00H
CLR 01H
LOOP:
JB P1.0,LP01
JNB P1.0,$
SETB TR0
CLR 01H
SJMP LOOP0
LP01:
JB P1.1,LP02
JNB P1.1,$
SETB 01H
SJMP LOOP0
LP02:
JB P1.2,LOOP0
JNB P1.1,$
CLR TR0
MOV P3,#0FDH
MOV P2,#0
MOV P3,#0FEH
MOV P2,#0
SJMP MAIN
LOOP0:
JB 00H,LOOP1
MOV A,R0
SJMP LOOP2
LOOP1:
MOV A,R1
LOOP2:
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R3,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
JB 01H,T0C
INC R2
T0C:
CPL 00H
MOV A,R3
JB 00H,T001
MOV P3,#0FDH
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV P2,A
T002:
MOV A,R2
CJNE A,#100,T0E
MOV R2,#0
MOV A,R0
JZ T003
DEC R0
SJMP T0E
T003:
MOV A,R1
JZ T004
DEC R1
MOV R0,#9
T0E:
RETI
T004:
CLR TR0
RETI
TABLE: ; 共陰極數碼管顯示代碼表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
❹ 51單片機做一個10秒倒計時的程序
C語言
#include
#define
uint
unsigned
int
#define
uchar
unsigned
char
sbit
p27=P2^7;//數碼管位選端定義
uchar
c,i;
//數碼管解碼表
unsigned
char
code
NumDecode[]
=
{
0XC0,//;0
0XF9,//;1
0XA4,//;2
0XB0,//;3
0X99,//;4
0X92,//;5
0X82,//;6
0XF8,//;7
0X80,//;8
0X90,//;9
};
void
main()
{
i=0;//10秒計時設置
c=0;//中斷次數計數
p27=1;//數碼管位選端關閉
TMOD=1;//設置定時器0為工作方式1
TH0=(65536-46080)/256;//定時50ms高8位求模
TL0=(65536-46080)%256;//定時50ms低8位求余
EA=1;//開總中斷
ET0=1;//定時器0中斷
TR0=1;//啟動定時器0
while(1)
{
if(c==20)//50ms中斷20次
{
c=0;
i++;//倒計時總數每秒減1
}
if(i<10)
{
p27=0;//數碼管位選選通
P0=NumDecode[i];//顯示數據
}
else
//循環計時設置
{
i=0;
}
}
}
void
timer0()
interrupt
1//定時器0中斷入口
{
TH0=(65536-46080)/256;//定時器重新賦初值
TL0=(65536-46080)%256;
c++;//中斷次數
}
❺ 一個51單片機的倒計時程序
你 display();是個死循環。而且main 也是個死循環。當中斷時間到了一秒後,flag=1;
調用display();
永遠也不會返回了。
建議:顯示子程序用中斷方式。大概10MS刷新一次就可以了。沒必要太快。太慢了會閃。你可以加入我的QQ群:107888487。記得給分哦
❻ 單片機倒計時工作原理
單片機倒計時工作原理。在程序中設置一個時間然後不斷的減少時間,時間減少為0時就是倒計時時間到了。
❼ 如何用單片機做一個簡單的倒計時器
一般我們用定時器來做計時器,實現時間得加。每次中斷發生,用一個變數自增來判斷時間是否到1S,到了之後清零這個變數,另一個時間變數自增來作時間得增加。現在就是要把這個自增的時間變數改為自減,判斷當小於0時,又賦初值,然後繼續自減判斷。
❽ 51單片機數碼管倒計時程序,從999999開始倒計時,用定時器T1的中斷完成
#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
uchar sec=0,min=0,hour;
uchar time;
uchar disdat[6];
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void dischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
void t0isr() interrupt 1 //秒計時
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)
{
time=0;
if(sec>0)sec--;
else if(min>0){sec=99;min--;}
else if(hour>0){sec=99;min=99;hour--;}
}
dischg();
}
void t1isr() interrupt 3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case 0:
P2=0x20;
P0=~ledtab[disdat[5]];
break;
case 1:
P2=0x10;
P0=~ledtab[disdat[4]];
break;
case 2:
P2=0x08;
P0=~ledtab[disdat[3]];
break;
case 3:
P2=0x04;
P0=~ledtab[disdat[2]];
break;
case 4:
P2=0x02;
P0=~ledtab[disdat[1]];
break;
case 5:
P2=0x01;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
TH1=0xec;
TL1=0x78;
TR1=1;
TR0=0;
ET0=1;
ET1=1;
EA=1;
fmq=0;
scanled=0;
time=0;
mode=1;
dischg();
while(1)
{
if(keyhu==0)
{
while(keyhu==0);
TR0=0;
hour++;
hour%=24;
}
if(keyhd==0)
{
while(keyhd==0);
TR0=0;
if(hour>0)hour--;
if(hour==0)hour=23;
}
if(keymu==0)
{
while(keymu==0);
TR0=0;
min++;
min%=60;
}
if(keymd==0)
{
while(keymd==0);
TR0=0;
if(min>0)min--;
if(min==0)min=59;
}
if(keysu==0)
{
while(keysu==0);
TR0=0;
sec++;
sec%=60;
}
if(keysd==0)
{
while(keysd==0);
TR0=0;
if(sec>0)sec--;
if(sec==0)sec=59;
}
if(keyst==0)
{
while(keyst==0);
TR0=~TR0;
}
dischg();
}
}
❾ 單片機六十秒倒計時程序
;數碼管段選接P2口,位選接P3.0和P3.1,
;採用定時器T0定時10ms,60H為1s計數單元,計數100次為1sORG 0000H ;程序從0地址開始
LJMP MAIN ;跳到MAIN處執行
ORG 000BH ;定時器T0
LJMP TIME0
ORG 0030H
MAIN:MOV TMOD,#01H ;設置T0工作在模式1
MOV TH0,#0D8H ;賦初值,定時10ms
MOV TL0,#0F0H
MOV IE,#82H ;開CPU中斷,開定時器0中斷
MOV R3,#60
SETB TR0 ;啟動T0定時器工作
MOV 60H,#100 ;給60H單元賦初值
CLR 4FH ;清零4FH單元
DISPLAY: ;顯示子程序
MOV DPTR,#TAB ;DPTR指向編碼表位置
MOV A,R3 ;將R3的內容復制到A
MOV B,#10
DIV AB ;A除B,商給A,余數給B
MOVC A,@A+DPTR ;根據A的值取出編碼表中的編碼
MOV P2,A ;由P1口輸出A的內容
CLR P3.0 ;清零P2.0
SETB P3.0 ;置位P2.0 MOV A,B
MOVC A,@A+DPTR ;根據A的值取出編碼表中的編碼
MOV P2,A ;由P1口輸出A的內容
CLR P3.1 ;清零P2.1
SETB P3.1 ;置位P2.1
JNB 4FH,DISPLAY ;判斷1秒時間是否到,沒有到,則跳轉到DIAPLAY處
CLR 4FH ;1秒到,清4FH
LJMP DISPLAY ;調用顯示子程序 TIME0:MOV TH0,#0D8H ;賦初值
MOV TL0,#0F0H
DJNZ 60H,TT ;60H單元自減1,判斷是否為0,不為0則跳轉到TT處
MOV 60H,#100 ;60H單元為0,則重新給其賦值100
SETB 4FH ;同時置位4FH單元
DEC R3 ;R3自加1
CJNE R3,#00H,TT ;判斷R3是否為0,否則跳轉TT處
CLR TR0
TT:RETI
TAB: ;編碼表
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;共陰
END ;程序結束
❿ 幫忙解讀一下51單片機99秒倒計時程序。
大概是下面這樣的
ORG 00H ;復位後主程序入口
JMP START ;轉移至主程序
ORG 0BH ;中斷服務程序入口
JMP TIMER ,轉移至中斷
START: MOV TMOD,#01H ;選擇定時器工作方式1
MOV TH0,#0BDH ;定時器0高8位給初始值
MOV TL0,#0C0H ;定時器0給低八位初始值
MOV IE,#82H
MOV 20H,#10 ;地址位20H的寄存器賦值
MOV 21H,#10 ;同上
MOV R7,#16 ;同上
CLR TR0
A4: MOV P2,#19H
CALL DELAY ;調用延時子程序
ANL P2,#00H ;與p2口數據進行與運算
MOV P2,#29H
CALL DELAY ;調用延時子程序
ORL P2,#00H
JB P1.0,A4
SETB TR0 ;打開定時器0
A1: MOV A,20H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ADD A,#10H
MOV P2,A
CALL DELAY
ANL P2,#00H
MOV A,21H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ADD A,#20H
MOV P2,A
CALL DELAY
ANL P2,#00H
MOV A,#01H
CJNE A,21H,A1 ;判斷是否到10
MOV A,#01
CJNE A,20H,A1 ;判斷是否到10
JMP START ;跳入主程序
TIMER: DJNZ R7,A2
MOV TH0,#0BDH
MOV TL0,#0C0H
MOV R7,#16
DJNZ 20H,A2
MOV 20H,#10
DJNZ 21H,A2
MOV 21H,#10
A2: RETI
DELAY: MOV R6,#248
DJNZ R6,$
RET
TABLE: DB 00H,00H,01H,02H,03H,04H ;定義表
DB 05H,06H,07H,08H,09H
END;結束
o(∩_∩)o...,給分吧