单片机:数字钟——基于DS1302时钟芯片。以六个数码管显示实现以下功能!
数字钟——基于DS1302时钟芯片。功能要求:1)使用DS1302时钟芯片计时;2)通过按键开关可以任意设置年、月、日、时、分、秒;(3)通过开关控制显示年月日或时分秒。...
数字钟——基于DS1302时钟芯片。
功能要求:1)使用DS1302时钟芯片计时;
2)通过按键开关可以任意设置年、月、日、时、分、秒;
(3)通过开关控制显示年月日或时分秒。
不用累加器,需要一个C语言编程程序实现此功能!
请高手赐教!感激涕林!邮箱:w19903160@163.com
回答满意在赠送50分 展开
功能要求:1)使用DS1302时钟芯片计时;
2)通过按键开关可以任意设置年、月、日、时、分、秒;
(3)通过开关控制显示年月日或时分秒。
不用累加器,需要一个C语言编程程序实现此功能!
请高手赐教!感激涕林!邮箱:w19903160@163.com
回答满意在赠送50分 展开
2个回答
展开全部
此程序只上传一半,原版程序以发到邮箱,记得查收!
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit port=P0^7;
sbit sclk=P1^1;
sbit dio=P1^0;
sbit ce=P1^2;
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar hour,min,sec,year,month,day;
uchar menuflag=0,flag;
void delay_ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<90;j++);
}
}
void display_hour(uchar h)
{
P2=0xff;
P0=seg[h/16];
led1=0;
delay_ms(5);
led1=1;
P0=seg[h%16];
led2=0;
port=0;
delay_ms(5);
}
void display_min(uchar m)
{
P2=0xff;
P0=seg[m/16];
led3=0;
delay_ms(5);
led3=1;
P0=seg[m%16];
led4=0;
port=0;
delay_ms(5);
}
void display_sec(uchar s)
{
P2=0xff;
P0=seg[s/16];
led5=0;
delay_ms(5);
led5=1;
P0=seg[s%16];
led6=0;
delay_ms(5);
}
void write(uchar add,da)
{
uchar temp,t;
ce=0;
sclk=0;
ce=1;
temp=add;
for(t=0;t<8;t++)
{
if(temp&0x01==1) dio=1;
else dio=0;
sclk=1;
delay_ms(1);
sclk=0;
temp=temp>>1;
}
temp=da;
for(t=8;t>0;t--)
{
if((temp&0x01)==1) dio=1;
else dio=0;
sclk=1;
delay_ms(1);
sclk=0;
temp=temp>>1;
}
ce=0;
}
uchar read(uchar add)
{
uchar temp,t;
ce=0;
sclk=0;
ce=1;
temp=add;
for(t=0;t<8;t++)
{
if((temp&0x01)==1) dio=1;
else dio=0;
sclk=1;
sclk=0;
temp>>=1;
}
temp=0;
for(t=8;t>0;t--)
{
temp>>=1;
if(dio==1) temp=temp|0x80;
else temp=temp&0x7f;
sclk=1;
sclk=0;
}
return temp;
}
void chu()
{
write(0x8e,0x00); //写保护
write(0x80,0x00); //写秒
write(0x82,0x20); //写分钟
write(0x84,0x8); //写小时
write(0x86,0x2); //写日
write(0x88,0x11); //写月
write(0x8c,0x11); //写年
// write(0x8e,0x80); //写保护
}
此程序会令你十分满意,记得给分哦亲!
由于级别有点低,所以原理图无法上传,也已发到邮箱!
希望采纳!!!
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit port=P0^7;
sbit sclk=P1^1;
sbit dio=P1^0;
sbit ce=P1^2;
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar hour,min,sec,year,month,day;
uchar menuflag=0,flag;
void delay_ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<90;j++);
}
}
void display_hour(uchar h)
{
P2=0xff;
P0=seg[h/16];
led1=0;
delay_ms(5);
led1=1;
P0=seg[h%16];
led2=0;
port=0;
delay_ms(5);
}
void display_min(uchar m)
{
P2=0xff;
P0=seg[m/16];
led3=0;
delay_ms(5);
led3=1;
P0=seg[m%16];
led4=0;
port=0;
delay_ms(5);
}
void display_sec(uchar s)
{
P2=0xff;
P0=seg[s/16];
led5=0;
delay_ms(5);
led5=1;
P0=seg[s%16];
led6=0;
delay_ms(5);
}
void write(uchar add,da)
{
uchar temp,t;
ce=0;
sclk=0;
ce=1;
temp=add;
for(t=0;t<8;t++)
{
if(temp&0x01==1) dio=1;
else dio=0;
sclk=1;
delay_ms(1);
sclk=0;
temp=temp>>1;
}
temp=da;
for(t=8;t>0;t--)
{
if((temp&0x01)==1) dio=1;
else dio=0;
sclk=1;
delay_ms(1);
sclk=0;
temp=temp>>1;
}
ce=0;
}
uchar read(uchar add)
{
uchar temp,t;
ce=0;
sclk=0;
ce=1;
temp=add;
for(t=0;t<8;t++)
{
if((temp&0x01)==1) dio=1;
else dio=0;
sclk=1;
sclk=0;
temp>>=1;
}
temp=0;
for(t=8;t>0;t--)
{
temp>>=1;
if(dio==1) temp=temp|0x80;
else temp=temp&0x7f;
sclk=1;
sclk=0;
}
return temp;
}
void chu()
{
write(0x8e,0x00); //写保护
write(0x80,0x00); //写秒
write(0x82,0x20); //写分钟
write(0x84,0x8); //写小时
write(0x86,0x2); //写日
write(0x88,0x11); //写月
write(0x8c,0x11); //写年
// write(0x8e,0x80); //写保护
}
此程序会令你十分满意,记得给分哦亲!
由于级别有点低,所以原理图无法上传,也已发到邮箱!
希望采纳!!!
展开全部
由于不知道你是用什么单片机写的,我就写下了DS1302的程序,楼主可复制修改就可以了,不是很难,楼主记得给分哦
typedef struct SYSTEMTIME
{
uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
uchar DateString[9];
uchar TimeString[9];
}SYSTEMTIME; //定义的时间类型
sbit DS1302_RST=P1^3; //DS1302复位线引脚
sbit DS1302_CLK=P1^4; //DS1302时钟线引脚
sbit DS1302_IO=P1^5; //DS1302数据线引脚
/**************DS1302一个写字节******************/
void DS1302InputByte(uchar d) //实时时钟写入一字节(内部函数)
{
uchar i;
ACC=d;
for (i=8;i>0;i--)
{
DS1302_IO=ACC0; //相当于汇编中的 RRC
DS1302_CLK=1;
DS1302_CLK=0; //发一个高跳变到低的脉冲
ACC=ACC>>1;
}
}
/**************DS1302读一个字节******************/
uchar DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
uchar i;
for (i=8;i>0;i--)
{
ACC=ACC>>1; //相当于汇编中的 RRC
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0; //发一个高跳变到低的脉冲
}
return(ACC);
}
/****************DS1302写数据********************/
void Write_1302(uchar ucAddr, uchar ucDa)
{
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr); //地址,命令
DS1302InputByte(ucDa); //写1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
}
/****************DS1302读数据********************/
uchar Read1302(uchar ucAddr) //读取DS1302某地址的数据
{
uchar ucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1; //enable
DS1302InputByte(ucAddr|0x01); //地址,命令
ucData=DS1302OutputByte(); //读1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
return(ucData);
}
/**************DS1302写保护设定******************/
void DS1302_SetProtect(bit flag) //是否写保护
{
if (flag)
Write_1302(0x8E,0x10); //WP=1,不能写入
else
Write_1302(0x8E,0x00); //WP=0,可以写入
}
/**************DS1302设置时间函数****************/
void DS1302_SetTime(uchar Address, uchar Value)
{
DS1302_SetProtect(0);
Write_1302(Address, ((Value/10)<<4|(Value%10)));//高4位为十位,低4位为个位
}
/*****************DS1302初始化******************/
void Init_DS1302(void)
{
uchar Second=Read1302(DS1302_SECOND);
if (Second&0x80) //如果第七为1(表明没有启动), 则启动时钟
DS1302_SetTime(DS1302_SECOND,0);
}
/**************DS1302时间转换函数***************/
void DS1302_GetTime(SYSTEMTIME *Time)
{
uchar ReadValue;
ReadValue=Read1302(DS1302_SECOND);
Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换秒
ReadValue=Read1302(DS1302_MINUTE);
Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换分
ReadValue=Read1302(DS1302_HOUR);
Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换时
ReadValue=Read1302(DS1302_DAY);
Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换日
ReadValue=Read1302(DS1302_WEEK);
Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换星期
ReadValue=Read1302(DS1302_MONTH);
Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换月
ReadValue=Read1302(DS1302_YEAR);
Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换年
}
typedef struct SYSTEMTIME
{
uchar Second;
uchar Minute;
uchar Hour;
uchar Week;
uchar Day;
uchar Month;
uchar Year;
uchar DateString[9];
uchar TimeString[9];
}SYSTEMTIME; //定义的时间类型
sbit DS1302_RST=P1^3; //DS1302复位线引脚
sbit DS1302_CLK=P1^4; //DS1302时钟线引脚
sbit DS1302_IO=P1^5; //DS1302数据线引脚
/**************DS1302一个写字节******************/
void DS1302InputByte(uchar d) //实时时钟写入一字节(内部函数)
{
uchar i;
ACC=d;
for (i=8;i>0;i--)
{
DS1302_IO=ACC0; //相当于汇编中的 RRC
DS1302_CLK=1;
DS1302_CLK=0; //发一个高跳变到低的脉冲
ACC=ACC>>1;
}
}
/**************DS1302读一个字节******************/
uchar DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
uchar i;
for (i=8;i>0;i--)
{
ACC=ACC>>1; //相当于汇编中的 RRC
ACC7=DS1302_IO;
DS1302_CLK=1;
DS1302_CLK=0; //发一个高跳变到低的脉冲
}
return(ACC);
}
/****************DS1302写数据********************/
void Write_1302(uchar ucAddr, uchar ucDa)
{
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1;
DS1302InputByte(ucAddr); //地址,命令
DS1302InputByte(ucDa); //写1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
}
/****************DS1302读数据********************/
uchar Read1302(uchar ucAddr) //读取DS1302某地址的数据
{
uchar ucData;
DS1302_RST=0;
DS1302_CLK=0;
DS1302_RST=1; //enable
DS1302InputByte(ucAddr|0x01); //地址,命令
ucData=DS1302OutputByte(); //读1Byte数据
DS1302_CLK=1;
DS1302_RST=0;
return(ucData);
}
/**************DS1302写保护设定******************/
void DS1302_SetProtect(bit flag) //是否写保护
{
if (flag)
Write_1302(0x8E,0x10); //WP=1,不能写入
else
Write_1302(0x8E,0x00); //WP=0,可以写入
}
/**************DS1302设置时间函数****************/
void DS1302_SetTime(uchar Address, uchar Value)
{
DS1302_SetProtect(0);
Write_1302(Address, ((Value/10)<<4|(Value%10)));//高4位为十位,低4位为个位
}
/*****************DS1302初始化******************/
void Init_DS1302(void)
{
uchar Second=Read1302(DS1302_SECOND);
if (Second&0x80) //如果第七为1(表明没有启动), 则启动时钟
DS1302_SetTime(DS1302_SECOND,0);
}
/**************DS1302时间转换函数***************/
void DS1302_GetTime(SYSTEMTIME *Time)
{
uchar ReadValue;
ReadValue=Read1302(DS1302_SECOND);
Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换秒
ReadValue=Read1302(DS1302_MINUTE);
Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换分
ReadValue=Read1302(DS1302_HOUR);
Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换时
ReadValue=Read1302(DS1302_DAY);
Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换日
ReadValue=Read1302(DS1302_WEEK);
Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换星期
ReadValue=Read1302(DS1302_MONTH);
Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换月
ReadValue=Read1302(DS1302_YEAR);
Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); //转换年
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询