导航:首页 > 操作系统 > 基于单片机的倒计时器

基于单片机的倒计时器

发布时间:2022-10-30 06:26:08

‘壹’ 用51单片机,构成一个10秒倒计时器

程序很简单,你要是现在需要我用protues画个图给你,然后把程序也给你。

这种设计的话就利用定时器做变量的减法计数就行了,和0计数到10原理都一样;按键控制TRx就可以完成开始和停止。你也可以自己设计试试。

希望我的回答能帮助到你。



————————我做好了 给你吧。

‘贰’ 基于单片机AT89C51的00--59秒倒计时器

proteus仿真最怕用三极管,常 常 不成功的。
话说你用C还是汇编?

‘叁’ 单片机4位倒计时器

我以前做了一个倒计时,贴给你做个参考:

ORG 0000H

JMP BEGIN

ORG000BH

LJMPT0INT

ORG001BH

LJMPT1INT

LEDDEQU30H

LEDCEQU36H

SECCEQU37H

MINCEQU38H

HOUREQU39H

TCNTEQU3AH

ORG0030H

;---------------------------------------

TABLE: ;共阴极数码管显示代码表

DB0FCH;"0"00H

DB60H;"1"01H

DB0DAH;"2"02H

DB0F2H;"3"03H

DB66H;"4"04H

DB0B6H;"5"05H

DB0BEH;"6"06H

DB0E0H;"7"07H

DB0FEH;"8"08H

DB0F6H;"9"09H

DB0EEH;"A"0AH

DB3EH;"B"0BH

DB9CH;"C"0CH

DB7AH;"D"0DH

DB9EH;"E"0EH

DB8EH;"F"0FH

DB00H;""10H

; DB 3FH,06H,5BH,4FH,66H;12345

; DB 6DH,7DH,07H,7FH, ;6789

;---------------------------------------

DELAY:

MOV R6,#25

DLY01:

MOV R7,#100

DJNZ R7,$

DJNZ R6,DLY01

RET

;---------------------------------------

BEGIN:

MOVSP,#5FH

MOVTMOD,#11H

MOVTH0,#3CH

MOVTL0,#0B0H

MOVTH1,#0F4H

MOVTL1,#48H

MOVLEDC,#6

MOVR0,#LEDD

CLRA

INIT:

MOV@R0,A

INCR0

DJNZLEDC,INIT

SETBET1

SETBTR1

MOVP2,#0

MOVTCNT,#0

MOVHOUR,#0

MOVMINC,#0

MOVSECC,#0

SETBET0

SETBEA

LOOP:

JBP1.0,LOOP1

LCALLDELAY

JBP1.0,LOOP1

JNBP1.0,$

INCHOUR

MOVA,HOUR

CJNEA,#24,LOOPH

LOOPH:

JCLOOPH1

MOVHOUR,#0

LOOPH1:

LCALLDISHOUR

SJMPLOOP

LOOP1:

JBP1.1,LOOP2

LCALLDELAY

JBP1.1,LOOP2

JNBP1.1,$

MOVA,HOUR

JNZLOOPH2

MOVHOUR,#23

SJMPLOOPH3

LOOPH2:

DECHOUR

LOOPH3:

LCALLDISHOUR

SJMPLOOP

LOOP2:

JBP1.2,LOOP3

LCALLDELAY

JBP1.2,LOOP3

JNBP1.2,$

INCMINC

MOVA,MINC

CJNEA,#60,LOOPM

LOOPM:

JCLOOPM1

MOVMINC,#0

LOOPM1:

LCALLDISMIN

SJMPLOOP

LOOP3:

JBP1.3,LOOP4

LCALLDELAY

JBP1.3,LOOP4

JNBP1.3,$

MOVA,MINC

JNZLOOPM2

MOVMINC,#59

SJMPLOOPM3

LOOPM2:

DECMINC

LOOPM3:

LCALLDISMIN

SJMPLOOP

LOOP4:

JBP1.4,LOOP5

LCALLDELAY

JBP1.4,LOOP5

JNBP1.4,$

INCSECC

MOVA,SECC

CJNEA,#60,LOOPS

LOOPS:

JCLOOPS1

MOVSECC,#0

LOOPS1:

