您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 带EEPROM的0-99计时
/*******************************************************************************FileName:I2C.cAuthor:jiangyanVersion:V1.0Date:26.06.2012Description:利用定时器产生一个0-99秒变化的秒表,并显示在数码管上,每过1秒就将这个变化的数写入EEPROM,当重新上电后,单片机从EEPROM中读出断电前的数字,然后继续显示。********************************************************************************/#includereg51.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedintsbitLE=P1^0;sbitSDA=P2^0;sbitSCL=P2^1;ucharnum,sec,write,shi,ge;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,//定义数码管显示数组0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/**********延时函数***************/voidDelayms(uintxms){uintx,y;for(x=xms;x0;x--)for(y=110;y0;y--);}/**********I2C延时函数***************/voidDelay(){_nop_();_nop_();_nop_();_nop_();_nop_();}/**********I2C初始化函数***************/voidI2C_init(){SDA=1;_nop_();SCL=1;_nop_();}/**********I2C起始函数***************/voidI2C_start(){SDA=1;_nop_();SCL=1;Delay();SDA=0;//发送启动信号Delay();}/**********I2C停止函数***************/voidI2C_stop(){SDA=0;_nop_();SCL=1;Delay();SDA=1;//发送停止信号Delay();}/***********I2C应答函数*************/voidI2C_respon(){ucharcc;SCL=1;Delay();while((SDA=1)&&(cc255)){cc++;}SCL=0;//钳住时钟总线以便接受数据_nop_();_nop_();}/**********I2C写一个字节函数***************/voidI2C_writebyte(ucharbyte){uchardd,temp;temp=byte;for(dd=0;dd8;dd++){temp=temp1;SCL=0;Delay();SDA=CY;Delay();SCL=1;//通知被控制器开始接受数据Delay();}SCL=0;Delay();SDA=1;//准备接受应答位Delay();}/**********I2C读一个字节函数***************/ucharI2C_readbyte(){ucharee,ff;SCL=0;//时钟先置低,准备接收数据Delay();SDA=1;//SDA置高方便数据的读取_nop_();_nop_();for(ee=0;ee8;ee++){SCL=1;//时钟线拉高,锁定读取的数据Delay();ff=(ff1)|SDA;//一次把8个独立的位放到一个字节中_nop_();_nop_();SCL=0;Delay();}returnff;//返回ff值}/**************I2C写函数**********************/voidI2C_writeadd(ucharaddress,uchartemp){I2C_start();//启动I2C_writebyte(0xa0);//确定对从器件进行写操作I2C_respon();//应答I2C_writebyte(address);//确定从器件写入的地址I2C_respon();//应答I2C_writebyte(temp);//发送要写的内容I2C_respon();//应答I2C_stop();//停止}/**************I2C读函数******************/ucharI2C_readadd(ucharaddress){uchartemp1;I2C_start();//启动I2C_writebyte(0xa0);//确定对主器件进行写操作I2C_respon();//应答I2C_writebyte(address);//确定写的地址I2C_respon();//应答I2C_start();//重新启动,准备换向I2C_writebyte(0xa1);//确定对从器件进行读操作I2C_respon();//应答temp1=I2C_readbyte();//将函数返回值给temp1I2C_stop();//停止returntemp1;//返回temp1值}/*************显示函数*****************/voiddisplay(ucharshi,ucharge){LE=1;//打开锁存器控制端P0=0xfe;//位选中十位上的数码管LE=0;//关闭锁存控制端P1=table[shi];//数码管显示的内容Delayms(1);//延时1ms,动态显示,利用余晖达到动态显示的效果LE=1;P0=0xfd;LE=0;P1=table[ge];}/**********初始化函数***************/voidinit(){TMOD=0x01;//定时器0工作在方式1下TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;//打开总中断ET0=1;//打开定时器T0中断TR0=1;//打开定时器T0}/**********主函数***************/voidmain(){I2C_init();sec=I2C_readadd(2);if(sec=100){sec=0;}init();while(1){if(sec==100)//判断计数是否达到100S,如果是则从零开始重新显示{sec=0;}shi=sec/10;//取模给十位显示ge=sec%10;//取余给各位显示display(shi,ge);if(write==1){write=0;I2C_writeadd(2,sec);}}}/**********中断函数函数***************/voidTime_t0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;num++;if(num==20)//num=20时,计时1S{num=0;sec++;write=1;}}
本文标题:带EEPROM的0-99计时
链接地址:https://www.777doc.com/doc-1802238 .html