173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

单片机实训倒计时器

htxw 2023-03-14 资讯中心 18 ℃

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

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

}

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

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 smgduan[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;i8;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]=smgduan[ssec%10];

DisplayData[1]=smgduan[ssec/10];

DisplayData[2]=0x40;

DisplayData[3]=smgduan[sec%10];

DisplayData[4]=smgduan[sec/10];

DisplayData[5]=0x40;

DisplayData[6]=smgduan[min%10];

DisplayData[7]=smgduan[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=2501695);

if(c==1696) c=0;

}

单片机设计的30秒倒计时器

看不清晶振是多大的。这也不难,不可能是毕设吧,自学就得自己搞,别人整出来了复制多没意思。真要是不想自己做,可以出钱找人设计。

单片机倒计时的编程

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 TR0

SETB ET0

SETB EA

MOV R0,#99

MOV R1,#0

LOOP:

JB P1.0,LOOP1

JNB P1.0,$

INC R0

CJNE R0,#100,LOOP

MOV R0,#99

SJMP LOOP

LOOP1:

JB P1.1,LOOP

JNB P1.1,$

CJNE R0,#0,LOOP11

SJMP LOOP

LOOP11:

DEC R0

SJMP LOOP

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-10000)

MOV TL0,#LOW(65536-10000)

SETB TR0

INC R1

CJNE R1,#100,T0E

DEC R0

MOV R1,#0

DEC R0

CJNE R0,#0,T00

CLR P3.0

SJMP T0E

T00:

SETB P3.0

MOV A,R0

MOV B,#10

DIV AB

MOV DPTR,#TABLE

JB 00H,T001

MOV P2,#0FEH

MOVC A,@A+DPTR

MOV P0,A

SJMP T0E

T001:

MOV P2,#0FDH

MOV A,B

MOVC A,@A+DPTR

MOV P0,A

T0E:

RETI

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

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

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

DB 6DH,7DH,07H,7FH,6fh ;56789

END

单片机设计制作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]; //个位显示处理

}

}

单片机实训倒计时器的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:单片机实训倒计时器

<