找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4315|回复: 0
收起左侧

Tiny DS1307 RTC I2C模块的使用(含单片机程序+仿真)

[复制链接]
ID:404797 发表于 2019-3-21 23:01 | 显示全部楼层 |阅读模式
  在网上看到Tiny RTC I2C模块,如下图:
A.jpg B.jpg
发现其接口只要四根线,方便为最小系统板的单片机系统所用,而且模块内集成了DS1307时钟芯片和24C32型EEPROM芯,可为单片机系统提供准确时钟和增强存储能力。便买下,试着使用其功能,对存储模块,就是写入数据再读出数据,对时钟模块,就是读出时间值,修改时间值并保存。根据IIC总线要求,试着编写模块操作程序,由于经常要下载程序到单片机测试,非常不便,便干脆按模块结构和功能做个仿真,在仿真上调试后再移植到实物中,可大大提高效率,另外对想了解DS1307模块和EEPROM模块而暂时手头上没有实物的同学,可提供直观了解程序功能的方便。下面是仿真截图。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Proteus1.JPG
本人用的是单片机最小系统
IMG_20190321_210332.jpg
虽略为简单,但还是配齐了按键矩阵和1602液晶显示器,以及关键的TinyRTC模块。
下面是程序移植到实物时的情形。

C.jpg D.jpg


下面是完整的程序和仿真设计

