[51单片机] 51单片机驱动DS12C887

[复制链接]
 楼主| 比神乐 发表于 2024-10-13 17:38 | 显示全部楼层 |阅读模式
代码:
  1. #include<reg51.h>
  2. #include"OLED.H"
  3. #include"define.h"

  4. extern unsigned char code Dot[];
  5. //extern char miao,shi,fen,year,month,day,week;
  6. void delay(uint z)//延时函数
  7. {
  8.         uint x,y;
  9.         for(x=z;x>0;x--)
  10.                 for(y=110;y>0;y--);
  11. }
  12. void init()
  13. {//初始化函数

  14.        
  15.        
  16.        
  17.         week=7;
  18.        
  19. /*以下几行在首次设置DS12C887时使用,以后不必再写入*/
  20.         write_ds(0x0A,0x20);//打开振荡器
  21.         write_ds(0x0B,0x22);//设置24小时模式,数据BCD码格式
  22.                                                 //开启闹铃中断
  23.         set_time();//设置上电默认时间
  24. //-----------------------------------------------------

  25. }
  26. void write_ds(uchar add,uchar date)
  27. {//写12C887函数
  28.         dscs=0;
  29.         dsas=1;
  30.         dsds=1;
  31.         dsrw=1;
  32.         P2=add;//先写地址
  33.         dsas=0;
  34.         dsrw=0;
  35.         P2=date;//再写数据
  36.         dsrw=1;
  37.         dsas=1;
  38.         dscs=1;                               
  39. }

  40. uchar read_ds(uchar add)
  41. {//读12C887函数
  42.         uchar ds_date;
  43.         dsas=1;
  44.         dsds=1;
  45.         dsrw=1;
  46.         dscs=0;
  47.         P2=add;//先写地址
  48.         dsas=0;
  49.         dsds=0;
  50.         P2=0xff;
  51.         ds_date=P2;//再读数据
  52.         dsds=1;
  53.         dsas=1;
  54.         dscs=1;
  55.         return ds_date;       
  56. }
  57. /*---首次操作12C887时给予寄存器初始化---*/
  58. void set_time()
  59. {//首次上电初始化时间函数
  60.         write_ds(0,0x40);
  61.         write_ds(1,0);
  62.         write_ds(2,0x59);
  63.         write_ds(3,0);
  64.         write_ds(4,0x23);
  65.         write_ds(5,0x0);
  66.         write_ds(6,0x7);
  67.         write_ds(7,0x31);
  68.         write_ds(8,0x12);
  69.         write_ds(9,0x23);       
  70. }
  71. void main(void)
  72. {
  73.         int i;
  74.         unsigned char shi1,ge;
  75.         LCD_Init();
  76.     LCD_CLS();
  77.         LCD_P8x16Str(20,4,(u8*)"20  -  -  ");
  78.         LCD_P8x16Str(20,6,(u8*)"  :  :  ");
  79.         init();
  80.         //Draw_BMP(0,0,100,3,(u8*)Dot);
  81.         while(1)
  82.         {
  83.                 year=read_ds(9);//读取12C887数据
  84.                 month=read_ds(8);       
  85.                 day=read_ds(7);
  86.                 week=read_ds(6);
  87.                 shi=read_ds(4);
  88.                 fen=read_ds(2);
  89.                 miao=read_ds(0);
  90.                 shi1=(miao>>4)+0x30;
  91.                 ge=(miao&0x0f)+0x30;
  92.                 LCD_P8x16Char(68,6,shi1);
  93.                 LCD_P8x16Char(76,6,ge);

  94.                 shi1=(fen>>4)+0x30;
  95.                 ge=(fen&0x0f)+0x30;
  96.                 LCD_P8x16Char(44,6,shi1);
  97.                 LCD_P8x16Char(52,6,ge);

  98.                 shi1=(shi>>4)+0x30;
  99.                 ge=(shi&0x0f)+0x30;
  100.                 LCD_P8x16Char(20,6,shi1);
  101.                 LCD_P8x16Char(28,6,ge);

  102.                 shi1=(day>>4)+0x30;
  103.                 ge=(day&0x0f)+0x30;
  104.                 LCD_P8x16Char(84,4,shi1);
  105.                 LCD_P8x16Char(92,4,ge);

  106.             shi1=(month>>4)+0x30;
  107.                 ge=(month&0x0f)+0x30;
  108.                 LCD_P8x16Char(60,4,shi1);
  109.                 LCD_P8x16Char(68,4,ge);

  110.                 shi1=(year>>4)+0x30;
  111.                 ge=(year&0x0f)+0x30;
  112.                 LCD_P8x16Char(36,4,shi1);
  113.                 LCD_P8x16Char(44,4,ge);

  114.                 LCD_P8x16Char(20,2,week+0x30);
  115.                 for(i=0;i<20000;i++);
  116.         }
  117. }
效果图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
chineseboyzxy 发表于 2024-10-24 15:45 | 显示全部楼层
好老的元件。07年做了一个数码管的表,用的就是89C51+12887,朋友自己做的并口编程器一遍一遍的烧芯片调试。带模拟演奏音乐报时,铃儿响叮当。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3535

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部