Ⅰ 如何用單片機做一個簡單的倒計時器
一般我們用定時器來做計時器,實現時間得加。每次中斷發生,用一個變數自增來判斷時間是否到1S,到了之後清零這個變數,另一個時間變數自增來作時間得增加。現在就是要把這個自增的時間變數改為自減,判斷當小於0時,又賦初值,然後繼續自減判斷。
Ⅱ 51鍗曠墖鏈篴t89s52鎬庝箞鍋0-9縐掑掕℃椂錛屾眰澶т漿瑙g瓟
鐢ㄤ竴涓鍏遍槾鏁扮爜綆℃帴鍦≒0鍙o紝鐢盤0鍙h緭鍑烘電爜銆傚啀鐢ㄥ畾鏃跺櫒瀹氭椂50ms錛岄噰鐢ㄤ腑鏂鏂瑰紡錛屽逛腑鏂璁℃暟20嬈″氨鏄涓縐掋傜敤涓涓鍙橀噺璁$掞紝鍒濆間負9錛屾瘡涓縐掑噺涓錛屽苟閫丳0鏄劇ず銆備豢鐪熷浘濡備笅銆
Ⅲ 求大神編一道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繼續同時點亮
}
/***************************************************************************/
Ⅳ c51單片機定時器30秒倒計時程序,一個按鍵控制開始,另一個按鍵控制暫停和繼續
#include<reg51.h>
unsignedcharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsignedcharsec=30,scanled;
unsignedchardisdat[2];
sbitkeys=P1^0;
sbitkeyc=P1^1;
sbitfmq=P3^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;
}
voidt0isr()interrupt1 //秒計時
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)
{
time=0;
if(sec>0&&flag==0)sec--;
}
dischg();
}
voidt1isr()interrupt3 //顯示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0xfe;
P0=ledtab[disdat[1]];
break;
case1:
P2=0xfd;
P0=ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=2;
}
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;
while(1)
{
if(keys==0)
{
while(keys==0);
TR0=1;
}
if(keyc==0)
{
while(keyc==0);
TR0=~TR0;
}
}
}