打印

这是:我做的12864和12C887的电路板

[复制链接]
3941|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
yuanquan12345|  楼主 | 2010-9-28 09:17 | 只看该作者
[img][/img]

使用特权

评论回复
板凳
402206480| | 2010-9-28 11:30 | 只看该作者
那温度是假的吧

使用特权

评论回复
地板
yuanquan12345|  楼主 | 2010-9-28 11:39 | 只看该作者
温度是假的,18B20还没买到,现在12C887的时间还显示不出来。
请大家指点。
谢谢。

使用特权

评论回复
5
zkkov2000| | 2010-9-28 16:45 | 只看该作者
我显摆下----(我用的是STC89C516RD+)
硬件:因为DS12C887相当于单片机的外扩RAM,使用的是16位地址,我用的是P0和P2口,P2口空置,上电为高电平,所以为FFXX(前两位是FF),可参考相关资料。
软件:
ds12c887.h文件里程序如下
#ifndef __DS12C887_H
#define __DS12C887_H

sbit CS_887=P3^5;//注意和你的板子硬件电路上的区别
/* 寄存器地址通道定义 */
#define  chSecondsChannel XBYTE[0xff00]
#define  chMinutesChannel XBYTE[0xff02]
#define  chHoursChannel   XBYTE[0xff04]
#define  chDofWChannel    XBYTE[0xff06]
#define  chDateChannel    XBYTE[0xff07]
#define  chMonthChannel   XBYTE[0xff08]
#define  chYearChannel    XBYTE[0xff09]
#define  chCenturyChannel XBYTE[0xff32]
#define  chRegA    XBYTE[0xff0a]
#define  chRegB    XBYTE[0xff0b]
#define  chRegC    XBYTE[0xff0c]
#define  chRegD    XBYTE[0xff0d]
/* 命令常量定义 */
#define CMD_START_DS12C887     0x20            /* 开启时钟芯片 */

#define CMD_START_OSCILLATOR 0x70            /* 开启振荡器,
处于抑制状态 */
#define CMD_CLOSE_DS12C887     0x30            /* 关掉时钟芯片
*/
/* 所有的置位使用或操作,清除使用与操作 */
#define MASK_SETB_SET         0x80            /* 禁止刷新 */
#define MASK_CLR_SET         0x7f            /* 使能刷新 */
#define MASK_SETB_DM         0x04            /* 使用HEX格式
*/
#define MASK_CLR_DM             0xfb            /* 使
用BCD码格式 */
#define MASK_SETB_2412         0x02            /* 使
用24小时模式 */
#define MASK_CLR_2412         0xfd            /* 使用12小时模
式 */
#define MASK_SETB_DSE         0x01            /* 使用夏令时 */
#define MASK_CLR_DSE         0xfe            /* 不使用夏令时
*/
/* 函数声明部分 */
//extern void StartDs12c887(void);//zk:2010.01.11-10:18原来是屏蔽的
//extern void CloseDs12c887(void);
extern void InitDs12c887(void);
extern unsigned char GetSeconds(void);
extern unsigned char GetMinutes(void);
extern unsigned char GetHours(void);
extern unsigned char GetDate(void);
extern unsigned char GetMonth(void);
unsigned char GetYear(void);
void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char chHours);
void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear);
#endif

DS12C887.c的程序如下:

void InitDs12c887()
{
    CS_887=0;
  chRegA = CMD_START_DS12C887;//0x20
    chRegB = chRegB | MASK_SETB_SET;        // 禁止刷新
chRegB=0x86;
    chCenturyChannel = 0x21;                // 设置为21世纪
        chRegA=0x20;
    chRegB=0x06;
    chRegB = chRegB & MASK_CLR_SET;           // 使能刷新
        CS_887=1;
}

使用特权

评论回复
6
zkkov2000| | 2010-9-28 16:46 | 只看该作者
继续:
/*************************************************************
函数功能:该函数用来从时钟芯片读取秒字节
应用范围:
入口参数:
出口参数:
*************************************************************/   
unsigned char GetSeconds(void)
{
    int temp;
           CS_887=0;
        temp=chSecondsChannel;   
        CS_887=1;
        return(temp);
}

/*************************************************************
函数功能:该函数用来从时钟芯片读取分字节
应用范围:
入口参数:
出口参数:
*************************************************************/   
unsigned char GetMinutes(void)
{
   
        int temp;
           CS_887=0;
    temp=chMinutesChannel;
        CS_887=1;
        return(temp);
}

/*************************************************************
函数功能:该函数用来从时钟芯片读取小时字节
应用范围:
入口参数:
出口参数:
*************************************************************/   
unsigned char GetHours(void)
{
        int temp;
           CS_887=0;
    temp=chHoursChannel;
        CS_887=1;
        return(temp);
}

/*************************************************************
函数功能:该函数用来从时钟芯片读取日字节
应用范围:
入口参数:
出口参数:
*************************************************************/   
unsigned char GetDate(void)
{
        int temp;
           CS_887=0;
    temp=chDateChannel;
        CS_887=1;
        return(temp);
}
/*************************************************************
函数功能:该函数用来从时钟芯片读取月字节
应用范围:
入口参数:
出口参数:
*************************************************************/   
unsigned char GetMonth(void)
{
        int temp;
           CS_887=0;
    temp=chMonthChannel;
        CS_887=1;
        return(temp);
}

