ds1302是一个时钟芯片,和avr没关系,这里用mega32操作该芯片,关于这个芯片网上资料很多,我简单说一下,通信方式是SPI模式,芯片内部有几个寄存器存放年月日时分秒,还有写保护等。
*****************************************************************
//CPU:mega32
//编译器:iar
//DS1302
//main函数中调用lcd显示函数
//管脚定义 void main(void) } ******************************************************************
#include
#include "lcd.h"
void Write1302 ( unsigned char addr,unsigned char dat );
unsigned char Read1302 ( unsigned char addr );
void ds1302_init(void);
//寄存器宏定义
#define SECOND 0x80
#define MINUTE 0x82
#define HOUR 0x84
#define DAY 0x86
#define MONTH 0x88
#define YEAR 0x8C
#define PROTECT 0x8E
#define CE PORTD_Bit5 //读写使能
#define SCLK PORTD_Bit6 //时钟
#define TIO PORTD_Bit7 //数据输出
#define RIO PIND_Bit7 //数据输入
#define CE_D DDRD_Bit5 //CE方向
#define SCLK_D DDRD_Bit6 //SCLK方向
#define IO_D DDRD_Bit7 //IO方向
{
ds1302_init();
lcd_init();
while(1)
{
delay(10000);
clear();
display_string(num2str(Read1302(YEAR)),0,0);display_string("YEAR",0,16);display_string(num2str(Read1302(MONTH)),0,64);display_string("MONTH",0,80);
display_string(num2str(Read1302(DAY)),2,0);display_string("DAY",2,16);display_string(num2str(Read1302(HOUR)),2,64);display_string("HOUR",2,80);
display_string(num2str(Read1302(MINUTE)),4,0);display_string("MIN",4,16);display_string(num2str(Read1302(SECOND)),4,64);display_string("SECOND",4,80);
}
}
//地址、数据发送子程序
void Write1302 ( unsigned char addr,unsigned char data )
{
unsigned char i;
IO_D = 1;
CE = 0; //CE 引脚为低,数据传送中止
SCLK = 0; //清零时钟总线
CE = 1; //CE 引脚为高,逻辑控制有效
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK = 0;
TIO = (addr&0x01); //每次传输低字节
addr >>= 1; //右移一位
SCLK = 1;
}
//发送数据
for ( i=8; i>0; i-- )
{
SCLK = 0;
TIO = (data&0x01);
data >>= 1;
SCLK = 1;
}
CE = 0;
//数据读取子程序
unsigned char Read1302 ( unsigned char addr )
{
unsigned char i,data=0,temp;
addr = addr | 1;//变为读地址
IO_D = 1;
CE=0;
SCLK=0;
CE = 1;
//发送地址
for ( i=8; i>0; i-- ) //循环8次移位
{
SCLK = 0;
TIO = (addr&0x01); //每次传输低字节
addr >>= 1; //右移一位
SCLK = 1;
}
IO_D = 0;
//读取数据
for ( i=0; i<8; i++ )
{
SCLK = 1;
SCLK = 0;
data |= RIO< }
CE=0;
// data = data/16*10 + data&0x0f ; 为什么不对
temp = data>>4;
data &= 0x0f;
data = temp*10 + data;
return (data);
}
//初始化DS1302
void ds1302_init(void)
{
CE_D = 1 ; //CE 输出
SCLK_D = 1 ; //SCLK 输出
Write1302 (PROTECT,0X00); //禁止写保护
Write1302 (SECOND ,0x30); //秒位初始化
Write1302 (MINUTE ,0x05); //分钟初始化
Write1302 (HOUR ,0x6); //小时初始化
Write1302 (DAY ,0x14); //日位初始化
Write1302 (MONTH ,0x12); //月钟初始化
Write1302 (YEAR ,0x88); //年初始化
Write1302 (PROTECT,0x80); //允许写保护
}
上一篇:avr单片机USART程序详解
下一篇:使用AVR来驱动MAXIN的DS18B20
推荐阅读最新更新时间:2024-10-26 00:17