Ⅰ 如何用单片机做一个简单的倒计时器
一般我们用定时器来做计时器,实现时间得加。每次中断发生,用一个变量自增来判断时间是否到1S,到了之后清零这个变量,另一个时间变量自增来作时间得增加。现在就是要把这个自增的时间变量改为自减,判断当小于0时,又赋初值,然后继续自减判断。
Ⅱ 51鍗旷墖链篴t89s52镐庝箞锅0-9绉掑掕℃椂锛屾眰澶т浆瑙g瓟
鐢ㄤ竴涓鍏遍槾鏁扮爜绠℃帴鍦≒0鍙o纴鐢盘0鍙h緭鍑烘电爜銆傚啀鐢ㄥ畾镞跺櫒瀹氭椂50ms锛岄噰鐢ㄤ腑鏂鏂瑰纺锛屽逛腑鏂璁℃暟20娆″氨鏄涓绉掋傜敤涓涓鍙橀噺璁$掞纴鍒濆间负9锛屾疮涓绉掑噺涓锛屽苟阃丳0鏄剧ず銆备豢鐪熷浘濡备笅銆
Ⅲ 求大神编一道51单片机实现多种倒计时功能
这个不算太难,只要利用标识符进行判断即可
标识符就是一个变量,常使用字符型变量作为标识符,占用空间小
每一种状态都用标识符表示出来,例如状态0,状态1,状态2 ..................状态254
字符型变量的值范围是 0 ~ 254 共255个值,够你用的了
给你一个类似的程序,我自己写的,你作为参考吧
程序的组成是:两个按键,一组四位数码管,两个LED发光二极管
程序的功能是:按下按键A,两个LED同时点亮,并延时10秒(时间随意修改)
按下按键B,两个LED同时熄灭,并延时10秒(时间随意修改)
无按键按下时,两个LED交替点亮,达到闪烁的效果
程序如下,并加了注释,若满意请采纳!
#include <reg51.h> //51单片机通用头文件
unsigned int i,t,h; char fe;
sbit a=P3^7; sbit b=P3^6; sbit led=P2^7; sbit lad=P2^6;//按键及LED端口定义
char table[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示编码
/***************************************************************************/
void YS(char hs){char hk;for(;hs>0;hs--){for(hk=200;hk>0;hk--);}}//延时函数
/***************************************************************************/
void XS(int xs) //数码管显示
{
char d1,d2,d3,d4;
d1=(xs/1)%10; d2=(xs/10)%10; d3=(xs/100)%10; d4=(xs/1000)%10;
P0=table[d1]; P1=0xf7; YS(10); P1=0xff;//个位显示
P0=table[d2]; P1=0xfb; YS(10); P1=0xff;//十位显示
P0=table[d3]; P1=0xfd; YS(10); P1=0xff;//百位显示
P0=table[d4]; P1=0xfe; YS(10); P1=0xff;//千位显示
}
/***************************************************************************/
void main()
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01; TR0=1; ET0=1; EA=1;
led=0;lad=1;
while(1)
{
XS(h);//调用数码管显示函数
if(a==0){h=10;fe=0;}//按键 A, LED 亮10秒
if(b==0){h=10;fe=1;}//按键 B, LED 灭10秒
}
}
/***************************************************************************/
void t0()interrupt 1//定时器 0 中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++; t++;
if(h>0){t=0;}//如果按键按下,屏蔽 t 计数,
if(t>=5){t=0;led=~led; lad=~lad;}//t计数,用于两个LED闪烁
if(i>=20)//还是原来的时间判断
{
i=0;
if(h>0&&fe==0){h--;led=0;lad=0;}//如果是状态 0 同时点亮两个LED
if(h>0&&fe==1){h--;led=1;lad=1;}//如果是状态 1 同时关闭两个LED
}
if(h==0&&led==0&&lad==0){led=1;lad=0;}//此句防止数码管倒计时后两个LED继续同时点亮
}
/***************************************************************************/
Ⅳ c51单片机定时器30秒倒计时程序,一个按键控制开始,另一个按键控制暂停和继续
#include<reg51.h>
unsignedcharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0-9
unsignedcharsec=30,scanled;
unsignedchardisdat[2];
sbitkeys=P1^0;
sbitkeyc=P1^1;
sbitfmq=P3^0;
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
disdat[0]=sec/10;
disdat[1]=sec%10;
}
voidt0isr()interrupt1 //秒计时
{
TH0=0x3c;
TL0=0xb0;
time++;
if(time==20)
{
time=0;
if(sec>0&&flag==0)sec--;
}
dischg();
}
voidt1isr()interrupt3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0xfe;
P0=ledtab[disdat[1]];
break;
case1:
P2=0xfd;
P0=ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=2;
}
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;
while(1)
{
if(keys==0)
{
while(keys==0);
TR0=1;
}
if(keyc==0)
{
while(keyc==0);
TR0=~TR0;
}
}
}