当前位置:首页 > 单片机 > 单片机
[导读] 继电器定时器程序#include//器件配置文件#defineucharunsignedchar//变量类型的宏定义#defineuintunsignedintucharDATA_7SEG[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};/*0~9的数码管段

继电器定时器程序

#include//器件配置文件
#defineucharunsignedchar//变量类型的宏定义

#defineuintunsignedint
ucharDATA_7SEG[10]={0xfc,0x60,0xda,0xf2,0x66,
0xb6,0xbe,0xe0,0xfe,0xf6};/*0~9的数码管段码*/
ucharx[4];/*存放走时的数组*/
uchary[4]={0,0,0,0};/*存放定时1的数组*/
ucharz[4]={0,0,0,0};/*存放定时2的数组*/
ucharact[4]={0xfe,0xfd,0xfb,0xf7};/*四位数码管的位选码*/
voiddelay(uintk);//延时子函数声明
voidconv();//走时转换子函数声明
voidp_out();//判别定时到否子函数声明
voidp_out1();//判别定时到否子函数1声明
voidt_adj();//走时调整子函数声明
uchardEDA=0;/*100mS计数单元清零*/
bitd_05s=0;/*0.5秒标志*/
bito_f1=0;/*定时1启/停标志*/
bito_f2=0;/*定时2启/停标志*/
ucharset=0;/*功能键标志*/
ucharh=0;
ucharn=0;
ucharm=0;
ucharflag;
ucharleft=0;
ucharsec=0;
ucharmin=0;
ucharhour=0;
ucharmin1=0;
ucharhour1=0;
ucharmin2=0;
ucharhour2=0;
ucharup=0;
bitflag1=0;
bitflag2=0;

/*显示走时*/
voidtime()
{
for(h=0;h<4;h++)
{P1=DATA_7SEG[x[h]];//输出数码管的字形码
P3=act[h];p_out();//输出数码管的位码。判断输出
if(P3_2==0){if(d_05s==1)P1_0=1;elseP1_0=0;}/*百位数码管点亮时,控制小数点
(秒点)闪烁*/
delay(2);}//每位数码管点亮2ms
if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;}/*若定时1启动,
点亮十位数码管小数点*/
else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则十位数码管
小数点不亮*/
delay(2);
if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;}/*若定时2启动,
点亮个位数码管小数点*/
else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则个位数码管
小数点不亮*/
delay(2);
}

/*定时器T0初始化*/
voidinit_timer0()
{
TMOD=0x11;
TH0=-(50235/256);
TL0=-(50235%256);
IE=0x8a;
TR0=1;
}

/*定时器T1初始化*/
voidinit_timer1()
{
TH1=-(5000/256);
TL1=-(5000%256);
}


/*延时k*1ms子函数*/
voiddelay(uintk)
{
uinti,j;
for(i=0;ifor(j=0;j<60;j++)
{;}}
}

/*100mS定时中断服务子函数*/
voidzd0(void)interrupt1
{
TH0=-(50235/256);//重装100ms定时初值
TL0=-(50235%256);
deda++;//100ms计时单元递增
}

/*10mS定时中断服务子函数*/
voidzd1(void)interrupt3
{uchari,j;i=P1;j=P3;
TH1=-(5000/256);
TL1=-(5000%256);
if(m==1)n++;
if(n>=30){n=0;m=0;}
P3_7=0;
P1=0xff;
if(P1!=0xff)
{
if(n==0)m=1;
{if(n==1)
{
if(P1_0==0){set++;left=0;}
if(set>=4)set=0;
if(set==1)flag=0x55;
if(P1_1==0)left++;
if(left>=4)left=0;
if(P1_2==0){up++;
switch(left)
{
case0:{if(up>=10)up=0;}break;
case1:{if(up>=6)up=0;}break;
case2:{if(up>=10)up=0;}break;
case3:{if(up>=3)up=0;}break;
default:break;
}
}
if(P1_2==0){
switch(set)
{case0:break;
case1:x[left]=up;break;
case2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break;
case3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break;
default:break;}
}
else{
switch(set)
{case0:break;
case1:up=x[left];break;
case2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break;
case3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break;
default:break;}
}}
}}
P1=i;P3=j;
}

