实时电子时钟实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告班级姓名学号组员实验题目:实时电子时钟
一、实验目的:
1、掌握DS1302与ATmega8单片机接口的方法。
2、掌握DS1302使用方法
二、实验仪器:
1、A VRATmega8 单片机开发板一块
2、+9V直流电源一个
3、USBISP下载电缆一根
三、实验原理
四、实验内容
/*************************************************
功能:实时时钟
芯片:mage8、DS1302
管脚:PC0-SCLK、PC1-I/O、PC2-RSE
*************************************************/
#include
#include
#include
#include"screen.c"
#define SCK_CLR PORTC &= ~BIT(0) //SCLK拉低
#define SCK_SET PORTC |= BIT(0) //SCLK拉高
#define SCK_OUT DDRC |= BIT(0) //SCLK设置为输出
#define RST_CLR PORTC &= ~BIT(2) //RST拉低
#define RST_SET PORTC |= BIT(2) //RST拉高
#define RST_OUT DDRC |= BIT(2) //RST设置为输出
#define IO_CLR PORTC &= ~BIT(1) //I/O拉低
#define IO_SET PORTC |= BIT(1) //I/O拉高
#define IO_OUT DDRC |= BIT(1) //I/O设置为输出
#define IO_IN DDRC &= ~BIT(1) //I/O设置为输入
#define IO_R PINC & BIT(1) //读 I/O
unsigned char time_data[7]={11,6,8,20,14,44,40}; //年、星期、月、日、时、分、秒unsigned char write_add[7]={0x8C,0x8A,0x88,0x86,0x84,0x82,0x80};
unsigned char read_add[7]={0x8D,0x8B,0x89,0x87,0x85,0x83,0x81};
unsigned char temp[] ="";
/******************************************
函数名:write_ds1302_byte()
功能:往DS1302写一个字节
入口参数:dat
返回参数:无
******************************************/
void write_ds1302_byte(unsigned char dat)
{
unsigned char i;
IO_OUT;
for(i=0;i<8;i++)
{
if(dat & 0x01)
{
IO_SET;
}
else
{
IO_CLR;
}
SCK_SET;
SCK_CLR;
dat = dat >> 1;
}
}
/****************************************** 函数名:read_ds1302()
功能:从DS1302读一个字节
入口参数:add
返回参数:无
******************************************/ unsigned char read_ds1302(unsigned char add) {
unsigned char i,value;
RST_CLR;
SCK_CLR;
RST_SET;
write_ds1302_byte(add);
IO_IN;
for(i=0;i<8;i++)
{
value = value >> 1;
if(IO_R)
{
value = value | 0x80;
}
SCK_SET;
SCK_CLR;
}
RST_CLR;
return value;
}
/****************************************** 函数名:write_ds1302()
功能:往DS1302写地址、数据
入口参数:add、dat
返回参数:无
******************************************/
void write_ds1302(unsigned char add,unsigned char dat) {
RST_CLR;
SCK_CLR;
RST_SET;
write_ds1302_byte(add);
write_ds1302_byte(dat);
RST_CLR;
}
/******************************************
函数名:set_rtc()
功能:设置时间
入口参数:无
返回参数:无
******************************************/
void set_rtc(void)
{
unsigned char i,k;
for(i=0;i<7;i++)
{
k = time_data[i]/10;
time_data[i] = time_data[i]%10;
time_data[i] = time_data[i]+k*16;
}
write_ds1302(0x8E,0x00);
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8E,0x80);
}
/******************************************
函数名:read_rtc()
功能:读取时间
入口参数:无
返回参数:无
******************************************/
void read_rct(void)
{
unsigned char i;
for(i=0;i<7;i++)
{