在网上看到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, 下载次数: 94)
|