我自带电路图,急要,私我。
一段定时关机的代码就行。
基础代码不复杂,很快的,快来快来
#include<reg51.h>
#include <as.h>
#include <sd.h>
#include <math.h>
#define uint unsigned int
#define uchar unsigned char
uchar miao,shi,fen,t,al,temp;
int k;
sbit SCLK = P1^4; /*实时时钟时钟线引脚 */
sbit IO = P1^5; /*实时时钟数据线引脚 */
sbit RST = P1^6; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//校时按键与C51的引脚连接定义
sbit key1=P1^2; //设置键
sbit key2=P1^7; //加键
sbit dianji=P1^3;
sbit xiadong=P3^2;
void write_byte(uchar dat)//写一个字节
{
ACC=dat;
RST=1;
for(al=8;al>0;al--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()//读一个字节
{
RST=1;
for(al=8;al>0;al--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
//----------------------------------------
void write_1302(uchar add,uchar dat)//向1302芯片写函数,指定写入地址,数据
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)//从1302读数据函数,指定读取数据来源地址
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
//--------------------------------------
void ds1302_init() //1302芯片初始化子函数(2010-01-07,12:00:00,week4)
{
RST=0;
SCLK=0;
write_1302(0x8e,0x00); //允许写,禁止写保护
//write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
//write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
//write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
//write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
//write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07
//write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01
//write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10
write_1302(0x8e,0x80); //打开写保护
}
void init() //定时器、计数器设置函数
{
TMOD=0x11; //指定定时/计数器的工作方式为3
TH0=0; //定时器T0的高四位=0
TL0=0; //定时器T0的低四位=0
EA=1; //系统允许有开放的中断
ET0=1; //允许T0中断
TR0=1; //开启中断,启动定时器
}
void main()
{
ds1302_init();
init(); //调用定时计数器的设置子函数
key1=1;
key2=1;
dianji=0;
TR0=1;
xiadong=1;
while(1) //无限循环下面的语句:
{
if(key2==0)
{
delay(20);
if(key2==0)
{
t=50;
TR0=0;
miao=0;
temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302
write_1302(0x8e,0x00);
write_1302(0x80,0x80|temp);//miao
write_1302(0x8e,0x80);
fen++;
if(fen==60){fen=0;}
temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x82,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
while(t>0)
{
t--;
xianshi( shi,fen);
}
TR0=1;
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302
write_1302(0x8e,0x80);
}
}
TR0=1;
if(key1==0)
{
delay(20);
if(key1==0)
{
t=50;
TR0=0;
shi++;
if(shi==24){shi=0;}
temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码
write_1302(0x8e,0x00);//允许写,禁止写保护
write_1302(0x84,temp);//向DS1302内写小时寄存器84H写入调整后的小时数据BCD码
write_1302(0x8e,0x80);//打开写保护
miao=0;
while(t>0)
{
t--;
xianshi( shi,fen);
}
TR0=1; //开启中断,启动定时器
temp=(miao)/10*16+(miao)%10;
write_1302(0x8e,0x00);
write_1302(0x80,0x00|temp);//miao数据写入DS1302
write_1302(0x8e,0x80);
}
}
k=shi*100+fen;
if(xiadong==1)
{
if(0<=k && k<400){dianji=0;}
if(400<=k && k<=530 ){dianji=1;}
if(530<k && k<1830){dianji=0;}
if(1830<=k && k<=2030){dianji=1;}
if(2030<k && k<2400){dianji=0;}
}
if(xiadong==0)
{
if(0<=k && k<500){dianji=0;}
if(500<=k && k<=630){dianji=1;}
if(630<k && k<1700){dianji=0;}
if(1700<=k && k<=2000){dianji=1;}
if(2000<k && k<2400){dianji=0;}
}
xianshi(shi,fen);
} //调用键盘扫描子函数
}
void timer0() interrupt 1 //取得并显示日历和时间
{
miao = BCD_Decimal( read_1302(0x81) );
fen = BCD_Decimal( read_1302(0x83) );
shi = BCD_Decimal( read_1302(0x85) );
}
#ifndef _as_h_
#define _as_h_
#include<math.h>
#include<sd.h>
#include<wei.h>
sbit dian=P2^7;
char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
char code tab[]={0x70,0xb0,0xd0,0xe0};
int numb[4]={0};
int a,b,c,d,js;
int x;
void xianshi( int ho, mi)
{
a=ho/10;
b=ho%10;
c=mi/10;
d=mi%10;
numb[0]=a;
numb[1]=b;
numb[2]=c;
numb[3]=d;
x=0;
dian=0;
while(x<4)
{
P0=tab[x];
js=30;
while(js>0)
{
P2=table[ numb[x]];
if(x==1)
{ dian=1;}
js--;
}
P2=0x00;
x++;
}
}
#endif
#ifndef _sd_h_
#define _sd_h_
void delay(int z)
{
int x,j;
for(j=0;j<z;j++)
for(x=0;x<=50;x++);
}
#endif
找我