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

供稿:hz-xin.com     日期:2025-01-13
如何用单片机做一个简单的倒计时器

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

键盘预置时间数,在减计数啊

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

#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;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]=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>=250&&1695);

if(c==1696) c=0;

}



一般我们用定时器来做计时器,实现时间得加。每次中断发生,用一个变量自增来判断时间是否到1S,到了之后清零这个变量,另一个时间变量自增来作时间得增加。现在就是要把这个自增的时间变量改为自减,判断当小于0时,又赋初值,然后继续自减判断。



这个方法很简单.

一般我们用定时器来做计时器,实现时间得加.每次中断发生,用一个变量自增来判断时间是否到1S,到了之后清零这个变量,另一个时间变量自增来作时间得增加.现在就是要把这个自增的时间变量改为自减,判断当小于0时,又赋初值,然后继续自减判断.
还可以通过加入键盘来增加一些附加的功能,比如开始,停止,设置时间等,正好我手头上有这样的程序,你需要的话我明天回家后上传给你.
希望我的回答能帮助到你.

单片机,倒计时120和正计时150程序怎么写?
根据您提到的单片机以及倒计时和正计时需求,您可以使用相应的编程语言(如C语言)编写程序来实现这些功能。以下是一个简单的示例代码,用于倒计时120和正计时150:倒计时120程序示例:```c include void delay() { \/\/ 延时函数,可根据实际情况进行调整 unsigned int i, j;for (i = 0; i < 120...

请帮忙写一个程序:单片机控制液晶显示器60秒倒计时(C语言)
在单片机领域,使用C语言编写一个控制液晶显示器60秒倒计时的程序是一项有趣且实用的任务。程序的核心在于精确地控制液晶显示器的显示内容和倒计时的时间流逝。为了实现这一目标,我们需要熟悉单片机的基本编程技巧以及液晶显示器的接口控制。首先,我们需要定义几个关键的变量和宏定义。例如,使用uchar和uint...

基于51单片机,lcd1602怎么显示倒计时秒表? - 知乎
基于单片机的数字秒表设计,核心使用51系列的STC89C52单片机,结合LCD12864显示模块、语音播报模块及输入模块,实现功能如下:系统中控部分由STC89C52单片机负责,它接收输入信息并处理,控制输出。输入模块包括三个部分:DS1302时钟模块,用于获取时间、实现计时与倒计时;四个独立按键,用于设置时间、倒计时时间、...

51单片机通过使用74HC164实现60秒倒计时电路图如下:该怎么编程序(C语 ...
使用中断计时是实现60秒倒计时的一种有效方法。这种计时方式可以确保精确的时间控制,避免因循环延时造成的误差积累。在实现过程中,可以利用51单片机的定时器中断功能,设置定时器的计数方式和中断模式,以达到每秒减1的效果。在显示方面,可以使用两个端口来控制位选,通过动态扫描的方式逐行点亮数码管。数码...

高手帮忙51c单片机——想制作倒计时报警器,求个c程序
while(1){ display();keyscan();beep=1;if (miao==0&&fen==0&&shi==0)\/\/当倒数计时为00-00-00时蜂鸣器响 { beep=0;TR0=0;} } } void delay(uint z){ uint i,j;for (i=z;i>0;i--)for (j=110;j>0;j--);} void display() \/\/我这里P2为位选,P0为段选,显示格式为...

基于AT89C51单片机的LED数字倒计时器
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;...

利用单片机设计实现一个60秒倒计时显示装置,并且计时到后发出报警声音...
include<reg52.h>sbit bz=P3^1;unsigned char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};unsigned char n,time=60;main(){P1=a[0];P2=a[6];TMOD=0X01;TH0=(65536-10000)\/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;while(1);}timer0() ...

怎样用51单片机实现累加计时和倒计时,并用六个共阴极数码管显示出来。用...
其中可有有用的摘要本题给出基于单片机的数字中的设计,设计由单片机作为核心控制器,通过频率计数实现计时功能,将实时时间经由单片机输出到显示设备——数码管上显示出来,并通过键盘来实现启动、停止、复位和调整时间的功能。关键词: 单片机、数字钟、AT89S52、LED 1 引言在单片机技术日趋成熟的今天,其灵活的硬件电路的...

倒计时计数器工作原理
1. 倒计时计数器的工作原理主要依赖于单片机内部的“定时\/计数器”。2. 单片机通过编写特定的逻辑程序,结合DS1302时钟芯片来获取系统时间,实现了倒计时的功能。这是单片机应用中的一个基础示例。

怎样用单片机c语言实现60秒倒计时
这个很简单的嘛。。自己看看书多做做就知道了。。像这样简单的都来问的话,那你工作的话就基本上完全是不会了。。跟你提个思路吧,首先是,定义一个变量,用来保存初值60,然后进行定时器初始化,开启定时器中断,打开全部中断。然后就是在定时器中断处理函数里面进行计数了,,当计时满一秒的时候,...