历史上的今天
今天是:2025年06月25日(星期三)
2018年06月25日 | 51单片机对DS1302突发模式的读写
2018-06-25 来源:eefocus
#include
#include
#include "DS1302.h"
//DS1302管脚
sbit SCLK = P3^6; //时钟
sbit CE = P3^5; //片选
sbit databus = P3^4; //双向IO
//写模式寄存器
#define WRITE_CONTROL_SECONDS 0x80 //秒 //位7=1暂停 =0运行
#define WRITE_CONTROL_MINUTE 0x82 //分
#define WRITE_CONTROL_HOUR 0x84 //时 位7 1——12小时模式 0——24小时模式 当位7为1时位5 0——am 1——pm
#define WRITE_CONTROL_DAY 0x86 //日
#define WRITE_CONTROL_MONTH 0x88 //月
#define WRITE_CONTROL_WEEK 0x8a //周
#define WRITE_CONTROL_YEAR 0x8e //年
//读模式寄存器
#define READ_CONTROL_SECONDS 0x81 //秒
#define READ_CONTROL_MINUTE 0x83 //分
#define READ_CONTROL_HOUR 0x85 //时
#define READ_CONTROL_DAY 0x87 //日
#define READ_CONTROL_MONTH 0x89 //月
#define READ_CONTROL_WEEK 0x8b //周
#define READ_CONTROL_YEAR 0x8d //年
//控制读写寄存器
#define READ_CONTROL 0x8f //读
#define WRITE_CONTROL 0x8e //写
#define OPEN_PROTECT 0x80 //开写保护
#define CLOSE_PROTECT 0x00 //关写保护
//突发模式寄存器
#define READ_COLOCK_BURST 0xbf //读时钟突发模式寄存器
#define WRITE_COLOCK_BURST 0xbe //写时钟突发模式寄存器
#define READ_RAM_BURST 0xFF //读RAM突发模式寄存器
#define WRTIE_RAM_BURST 0xFE //写RAM突发模式寄存器
//初始值存放 秒,分,时,日,月,周,年,关写保护
unsigned char write_Data_array[8]={0,0,1,1,1,1,15,00};
//BCD转十进制值存放
unsigned char BCD_to_TEN[8] = {0};
//读取值存放
unsigned char read_Data_array[8] = {0};
//十进制转BCD
unsigned char BCD_preservation[8]={0};
void start(void); //开始
void end(void); //结束
void write_data(unsigned char Data); //写一个字节数据
unsigned char read_data(void); //读一个字节数据
void ten_to_BCD_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn); //十进制转BCD
void BCD_to_ten_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn); //BCD转十进制
void init_ds1302_BURST(void); //突发模式初始化
void get_ds1302_data(unsigned char length); //突发模式读取数据
//初始化ds1302
//DS1302突发模式的读写包含开关写保护
void init_ds1302_BURST(void)
{
unsigned char i = 0;
//十进制转BCD
ten_to_BCD_transformation(write_Data_array,sizeof(write_Data_array),BCD_preservation);
//关写保护
start();
write_data(WRITE_CONTROL);
write_data(CLOSE_PROTECT);
end();
//突发模式写入数据
start();
write_data(WRITE_COLOCK_BURST);
for(i = 0; i<8; i++)
{
write_data(BCD_preservation[i]);
}
end();
//开写保护
start();
write_data(WRITE_CONTROL);
write_data(OPEN_PROTECT);
end();
}
//以突发模式获取ds1302时钟数据
void get_ds1302_data(unsigned char length)
{
unsigned char i = 0;
//关写保护
start();
write_data(WRITE_CONTROL);
write_data(CLOSE_PROTECT);
end();
//开始读取数据
start();
write_data(READ_COLOCK_BURST);
for(i=0; i { read_Data_array[i] = read_data(); } end(); //开写保护 start(); write_data(WRITE_CONTROL); write_data(OPEN_PROTECT); end(); //BCD转十进制 BCD_to_ten_transformation(read_Data_array,sizeof(read_Data_array),BCD_to_TEN); } //十进制转换为BCD void ten_to_BCD_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn) { unsigned char i = 0,high = 0,low = 0; for(i=0;i { high = *(pvalue+i)/10%10; //获取十进制十位 low = *(pvalue+i)%10; //获取十进制个位 *(preturn+i) = (high<<4)|low; //十进制转换成BCD } } //BCD转换为十进制 void BCD_to_ten_transformation(unsigned char *pvalue,unsigned char length,unsigned char *preturn) { unsigned char i = 0,high = 0,low = 0; for(i=0;i { high = *(pvalue+i)/16%16; //十六进制转十进制十位 low = *(pvalue+i)%16; //十六进制转十进制个位 *(preturn+i) = (high*10)+low; //十进制组合 } } //开始 void start(void) { CE = 0; SCLK = 0; databus = 0; CE = 1; } //结束 void end(void) { CE = 0; SCLK = 1; databus = 1; } //写一个字节数据 void write_data(unsigned char Data) { unsigned char i = 0; for(i=0; i<8; i++) { SCLK = 0; databus = Data&0x01; SCLK = 1; Data>>=1; } } //读一个字节数据 unsigned char read_data(void) { unsigned char i = 0,value = 0; for(i=0; i<8; i++) { SCLK = 1; if(databus == 1) { value|=0x80; } SCLK = 0; value>>=1; } return value; } void main(void) { init_ds1302_BURST(); //初始化DS1302 while(1) { get_ds1302_data(8); //获DS1302值 } }
史海拾趣
|
带中断的流驱动的重复动态加载卸载后,引起InterruptInitialize失败问题。。 有个驱动, 在DRV_Init 函数中,通过 KernelIoControl 来动态获取系统中断, 同时用 InterruptInitialize绑定系统中断和Event事件。 在 DRV_Deinit 函数中 用 KernelIoControl 释放系统中断。 但是 再次动态加载该驱动时候,提示InterruptIniti ...… 查看全部问答> |
|
第一次使用CCD啊。搞不懂方向啊。英文看起太恼火了。 求一个中文的这个器件的资料。或者中文的CCD使用教程。谢谢了。。 我的邮箱:272257780@qq.com… 查看全部问答> |
|
请教:调用KernelIoControl重启WINCE后造成死机 #include #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) extern \"C\" __declspec(dllimport) BOOL KernelIoControl( DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOut ...… 查看全部问答> |
|
我在西安,有没有人在无聊的时候带带我??? msn:tangzichao1984@hotmail.com qq:11826964 不胜感激… 查看全部问答> |
|
大家好, 在用微软官方提供的CE6.0USB摄像头驱动的时候需要对他进行修改么?我用的摄像头(蓝色妖姬s9红警)是遵从USB视频规范的。 如果需要修改,应该改哪些函数呢? 求高手指导! [ 本帖最 ...… 查看全部问答> |
|
debug运行后显示程序已经在运行中,但是并没有在main的开始处暂停 而且在main中加入断点也不经过,不知道这样问题应该怎么解决啊。… 查看全部问答> |