单片机源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P0^5;
  5. sbit rw=P0^6;
  6. sbit E=P0^7;

  7. sbit scl=P3^4;
  8. sbit sda=P3^5;

  9. sbit kx0=P1^0;
  10. sbit kx1=P1^1;
  11. sbit kx2=P1^2;
  12. sbit kx3=P1^3;
  13. sbit ky0=P1^4;
  14. sbit ky1=P1^5;
  15. sbit ky2=P1^6;
  16. sbit ky3=P1^7;
  17. char pos,num,key,memdata[17],wa[2],dtime[2][8];
  18. uchar code CGCODE[]={
  19. 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//显示年0x00
  20. 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//显示月0x01
  21. 0x0F,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00 //显示日0x02
  22. };
  23. char vcode[10]={'"','\'',':','w',2,1,0,'C'};
  24. //==============================================================================
  25. int KeyDown()
  26. {char v,x,y;
  27. x=4;y=4;
  28. P1=0x0f;v=P2;
  29. if(v!=0x0f){if(kx0==0)x=0;if(kx1==0)x=1;if(kx2==0)x=2;if(kx3==0)x=3;
  30.              P1=0xf0;if(ky0==0)y=0;if(ky1==0)y=1;if(ky2==0)y=2;if(ky3==0)y=3;
  31.              }
  32. return x*4+y;
  33. }
  34. //################################################################
  35. char cp,vp;
  36. void delay(int ii){int i;for(i=0;i<ii;i++);}
  37. void writeCmd(uchar c){E=0;rw=0;rs=0;delay(5);P2=c;delay(5);E=1;delay(5);E=0; }
  38. void writeDat(uchar c){E=0;rw=0;rs=1;delay(5);P2=c;delay(5);E=1;delay(5);E=0;}
  39. void clr(int ii){char i;if(ii==0){writeCmd(0x80+0x40);for(i=0;i<13;i++)writeDat(' ');}if(ii==1){writeCmd(0x80);for(i=0;i<13;i++)writeDat(' ');}}
  40. void PrtC(char c){if(vp==13){clr(0);writeCmd(0x80+0x40);}if(vp==26){clr(1);writeCmd(0x80);vp=0;}writeDat(c);vp++;}
  41. void PutxyC(char x,char y,uchar c){if(y>0)writeCmd(0x80+0x40+x);else writeCmd(0x80+x);writeDat(c);}
  42. void Prtstr(char *cp){char i=0;while(cp[i]!=0){PrtC(cp[i]);i++;}}
  43. //-------------------------------------------------------
  44. void LM1602_Init(){writeCmd(0x38);delay(500); writeCmd(0x0f);delay(500);writeCmd(0x01);delay(500);}
  45. //#################################################################################
  46. void delay1(){;;}
  47. void IIC_start(){scl=0;sda=1;scl=1;sda=0;}
  48. void IIC_stop(){scl=0;sda=0;scl=1;sda=1;}
  49. void IIC_respons(){int i;scl=1;while((sda==1)&&(i<250))i++;scl=0;}
  50. void IIC_answer(){sda=0;delay1();scl=1;delay1();scl=0;}
  51. void IIC_noanswer(){sda=1;scl=1;delay1();scl=0;}
  52. void IIC_init(){sda=1;delay1();scl=1;delay1();}
  53. void IIC_write_byte(uchar ci)
  54. {char i,temp; temp=ci;
  55. for(i=0;i<8;i++){scl=0;sda=temp&0x80;temp=temp<<1;delay1();scl=1;delay1();scl=0;}}
  56. //--------------------------------------------------------------------------------
  57. uchar IIC_read_byte()
  58. {uchar i,k;
  59. scl=0;delay1();sda=1;delay1();
  60. for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay1();}
  61. return k;
  62. }
  63. //===============================================================================
  64. void IIC_write_addstr(char chip,uint address,char addmode,char str[])
  65. {int i=0;
  66. IIC_start();
  67. IIC_write_byte(chip);IIC_respons();
  68. if(addmode==0){IIC_write_byte(address);IIC_respons();}
  69. else{IIC_write_byte(address>>8);IIC_respons();IIC_write_byte(address&0xff);IIC_respons();}
  70. while(str[i]!=0){IIC_write_byte(str[i]);IIC_respons();i++;}
  71. IIC_stop();
  72. }
  73. //-----------------------------------------------------------------------------------
  74. uchar *IIC_read_addstr(char chip,uchar address,char addmode,int len,char *cp)
  75. {uchar i,dat;
  76.   IIC_start(); IIC_write_byte(chip);IIC_respons();
  77.   if(addmode==0){IIC_write_byte(address);IIC_respons();}
  78.   else{IIC_write_byte(address>>8);IIC_respons();IIC_write_byte(address&0xff);IIC_respons();}
  79.   IIC_start(); IIC_write_byte(chip+1);IIC_respons();
  80.   for(i=0;i<len;i++){cp[i]=IIC_read_byte();if(i==(len-1))IIC_noanswer();else IIC_answer();} IIC_stop();
  81.   return cp;
  82.   }
  83. void showdatetime()
  84. { char i;
  85.   for(i=0;i<8;i++)dtime[1][i]=dtime[0][i];
  86.   PrtC(dtime[0][6]/16+0x30);PrtC(dtime[0][6]%16+0x30);PrtC(0);
  87.   PrtC(dtime[0][5]/16+0x30);PrtC(dtime[0][5]%16+0x30);PrtC(1);
  88.   PrtC(dtime[0][4]/16+0x30);PrtC(dtime[0][4]%16+0x30);PrtC(2);
  89.   PrtC(dtime[0][3]/16+0x30);PrtC(dtime[0][3]%16+0x30);PrtC('W');
  90.   PrtC(dtime[0][2]/16+0x30);PrtC(dtime[0][2]%16+0x30);PrtC(':');
  91.   PrtC(dtime[0][1]/16+0x30);PrtC(dtime[0][1]%16+0x30);PrtC('\'');
  92.   PrtC(dtime[0][0]/16+0x30);PrtC(dtime[0][0]%16+0x30);PrtC('"');
  93.   num=(dtime[1][pos]/16)*10+dtime[1][pos]%16;
  94. }
  95. void showitem()
  96. {writeCmd(0x80+15);
  97. writeDat(vcode[pos]);
  98. num=(dtime[1][pos]/16)*10+dtime[1][pos]%16;
  99. PutxyC(14,1,num/10+0x30);
  100. writeDat(num%10+0x30);
  101. }
  102. void showedit()
  103. {dtime[1][pos]=num/10*16+num%10;
  104.   PutxyC(14,1,num/10+0x30);
  105.   writeDat(num%10+0x30);
  106. }
  107. //################################################################
  108. void main()
  109. {char i,j;
  110. pos=0;num=0;
  111.   writeCmd(0x38);
  112.   writeCmd(0x0f);
  113.   writeCmd(0x40);
  114.   for(i=0;i<24;i++)writeDat(CGCODE[i]);
  115.   j=rand()%16;
  116.   IIC_read_addstr(0xa0,j*16,1,16,memdata);
  117.   for(i=0;i<13;i++)PrtC(memdata[i]);
  118.   IIC_read_addstr(0xd0,0,0,7,dtime[0]);showdatetime();
  119.   PutxyC(13,0,'|');PutxyC(13,1,'|');showitem();
  120.   while(1)
  121.   {key=KeyDown();
  122.    if((key>=0)&&(key<16))
  123.            {while(KeyDown()==key);P0=key;
  124.                     if(key==0){IIC_write_addstr(0xd0,0x07,1,"\x10");}
  125.             if(key==1){wa[0]=num/10*16+num%10;wa[1]=0;IIC_write_addstr(0xd0,pos,0,wa);}
  126.                         if(key==2){;}
  127. ……………………

  128. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
TinyRTC.zip (44.25 KB, 下载次数: 94)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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