#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 } } }
|