这个不算太难,只要利用标识符进行判断即可
标识符就是一个变量,常使用字符型变量作为标识符,占用空间小
每一种状态都用标识符表示出来,例如状态0,状态1,状态2 状态254
字符型变量的值范围是 0 ~ 254 共255个值,够你用的了
给你一个类似的程序,我自己写的,你作为参考吧
程序的组成是:两个按键,一组四位数码管,两个LED发光二极管
程序的功能是:按下按键A,两个LED同时点亮,并延时10秒(时间随意修改)
按下按键B,两个LED同时熄灭,并延时10秒(时间随意修改)
无按键按下时,两个LED交替点亮,达到闪烁的效果
程序如下,并加了注释,若!
#include <reg51h> //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继续同时点亮
}
//
从60秒到30秒再到90秒并循环倒计时显示。
----
有点不好理解。
从60秒到30秒,看来,是倒计时。
到了30之后,怎么办?是立即改为90吗?
到了90之后,再怎么办?是立即改为60吗?
#include "reg51h"
sbit start=P3^2; //外部中断0引脚 开始
sbit rst=P3^3; //外部中断1引脚 复位
sbit breakk=P3^4;
sbit led=P3^5;
sbit beep=P3^7;
sbit P30=P3^0;
sbit P31=P3^1;
unsigned char code duanma[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff
};
char time=24;//原来的30s改为24小时
char flag_t=0; // 1秒辅助计时
char now=0; // 0停止 1 计时 2报警 3复位
unsigned int temp=0;//添加此行// 定义一个16位临时变量
unsigned char g=0,s=3,i=0;
void delay(unsigned int n)
{
while(--n);
}
void t0_srv() interrupt 1 using 1
{
TH0=0X3C;
TL0=0XB0;
flag_t++;
if(flag_t>=20){ //2050ms=1s
flag_t=0;
temp++; //添加此行
if(temp>=3600)//1小时=3600s //添加此行
{
temp=0;//添加此行
time--;
if(time<=0){
beep=0;
led=0;
TR0=0;
now=2;
time=0;
}
}
}
}
void button_start() interrupt 0 using 1 //外部中断0
{
delay(1500);
if(start==0) {
now=1;
TR0=1;
}
else return;
while(start==0);
delay(1500);
}
void button_rst() interrupt 2 using 1
{
delay(1500);
if(rst==0) {
TR0=0;
time=24;//原为time=30;
i=0;
led=1;
beep=1;
now=0;
}
else return;
while(rst==0);
delay(1500);
}
void disp()
{
g=time%10;
s=time/10;
g=duanma[g];
s=duanma[s];
P1=g;
P31=0;
delay(250);
P31=1;
P1=s;
P30=0;
delay(250);
P30=1;
//
}
void key()
{
if(breakk==0)delay(1500);
else return;
if(breakk==0) {
if(now==1){
i++;
if(i%2)TR0=0;
if(!(i%2))TR0=1;
}
}
else return;
while(breakk==0);
delay(1500);
}
main()
{
TMOD=0X01;//定时器0工作在方式1,
EA=1;
IT0=1;
ET0=1;
TH0=0X3C;//在12M 晶振下,定时时间为50ms
TL0=0XB0;
EX0=1;
EX1=1;
//TR0=1;
while(1){
disp();
key();
}
}
#include <at89x52h>
#include <intrinsh>
#define uchar unsigned char
#define uint unsigned int
#define seg P0
#define sw P2
int tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
int dis[]={0,0};
uint X;
uchar Count=0;
uchar sec=60;
void display()
{
int a;
int m=0x01;
dis[0]=sec/10;
dis[1]=sec%10;
for(a=0;a<2;a++)
{
seg=0xff;
seg=tab[dis[a]];
sw=m;
m=_crol_(m,1);
}
}
void TINT0() interrupt 1
{
TL0=-50000%256;
TH0=-50000/256;
if(++Count==20)
{
if(sec>0)sec--;
Count=0;
}
}
void Main()
{
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TL0=-50000%256;
TH0=-50000/256;
while(1)
{
if(sec==0)sec=60;
display();
}
}
以上就是关于求大神编一道51单片机实现多种倒计时功能全部的内容,包括:求大神编一道51单片机实现多种倒计时功能、求C51单片机汇编语言控制两位数码管倒计时程序,从60秒到30秒再到90秒并循环倒计时显示。、下面是51单片机30秒倒计时程序,怎么把它改成24小时倒计时程序,别的不变,十分感谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)