标题:
51单片机粗略60s倒计时数码管显示求教
[打印本页]
作者:
单片机之神
时间:
2020-4-26 23:37
标题:
51单片机粗略60s倒计时数码管显示求教
目前还没有学习定时中断,所以只能是粗略的60s倒计时数码管显示,下面是我自己编的程序,没有预期现象,还请各位大佬帮忙瞅瞅,感谢!
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
void display(uint ge,uint shi);
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=120;b>0;b--);
}
uchar table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint c,n,i,ge,shi;
sbit k1=P1^0;
void main()
{
while(1)
{
c=0;
n=60;
if(k1==0) {c=1;}
if(k1==0) delay(10);
if(c==1)
{
for(i=60;i>0;i--)
{
n- -;
display(ge,shi);//调用显示子函数
delay(1000);//延时一秒
}
if(n==0) n=0;
}
}
}
}
void display(uint ge,uint shi)//显示子函数
{
ge=n%10;
shi=n/10;
P2=0xfe;
P1=table1[ge];
delay(5);
P2=0xfd;
P1=table1[shi];
delay(5);
}
作者:
之一知足
时间:
2020-4-26 23:58
那就去学定时器,用软件延时函数太粗略了,或者用延时函数计算工具,计算出大概比较精确的延时函数,自己一点一点试,比较不好
作者:
单片机之神
时间:
2020-4-27 07:31
拜托了各位,这个是我们师傅布置的任务,不用中断定时怎么做
作者:
xianfajushi
时间:
2020-4-27 09:27
用不用中断都一样,都是延时而已。可参
https://blog.csdn.net/xianfajush ... rank_v2~rank_v25-19
作者:
wulin
时间:
2020-4-27 14:11
用控制主循环周期的60s倒计时程序示例+仿真
无标题.jpg
(121.04 KB, 下载次数: 24)
下载附件
2020-4-27 14:10 上传
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit k1=P3^0;
uchar table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint n;
uchar c=0,i=0,sec=0;
bit j;
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=119;b>0;b--);
}
void display()//显示子函数
{
P1=0x00;//消隐
P2=0xfe;//送个位位码
P1=table1[sec%10];//送个位段码
delay(1);//延时一毫秒
P1=0x00;//消隐
P2=0xfd;//送十位位码
P1=table1[sec/10];//送十位段码
delay(1);//延时一毫秒
}
void main()
{
while(1)//主循环周期约2ms
{
if(k1==0)
{
if(++i==10 && j==0)//计数消抖与判断按键状态
{
j=1;//记忆按键状态
c++;
if(c==1)//开始倒计时
{
sec=60;
n=0;
}
// if(c==2)//暂停
if(c==3)//清0
{
c=0;
sec=0;
}
}
}
else //按键松手
{
i=0;
j=0;
}
if(c==1)//允许倒计时
{
n++;
if(n>=500)//1秒
{
n=0;
if(sec>0)
sec--;
if(sec==0)
c=0;
}
}
display();//调用显示子函数
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1