📄 ds1302+led-c51.c
字号:
/******************************************************************
/* *
/* AOKE210E单片机开发系统演示程序 *
/* *
/* 版本: V2.0 (2007/11/20) *
/* 作者: 高山流水 (Email: aoke999@sohu.com) *
/* 网站: www.aokemcu.cn(奥科电子) *
/* *
/* *
/******************************************************************/
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;
sbit reset = P1^2;
sbit sclk = P1^0;
sbit io = P1^1;
sbit BEEP = P1^6;
sbit dula=P2^2;
sbit wela=P2^3;
bit flag=1,hour=0,min=0,sec=0;
bit year=0,month=0,day=0,week=0;
bit alarm_flag=0;
uchar timecount=0,count=0;
uchar str1[]=" - - Week: ";
uchar str2[]="Time: ";
uchar str3[]="Alarm: ";
uchar init [] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //
uchar init1[] ={0x00,0x00};
uchar init2[] ={0x00,0x00,0x00,0x26,0x11,0x01,0x07}; //
//秒, 分, 时, 日, 月,星期,年
uchar bj_time[] ={0x00,0x00,0x00};
//秒, 分, 时
uchar code mytab[8] = {0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};//小喇叭
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, //数码管编码
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/******************************************************************/
/******************************************************************/
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************/
//
/*********************************************************/
void delay()
{
uchar j;
for(j=250;j>0;j--);
}
/**********************************************************/
//
/**********************************************************/
void write_byte(uchar inbyte)
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0; //写的时候低电平改变数据
if(inbyte&0x01)
io=1;
else
io=0;
sclk=1; //写的时候高电平,把数据写入ds1302
_nop_();
inbyte=inbyte>>1;
}
}
/**********************************************************/
/**********************************************************/
uchar read_byte() //sclk的下跳沿读数据
{
uchar i,temp=0;
io=1; //设置为输入口
for(i=0;i<7;i++)
{
sclk=0;
if(io==1)
temp=temp|0x80;
else
temp=temp&0x7f;
sclk=1; //产生下跳沿
temp=temp>>1;
}
return (temp);
}
/**********************************************************/
// 往ds1302的某个地址写入数据
/**********************************************************/
void write_ds1302(uchar cmd,uchar indata)
{
sclk=0;
reset=1;
write_byte(cmd);
write_byte(indata);
sclk=0;
reset=0;
}
/**********************************************************/
// 读ds1302某地址的的数据
/**********************************************************/
uchar read_ds1302(uchar addr)
{
uchar backdata;
sclk=0;
reset=1;
write_byte(addr); //先写地址
backdata=read_byte(); //然后读数据
sclk=0;
reset=0;
return (backdata);
}
/**********************************************************/
// 设置初始时间
/**********************************************************/
void set_ds1302(uchar addr,uchar *p,uchar n) //写入n个数据
{
write_ds1302(0x8e,0x00); //写控制字,允许写操作
for(;n>0;n--)
{
write_ds1302(addr,*p);
p++;
addr=addr+2;
}
write_ds1302(0x8e,0x80); //写保护,不允许写
}
/**********************************************************/
// 读取当前时间
/**********************************************************/
void read_nowtime(uchar addr,uchar *p,uchar n)
{
for(;n>0;n--)
{
*p=read_ds1302(addr);
p++;
addr=addr+2;
}
}
/**********************************************************/
// 初始化DS1302
/**********************************************************/
void init_ds1302()
{
reset=0;
sclk=0;
write_ds1302(0x80,0x00);
write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电
write_ds1302(0x8e,0x80); //写保护控制字,禁止写
}
/**********************************************************/
/* */
/* 蜂鸣器响一声 */
/* */
/**********************************************************/
void beep()
{
unsigned char y;
for (y=0;y<100;y++)
{
delay();
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
delay1(50);
}
/**********************************************************/
// Time0中断函数
/**********************************************************/
void Time0(void) interrupt 1 using 0
{
TH0=0x4c; //50ms定时
TL0=0x00;
timecount++;
if(timecount>9)
{
timecount=0;
flag=~flag;
}
}
/**********************************************************/
// 设定值写入DS1302
/**********************************************************/
void Set_W1302(uchar addr)
{
uchar temp;
write_ds1302(0x8e,0x00);
temp=(init1[0]<<4)+init1[1];
write_ds1302(addr,temp);
write_ds1302(0x8e,0x80);
beep();
}
/**********************************************************/
// 显示当前时间
/**********************************************************/
void Play_nowtime()
{
read_nowtime(0x81,init,7); //读出当前时间,读出7个字节
if(!K4)
{
//显示年
dula=0;
P0=table[init[6]>>4];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay();
dula=0;
P0=table[init[6]&0x0f];
dula=1;
dula=0;
wela=0;
P0=0xfd;
wela=1;
wela=0;
delay();
//显示月
dula=0;
P0=table[init[4]>>4];
dula=1;
dula=0;
wela=0;
P0=0xfb;
wela=1;
wela=0;
delay();
dula=0;
P0=table[init[4]&0x0f];
dula=1;
dula=0;
wela=0;
P0=0xf7;
wela=1;
wela=0;
delay();
//显示日
dula=0;
P0=table[init[3]>>4];
dula=1;
dula=0;
wela=0;
P0=0xef;
wela=1;
wela=0;
delay();
dula=0;
P0=table[init[3]&0x0f];
dula=1;
dula=0;
wela=0;
P0=0xdf;
wela=1;
wela=0;
delay();
//显示周
dula=0;
P0=table[init[5]>>4];
dula=1;
dula=0;
wela=0;
P0=0xbf;
wela=1;
wela=0;
delay();
dula=0;
P0=table[init[5]&0x0f];
dula=1;
dula=0;
wela=0;
P0=0x7f;
wela=1;
wela=0;
delay();
}
else
{
//显示时
dula=0;
P0=table[init[2]>>4];
dula=1;
dula=0;
wela=0;
P0=0xfb;
wela=1;
wela=0;
delay();
dula=0;
P0=table[init[2]&0x0f];
dula=1;
dula=0;
wela=0;
P0=0xf7;
wela=1;
wela=0;
delay();
//显示分
dula=0;
P0=table[init[1]>>4];
dula=1;
dula=0;
wela=0;
P0=0xef;
wela=1;
wela=0;
delay();
dula=0;
P0=table[init[1]&0x0f];
dula=1;
dula=0;
wela=0;
P0=0xdf;
wela=1;
wela=0;
delay();
//显示秒
dula=0;
P0=table[init[0]>>4];
dula=1;
dula=0;
wela=0;
P0=0xbf;
wela=1;
wela=0;
delay();
dula=0;
P0=table[init[0]&0x0f];
dula=1;
dula=0;
wela=0;
P0=0x7f;
wela=1;
wela=0;
delay();
}
}
/**********************************************************/
// 主函数
/**********************************************************/
void main()
{
P1=0xff;
TMOD=0x01;
TH0=0x4c; //50ms定时
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
init_ds1302(); //初始化ds1302
while(1)
{
//---------------------------------------------------------
if(!K1 ||!K2 ||!K3)
{
set_ds1302(0x80,init2,7); //设置初始时间,日期,年月
beep();
}
Play_nowtime();
// Time_compare();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -