原创 简单功能的篮球赛24秒计时

2008-7-29 07:26 2904 6 6 分类: MCU/ 嵌入式

/************************篮球赛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; //同时,我们让绿灯亮,即比赛进入暂停时段
 
 
}


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条