① 如何用单片机做一个简单的倒计时器
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计算出来的,这里只是给出一个实现的思路。
首次回答,望采纳!