历史上的今天
今天是:2024年11月28日(星期四)
2019年11月28日 | avr单片机ds1302时钟程序详解
2019-11-28 来源:51hei
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程序详解
史海拾趣
|
大家觉得搞单片机(嵌入式电子技术开发)累吗??? http://bbs.21ic.com/viewthread.php?tid=127427… 查看全部问答> |
|
定时器产生的中断请求,如何获取来响应自己的程序呢? 我想利用定时器在指定的时间到达时,执行我写的一段程序,怎么获取定时器的这个中断呢? 有例程最好,我不知道这个过程如何写,是不是中断有一个固定的模式?? 新手求指教啊~~~~… 查看全部问答> |
|
PSDSoft Express软件生成的编程文件obj格式解析 各位好: 最近用到PSDSoft Express软件,其生成的编程文件obj中,包含:PLD映射,SRAM数据,EPROM数据,不知如何划分!因为编程PSD501芯片要用到这个文件. 另外,发现此软件生成的项目中,在生成obj文件之前,会自动 ...… 查看全部问答> |
|
就是在一个SPI总线上我有两个一样的IC,A,B;现在SPI总线是如何识别他们两个呢?怎样确定他们的优先级呢?比如说要把A的那个信号切换到什么状态的方法? 请高手指教!… 查看全部问答> |
|
使用NiosII控制高频头CU1216,在NiosII IDE中运行下列程序后,由于没有应答,程序死在Write_I2C_Byte函数的while(I2C_Ackn() );,reset,sda,scl均加了上拉电阻,进行了一些检查均没有结果 ,哪位高手能帮我指点迷津?谢谢。 #include \"i2c.h\" ...… 查看全部问答> |
|
很早的时候知道嵌入式很火,自己也很喜欢。于是自己抱着书看,看51、arm... ,最后还学linux,学习移植,编译内核,都是蒙着头过河。一味的追求想象中的 高科技,现在才发现自己的学习之路走的有点偏。 &n ...… 查看全部问答> |
|
我最近在设计一个正弦波发生器的过程中,出现了很诡异的问题。频率稍微上调多点,输出波形就截止。采取fpga的de0开发板,方案如下:1. 频率处理以及显示(元件1) ——> 输出整形(integer)频率 f2. 输入频率 —— ...… 查看全部问答> |




