久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5155|回復: 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, 下載次數: 96)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩1区2区 | 黄一级| 蜜桃综合在线 | 美女在线一区二区 | 日韩av中文 | 国产一区二区三区网站 | 天天躁日日躁aaaa视频 | 成人免费在线网 | 国产一区 日韩 | 亚洲精品观看 | 亚洲人成在线观看 | 不卡欧美 | 国产精品亚洲欧美日韩一区在线 | av黄在线观看| 久久青草av| 少妇精品亚洲一区二区成人 | 国产美女精品视频 | 欧美精品首页 | 欧美一区在线视频 | 久视频在线观看 | 91精品久久久久 | 久草精品视频 | 国产婷婷精品av在线 | 成人一区二区三区在线观看 | 日本久久网 | 国产精品视频一二三区 | 91久久伊人 | 国产色网 | 超碰免费在线观看 | av一级毛片 | 亚洲精品一区二区三区 | 自拍偷拍亚洲欧美 | a黄毛片| k8久久久一区二区三区 | 好好的日在线视频 | 国产乱码精品一区二区三区忘忧草 | 欧美日韩综合一区 | 成人夜晚看av | 国产一区二区三区四区五区加勒比 | 日本大片在线播放 | 国产伦精品一区二区三区精品视频 |