/************************篮球赛24秒**********************/
/*
制作:梦之弦
日期:2008-5-18
功能:带掉电存储功能的篮球赛24秒计时器
*/
#include <AT89X51.H>
#define uint unsigned int
#define uchar unsigned char
sbit led="P3"^0;
sbit led2=P3^1;
sbit zt="P3"^2;
bit write="0"; //写24C02的标志;
sbit sda="P1"^0; //IO口定义
sbit scl="P1"^1;
sbit aa="P1"^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段码值
uchar Second;
void delay1s(void) //延时子函数,时间是1秒
{
unsigned char i,j,k;
for(k=100;k>0;k--)
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void delay(uint z)
{
uchar i,j;
for(i=z;i>0;i--)
for(j=113;j>0;j--);
}
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();
delay(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";
delay(50);
}
void main(void)
{
x24c08_init(); //初始化24C08
EA="1"; //开总中断
EX0=1; //开外部中断0
Second="x24c08"_read(2);//读出保存的数据赋于sec
P0=table[Second/10]; //输出十位数
P2=table[Second%10]; //输出个位数
while(1)
{
if(zt==1) //如果犯规/暂停键释放,绿灯灭
delay(10);
if(zt==1)
{
led2=1;
delay1s();//延时1秒
write="1"; //1秒写一次24C08
Second++; //秒自加
led="1"; //红灯灭
if(aa==0)
{delay(10);
if(aa==0)
Second="0";
}
if(Second==24) //是否秒表走到24
{
write="1"; //1秒写一次24C08
Second="0";//是24,则清零,重新计时
led="0"; //同时,指示灯,红灯提示24到,即红灯会亮
}
if(write==1) //判断计时器是否计时一秒
{
write=0; //清零
x24c08_write(2,Second); //在24c08的地址2中写入数据sec
}
P0=table[Second/10];
P2=table[Second%10];
} }
}
void exter0() interrupt 0 //外部中断服务程序
{
if(zt==0) //如果有键按下,即有队要求暂停或有违例,这时就要中断,并且停表
delay(10);
if(zt==0)
led2=0; //同时,我们让绿灯亮,即比赛进入暂停时段
}
文章评论(0条评论)
登录后参与讨论