#include <AT89X52.H> #include <stdio.h> #include <absacc.h>  unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,                             0x6d,0x7d,0x07, 0x7f,0x6f,};  unsigned char sec;        //定义计数值,每过1秒,sec加1  unsigned int tcnt;        //定时中断次数 bit  write=0;             //写24C08的标志; sbit gewei=P2^0;          //个位选通定义 sbit shiwei=P2^1;         //十位选通定义 /////////24C08读写驱动程序//////////////////// sbit scl=P3^4;  //24c08 SCL sbit sda=P3^5;  //24c08 SDA void delay1(unsigned char x) {  unsigned int i;   for(i=0;i<x;i++);   ;} void flash()  {  ;  ; } void x24c08_init()  //24c08初始化子程序  {scl=1; flash(); sda=1; flash();} void start()        //启动I2C总线 {sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();} void stop()         //停止I2C总线 {sda=0; flash(); scl=1; flash(); sda=1; flash();} void writex(unsigned char j)  //写一个字节 {  unsigned char i,temp;    temp=j;    for (i=0;i<8;i++)    {temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();}    scl=0; flash(); sda=1; flash(); } unsigned char readx()   //读一个字节 {    unsigned char i,j,k=0;    scl=0; flash(); sda=1;    for (i=0;i<8;i++)    {  flash(); scl=1; flash();       if (sda==1) j=1;       else j=0;       k=(k<<1)|j;        scl=0;}    flash(); return(k); } void clock()         //I2C总线时钟 {    unsigned char i=0;    scl=1; flash();    while ((sda==1)&&(i<255))i++;    scl=0; flash(); } ////////从24c02的地址address中读取一个字节数据///// unsigned char x24c08_read(unsigned char address) {    unsigned char i;    start(); writex(0xa0);    clock(); writex(address);    clock(); start();    writex(0xa1); clock();    i=readx(); stop();    delay1(10);    return(i); } //////向24c02的address地址中写入一字节数据info///// void x24c08_write(unsigned char address,unsigned char info) {    EA=0;    start(); writex(0xa0);    clock(); writex(address);    clock(); writex(info);    clock(); stop();    EA=1;    delay1(50); } /////////////24C08读写驱动程序完///////////////////// void Delay(unsigned int tc)     //延时程序 {     while( tc != 0 )                    {unsigned int i;                     for(i=0; i<100; i++);             tc--;} } void LED()                  //LED显示函数 {    shiwei=0; P0=table[sec/10]; Delay(8); shiwei=1;    gewei=0;  P0=table[sec%10]; Delay(5); gewei=1; } void t0(void) interrupt 1 using 0  //定时中断服务函数 {  TH0=(65536-50000)/256; //对TH0 TL0赋值 TL0=(65536-50000)%256; //重装计数初值 tcnt++;        //每过250ust tcnt加一 if(tcnt==20)  //计满20次(1秒)时   {      tcnt=0;   //重新再计     sec++;     write=1;  //1秒写一次24C08     if(sec==100) //定时100秒,在从零开始计时       {sec=0;}    }  } void main(void)  {  TMOD=0x01;  //定时器工作在方式1 ET0=1;  EA=1;  x24c08_init();        //初始化24C08 sec=x24c08_read(2);//读出保存的数据赋于sec TH0=(65536-50000)/256; //对TH0 TL0赋值 TL0=(65536-50000)%256; //使定时器0.05秒中断一次 TR0=1;           //开始计时  while(1)    {      LED();     if(write==1) //判断计时器是否计时一秒     {      write=0;              //清零       x24c08_write(2,sec);  //在24c08的地址2中写入数据sec     }    } }  
 |