/*
日期:2010年10月10日
文件名:DS1302功能:第三步,实现单片机对DS1302的读写,将时间信息显示在数码管上,断电后仍能正常计时
*/
unsigned char rec_time[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定义一个数组存储秒,分,时,日,月,周,年
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义数码管的0~9的段码
//对DS1320的三个和单片机的接口进行字符常量定义
#define SCLK PORTC0_bit
#define IO PORTC1_bit
#define RST PORTC2_bit
//初始化和DS1302连接的三个端口
void ds1302_init()
{
DDRC|=0x07; //设置PC0,1,2为输出
SCLK=0; //设置SCLK初始值为0
IO=1; // 设置IO初始值为1
RST=0; //设置RST初始值为0
}
//写入一个字节
void ds1302_write_byte(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
SCLK=0; //时钟信号拉低
if(dat&0x01)
IO=1; //判断地址字节的最低位,1位为1则拉高IO
else IO=0; //1位为0,则输入数据为0,拉低IO
delay_us(1);
SCLK=1; //时钟信号拉高,产生上升沿
delay_us(1);
dat>>=1; //字节右移一位
}
}
//读出一个字节
unsigned char ds1302_read_byte()
{
unsigned char i, dat=0;
DDC1_bit=0; //设置IO的方向为输入
PORTC1_bit=0; //设置IO为高阻态
for(i=0;i<8;i++)
{
dat>>=1; //数据右移一位
SCLK=1; //设置SCLK为高电平
delay_us(1);
SCLK=0; //设置SCLK为低电平,产生下降沿
delay_us(1);
if(PINC1_bit==1) //如果读出的数据为1
dat|=0x80; //数据位1,则写入1
}
DDC1_bit=1; //将IO口的方向改为输出
return dat; //返回得到的数据
}
//向DS1302写入一个地址和数据
void ds1302_write(unsigned char add,unsigned char dat)
{
RST=0; //将RST拉低
SCLK=0; //将SCLK拉低
RST=1; //将RST拉高
ds1302_write_by
DS1302读写程序 来自淘豆网www.taodocs.com转载请标明出处.