ds1302

标 签:

    stc12系列,stc15系列的ds1302的驱动程序,ds1302我就不在这里多介绍,当你用这个芯片的时候你应该会了解了他的一些基本的参数,功能特点了吧,我就不多说了,直接上程序。

    首先新建项目,这个我也不多说了,我博客里面有,不会的自己找找。

    第一步,新建 ds1302.h 文件,代码如下:

#ifndef __DS1302_H
#define __DS1302_H
#include "INTRINS.H"
#include "STC15Wxx.H"
//#include "STC12C5A.H"

sbit DS1302_IO = P3^3;
sbit DS1302_CE = P5^5;
sbit DS1302_CL = P3^2;

//定义变量
extern unsigned char time[7] = {0x00,0x16,0x18,0x19,0x04,0x06,0x17};

//声明函数
void DS1302BurstWrite();//利用ds1302的突发模式一次读取八个字节
void DS1302BurstRead(unsigned char leg);//利用ds1302的突发模式一次写入八个字节
unsigned char DS1302SingleRead(unsigned char addr);//读取ds1302上的某个寄存器地址值
void DS1302SingleWrite(unsigned char addr,unsigned char val);//给ds1302上的某个寄存器地址写入值

#endif

    第二步,新建 ds1302.c 文件,代码如下:

#include "ds1302.h"

//iic通信开始信号
void IIC_Start(){
	DS1302_CE = 0;
    DS1302_CL = 0;
    DS1302_IO = 0;
    _nop_();
    _nop_();
    _nop_();
    DS1302_CE = 1;
}

//iic通信结束信号
void IIC_End(){
	DS1302_CE = 0;
    _nop_();
    DS1302_CL = 1;
    _nop_();
    DS1302_IO = 1;
}

//在iic信道上写入ds1302的寄存器地址
void DS1302ByteWrite(unsigned char dat){
    unsigned char i;

    for(i=0;i<8;i++){ //循环写入八位地址位
        dat >>= 1;
        DS1302_IO = CY;
        DS1302_CL = 1;
        DS1302_CL = 0;
    }
}

//在iic信道上读取ds1302的寄存器值
unsigned char DS1302ByteRead(){
    unsigned char i,dat = 0x00;   

    for(i=0;i<8;i++){   //循环读取八位数据位
        if(DS1302_IO){
            dat |= 1 << i;
        }
        DS1302_CL = 1;
        DS1302_CL = 0;
    }
    return dat;
}

//利用ds1302的突发模式一次读取八个字节
void DS1302BurstRead(unsigned char leg){
    unsigned char i;     

    IIC_Start(); //在iic信道上写入开始信号
    DS1302ByteWrite(0xBF);//写入ds1302突发读命令
    for(i=0;i < leg;i++){ //循环读取leg个字节,小于八个字节
        time[i] = DS1302ByteRead(); //读取ds1302的值
    }
    DS1302End(); //在iic信道上写入结束信号
}

//利用ds1302的突发模式一次写入八个字节
void DS1302BurstWrite(){
    unsigned char i;
       
    DS1302Start();//在iic信道上写入开始信号
    DS1302ByteWrite(0xBE);//写入ds1302突发写命令
    for(i=0;i < 8;i++){//循环写入八个字节
        DS1302ByteWrite(time[i]); //给ds1302的寄存器写入值
    }
    DS1302End();//在iic信道上写入结束信号
}

//读取ds1302上的某个寄存器地址值
unsigned char DS1302SingleRead(unsigned char addr){
    unsigned char dat;
    
    DS1302Start();//在iic信道上写入开始信号
    DS1302ByteWrite(addr);
    dat = DS1302ByteRead();//读取该寄存器地址的值
    DS1302End();//在iic信道上写入结束信号
    
    return dat;
}

//给ds1302上的某个寄存器地址写入值
void DS1302SingleWrite(unsigned char addr,unsigned char val){  
    DS1302Start();//在iic信道上写入开始信号
    DS1302ByteWrite(addr);//写入ds1302寄存器地址
    DS1302ByteWrite(val);//给该寄存器地址写入值
    DS1302End();//在iic信道上写入结束信号
}

    第三步,新建 main.c 文件,代码如下:

#include "STC15Wxx.h"
#include "ds1302.h"

//定义变量
unsigned int sec;


//声明函数
void UartInit(void);//串口初始化
void Timer0Init(void);//定时器0初始化
void sendData(unsigned char dat);//发送串口数据

void main(){
    EA = 1;//开启总中断
    
    //初始化功能模块
    UartInit();
    Timer0Init();

    while(1){
        if(sec > 200){//如果做时钟,最好200左右
            sec = 0;
            DS1302BurstRead(3);//看你显示大小,如果只显示秒、分、时,只读三位就好
            sendData(time[0]);//发送秒到串口
        }
    }
}

//串口初始化
void UartInit(void)		//4800bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
	T2L = 0x8F;		//设定定时初值
	T2H = 0xFD;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
}

//发送一个字节到串口函数
void sendData(unsigned char dat){
    SBUF = dat;//写入发送值到串口缓存中
    while(!TI);//等待数据发送完闭
    TI = 0;//清除发送寄存器状态
}

//定时器0初始化
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初值
	TH0 = 0xD1;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
    ET0 = 1; //开启定时器中断
}

//定时器0中断
void T0() interrupt 1{
    sec++; //中断次数
}


51-STC / 评 论 (0) / 热度 (343℃) / 2017-04-20 / 阅读全文  / MaWei