实 验 报 告
班级 姓名 学号 组员
实验题目:实时电子时钟
一、实验目的:
1、掌握DS1302与ATmega8单片机接口的方法。
2、掌握DS1302使用方法
二、实验仪器:
1、AVRATmega8 单片机开发板 一块
2、+9V直流电源 一个
3、USBISP下载电缆 一根
三、实验原理
四、实验内容
/*************************************************
功能:实时时钟
芯片:mage8、DS1302
管脚:PC0-SCLK、PC1-I/O、PC2-RSE
*************************************************/
#include<iom8v.h>
#include<macros.h>
#include<delay.h>
#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++)
{
time_data[i] = read_ds1302(read_add[i]);
}
}
/******************************************
函 数 名:time_pro()
功 能:16进制转换10进制
入口参数:无
返回参数:无
******************************************/
void time_pro(void)
{
temp[0] = time_data[6]%16; //秒
temp[1] = time_data[6]/16;
temp[2] = time_data[5]%16; //分
temp[3] = time_data[5]/16;
temp[4] = time_data[4]%16; //write的返回值时
temp[5] = time_data[4]/16;
temp[6] = time_data[3]%16; //日
temp[7] = time_data[3]/16;
temp[8] = time_data[2]%16; //月
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论