班级            姓名          学号        组员
实验题目:实时电子时钟
一、实验目的:
1、掌握DS1302ATmega8单片机接口的方法。
2、掌握DS1302使用方法
二、实验仪器:
1、AVRATmega8 单片机开发板      一块       
2、+9V直流电源                    一个
3、USBISP下载电缆                一根
三、实验原理
四、实验内容
/*************************************************
                功能:实时时钟
               
芯片:mage8DS1302
管脚:PC0-SCLKPC1-I/OPC2-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写地址、数据
入口参数:adddat
返回参数:无
******************************************/
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小时内删除。