历史上的今天
今天是:2025年01月06日(星期一)
2018年01月06日 | 继电器定时器程序
2018-01-06 来源:eefocus
继电器定时器程序
#include
#define uchar unsigned char //变量类型的宏定义
#define uint unsigned int
uchar DATA_7SEG[10]={0xfc,0x60,0xda,0xf2,0x66,
0xb6,0xbe,0xe0,0xfe,0xf6}; /*0~9的数码管段码*/
uchar x[4]; /* 存放走时的数组*/
uchar y[4]={0,0,0,0}; /* 存放定时1的数组*/
uchar z[4]={0,0,0,0}; /* 存放定时2的数组*/
uchar act[4]={0xfe,0xfd,0xfb,0xf7}; /*四位数码管的位选码*/
void delay(uint k); //延时子函数声明
void conv(); //走时转换子函数声明
void p_out(); //判别定时到否子函数声明
void p_out1(); //判别定时到否子函数1声明
void t_adj(); //走时调整子函数声明
uchar dEDA=0; /*100mS计数单元清零*/
bit d_05s=0; /*0.5秒标志*/
bit o_f1=0; /*定时1启/停标志*/
bit o_f2=0; /*定时2启/停标志*/
uchar set=0; /*功能键标志*/
uchar h=0;
uchar n=0;
uchar m=0;
uchar flag;
uchar left=0;
uchar sec=0;
uchar min=0;
uchar hour=0;
uchar min1=0;
uchar hour1=0;
uchar min2=0;
uchar hour2=0;
uchar up=0;
bit flag1=0;
bit flag2=0;
/*显示走时*/
void time()
{
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;else P1_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初始化*/
void init_timer0()
{
TMOD=0x11;
TH0=-(50235/256);
TL0=-(50235%256);
IE=0x8a;
TR0=1;
}
/*定时器T1初始化*/
void init_timer1()
{
TH1=-(5000/256);
TL1=-(5000%256);
}
/*延时k*1ms子函数*/
void delay(uint k)
{
uint i,j;
for(i=0;i
{;}}
}
/*100mS定时中断服务子函数*/
void zd0(void) interrupt 1
{
TH0=-(50235/256); //重装100ms定时初值
TL0=-(50235%256);
deda++; //100ms计时单元递增
}
/*10mS定时中断服务子函数*/
void zd1(void) interrupt 3
{uchar i,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)
{
case 0:{if(up>=10)up=0;}break;
case 1:{if(up>=6)up=0;}break;
case 2:{if(up>=10)up=0;}break;
case 3:{if(up>=3)up=0;}break;
default:break;
}
}
if(P1_2==0){
switch(set)
{case 0:break;
case 1:x[left]=up;break;
case 2:{y[left]=up;if(P1_3==0)o_f1=!o_f1;}break;
case 3:{z[left]=up;if(P1_3==0)o_f2=!o_f2;}break;
default:break;}
}
else {
switch(set)
{case 0:break;
case 1:up=x[left];break;
case 2:{up=y[left];if(P1_3==0)o_f1=!o_f1;}break;
case 3:{up=z[left];if(P1_3==0)o_f2=!o_f2;}break;
default:break;}
}}
}}
P1=i;P3=j;
}
/*显示调整走时*/
void t_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*/
void t1_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*/
void t2_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
}
/*时、分、秒计时单元转换*/
void conv()
{
if(deda<=5)d_05s=0; //每500ms,秒点取反
else d_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,时单元清零
}
/*判别定时到否子函数*/
void p_out()
{
if(o_f1==1) //若定时1启动
{if(hour==hour1) //定时1时间到
{if(min==min1)
{flag1=1;if(d_05s==1)P3_4=0;else P3_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;else P3_4=1;}}} //继电器输出标志置0,蜂鸣器间断鸣响
if(flag1==0) P3_5=1; //若输出标志为0,继电器释放
}
/*判别定时到否子函数1*/
void p_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,继电器释放
}
/*主函数*/
void main()
{
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)
{
case 0:time();break;/*显示走时*/
case 1:t_adj();break;/*显示调整走时*/
case 2:t1_adj();break;/*显示调整定时1*/
case 3:t2_adj();break;/*显示调整定时2*/
default:break;
}
if(flag!=0x55) /*判断RAM受干扰标志,若受干扰,
则显示器闪烁告警*/
{uchar i;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)goto F0;
}P3_7=1;
}
else TR1=1;/*启动定时器1*/
}}
上一篇:AT89C52闹钟程序
下一篇:步进电机LCD显示可设定转数程序
史海拾趣
|
我自己倒了NK想把它加载到开发板上去运行,我用的方法是DOS加载法,做DOM DOS可引导系统,然后把,NK.BIN,CONFIG.SYS,OUTOEXEC.BAT,LOADCEPC.EXE拷贝到DOM中,开发板启动提示丢失了HIMEM.SYS文件,请问怎么解决?谢谢,最好帮 ...… 查看全部问答> |
|
我的VxWorks系统使用软盘启动,但存在一个问题:我的硬件平台是PC104,当PC104挂硬盘时VxWorks引导系统正常;不挂硬盘时,系统反复启动不能正常加载VxWorks。是不是要在config.h文件里做一些关于硬盘方面的设置,该如何设置请各位高手指点一下。… 查看全部问答> |
|
【班竹:为什么我的两个招聘的帖子都被删除了???】 招聘2-3名软件测试人员 我部门是隶属于一工厂的研发部,工厂在深圳福永(机场附近)。主要从事GPS的研发工作。 工作地点:深圳市南山区科技园 要求: 1) 计算机软件及相关专业毕业,大专及 ...… 查看全部问答> |
|
/* Includes ------------------------------------------------------------------*/#include \"stm32f10x.h\" GPIO_InitTypeDef GPIO_InitStructure;#define LED1_ON GPIO_SetBits(GPIOB,GPIO_Pin_5);#define LED1_OFF GPIO_ResetBits(GPI ...… 查看全部问答> |
|
前阵子有个项目,用了STM32F103,I2C总线上挂了两三个器件。读写器件时,总是等待某标志位出错。 由于时间紧,只能模拟I2C了。后来在网上搜了一下,貌似有哥们遇到类似问题,说是ST官方的errata承认I2C有问题。 不知道各位遇到过没? 希望赐 ...… 查看全部问答> |
|
,超前电子的LPC2368开发板,原价460元,现在卖240吧,不到6折了,不包邮, 板子的资料齐全,有一个配套LCD,板载网络接口 SD卡 USB 等常用功能 联系qq:289916015[localimg=300,240]2[/localimg] http://item.taobao.com/item.htm?id=988308063 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:34 编辑 去年公司里的产品上用到2254 运放,可是有次采购到的TLV2254I应用到HART通讯上,手持器通信就是通讯不上,后来换了以前购买的V2254AI就是可以通讯的上,请问V2254AI跟TLV2254I G4有什么区别? 片 ...… 查看全部问答> |




