您的位置 首页 主动

DIY制造LED数码管定时器

由于只有一个数码管,只能显示0到15,所以这个定时器可以定时0到15分,0到15个小时,0到15天,0到15个星期,本来想在程序中加上定时0到15个

因为只要一个数码管,只能显现0到15,所以这个守时器能够守时0到15分,0到15个小时,0到15天,0到15个星期,原本想在程序中加上守时0到15个月,但想想在实际情况中守时15个月都有一年多了,估量好少用到,就不写了。这个守时器我加上了继电器,所以能够操控220V交流电,且守时差错在几个毫秒内,还算准确吧。。。

先来几张初期的原理图:

下面是单片机的源程序:
#include
#define uint unsigned int
#define uchar unsigned char
sbit ledg=P1^0;//秒闪耀(一秒钟亮一秒钟灭)
sbit ledb=P1^1;//分闪耀(一分钟亮一分钟灭)
sbit fmq=P3^3;// 蜂鸣器
sbit ledx=P3^4;// 守时星期指示灯
sbit ledt=P3^6;// 守时天指示灯
sbit ledf=P3^5;// 守时分钟指示灯
sbit leds=P3^7;// 守时小时指示灯
sbit key1=P1^6;// 发动|暂停
sbit key2=P1^5;// 调整守时分钟
sbit key3=P1^4;// 调整守时小时
sbit key4=P1^3;// 调整守时天
sbit key5=P1^2;// 调整守时星期
sbit jdq=P1^7; //继电器
uint i,j,num,num1,num2,num3,num4,num5,num6;
uchar shi,temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,dsf,dss,dst,dsx;
uchar code shuju[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
void delayms(uint xms)
{
for(i=xms;i>0;i–)
for(j=110;j>0;j–);
}
void display(shi)
{
P2=shuju[shi];
}
void keyscan()
{
uchar i;
if(key1==0)
{
delayms(10);
if(key1==0)
{
ledb=0; //把分闪耀指示灯调用来指示发动|暂停
while(i==0&&P2!=0xC0)
{
TR0=~TR0;// 发动|暂停
i++;
}
if(TR0==1)
{
ledb=1;//把分闪耀指示灯调用来指示发动|暂停
}
else
{
TR0=0;
}
}
}
if(key2==0&&TR0==0)
{
dss=0; // 守时小时清零
dst=0; // 守时天数清零
dsx=0; // 守时星期清零
temp1=1; //进入switch-case
delayms(10);
}
if(key3==0&&TR0==0)
{
dsf=0;
dst=0;
dsx=0;
temp2=1;
delayms(10);
}
if(key4==0&&TR0==0)
{
dsf=0;
dss=0;
dsx=0;
temp3=1;
delayms(10);
}
if(key5==0&&TR0==0)
{
dsf=0;
dss=0;
dst=0;
temp4=1;
delayms(10);
}
switch (temp1)
{
case 1:
if(key2==0)
{
leds=1; // 封闭守时小时指示灯
ledt=1; // 封闭守时天指示灯
ledx=1;// 封闭守时星期指示灯
ledf=0;// 翻开守时分钟指示灯
ledg=1; // 封闭秒闪耀
ledb=1; // 封闭分闪耀
jdq=0; //封闭继电器
dsf++; // 分钟加加
shi=dsf;// 把分送去显现
if(dsf==16)
{
shi=0;
dsf=0;
}
while(!key2);
temp1=2;
temp5=1;
num2=dsf;
temp6=2;
temp7=2;
temp8=2;
}
break;
}
switch (temp2)
{
case 1:
if(key3==0)
{
ledf=1;
ledt=1;
ledx=1;
leds=0;
jdq=0;
ledg=1;
ledb=1;
dss++;
shi=dss;
if(dss==16)
{
shi=0;
dss=0;
}
while(!key3);
temp2=2;
temp6=1;
num4=dss;
temp5=2;
temp7=2;
temp8=2;
}
break;
}
switch (temp3)
{
case 1:
if(key4==0)
{
ledf=1;
leds=1;
ledx=1;
ledt=0;
jdq=0;
ledg=1;
ledb=1;
dst++;
shi=dst;
if(dst==16)
{
shi=0;
dst=0;
}
while(!key4);
temp3=2;
temp7=1;
num5=dst;
temp5=2;
temp6=2;
temp8=2;
}
break;
}
switch (temp4)
{
case 1:
if(key5==0)
{
ledf=1;
leds=1;
ledt=1;
ledx=0;
jdq=0;
ledg=1;
ledb=1;
dsx++;
shi=dsx;
if(dsx==16)
{
shi=0;
dsx=0;
}
while(!key5);
temp4=2;
temp8=1;
num6=dsx;
temp5=2;
temp6=2;
temp7=2;
}
break;
}
switch (temp5)
{
case 1:
if(num==3686)
{
num=0;
ledg=~ledg;
num1++;
}

if(num1==60)
{
num1=0;
num2–;
shi=num2;
if(num2==0)
{
jdq=1;
TR0=0;
}
}
break;

}
switch (temp6)
{
case 1:
if(num==3686)
{
num=0;
ledg=~ledg;
num1++;
}

if(num1==60)
{
num1=0;
ledb=~ledb;
num3++;
if(num3==60)
{
num3=0;
num4–;
shi=num4;
}
if(num4==0)
{
jdq=1;
TR0=0;
}
}
break;
}
switch (temp7)
{
case 1:
if(num==3686)
{
num=0;
ledg=~ledg;
num1++;
}

if(num1==60)
{
num1=0;
ledb=~ledb;
num3++;
if(num3==1440)
{
num3=0;
num5–;
shi=num5;
}
if(num5==0)
{
jdq=1;
TR0=0;
}
}
break;
}
switch (temp8)
{
case 1:
if(num==3686)
{
num=0;
ledg=~ledg;
num1++;
}

if(num1==60)
{
num1=0;
ledb=~ledb;
num3++;
if(num3==10080)
{
num3=0;
num6–;
shi=num6;
}
if(num6==0)
{
jdq=1;
TR0=0;
}
}
break;
}
}

void main()
{
TMOD=0x02;
TH0=6;
TL0=6;
EA=1;
ET0=1;
jdq=0;
while(1)
{
keyscan();
display(shi);
while(jdq==1&&P2==0xC0)
{
fmq=0;
ledg=1;
ledb=1;
}
}
}
void T0_time()interrupt 1
{
num++;
}

悉数全代码下载:http://www.51hei.com/f/ledccr.rar
这是洞洞板绘图软件画的电路图:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/255720.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部