微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR128的程序——DS1302时钟芯片

AVR128的程序——DS1302时钟芯片

时间:11-22 来源:互联网 点击:
#include

#include

#define uchar unsigned char

#define uint unsigned int

#define ds1302_rst PE4 //定义1302的RST接在PE4

#define ds1302_io PE3 //定义1302的IO接在PE3

#define ds1302_sclk PE2 //定义1302的时钟接在PE2

#define set_ds1302_rst_ddr() DDRE|=1 //复位端置为输出

#define set_ds1302_rst() PORTE|=1 //复位端置1

#define clr_ds1302_rst() PORTE&=~(1 //复位端清0

#define set_ds1302_io_ddr() DDRE|=1 //数据端置为输出

#define set_ds1302_io() PORTE|=1 //数据端置1

#define clr_ds1302_io() PORTE&=~(1 //数据端清0

#define clr_ds1302_io_ddr() DDRE&=~(1 //数据端置为输入

#define in_ds1302_io() PINE&(1 //数据端输入数据

#define set_ds1302_sclk_ddr() DDRE|=1 //时钟端置为输出

#define set_ds1302_sclk() PORTE|=1 //时钟端置1

#define clr_ds1302_sclk() PORTE &=~(1//时钟端清0

#define ds1302_sec_add 0x80 //秒数据地址

#define ds1302_min_add 0x82 //分数据地址

#define ds1302_hr_add 0x84 //时数据地址

#define ds1302_date_add 0x86 //日数据地址

#define ds1302_month_add 0x88 //月数据地址

#define ds1302_day_add 0x8a //星期数据地址

#define ds1302_year_add 0x8c //年数据地址

#define ds1302_control_add 0x8e //控制数据地址

#define ds1302_charger_add 0x90

#define ds1302_clkburst_add 0xbe

uchar TempData[8];

uchar timer[7]={12,2,8,20,31,50,3};

uchar WeiMa[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

uchar led_discode[11]={0xc0,0xf9,0xa4,0xb0,0x99,

0x92,0x82,0xf8,0x80,0x90,0xff};

void smg_io_init(void)

{

DDRA=0XFF;

PORTA=0XFF;

DDRE=0xff;

PORTE=0X1C;

DDRC=0XFF;

PORTC=0XFF;

DDRF|=0X0E;

PORTF|=0X0E;

PORTF&=0xF7;

DDRB |=0X10;

PORTB|=0X10;

}

void display(uchar FirstBit,uchar Num)

{

unsigned char i;

for(i=0;i

{

PORTC=led_discode[10];

PORTA=WeiMa[i+FirstBit];

PORTC=TempData[i];

Delayms(2);

}

}

void Delayms(uint MS)

{

uint i,j;

for( i=0;i

for(j=0;j<1141;j++);

}

void shi_BCD(void)

{

uchar i,k;

for(i=0;i<7;i++)

{

k=timer[i]/10;

timer[i]=timer[i];

timer[i]=timer[i]+k*16;

}

}

void ds1302_init(void)

{

set_ds1302_rst_ddr();

set_ds1302_sclk_ddr();

clr_ds1302_rst();

clr_ds1302_sclk();

}

void ds1302_write(uchar add,uchar data)

{

uchar i=0;

set_ds1302_io_ddr(); //配置IO为输出

clr_ds1302_rst(); //清复位,停止所有操作

clr_ds1302_sclk(); //清时钟,准备操作

set_ds1302_rst(); //置复位,开始操作

add = add & 0xFE;

for(i=0;i<8;i++) //此循环写入控制码

{

if(add&0x01)

set_ds1302_io(); //当前位为1,置数据位

else

clr_ds1302_io(); //当前位为0,清数据位

set_ds1302_sclk(); //产生时钟脉冲,写入数据

clr_ds1302_sclk();

add>>=1; //移位,准备写入下1位

}

for(i=0;i<8;i++) //此循环写入数据码

{

if(data&0x01)

set_ds1302_io();

else

clr_ds1302_io();

set_ds1302_sclk();

clr_ds1302_sclk();

data>>=1;

}

clr_ds1302_rst();

clr_ds1302_io_ddr();

}

uchar ds1302_read(uchar add)

{

uchar data=0;

uchar i=0;

add+=1;

set_ds1302_io_ddr(); //端口输出

clr_ds1302_rst(); //清复位

clr_ds1302_sclk(); //清时钟

set_ds1302_rst(); //置复位

for(i=0;i<8;i++) //此循环写入地址码

{

if(add&0x01)

{set_ds1302_io();}

else

{clr_ds1302_io();}

set_ds1302_sclk();

clr_ds1302_sclk();

add>>=1;

}

clr_ds1302_io_ddr(); //端口输入

for(i=0;i<8;i++) //此循环读出1302的数据

{

data>>=1;

if(in_ds1302_io())

{data|=0x80;}

set_ds1302_sclk();

clr_ds1302_sclk();

}

clr_ds1302_rst();

return(data);

}

void ds1302_write_time(void)

{

ds1302_write(ds1302_control_add,0x00); //关闭写保护

ds1302_write(ds1302_sec_add,0x80); //暂停

ds1302_write(ds1302_charger_add,0xa9); //涓流充电

ds1302_write(ds1302_year_add,timer[0]); //年

ds1302_write(ds1302_month_add,timer[1]); //月

ds1302_write(ds1302_date_add,timer[2]); //日

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top