A. 匯編語言 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
B. 如何用單片機做一個簡單的倒計時器
我已經完成了,下面是電路圖和實際效果,你也試試,程序已經調試完成了!!!是使用秒錶程序改編完成的,喜歡的話,點一個贊吧!希望能幫到你!!!
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//顯示0~F的值
u8 ssec=100,sec=60,min=04;
u8 DisplayData[8];
sbit beep=P1^5;
unsigned long counter=0;
unsigned int c=0;
sbit p15=P1^5;
bit p;
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 數 名 : Timer0Init
* 函數功能 : 定時器0初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0Init()
{
TMOD=0X11;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0Xd8; //給定時器賦初值,定時10ms
TL0=0Xf0;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器 -->啟動定時器中斷!
ET1=1;
TR1=1;
TH1=(65536-250)/256; //FC
TL1=(65536-250)%256;
}
/*******************************************************************************
* 函 數 名 : DigDisplay
* 函數功能 : 數碼管動態掃描函數,循環掃描8個數碼管顯示
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P0=DisplayData[i];//發送段碼
delay(100); //間隔一段時間掃描
P0=0x00;//消隱-->撤銷選中;
}
}
void datapros()
{
DisplayData[0]=smgan[ssec%10];
DisplayData[1]=smgan[ssec/10];
DisplayData[2]=0x40;
DisplayData[3]=smgan[sec%10];
DisplayData[4]=smgan[sec/10];
DisplayData[5]=0x40;
DisplayData[6]=smgan[min%10];
DisplayData[7]=smgan[min/10];
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
Timer0Init(); //定時器0初始化
while(1)
{
datapros();
DigDisplay();
}
}
/*******************************************************************************
* 函 數 名 : void Timer0() interrupt 1
* 函數功能 : 定時器0中斷函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer0() interrupt 1
{
TH0=0Xd8; //給定時器賦初值,定時10ms
TL0=0Xf0;
ssec--;
if(ssec==00) //1s
{
ssec=100;
sec--;
if(sec==00)
{
sec=60;
min--;
if(min==-1)
{
P1=1;
ssec=0;sec=0;min=0;
TR0=0;
}
}
}
}
void Timer1() interrupt 3
{
TH1=(65536-250)/256; //FC
TL1=(65536-250)%256;
if(p!=1) p15=~p15;
if(p==1) p15=0;
c++;
if(c==250)
{
//c=0;
p=~p;
}
if(c>=250&&1695);
if(c==1696) c=0;
}
C. 單片機的倒計時器初始值是怎麼算的,例如初始值是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
就是這么簡單的數學運算 高級語言編程就這么簡單
但用匯編語言編程就要知道單片機的內部結構,並用一些很難記憶的指令來寫程序,要繁瑣很多
D. 單片機 C語言秒錶程序 求修改!倒計時結束後又開始計時了怎麼停下來
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//顯示0-9段碼
ucharcount,time;
sbitstart=P3^4;
sbitstop=P3^5;
sbitreset=P3^6;
/*****延時函數*****/
voiddelay(uchark)
{
uchari,j;
for(i=0;i<k;i++)
for(j=0;j<200;j++);
}
voidmain()
{
TMOD=0x01;//設置為定時器模式1
TH0=0x3c;//晶振6MHz,定時時間100ms
TL0=0xb0;
IE=0x82;//開全局中斷和定時中斷
time=24;
count=0;
while(1)
{
if(start==0)TR0=1;//啟動開關
if(stop==0)TR0=0;//停止開關
含棚if(reset==0)time=24;//復位開關
P2=0xfe;//顯示個位
談高則P0=seg[time%10];//取計時值個位送P0口
delay(2);
P2=0xfd;//顯示十位
P0=seg[time/10];//取計時值十位送P0口
delay(2);
}
}
voidtimer0()interrupt1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==10)//中斷10次即1s=10×100ms
{
count=0;//計數次數清0
time--;//計時值減1
if(time==0)
{
time=24;//計時值減到念巧0則回初值
TR0=0;
}
}
}
E. 編程實現倒計時的秒錶,2位LED數碼管顯示,延時採用硬體延時的方法
編程實現倒計時的秒錶,2位LED數碼管顯示,延時埋閉採用硬體延時的方法
用單片機的定時器T0定時,計時1秒,實現倒計時的秒錶的功能。
程序如下
#include<reg51.h>
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽數碼管段碼表
unsigned char second;//秒倒計時變數
unsigned char t0n;//T0中斷次數計數
sbit k1=P3^2;//定義按鍵
void delay()
{
unsigned int j;
for(j=400;j>0;j--);
}
void display()//顯示子程序
{
P2=0x01;
P0=tab[second/10];//顯示十位
delay();
P2=0x02;
P0=tab[second%10];//顯示個位
delay();
}
void main()
{
TMOD=0x01;//用T0定時,中斷方式
TH0 =0x3C;//晶振12M,定時50ms
TL0 =0xB0;
IE =0x82;
while(1)
{
display();//調顯示子程序
if(k1==0)//按鍵按下
{
if(TR0==0)
{
TR0=1;//啟動開始計時
second=60;//從60秒開始倒計時
}
else
TR0=0;
while(k1==0);/滲嘩/等待按鍵釋放
}
}
}
//T0中斷程序
void T0_int() interrupt 1
{
TH0 =0x3C;
TL0 =0xB0;
t0n++;
if(t0n>=20)/彎喊裂/1秒到
{
t0n=0;
second--;//減1秒
if(second==0)TR0=0;
}
}
F. 採用AT89C51單片機設計一隻電子秒錶,倒計時(60~1每間隔1秒倒數)
硬體電路 有2位數碼管可以顯示秒錶的時間 0~10秒
有3個按鍵 K1為開始計時 K2為停止計時 K3為清零
軟體設計:
K1按下則啟動定時器定時 每到1秒 顯示器緩沖單元內容加1
K2按下則停止定時器定時
K3按下則將顯示器緩沖單元內容清零。
G. 如何用C51單片機做出以下程序 「秒錶是倒計時,從100秒開始倒計時 用數碼管實時顯示當前計時值」
假設P0 P2接數碼管,靜態驅動,程序如下:
include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num=100;
uchar time=0;
//共陰數碼管七段碼
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77};
void Delay1ms(uint i) //1ms延時程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<164;j++)
{;}
}
}
void main(void )//主程序
{
TMOD=0X01;
ET0=1;
EA=1;
TH0=(65536-50000)/256;//定時50ms
TL0=(65536-50000)%256;
TR0=1;
while(1)
{
P0=table[num/10];
Delay1ms(2);
P2=table[num%10];
Delay1ms(2);
}
}
void TIMER0()interrupt 1//中斷程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==20)
{
time=0;
num--;
}
if(num==0)
{
num=100;
}
}
H. 51單片機怎麼用三個按鍵控制分別為時鍾,秒錶,倒計時
假如三個按鍵分別為k1,k2,k3。
用k1選擇3個功能,按一下切換一個功能。
在時鍾狀態下,用k2選擇調節位,用於調時,分別選小時的十位,個位,分的十位,個位,開始計時這5個狀態。k3調節位加一,只能按加一調節了。
在秒錶狀態下,k2為計時和停止切換。k3為清0。
在倒計時狀態下,k2和k3作用與秒錶相同。倒計時初始值只好固定的。
I. 單片機設計的30秒倒計時器
看不清晶振是多大的。這也不難,不可能是畢設吧,自學就得自枝纖己搞,別人整出來了復制多沒意思。真要是不想自己做猛仔仿,可以出錢戚鄭找人設計。
J. 如何用單片機做一個簡單的倒計時器
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]; //數碼管個位
}