一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: gmliwei
收起左侧

[时钟DIY] YLEEE的AT-GG12864做12887大字符时钟

  [复制链接]
发表于 2012-6-6 15:17 | 显示全部楼层
很不错啊,正在做个1302的
发表于 2012-6-6 16:01 | 显示全部楼层
都是高手啊————————————————小弟学习了啊
发表于 2012-6-6 16:12 | 显示全部楼层
12887应该比1302容易啊,连驱动什么都省了,直接按外扩RAM用就成。
199003326 发表于 2012-6-6 14:51 https://www.yleee.com.cn/images/common/back.gif



   自学单片机的,没有系统的学过,所以我不会用外扩RAM;另外可能是心里有阴影吧~刚学单片机的时候买过1片(20一片买的,穷学生你懂得)网上下载的例程,软件上不知道怎么弄了一下,就读取不到任何数据了。1302折腾到现在没有废掉过哪怕一片……
后来因为坛子里的大字符19264钟去美信申请了2片,现在还有一片躺在那里睡觉
发表于 2012-6-6 16:15 | 显示全部楼层
自学单片机的,没有系统的学过,所以我不会用外扩RAM;另外可能是心里有阴影吧~刚学单片机的时候买 ...
sdf15937 发表于 2012-6-6 16:12 https://www.yleee.com.cn/images/common/back.gif



    说实话,俺也不会,就知道理论上能通,但具体咋写程序还真不清楚。
发表于 2012-6-6 16:29 | 显示全部楼层
楼主加油,期待中…………
发表于 2012-6-6 17:27 | 显示全部楼层
确实写12887底层驱动比1302容易,网上有现成的例程,不过现在很难买到原装的,网上买的大多都不好用,在电压低于4.7V有时会丢失数据,有时写不进,甚至出现莫名其妙的问题。
 楼主| 发表于 2012-6-6 17:35 | 显示全部楼层
确实写12887底层驱动比1302容易,网上有现成的例程,不过现在很难买到原装的,网上买的大多都不好用,在电压 ...
LED_123 发表于 2012-6-6 17:27 https://www.yleee.com.cn/images/common/back.gif


淘宝有4.5一个的,是正常价格的零头了,估计是不咋地。    1302有没有办法调节一下呢?话说还是这个便宜。
 楼主| 发表于 2012-6-8 10:40 | 显示全部楼层
本帖最后由 gmliwei 于 2012-6-8 13:39 编辑

今天上午考文综,两个半小时,天下着小雨,在外面没地避雨,学生进场后我就回家了;把程序调试了一下,字符的数据好不容易才弄好;DS12C887不知道咋回事,不能读出数据,按照百度的办法折腾了好久了一直读出0xFF;没办法先用常数代替,后面再弄1302的程序试试吧;18B20从以前的板子上拆了一个焊上,可以测量温度了。
DSCF5923.JPG
欢迎界面借鉴了坛友的思路,做了小修改;
DSCF5924.JPG
正常界面,现在的时间是手动输入的;

打开背光,实际测试电流大约20多毫安,比普通12864省电,大约是十分之一左右。
 楼主| 发表于 2012-6-8 13:39 | 显示全部楼层
12887timer.jpg
发表于 2012-6-8 15:44 | 显示全部楼层
网上找的程序,用着还行!!感觉12887比较好用!!



主程序c中文件
......
#include "ds12b887.h"
SYSTEMTIME CurrentTime;//数据定义
.......
.......
void main(void)
{
  ........
  DS12887_Init();//初始化
  .......  
while(1)
        {
        ........      
        DS12887_GetTime(&CurrentTime);      //读取数据
        a=CurrentTime.Hour/10;                    //小时
           b=CurrentTime.Hour%10;                      //小时
           c=CurrentTime.Minute/10;            //分钟
           d=CurrentTime.Minute%10;            //分钟
           e=CurrentTime.Second/10;            //秒
           f=CurrentTime.Second%10;            //秒        
       
           g=CurrentTime.Year/10;                    //年
           h=CurrentTime.Year%10;                    //年
           i=CurrentTime.Month/10;                    //月
           j=CurrentTime.Month%10;                    //月
           k=CurrentTime.Day/10;                      //日
           l=CurrentTime.Day%10;                      //日
        m=CurrentTime.Week;                 //星期
      
        ........
        }
   .........
}
时间设置:只列出分钟调整,其他雷同!!
.....
//分钟加
CurrentTime.Minute++;
if(CurrentTime.Minute>59) CurrentTime.Minute=0;
DS12887_SetTime(DS12887_Minute,(CurrentTime.Minute));
//分钟减
if(CurrentTime.Minute>0) CurrentTime.Minute--;
if(CurrentTime.Minute==0) CurrentTime.Minute=59;
DS12887_SetTime(DS12887_Minute,(CurrentTime.Minute));
               