LCALLDISSEC

LJMPLOOP

LOOP5:

JBP1.5,LOOP6

LCALLDELAY

JBP1.5,LOOP6

JNBP1.5,$

MOVA,SECC

JNZLOOPS2

MOVSECC,#59

SJMPLOOPS3

LOOPS2:

DECSECC

LOOPS3:

LCALLDISSEC

LJMPLOOP

LOOP6:

JBP3.1,LOOP7

LCALLDELAY

JBP3.1,LOOP7

JNBP3.1,$

CPLTR0

LOOP7:

LJMPLOOP

;---------------------------------------

T1INT:

PUSHACC

CLRTR1

MOVTH1,#0F4H

MOVTL1,#48H

SETBTR1

MOVDPTR,#TABLE

MOVR0,#LEDD

MOVA,LEDC

T1INT0:

JNZT1INT1

MOVP2,#01H

MOVA,@R0

MOVCA,@A+DPTR

CPLA

MOVP0,A

SJMPT1INTD

T1INT1:

DECA

JNZT1INT2

MOVP2,#02H

INCR0

MOVA,@R0

MOVCA,@A+DPTR

CPLA

MOVP0,A

SJMPT1INTD

T1INT2:

DECA

JNZT1INT3

MOVP2,#04H

INCR0

INCR0

MOVA,@R0

MOVCA,@A+DPTR

CPLA

MOVP0,A

SJMPT1INTD

T1INT3:

DECA

JNZT1INT4

MOVP2,#08H

INCR0

INCR0

INCR0

MOVA,@R0

MOVCA,@A+DPTR

CPLA

MOVP0,A

SJMPT1INTD

T1INT4:

DECA

JNZT1INT5

MOVP2,#10H

INCR0

INCR0

INCR0

INCR0

MOVA,@R0

MOVCA,@A+DPTR

CPLA

MOVP0,A

SJMPT1INTD

T1INT5:

DECA

JNZT1INTD

MOVP2,#20H

INCR0

INCR0

INCR0

INCR0

INCR0

MOVA,@R0

MOVCA,@A+DPTR

CPLA

MOVP0,A

T1INTD:

INCLEDC

MOVA,LEDC

CJNEA,#6,T1INT6

T1INT6:

JCT1INTE

MOVLEDC,#0

T1INTE:

POPACC

RETI

;---------------------------------------

HBCD:

MOVB,#10

DIVAB

SWAPA

ORLA,B

RET

;---------------------------------------

T0INT:

PUSHACC

CLRTR0

MOVTH0,#3CH

MOVTL0,#0B0H

SETBTR0

INCTCNT

MOVA,TCNT

CJNEA,#20,T0INT1

T0INT1:

JCT0INTE

MOVTCNT,#0

MOVA,SECC

ORLA,MINC

ORLA,HOUR

JNZT0INT2

SETBP3.0

CLRTR0

POPACC

RETI

T0INT2:

MOVA,MINC

ORLA,HOUR

JNZT0INT3

MOVA,SECC

CJNEA,#6,T0INT21

T0INT21:

JNCT0INT22

CPLP3.0

T0INT22:

DECSECC

LCALLDISSEC

SJMPT0INTE

T0INT3:

MOVA,SECC

JZT0INT31

DECSECC

LCALLDISSEC

SJMPT0INTE

T0INT31:

MOVSECC,#59

LCALLDISSEC

MOVA,MINC

JZT0INT32

DECMINC

LCALLDISMIN

SJMPT0INTE

T0INT32:

MOVMINC,#59

LCALLDISMIN

DECHOUR

LCALLDISHOUR

T0INTE:

POPACC

RETI

;---------------------------------------

DISSEC:

MOVA,SECC

LCALLHBCD

PUSHACC

ANLA,#0FH

MOV30H,A

POPACC

SWAPA

ANLA,#0FH

MOV31H,A

RET

;---------------------------------------

DISMIN:

MOVA,MINC

LCALLHBCD

PUSHACC

ANLA,#0FH

MOV32H,A

POPACC

SWAPA

ANLA,#0FH

MOV33H,A

RET

;---------------------------------------

DISHOUR:

MOVA,HOUR

LCALLHBCD