/*显示调整走时*/
voidt_adj()
{p_out1();
for(h=0;h<4;h++)//四位数码管每位点亮3ms
{if(h==left)P1=0x00;
else{P1=DATA_7SEG[x[h]];
P3=act[h];p_out();
delay(3);}}
P1=DATA_7SEG[up];P3=act[left];
hour=x[3]*10+x[2];min=x[1]*10+x[0];
p_out();
delay(12);//需调整的数码管点亮12ms
if(o_f1==1){P1=0x01;P3_3=1;P3_2=1;P3_1=0;P3_0=1;}/*若定时1启动,
点亮十位数码管小数点*/
else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则十位数码管
小数点不亮*/
delay(12);//需调整的数码管点亮12ms
if(o_f2==1){P1=0x01;P3_3=1;P3_2=1;P3_1=1;P3_0=0;}/*若定时2启动,
点亮个位数码管小数点*/
else{P1=0x00;P3_3=1;P3_2=1;P3_1=1;P3_0=1;}p_out();/*否则个位数码管
小数点不亮*/
delay(12);//需调整的数码管点亮12ms
}

/*显示调整定时1*/
voidt1_adj()
{p_out1();
for(h=0;h<4;h++)//四位数码管每位点亮3ms
{if(h==left)P1=0x00;
else{P1=DATA_7SEG[y[h]];
P3=act[h];p_out();
delay(3);}}
P1=DATA_7SEG[up];P3=act[left];//需调整的数码管点亮18ms
hour1=y[3]*10+y[2];min1=y[1]*10+y[0];
p_out();
delay(18);
if(o_f1==1){P1=0x01;P3_3=0;P3_2=1;P3_1=0;P3_0=1;}/*若定时1启动,
点亮十位数码管小数点*/
else{P1=0x01;P3_3=0;P3_2=1;P3_1=1;P3_0=1;}/*否则十位数码管
小数点不亮*/
p_out();
delay(18);//需调整的数码管点亮18ms
}


/*显示调整定时2*/
voidt2_adj()
{p_out1();
for(h=0;h<4;h++)//四位数码管每位点亮3ms
{if(h==left)P1=0x00;
else{P1=DATA_7SEG[z[h]];//需调整的数码管点亮18ms
P3=act[h];p_out();
delay(3);}}
P1=DATA_7SEG[up];P3=act[left];
hour2=z[3]*10+z[2];min2=z[1]*10+z[0];
p_out();
delay(18);
if(o_f2==1){P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=0;}/*若定时2启动,
点亮个位数码管小数点*/
else{P1=0x01;P3_3=1;P3_2=0;P3_1=1;P3_0=1;}/*否则个位数码管
小数点不亮*/
p_out();
delay(18);//需调整的数码管点亮18ms
}


/*时、分、秒计时单元转换*/
voidconv()
{
if(deda<=5)d_05s=0;//每500ms,秒点取反
elsed_05s=1;
if(deda>=10){sec++;deda=0;}//每1000ms,秒单元递增
if(sec>=60){min++;sec=0;}//每60s,分单元递增
if(min>=60){hour++;min=0;}//每60m,时单元递增
if(hour>=24){hour=0;}//每24h,时单元清零
}

/*判别定时到否子函数*/
voidp_out()
{
if(o_f1==1)//若定时1启动
{if(hour==hour1)//定时1时间到
{if(min==min1)
{flag1=1;if(d_05s==1)P3_4=0;elseP3_4=1;}}}//继电器输出标志置1,蜂鸣器间断鸣响
if(flag1==1)P3_5=0;//若输出标志为1,继电器吸合

if(o_f2==1)//若定时2启动
{if(hour==hour2)//定时2时间到
{if(min==min2)
{flag1=0;if(d_05s==1)P3_4=0;elseP3_4=1;}}}//继电器输出标志置0,蜂鸣器间断鸣响
if(flag1==0)P3_5=1;//若输出标志为0,继电器释放
}

/*判别定时到否子函数1*/
voidp_out1()
{
if(o_f1==1)//若定时1启动
{if(hour==hour1)//定时1时间到
{if(min==min1)
{flag1=1;}}}//继电器输出标志置1
if(flag1==1)P3_5=0;//若输出标志为1,继电器吸合

if(o_f2==1)//若定时2启动
{if(hour==hour2)//定时2时间到
{if(min==min2)
{flag1=0;}}}//继电器输出标志置0
if(flag1==0)P3_5=1;//若输出标志为0,继电器释放
}


