📄 ds1302时分.c
字号:
/************************************/
/*杭州电子&计算机工作室 */
/*http://www.hificat.com */
/*DS1302测试程序 */
/*目标器件:AT89S51 */
/*晶振:11.0592MHZ */
/*编译环境:Keil 7.50A */
/************************************/
/*********************************包含头文件********************************/
#include "reg51.h"
#include <intrins.h>
/*********************************端口定义**********************************/
sbit DS1302_CLK = P1^0;
sbit DS1302_IO = P1^1;
sbit DS1302_RST = P1^2;
/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/******************************定义全局变量*********************************/
unsigned char second,minute,hour,week,day,month,year; //秒、分、时、星期、日、月、年
unsigned char minute1,hour1;
unsigned char t1,t2,i;
unsigned char time[]={0x08,0x06,0x19,0x04,0x09,0x30,0x00}; //初始时间数组
unsigned char secondchar,minutechar,hourchar,weekchar,daychar,monthchar,yearchar;
unsigned char keysum ;
sbit K1 = P3^2;
sbit K2 = P3^3;
unsigned char key_s, key_v, tmp;
unsigned char key_s1, key_v1;
//int kk;
/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/
void delay1(void)
{
int k;
for(k=0;k<400;k++);
}
void delayms(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void delayms1(unsigned char ms)
// 延时子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void displayhour(void)
{
P2=0xfe;
P0=tab[hour1/10];
delayms1(1);
P2=0xfd;
P0=tab[hour1%10];
delayms1(1);
}
void displayminuite(void)
{
P2=0xf7;
P0=tab[minute1/10];
delayms1(1);
P2=0xef;
P0=tab[minute1%10];
delayms1(1);
}
void displaysecond(void)
{
P2=0xbf;
P0=tab[second/10];
delayms1();
P2=0x7f;
P0=tab[second%10];
delayms1();
}
/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display(void)
{
P2=0xfe;
P0=tab[hour/16];
delay1();
P2=0xfd;
P0=tab[hour%16];
delay1();
P2=0xfb;
P0=0xbf; //显示"-"
delay1();
P2=0xf7;
P0=tab[minute/16];
delay1();
P2=0xef;
P0=tab[minute%16];
delay1();
P2=0xdf;
P0=0xbf; //显示"-"
delay1();
P2=0xbf;
P0=tab[second/16];
delay1();
P2=0x7f;
P0=tab[second%16];
delay1();
}
/*****************************************************************************
函数功能:向DS1302送一字节数据子程序
入口参数:
出口参数:
*****************************************************************************/
void InputByte(unsigned char byte1)
{
char i;
for(i=8;i>0;i--)
{
DS1302_IO=(bit)(byte1&0x01);
DS1302_CLK=1;
_nop_();
DS1302_CLK=0;
byte1>>=1;
}
return;
}
/*****************************************************************************
函数功能:读DS1302一个字节子程序
入口参数:
出口参数:
*****************************************************************************/
unsigned char outputbyte(void)
{
unsigned char i;
unsigned ucdat=0;
for(i=8;i>0;i--)
{
DS1302_IO=1;
ucdat>>=1;
if(DS1302_IO)ucdat|=0x80;
DS1302_CLK=1;
_nop_();
DS1302_CLK=0;
}
return(ucdat);
}
/*****************************************************************************
函数功能:向DS1302某地址写一字节数据子程序
入口参数:addr,TDat
出口参数:
*****************************************************************************/
void write_ds1302(unsigned char addr,unsigned char TDat)
{
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
_nop_();
InputByte(TDat);
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
}
/*****************************************************************************
函数功能:读DS1302地址子程序
入口参数:add
出口参数:timedata
*****************************************************************************/
unsigned char read_ds1302(unsigned char addr)
{
unsigned char timedata;
DS1302_RST=0;
_nop_();
DS1302_CLK=0;
_nop_();
DS1302_RST=1;
InputByte(addr);
timedata=OutputByte();
DS1302_CLK=1;
_nop_();
DS1302_RST=0;
return(timedata);
}
/*****************************************************************************
函数功能:初始化DS1302子程序
入口参数:time[](全局变量)
出口参数:
*****************************************************************************/
void initial_ds1302()
{
write_ds1302(0x8e,0x00); //写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,time[0]); //年
write_ds1302(0x88,time[1]); //月
write_ds1302(0x86,time[2]); //日
write_ds1302(0x8A,time[3]); //星期
write_ds1302(0x84,time[4]); //时
write_ds1302(0x82,time[5]); //分
write_ds1302(0x80,time[6]); //秒
write_ds1302(0x8e,0x80); //写保护寄存器
}
void initial_ds13021()
{
write_ds1302(0x8e,0x00); //写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,year); //年
write_ds1302(0x88,month); //月
write_ds1302(0x86,day); //日
write_ds1302(0x8A,week); //星期
write_ds1302(0x84,hour); //时
write_ds1302(0x82,minute); //分
write_ds1302(0x80,second); //秒
write_ds1302(0x8e,0x80); //写保护寄存器
}
/*****************************************************************************
函数功能:读DS1302时间子程序
入口参数:
出口参数:全局变量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
second=read_ds1302(0x81); //秒寄存器
minute=read_ds1302(0x83); //分
hour=read_ds1302(0x85); //时
week=read_ds1302(0x8B); //星期
day=read_ds1302(0x87); //日
month=read_ds1302(0x89); //月
year=read_ds1302(0x8d); //年
}
/*****************************************************************************
函数功能:主程序
入口参数:
出口参数:
*****************************************************************************/
bit scan_key1()
// 扫描按键
{
key_s1 = 0x00;
key_s1 |= K2; /////////////////////////////////////////////////
return(key_s1 ^ key_v1);
}
void proc_key1()
// 键处理
{ // hour=12;
// displayhour();
if((key_v1 & 0x01) == 0 )
{ // K2按下
if (keysum==1) hour1=hour1+1;
// if(hour==0x10) hour=hour+6;
// if(hour==0x20) hour=32;
if (keysum==2) minute1=minute1+1;
if (minute1>59) minute1=0;
if (hour1>23) hour1=0;
}
}
bit scan_key()
// 扫描按键
{
key_s = 0x00;
key_s |= K1; /////////////////////////////////////////////////
return(key_s ^ key_v);
}
void proc_key()
// 键处理
{
if((key_v & 0x01) == 0)
{ // K1按下
// send_str();
keysum++;
if (keysum==1)
{
hour1=((int)hour)/16;
hour1=hour1*10+((int)hour)%16;
//hour1=hour
}
if (keysum==2)
{
minute1=((int)minute)/16;
minute1=minute1*10+((int)minute)%16;
// minute1=minute;
}
if (keysum>2)
{
keysum=0;
hour=(hour1/10)*16+(hour1%10);
minute=(minute1/10)*16+(minute1%10);
initial_ds13021();
}
}
}
void main(void)
{
keysum=0;
initial_ds1302(); //初始化DS1302
while(1)
{
if(scan_key()) // 扫描按键
{
delayms(10); // 延时去抖动
if(scan_key()) // 再次扫描
{
key_v = key_s; // 保存键值
proc_key(); // 键处理
}
}
if(scan_key1()) // 扫描按键
{
delayms(10); // 延时去抖动
if(scan_key1()) // 再次扫描
{
key_v1 = key_s1; // 保存键值
proc_key1(); // 键处理
}
}
if (keysum==1)displayhour();
if (keysum==2)displayminuite();
if (keysum==0 )
{
read_time(); //读取时间
display(); //显示时间
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -