A. 51單片機300秒倒計時
修改 num 的定義為 int num;
然後在中斷常式中修改倒計時起始值即可;
B. 匯編語言 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
C. 小白求救,51單片機利用兩個數碼管實現60秒倒計時
個位數能夠顯示正常,那麼就說明十位數的處理代碼出了問題;
給出代碼看看吧
D. 求大神編一道51單片機實現多種倒計時功能
這個不算太難,只要利用標識符進行判斷即可
標識符就是一個變數,常使用字元型變數作為標識符,佔用空間小
每一種狀態都用標識符表示出來,例如狀態0,狀態1,狀態2 ..................狀態254
字元型變數的值范圍是 0 ~ 254 共255個值,夠你用的了
給你一個類似的程序,我自己寫的,你作為參考吧
程序的組成是:兩個按鍵,一組四位數碼管,兩個LED發光二極體
程序的功能是:按下按鍵A,兩個LED同時點亮,並延時10秒(時間隨意修改)
按下按鍵B,兩個LED同時熄滅,並延時10秒(時間隨意修改)
無按鍵按下時,兩個LED交替點亮,達到閃爍的效果
程序如下,並加了注釋,若滿意請採納!
#include <reg51.h> //51單片機通用頭文件
unsigned int i,t,h; char fe;
sbit a=P3^7; sbit b=P3^6; sbit led=P2^7; sbit lad=P2^6;//按鍵及LED埠定義
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延時函數
/***************************************************************************/
void XS(int xs) //數碼管顯示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P1=0xf7; YS(10); P1=0xff;//個位顯示
P0=table[d2]; P1=0xfb; YS(10); P1=0xff;//十位顯示
P0=table[d3]; P1=0xfd; YS(10); P1=0xff;//百位顯示
P0=table[d4]; P1=0xfe; YS(10); P1=0xff;//千位顯示
}
/***************************************************************************/
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01; TR0=1; ET0=1; EA=1;
led=0;lad=1;
while(1)
{
XS(h);//調用數碼管顯示函數
if(a==0){h=10;fe=0;}//按鍵 A, LED 亮10秒
if(b==0){h=10;fe=1;}//按鍵 B, LED 滅10秒
}
}
/***************************************************************************/
void t0()interrupt 1//定時器 0 中斷
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++; t++;
if(h>0){t=0;}//如果按鍵按下,屏蔽 t 計數,
if(t>=5){t=0;led=~led; lad=~lad;}//t計數,用於兩個LED閃爍
if(i>=20)//還是原來的時間判斷
{
i=0;
if(h>0&&fe==0){h--;led=0;lad=0;}//如果是狀態 0 同時點亮兩個LED
if(h>0&&fe==1){h--;led=1;lad=1;}//如果是狀態 1 同時關閉兩個LED
}
if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句防止數碼管倒計時後兩個LED繼續同時點亮
}
/***************************************************************************/
E. c51單片機時鍾,按鍵可使其從當前時間倒計時
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsignedcharsec=0,min=0,hour=24,scanled;
unsignedcharkey,mode,time;
unsignedchardisdat[8];
unsignedcharalarm[3]={23,59,0},dly;
sbitkeyhu=P1^0;
sbitkeyhd=P1^1;
sbitkeymu=P1^2;
sbitkeymd=P1^3;
sbitkeysu=P1^4;
sbitkeysd=P1^5;
sbitkeyst=P1^6;
sbitfmq=P3^0;
bitflag=0;
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
disdat[0]=sec%10;
disdat[1]=sec/10;
disdat[2]=min%10;
disdat[3]=min/10;
disdat[4]=hour%10;
disdat[5]=hour/10;
}
voidt0isr()interrupt1 //秒計時
{
TH0=0x3c;
TL0=0xb0;
time++;
switch(mode)
{
case0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
break;
case1:
if(time==20)
{
time=0;
if(sec>0&&flag==0)sec--;
elseif(min>0&&flag==0){sec=59;min--;}
elseif(hour>0&&flag==0){sec=59;min=59;hour--;}
if((hour==alarm[0])&&(min==alarm[1])&&(sec==alarm[2])){fmq=1;flag=1;dly++;}
}
break;
}
if(dly>=2){fmq=0;flag=0;TR0=0;dly=0;}
dischg();
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x20;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x10;
P0=~ledtab[disdat[4]]&0x7f;
break;
case2:
P2=0x08;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x04;
P0=~ledtab[disdat[2]]&0x7f;
break;
case4:
P2=0x02;
P0=~ledtab[disdat[1]];
break;
case5:
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();
}
}
F. 求教,利用51單片機編寫兩個數碼管60秒倒計時,個位是從5開始計時之後才是9開始倒計時,十位顯示不
如樓上所說,你沒有初始化num這個參數,那麼默認值就是0,也相當於256,所以一開始進入中斷就是256-1,也就是255,個位是5,十位數是25,所以顯示就成了你現在的模樣。因此初始化以下就好了。
G. 如何用單片機做一個簡單的倒計時器
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]; //數碼管個位
}
H. 用51單片機C語言版設計秒錶倒計時
K1 EQU P1.0
K2 EQU P1.1
K3 EQU P1.2
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 TR0
SETB EA
MOV R0,#9
MOV R1,#9
MOV R2,#0
MOV R3,#99
CLR 00H
CLR 01H
LOOP:
JB K1,LP01
JNB K1,$
CLR 01H
INC R3
CJNE R3,#100,LOOP0
MOV R3,#0
SJMP LOOP0
LP01:
JB K2,LP02
JNB K2,$
CLR 01H
CJNE R3,#0,LP011
MOV R3,#99
SJMP LOOP0
LP011:
DEC R3
SJMP LOOP0
LP02:
JB K3,LOOP
JNB K3,$
SETB 01H
SJMP LOOP
LOOP0:
MOV A,R3
MOV B,#10
DIV AB
MOV R0,B
MOV R1,A
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
SETB TR0
MOV DPTR,#TABLE
T0C:
CPL 00H
JB 00H,T001
MOV P3,#0FDH
MOV A,R1
MOVC A,@A+DPTR
MOV P2,A
SJMP T002
T001:
MOV P3,#0FEH
MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
T002:
JNB 01H,T0E
INC R2
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 01H
MOV R4,#16
T005:
CPL P0.0
LCALL DELAY
DJNZ R4,T005
RETI
DELAY:
MOV R6,#200
DLY:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DLY
RET
TABLE: ; 共陰極數碼管顯示代碼表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6FH ;56789
END
I. 51單片機怎麼用三個按鍵控制分別為時鍾,秒錶,倒計時
假如三個按鍵分別為k1,k2,k3。
用k1選擇3個功能,按一下切換一個功能。
在時鍾狀態下,用k2選擇調節位,用於調時,分別選小時的十位,個位,分的十位,個位,開始計時這5個狀態。k3調節位加一,只能按加一調節了。
在秒錶狀態下,k2為計時和停止切換。k3為清0。
在倒計時狀態下,k2和k3作用與秒錶相同。倒計時初始值只好固定的。
J. 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++;//中斷次數
}