/*************************************************************
函数功能:该函数用来从时钟芯片读取年字节
应用范围:
入口参数:
出口参数:
*************************************************************/   
unsigned char GetYear(void)
{
        int temp;
           CS_887=0;
    temp=chYearChannel;
        CS_887=1;
        temp&=0x0f;
        return(temp);
}

/*************************************************************
函数功能:该函数用来从时钟芯片读取世纪字节
应用范围:
入口参数:
出口参数:
*************************************************************/   
/*
unsigned char GetCentury(void)
{
//   return(chCenturyChannel);
        int temp;
           CS_887=0;
    temp=chCenturyChannel;
        CS_887=1;
        return(temp);
}   
*/
/*************************************************************
函数功能:该函数用来设置时钟芯片的时间
应用范围:
入口参数:chSeconds、chMinutes、chHours是设定时间的压缩BCD码
出口参数:
*************************************************************/   
void SetTime(unsigned char chSeconds,unsigned char chMinutes,unsigned char chHours)
{
    CS_887=0;
        chRegB |=  MASK_SETB_SET;        /* 禁止刷新 */
    chSecondsChannel = chSeconds;
    chMinutesChannel = chMinutes;
    chHoursChannel = chHours;
    chRegB &=  MASK_CLR_SET;            /* 使能刷新 */
        CS_887=1;
}

/*************************************************************
函数功能:该函数用来设置时钟芯片的日期
应用范围:
入口参数:chDate、chMonth、chYear是设定日期的压缩BCD码
出口参数:
*************************************************************/   
void SetDate(unsigned char chDate,unsigned char chMonth,unsigned char chYear)
{
           CS_887=0;
        chRegB |=  MASK_SETB_SET;        /* 禁止刷新 */
    chDateChannel = chDate;
    chMonthChannel = chMonth;
    chYearChannel = chYear;
    chRegB &=  MASK_CLR_SET;            /* 使能刷新 */
        CS_887=1;
}

使用特权

评论回复
7
zkkov2000| | 2010-9-28 16:47 | 只看该作者
“世纪”这个在DS12C887+才有,DS12C887这个型号据说没有。

使用特权

评论回复
8
zkkov2000| | 2010-9-28 16:48 | 只看该作者
8B20 的驱动我也有,但我希望你能自己写。就当锻炼吧。

使用特权

评论回复
9
yuanquan12345|  楼主 | 2010-9-28 17:04 | 只看该作者
谢谢你,我觉得在大家的帮助下我离目标更近了。
谢谢。
我写的读和写12C887:
/**************************************/
     /* DS12C887时钟芯片写指令*/
/**************************************/
void write_ds(uchar add,uchar date)
{
        dscs=0;
        dsas=1;
        dsds=1;
        dsrw=1;
        P0=add;
        dsas=0;
        dsrw=0;
        P0=date;
        dsrw=1;
        dsas=1;
        dscs=1;                               
}

/************************************/
      /* DS12C887读指令*/
/************************************/

uchar read_ds(uchar add)
{
        uchar ds_date;
        dsas=1;
        dsds=1;
        dsrw=1;
        dscs=0;
        P0=add;
        dsas=0;
        dsds=0;
        P0=0xff;
        ds_date=P0;
        dsds=1;
        dsas=1;
        dscs=1;
        return ds_date;       
}

void set_time()
{
        write_ds(4,08);
        write_ds(2,06);
       
}

使用特权

评论回复
10
yuanquan12345|  楼主 | 2010-9-28 17:05 | 只看该作者
然后再加上12864的显示地址,能行吗?

使用特权

评论回复
11
yuanquan12345|  楼主 | 2010-9-28 17:05 | 只看该作者
请指教。

使用特权

评论回复
12
yulri| | 2010-9-28 18:55 | 只看该作者
:handshake顶!

使用特权

评论回复
13
杜专| | 2010-9-28 20:00 | 只看该作者
有遇STC

使用特权

评论回复
14
yuanquan12345|  楼主 | 2010-9-28 20:19 | 只看该作者
请多指点。

使用特权

评论回复
15
yuanquan12345|  楼主 | 2010-9-28 23:04 | 只看该作者
读出来了,秒怎么以3累加。每次加3。

使用特权

评论回复
16
yuanquan12345|  楼主 | 2010-9-28 23:05 | 只看该作者
是什么原因?
请大家帮忙、
先谢谢了。

使用特权

评论回复
17
yuanquan12345|  楼主 | 2010-9-28 23:20 | 只看该作者
将时、分,注释掉,秒走得正常,加上时和分都按秒的时间跑。怪了,检查线没接错。

使用特权

评论回复
18
yuanquan12345|  楼主 | 2010-9-28 23:22 | 只看该作者
单独试分也不正常。

使用特权

评论回复
19
yuanquan12345|  楼主 | 2010-9-28 23:44 | 只看该作者
今天有收获。

使用特权

评论回复
20
yuanquan12345|  楼主 | 2010-9-28 23:52 | 只看该作者
除了秒正常,时和分都跑乱了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

1155

帖子

3

粉丝