PUSHACC

ANLA,#0FH

MOV34H,A

POPACC

SWAPA

ANLA,#0FH

MOV35H,A

RET

;---------------------------------------

END

‘肆’ 如何用单片机做一个简单的倒计时器

我已经完成了,下面是电路图和实际效果,你也试试,程序已经调试完成了!!!是使用秒表程序改编完成的,喜欢的话,点一个赞吧!希望能帮到你!!!

#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;

}

‘伍’ 基于at89C52单片机倒计时器C语言

/*************************************
要求是能进行9999秒倒计时
用C语言实现
*************************************/
#include<at89X51.h>

#define uchar unsigned char
#define uint unsigned int
uchar num_qian,num_,num_shi,num_ge;//定义千位,百位,十位,个位。
uint time;//要显示的时间0~9999
uint tcnt;//计时单元
//*****************//
//以下是端口定义
//*****************//
sbit key_qian=P1^0;//按键"千加1"
sbit key_ =P1^2;//按键"百加1"
sbit key_shi =P1^4;//按键"十加1"
sbit key_ge =P1^6;//按键"个加1"
sbit laba =P3^1;//喇叭

void delay(unsigned int z)//1毫秒延时子函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

//*****************//
//以下是七段数码管驱动程序
//*****************//
/**************************************************
** 功能描述: 中断接受字符串驱动程序
**占用引脚资源 P30
**占用系统资源 串口中断;中断向量4
***************************************************/
#define DUAN P0
#define WEI P2

unsigned char code dispcode[]=
{
0x3F,/*0*/
0x06,/*1*/
0x5B,/*2*/
0x4F,/*3*/
0x66,/*4*/
0x6D,/*5*/
0x7D,/*6*/
0x07,/*7*/
0x7F,/*8*/
0x6F,/*9*/
}; //共阴段码表
//0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,NULL,-
uchar code dispbitcode[]=
{0xef,0xdf,0xbf,0x7f}; //共阴位码表

uchar dispbuf[4],dispcount;//开辟四个显示缓冲区

void ledinit()/***初始化子函数,定时器0刷新显示内容***/
{
TMOD|=0x01; // 定时器0方式1
TH0=(65536-5000)/256; //定时器16位模式
TL0=(65536-5000)%256; //溢出时间:5ms
TR0=1; //开启定时器0
ET0=1; //使能定时器0
EA=1; //系统使能
}

void leddisp()//固定显示某些数字
{
dispbuf[0]=time/1000;
dispbuf[1]=time%1000/100;
dispbuf[2]=time%100/10;
dispbuf[3]=time%10;
}

void keytest()//按键检测程序
{
if(!key_qian)//如果千位按键
{
delay(5);//5毫秒延时去抖
if(!key_qian)//如果千位按键的确按下了
{
num_qian++;//千位数字加一
while(!key_qian);//等待按键松开
}
time+=num_qian*1000;//千位数字加1
}
if(!key_)//如果百位按键
{
delay(5);//5毫秒延时去抖
if(!key_)//如果百位按键的确按下了
{
num_++;//百位数字加一
while(!key_);//等待按键松开
}
time+=num_*100;//百位数字加1
}
if(!key_shi)//如果十位按键
{
delay(5);//5毫秒延时去抖
if(!key_shi)//如果十位按键的确按下了
{
num_shi++;//千位数字加一
while(!key_shi);//等待按键松开
}
time+=num_shi*10;//十位数字加1
}
if(!key_ge)//如果千位按键
{
delay(5);//5毫秒延时去抖
if(!key_ge)//如果个位按键的确按下了
{
num_qian++;//千位数字加一
while(!key_ge);//等待按键松开
}
time+=num_ge;//个位数字加1
}
}

void main()//主程序
{
ledinit();//数码管中断初始化,定时器0刷新显示内容
while(1)//大循环
{
if((!key_qian)||(!key_)||(!key_shi)||(!key_ge))//如果四个按键中的任何一个被按下
keytest();//执行按键检测程序
leddisp();//不断的刷新显示内容
}
}

//*************************************************
//以下是定时器0刷新数码管显示内容驱动程序
//*************************************************
/**************************************************
** 功能描述: 七段数码管驱动程序
**占用引脚资源: 数码管段选,数码管位选
**占用系统资源T0
***************************************************/

