求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000
时间:2023-10-01 22:07:02
匿名用户
1级
2014-05-05 回答
这是数字时钟的C程序。如果要控制继电器的开关,可以在主程序中添加时间控制。换句话说,在您定义的某个时间内,继电器将打开或关闭!由于单片机对数字管的控制引脚不同,程序必须自行修改。
#include
//#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={ 0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xd8,
0x80,0x90}//数字显示
sbit duan=P2^1;//段选定义
sbit wei=P2^二、/位选定义
sbit k1=P3^2;//选择 秒/分/时 调试定义
sbit k2=P3^3.//增减调试定义
/*定义初始变量*/
uchar miao=0;
uchar fen=0;
uchar shi=0;
uchar mst=0.//标准化时间
uchar key=0;
void display()
void delay(uchar z);
void time_pro();
void keyscan();
main()
{
mst=0;
miao=0;
TMOD=0x01;//time0为定时器,选择方法1
TH0=(65535-50000)/256;
TL0=(65535-50000)%6;
EA=1;
ET0=1;
TR0=1;
wei=1;
P0=0x3f;
wei=0;
duan=1;
P0=table[0];
duan=0;
P1=0x55.//点亮流水灯
while(1)
{
display();
time_pro();
if(k1==0) keyscan();
这里加入了继电器开合控制:时间可以根据自己的需要任意定义
//例如:if(shi==17&&fen==21&&miao==52)
{
jidianqi=0;//0就表示继电器关闭
}
if(shi==23&&fen==57&&miao==34)
{
jidianqi=1./1表示继电器打开
}
}
}
/*显示子程序*/
void display()
{
wei=1;
P0=0x01;
wei=0;
P0=0xff;//清屏
duan=1;
P0=table[miao];//显示秒的位置
duan=0;
delay(1);
wei=1;
P0=0x02;
wei=0;
P0=0xff;
duan=1;
P0=table[miao/10];//显示秒的十位
duan=0;
delay(1);
wei=1;
P0=0x04;
wei=0;
P0=0xff;
duan=1;
P0=table[fen];///显示分钟的位置
duan=0;
delay(1);
wei=1;
P0=0x08;
wei=0;
P0=0xff;
duan=1;
P0=table[fen/10];//显示分钟十位
duan=0;
delay(1);
wei=1;
P0=0x10;
wei=0;
P0=0xff;
duan=1;
P0=table[shi];///显示小时个位
duan=0;
delay(1);
wei=1;
P0=0x20;
wei=0;
P0=0xff;
duan=1;
P0=table[shi/10];//显示10小时
duan=0;
delay(1);
}
/*延时子程序*/
void delay(uchar z)
{
uchar x,y;
for(x=0;x<=z;x )
for(y=0;y<=107;y );
}
/*子程序的时间处理*/
void time_pro()
{
if(miao>=60)
{ miao=0;
fen ;
if(fen>=60)
{
fen=0;
shi ;
if(shi>=24)
shi=0;
}
}
}
/*子程序扫描键盘*/
void keyscan()
{
///第一次检测 k1 按键
while(!key)
{
display();P1=~P1;
while(k1==0)
{
delay(1);
if(k1==0)
key=0;
key=1;
}
}
key=0;
///第一次检测 k2 按键
while(!key)
{
display();P1=~P1;
while(k2==0)
{
delay(220);
if(k2==0)
{ key=0;
miao ;
if(miao>=60) miao=0;
display();
delay(220);
}
key=1;
}
}
key=0;
///第二次检测 k1 按键
while(!key)
{
display();P1=0x55;
while(k1==0)
{
delay(220);
if(k1==0)
{
key=0;
display();
P1=~P1;
}
key=1;
}
}
key=0;
///第二次检测 k2 按键
while(!key)
{
display();P1=~P1;
while(k2==0)
{
delay(220);
if(k2==0)
{ key=0;
fen ;
if(fen>=60) fen=0;
display();
delay(220);
}
key=1;
}
}
key=0;
///第三次检测 k1 按键
while(!key)
{
display();P1=~0x55;
while(k1==0)
{
delay(220);
if(k1==0)
{
key=0;
P1=~P1;
display();
}
key=1;
}
}
key=0;
//第三次检测 k2 按键
while(!key)
{
display();P1=~P1;
while(k2==0)
{
delay(220);
if(k2==0)
{ key=0;
shi++;
if(shi>=24) shi=0;
display();
delay(220);
}
key=1;
}
}
}
/*中断延时子程序*/
void time() interrupt 1 //定时器0方式1,50ms中断一次
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
mst++;
if(mst==20)
{
mst=0;//记数机器清零
P1=~P1;
miao++;
time_pro();
}
}