在網上看到Tiny RTC I2C模塊,如下圖:
發現其接口只要四根線,方便為最小系統板的單片機系統所用,而且模塊內集成了DS1307時鐘芯片和24C32型EEPROM芯,可為單片機系統提供準確時鐘和增強存儲能力。便買下,試著使用其功能,對存儲模塊,就是寫入數據再讀出數據,對時鐘模塊,就是讀出時間值,修改時間值并保存。根據IIC總線要求,試著編寫模塊操作程序,由于經常要下載程序到單片機測試,非常不便,便干脆按模塊結構和功能做個仿真,在仿真上調試后再移植到實物中,可大大提高效率,另外對想了解DS1307模塊和EEPROM模塊而暫時手頭上沒有實物的同學,可提供直觀了解程序功能的方便。下面是仿真截圖。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
本人用的是單片機最小系統
雖略為簡單,但還是配齊了按鍵矩陣和1602液晶顯示器,以及關鍵的TinyRTC模塊。
下面是程序移植到實物時的情形。
下面是完整的程序和仿真設計
單片機源程序如下:
- #include<reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit rs=P0^5;
- sbit rw=P0^6;
- sbit E=P0^7;
- sbit scl=P3^4;
- sbit sda=P3^5;
- sbit kx0=P1^0;
- sbit kx1=P1^1;
- sbit kx2=P1^2;
- sbit kx3=P1^3;
- sbit ky0=P1^4;
- sbit ky1=P1^5;
- sbit ky2=P1^6;
- sbit ky3=P1^7;
- char pos,num,key,memdata[17],wa[2],dtime[2][8];
- uchar code CGCODE[]={
- 0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//顯示年0x00
- 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x13,0x00,//顯示月0x01
- 0x0F,0x09,0x09,0x0f,0x09,0x09,0x0f,0x00 //顯示日0x02
- };
- char vcode[10]={'"','\'',':','w',2,1,0,'C'};
- //==============================================================================
- int KeyDown()
- {char v,x,y;
- x=4;y=4;
- P1=0x0f;v=P2;
- if(v!=0x0f){if(kx0==0)x=0;if(kx1==0)x=1;if(kx2==0)x=2;if(kx3==0)x=3;
- P1=0xf0;if(ky0==0)y=0;if(ky1==0)y=1;if(ky2==0)y=2;if(ky3==0)y=3;
- }
- return x*4+y;
- }
- //################################################################
- char cp,vp;
- void delay(int ii){int i;for(i=0;i<ii;i++);}
- void writeCmd(uchar c){E=0;rw=0;rs=0;delay(5);P2=c;delay(5);E=1;delay(5);E=0; }
- void writeDat(uchar c){E=0;rw=0;rs=1;delay(5);P2=c;delay(5);E=1;delay(5);E=0;}
- 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(' ');}}
- void PrtC(char c){if(vp==13){clr(0);writeCmd(0x80+0x40);}if(vp==26){clr(1);writeCmd(0x80);vp=0;}writeDat(c);vp++;}
- void PutxyC(char x,char y,uchar c){if(y>0)writeCmd(0x80+0x40+x);else writeCmd(0x80+x);writeDat(c);}
- void Prtstr(char *cp){char i=0;while(cp[i]!=0){PrtC(cp[i]);i++;}}
- //-------------------------------------------------------
- void LM1602_Init(){writeCmd(0x38);delay(500); writeCmd(0x0f);delay(500);writeCmd(0x01);delay(500);}
- //#################################################################################
- void delay1(){;;}
- void IIC_start(){scl=0;sda=1;scl=1;sda=0;}
- void IIC_stop(){scl=0;sda=0;scl=1;sda=1;}
- void IIC_respons(){int i;scl=1;while((sda==1)&&(i<250))i++;scl=0;}
- void IIC_answer(){sda=0;delay1();scl=1;delay1();scl=0;}
- void IIC_noanswer(){sda=1;scl=1;delay1();scl=0;}
- void IIC_init(){sda=1;delay1();scl=1;delay1();}
- void IIC_write_byte(uchar ci)
- {char i,temp; temp=ci;
- for(i=0;i<8;i++){scl=0;sda=temp&0x80;temp=temp<<1;delay1();scl=1;delay1();scl=0;}}
- //--------------------------------------------------------------------------------
- uchar IIC_read_byte()
- {uchar i,k;
- scl=0;delay1();sda=1;delay1();
- for(i=0;i<8;i++){scl=1;delay();k=(k<<1)|sda;scl=0;delay1();}
- return k;
- }
- //===============================================================================
- void IIC_write_addstr(char chip,uint address,char addmode,char str[])
- {int i=0;
- IIC_start();
- IIC_write_byte(chip);IIC_respons();
- if(addmode==0){IIC_write_byte(address);IIC_respons();}
- else{IIC_write_byte(address>>8);IIC_respons();IIC_write_byte(address&0xff);IIC_respons();}
- while(str[i]!=0){IIC_write_byte(str[i]);IIC_respons();i++;}
- IIC_stop();
- }
- //-----------------------------------------------------------------------------------
- uchar *IIC_read_addstr(char chip,uchar address,char addmode,int len,char *cp)
- {uchar i,dat;
- IIC_start(); IIC_write_byte(chip);IIC_respons();
- if(addmode==0){IIC_write_byte(address);IIC_respons();}
- else{IIC_write_byte(address>>8);IIC_respons();IIC_write_byte(address&0xff);IIC_respons();}
- IIC_start(); IIC_write_byte(chip+1);IIC_respons();
- for(i=0;i<len;i++){cp[i]=IIC_read_byte();if(i==(len-1))IIC_noanswer();else IIC_answer();} IIC_stop();
- return cp;
- }
- void showdatetime()
- { char i;
- for(i=0;i<8;i++)dtime[1][i]=dtime[0][i];
- PrtC(dtime[0][6]/16+0x30);PrtC(dtime[0][6]%16+0x30);PrtC(0);
- PrtC(dtime[0][5]/16+0x30);PrtC(dtime[0][5]%16+0x30);PrtC(1);
- PrtC(dtime[0][4]/16+0x30);PrtC(dtime[0][4]%16+0x30);PrtC(2);
- PrtC(dtime[0][3]/16+0x30);PrtC(dtime[0][3]%16+0x30);PrtC('W');
- PrtC(dtime[0][2]/16+0x30);PrtC(dtime[0][2]%16+0x30);PrtC(':');
- PrtC(dtime[0][1]/16+0x30);PrtC(dtime[0][1]%16+0x30);PrtC('\'');
- PrtC(dtime[0][0]/16+0x30);PrtC(dtime[0][0]%16+0x30);PrtC('"');
- num=(dtime[1][pos]/16)*10+dtime[1][pos]%16;
- }
- void showitem()
- {writeCmd(0x80+15);
- writeDat(vcode[pos]);
- num=(dtime[1][pos]/16)*10+dtime[1][pos]%16;
- PutxyC(14,1,num/10+0x30);
- writeDat(num%10+0x30);
- }
- void showedit()
- {dtime[1][pos]=num/10*16+num%10;
- PutxyC(14,1,num/10+0x30);
- writeDat(num%10+0x30);
- }
- //################################################################
- void main()
- {char i,j;
- pos=0;num=0;
- writeCmd(0x38);
- writeCmd(0x0f);
- writeCmd(0x40);
- for(i=0;i<24;i++)writeDat(CGCODE[i]);
- j=rand()%16;
- IIC_read_addstr(0xa0,j*16,1,16,memdata);
- for(i=0;i<13;i++)PrtC(memdata[i]);
- IIC_read_addstr(0xd0,0,0,7,dtime[0]);showdatetime();
- PutxyC(13,0,'|');PutxyC(13,1,'|');showitem();
- while(1)
- {key=KeyDown();
- if((key>=0)&&(key<16))
- {while(KeyDown()==key);P0=key;
- if(key==0){IIC_write_addstr(0xd0,0x07,1,"\x10");}
- if(key==1){wa[0]=num/10*16+num%10;wa[1]=0;IIC_write_addstr(0xd0,pos,0,wa);}
- if(key==2){;}
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
TinyRTC.zip
(44.25 KB, 下載次數: 96)
2019-3-21 23:00 上傳
點擊文件名下載附件
程序及仿真
|