void t0(void) interrupt 1 //using 0
{
TH0=(65536-5000)/256; //5ms中断
TL0=(65536-5000)%256; //16位定时器模式
WEI=0xff;//关位选
DUAN=dispcode[dispbuf[dispcount]]; //段选
WEI=dispbitcode[dispcount]; //开位选
dispcount++;
if(dispcount==5)
dispcount=0;

tcnt++; //计数个数加一
if(tcnt==5*200)//满足1S了
{
tcnt=0;//计数个数归零
time--;//时间减一
if(time==0)//时间
while(1);
}
if(time<10)//时间小于10
laba=~laba;//声音报警
}
这个应该可以!

‘陆’ 如何用单片机做一个简单的倒计时器

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]; //数码管个位
}

‘柒’ 用单片机如何制作一个倒计时器

我用的是89C52单片机写的,数码管是共阴极的。99秒定时器,你只需要修改初始的值就可以了。#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar tt=0,flag;
uint i=0;
uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
void display(uint i);
void delay(uint del)
{
uchar i, j;
for(i=0; i<del; i++)
for(j=0; j<=148; j++);}
main()
{
TMOD=0X01;
TR0=1; //启动定时器
ET0=1; //开定时器
TH0=0X40;
TL0=0X00;
EA=1; //开总中断
while(1)
{
if(tt==20)
{
tt=0;
i++;
if(i==99)
i=0;
} display(i);

}
}
void display(uint k)
{
P2=0X04;
P0=table[k/100];
delay(5);
P2=0X02;
P0=table[k%100/10];
delay(5);
P2=0X01;
P0=table[k%10];
delay(5);
}
void timer0() interrupt 1
{
TH0=0X40;
TL0=0X00;
tt++;

}

‘捌’ 单片机控制倒计时定时器

哥们
我做的定时器 的程序
这个是正的 你该一下吧
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code []={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar code da[]={0x40,0x79,0x24,0x30,0x19,0x12,0x2,0x78,0x0,0x10};
display(uchar,uchar,uchar,uchar);
uchar x=0;
uchar n=0;
uchar flag=0;
uchar second=0,minute=0;
sbit K1=P3^0;
sbit K2=P3^1;
uchar temp=0;
delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=25;b>0;b--)
;
}
display(uchar m1,uchar m,uchar s1,uchar s)
{
P0=[m1];
P2=0xfe;
delay(10);

P0=da[m];
P2=0xfd;
delay(10);

P0=[s1];
P2=0xfb;
delay(10);

P0=[s];
P2=0xf7;
delay(10);
}
void main()
{

EA=1;
ET1=1;
TMOD=0x10;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
while(1)
{
P3=0XFF;
if(K1==0)
delay(10);
if(K1==0)
TR1=1;
if(K2==0)
delay(10);
if(K2==0)
TR1=0;
if(flag==20)
{
flag=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
}
}
}
display(minute/10,minute%10,second/10,second%10);
}

}
void tim1() interrupt 3
{
TR1=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR1=1;
flag++;
}

‘玖’ 汇编语言 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

‘拾’ 基于AT89C51单片机的LED数字倒计时器

#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,58},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();
}
}

阅读全文

与基于单片机的倒计时器相关的资料

热点内容
脚本提取源码器 浏览:928
smo源码 浏览:875
为什么要搭建单独服务器 浏览:478
编译器有什么控制 浏览:891
希尔伯特pdf 浏览:645
php数组全数字 浏览:645
解密塔罗牌小程序源码 浏览:862
聚合跑分源码 浏览:553
注册dns服务器写什么 浏览:879
linux安装deb包 浏览:521
电脑盘文件夹如何平铺 浏览:267
相机卡满了没文件夹 浏览:751
如何批量快速压缩视频 浏览:432
我的世界如何加入ice服务器 浏览:873
兄弟cnc编程说明书 浏览:204
php闪电入门教程学习 浏览:152
金岳霖逻辑pdf 浏览:938
linuxtomcat线程 浏览:77
pboc长度加数据加密 浏览:187
英雄联盟国际服手游怎么下安卓 浏览:298