① 如何用單片機做一個簡單的倒計時器
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]; //數碼管個位
}
② 單片機的倒計時器初始值是怎麼算的,例如初始值是30分鍾,30分鍾是怎麼設置的
那是由許多變數來保存的,如用定時器定時50ms 中斷20次是1S 每60秒是1分鍾 中斷次數 秒數 分鍾數都可由變數來表示
如 fen miao n 分別代表當前分鍾數 秒數 中斷次數
程序工作過程是這樣的 :
定時器定時50ms(由於單片機定時器位數限制,不容易實現1秒定時)
定時時間到 (發生中斷,進入中斷程序),變數n加1如果n等於20將n清0同時將miao加1 如果miao等於60 秒清0
同時fen 加1 就可以實現計時
如果倒計時,可以設fen的初值為30 每次miao等於60時將分減1
就是這么簡單的數學運算 高級語言編程就這么簡單
但用匯編語言編程就要知道單片機的內部結構,並用一些很難記憶的指令來寫程序,要繁瑣很多
③ 單片機設計製作9S倒計時器~
1.顯示。2.啟動/停止。3.重置30秒
中的第一個和第三個功能有的,至於第2個,程序里是一直倒計時,結束了
就再重置30,繼續倒計時。
如果你需要鍵盤按鍵的話,只需要按鍵將中斷關了或者開了,就可以。
#include <reg52.h>
code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共陽數碼管 0-9
unsigned char Dis_Shiwei;//定義十位
unsigned char Dis_Gewei; //定義個位
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
TMOD |=0x01;//定時器設置 10ms in 12M crystal
TH0=0xd8; // 初值55536,計數10000次,每次1us,總計10ms
TL0=0xf0;
IE= 0x82; //打開中斷
TR0=1; //啟動計數器TR0
while(1)
{
P0=Dis_Shiwei;//顯示十位
P2=0xFD; // P2=1111 1101
delay(300);//短暫延時
P0=Dis_Gewei; //顯示個位
P2=0xFE; // P2=1111 1110
delay(300);
}
}
/********************************/
/* 定時中斷 */
/********************************/
void tim(void) interrupt 1 using 1 //前1為定時中斷TR0
{
static unsigned char second=30,count; //初值30
TH0=0xd8;//重新賦值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second--;//秒減1
if(second==0)
{ //這里添加定時到0的代碼 ,可以是燈電路,繼電器吸合等,或者執行一個程序
second=30; //減到0是重新賦值99
}
Dis_Shiwei=tab[second/10];//十位顯示值處理
Dis_Gewei=tab[second%10]; //個位顯示處理
}
}
④ 單片機程序,設計一個倒計時程序,每八個小時響一次,持續時間五秒,求大神幫忙。
#include <reg52.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
sbit fm=P1^7;//蜂鳴器
uint aa=0,c;
void Delay1ms(unsigned int i) //1ms延時程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化設置
{
TMOD=0x01;//定時器0作為定時器用
TH0=965536-5000)/256;//定時50ms
TL0=965536-5000)%256;
EA=1;//開總中斷
ET0=1;//允許定時器1中斷
TR0=1;//啟動定時器
}
void main()//主程序很簡單
{
init();//初始化
c=3600*8;
while(1)//循環程序
{
while(c!=0);
c=3600*8;
fm=1;//報警
Delay1ms(5000) ;
fm=0;//報警停止
}
}
void timer0()interrupt 1//定時器0的中斷序號為1
{
aa++;
TH0=965536-5000)/256;//定時50ms
TL0=965536-5000)%256;
if(aa==20)//中斷10次,共1S
{
aa=0;
c--;
}
}
⑤ 利用單片機(STC89C52)設計倒計時數字鍾
#include<reg51.h>
#define uchar unsigned char
uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsigned char sec=0,min=0,hour=24,scanled;
unsigned char key,mode,time;
unsigned char disdat[8];
unsigned char alarm[3]={23,59,0},dly;
sbit keyhu=P1^0;
sbit keyhd=P1^1;
sbit keymu=P1^2;
sbit keymd=P1^3;
sbit keysu=P1^4;
sbit keysd=P1^5;
sbit keyst=P1^6;
sbit fmq=P3^0;
bit flag=0;
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++;
switch(mode)
{
case 0:
if(time==20)
{
time=0;
sec++;
if(sec>59)
{
sec=0;
min++;
if(min>59)
{
min=0;
hour++;
if(hour>23)hour=0;
}
}
}
break;
case 1:
if(time==20)
{
time=0;
if(sec>0 && flag==0)sec--;
else if(min>0 && flag==0){sec=59;min--;}
else if(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();
}
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]]&0x7f;
break;
case 2:
P2=0x08;
P0=~ledtab[disdat[3]];
break;
case 3:
P2=0x04;
P0=~ledtab[disdat[2]]&0x7f;
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();
}
}
⑥ 採用AT89C51單片機設計一隻電子秒錶,倒計時(60~1每間隔1秒倒數)
硬體電路 有2位數碼管可以顯示秒錶的時間 0~10秒
有3個按鍵 K1為開始計時 K2為停止計時 K3為清零
軟體設計:
K1按下則啟動定時器定時 每到1秒 顯示器緩沖單元內容加1
K2按下則停止定時器定時
K3按下則將顯示器緩沖單元內容清零。
⑦ 51單片機做一個倒計時,在程序運行過程中也需要可以調節時間,這種模式的設計思路
倒計時用定時器做
程序運行中,要修改定時器的數值就修改定時器的TH0 ,TL0;
#include <reg51.h>
void InitTimer0(void)
{
TMOD = 0x05;
TH0 = 0xD8;
TL0 = 0xF0;//定時100ms
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main(void)
{
InitTimer0();
while(1)
{
//根據你的要求,在這里重新設置定時的時間
if(a==1)//假設滿足a==1需要修改新的時間為 10ms
{
TH0 = 0xDC;
TL0 = 0x00;
}
}
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = 0x0D8;
TL0 = 0x0F0;
//定時到了執行的代碼在這里寫
}
這個代碼
TH0 TL0是根據晶振是11.0592計算出來的,這里只是給出一個實現的思路。
首次回答,望採納!