.....

以下是ds12b887.h文件内容

#ifndef __DS12b887_H__
#define __DS12b887_H__

sbit DS_DS = P2^7;        
sbit DS_RW = P2^6;        
sbit DS_AS = P2^5;          
sbit DS_CS = P2^4;
#define DS_DAT P0        

typedef struct _SYSTEMTIME_
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
}SYSTEMTIME;


#define DS12887_Second 0x00 //秒
#define DS12887_Minute 0x02 //分
#define DS12887_Hour 0x04 //时
#define DS12887_Week 0x06 //星期
#define DS12887_Day 0x07 //日
#define DS12887_Month 0x08 //月
#define DS12887_Year 0x09 //年
#define _REG_SEC        0x00
#define _REG_SEC_ALM    0x01
#define _REG_MIN        0x02
#define _REG_MIN_ALM    0x03
#define _REG_HOUR       0x04
#define _REG_HOUR_ALM   0x05
#define _REG_WKD        0x06
#define _REG_DATE       0x07
#define _REG_MONTH      0x08
#define _REG_YEAR       0x09

#define write_data DS12887_Write

void DS12887_Init(void);

void DS12887_Write(unsigned char Address, unsigned char Value)
{
DS_CS = 0;
DS_AS = 0;
DS_DS = 1;
DS_RW = 1;
DS_AS = 1;
DS_DAT= Address;
DS_AS = 0;
DS_RW = 0;
DS_DAT= Value;
DS_RW = 1;
DS_AS = 1;
DS_CS = 1;
}

unsigned char DS12887_Read(unsigned char Address)
{
unsigned char DS_RDAT;
DS_CS = 0;
DS_AS = 0;
DS_DS = 1;
DS_RW = 1;
DS_AS = 1;
DS_DAT= Address;
DS_AS = 0;
DS_DS = 0;
DS_DAT=0xff;
DS_RDAT = DS_DAT;
DS_DS = 1;
DS_AS = 1;
DS_CS = 1;
return (DS_RDAT);
}

unsigned char read_data(unsigned char Address)
{
        unsigned char temp;
        while(DS12887_Read(0x0a) & 0x80);
        temp = DS12887_Read(Address);
        return temp;
}

void DS12887_Init(void)
{
        if(read_data(100)!=233)
    {
        write_data(0x0a,0x2f);              
        write_data(0x0b,0x86);         
        write_data(100,233);           
        write_data(_REG_SEC,33);
        write_data(_REG_MIN,0);
        write_data(_REG_HOUR,22);
        write_data(_REG_WKD,3);
        write_data(_REG_DATE,26);
        write_data(_REG_MONTH,1);
        write_data(_REG_YEAR,11);
        
        write_data(0x0b,0x06);   
    }
    else  write_data(0x0b,0x06);      
}

void DS12887_SetTime(unsigned char Address, unsigned char Value)
{
    DS12887_Write(0x0b, 0x86);
    DS12887_Write(Address,Value);
    DS12887_Write(0x0b, 0x06);
}

void DS12887_GetTime(SYSTEMTIME *Time)
{
        Time->Second = read_data(DS12887_Second);
        Time->Minute = read_data(DS12887_Minute);
        Time->Hour   = read_data(DS12887_Hour);
        Time->Day = read_data(DS12887_Day );
        Time->Week = read_data(DS12887_Week );
        Time->Month = read_data(DS12887_Month);
        Time->Year = read_data(DS12887_Year);
}

#endif

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-7-13 13:48 , Processed in 0.052286 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表