/*主函数*/
voidmain()
{
init_timer0();/*定时器T0初始化*/
init_timer1();/*定时器T1初始化*/

while(1)
{
/*将显示缓冲数组内容移到时、分计时单元*/
hour=x[3]*10+x[2];min=x[1]*10+x[0];
hour1=y[3]*10+y[2];min1=y[1]*10+y[0];
hour2=z[3]*10+z[2];min2=z[1]*10+z[0];
conv();/*时、分、秒及100mS单元转换*/
/*将转换后的时、分计时单元内容移到显示缓冲数组*/
x[3]=hour/10;x[2]=hour%10;x[1]=min/10;x[0]=min%10;
y[3]=hour1/10;y[2]=hour1%10;y[1]=min1/10;y[0]=min1%10;
z[3]=hour2/10;z[2]=hour2%10;z[1]=min2/10;z[0]=min2%10;
switch(set)
{
case0:time();break;/*显示走时*/
case1:t_adj();break;/*显示调整走时*/
case2:t1_adj();break;/*显示调整定时1*/
case3:t2_adj();break;/*显示调整定时2*/
default:break;
}
if(flag!=0x55)/*判断RAM受干扰标志,若受干扰,
则显示器闪烁告警*/
{uchari;P3_4=1;P3_5=1;
for(i=0;i<100;i++)/*点亮显示器200mS*/
{
P1=DATA_7SEG[x[3]];P3=0xf7;delay(1);
P1=DATA_7SEG[x[2]];P3=0xfb;delay(1);
P1=DATA_7SEG[x[1]];P3=0xfd;delay(1);
P1=DATA_7SEG[x[0]];P3=0xfe;delay(1);
}

P1=0xff;P3=0xff;delay(400);/*熄灭显示器200mS*/
P3_7=0;
/*如有键按下达0.5S则退出闪烁状态同时掉电标志置55H。*/
if(P1!=0xff){
delay(10);if(P1_0==0)flag=0x55;F0:if(P1!=0xff)gotoF0;
}P3_7=1;
}
elseTR1=1;/*启动定时器1*/
}}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Holtek新推出BS67F2432具备触控按键、高精准度HIRC与LCD驱动器Flash MCU。主要特色为内建高精准度4MHz HIRC振荡电路、8路触控按键及最大支持4COM×15SEG LCD驱动器。适用于触控接...

关键字: MCU LCD驱动器 定时器

专业研发提供节省空间的PoE ASFET和EMC优化型NextPowerS3 MOSFET。

关键字: PoE 继电器 MOSFET

在工业自动化和电力系统的控制领域,接触器和继电器是两种极为重要的电气元件。它们虽然在功能上有着相似之处,但在应用、结构和工作原理上却各有特色。本文将深入探讨这两种设备的区别,并通过比较分析来阐明它们各自的优势和局限。

关键字: 接触器 继电器

今天解析一下中间继电器的作用与应用深度解析。在工业自动化和电气控制系统中,中间继电器作为一种电磁开关设备,扮演着重要的角色。不同于一般的接触器或大型继电器,中间继电器通常用于控制一个或多个辅助电路,其负载电流相对较小。本...

关键字: 中间继电器 继电器

在工业和建筑自动化控制系统中,中间继电器和接触器作为两种常用的电磁开关设备,它们在电路中扮演着至关重要的角色。尽管二者在功能上有所重叠,但它们的设计、用途以及工作方式却有着明显的差异。为了帮助工程师和技术人员更好地理解和...

关键字: 中间继电器 继电器 接触器

在电子和电气工程领域,继电器作为一种基础而重要的组件,扮演着控制、保护和通信的多重角色。它们在各种设备和系统中广泛应用,从简单的家用电器到复杂的工业控制系统中都能看到它们的身影。本文将深入探讨继电器的作用以及其工作原理,...

关键字: 继电器 电控制器件

你了解继电器与接触器的区别吗,在电气控制系统中,继电器和接触器是两种常见的电磁开关设备。它们在自动控制电路中扮演着至关重要的角色,负责实现远距离控制、保护电路以及传递信号等功能。尽管两者在功能上有所重叠,但它们的设计、用...

关键字: 继电器 接触器

在工业控制和自动化领域,中间继电器作为一种典型的电气控制组件,扮演着扩展控制能力、增强系统灵活性的重要角色。本文旨在深入探讨中间继电器的工作原理,并解析其在多样化应用场景中的功能及作用。

关键字: 中间继电器 继电器

今天,小编将在这篇文章中为大家带来继电器的有关报道,通过阅读这篇文章,大家可以对继电器具备清晰的认识,主要内容如下。

关键字: 继电器 漏电继电器

在现代电气工程中,继电器是一种广泛应用于控制电路的关键元件。它们可以实现小电流控制大电流的功能,从而实现对各种设备的自动控制。然而,市场上有众多的继电器型号,让人眼花缭乱。本文将为您介绍继电器的基本知识,以及如何根据实际...

关键字: 继电器 电气工程
关闭
关闭