求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000

1. 有4个数码管(共阳) 显示千、百、十、个(秒)。
2. 开机时显示00:00,通过4个按键(微动开关)分别控制个、十、百、千各位0~9的显示,实现对预定时间设定,按一下加一,0~9循环。
3. 时间设定后倒计时开始,待数码管显示0000时,继电器断开,下游断电。
4.单片机晶振12.000。
5.数码管:共阳数码管,段位:P0.0~P0.7。控制极:P2.0~P2.3。
6.开关:千位~~~个位是P1.0~~~P1.3。
7.继电器:P3.0
从没学过C语言,单片机也是觉得感兴趣,刚刚开会学习的。
跪求,跪求,跪跪求哪位大神、高手、天才能帮我解决一下。感激涕零啊~~~

这是数字时钟的C程序,如果要实现对继电器的开关控制,就可以在主程序中加入对时间的控制。也就是说,在你定义的某个时间上,继电器会实现开或者合的状态!由于单片机对数码管的控制引脚有别,程序还得自己加以修改。
#include<reg52.h>
//#include<absacc.h>
#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^2;//位选定义
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)%256;
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%10];//显示秒钟的个位
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%10];//显示分钟的个位
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%10];//显示小时的个位
duan=0;
delay(1);

wei=1;
P0=0x20;
wei=0;
P0=0xff;
duan=1;
P0=table[shi/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();
}
}追问

5555555555朋友,我还是没弄明白啊,不是懒,真的一点基础也木有啊。麻烦有时间帮我改改,我直接就能用的。在网上搜了几个程序继电器程序,不知道该怎么加进去,还有一些地方也得改吧,段选、位选我知道:sbit duan=P0^0;//段选定义
.........
sbit duan=P0^7;
sbit LED4= P2^3;//数码管位选
..........
sbit LED1= P2^0;
sbit k1=P1^0;//按键定义
..........
sbit k4=P1^3;
渴望再次得到你的帮助,困死了..

追答

最好的办法是看51单片机基础的书籍,这是打基础的好书! 我没有你的硬件,我的软件只能帮到此步骤了!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-08
开一个定时中断, 键盘扫描,和led显示,定时到P3.0=1/=0控制继电器吸合,断开。你的程序就写三个函数就行了,找个例程,自己摸索一下就搞定了。
相似回答