源程序C代码:篮球比赛应用系统

编程实验

72人已加入

描述

  /*****************************************************************

  题目:篮球比赛计时记分系统

  硬件:STC89C52RC、1602LCM液晶屏、六个按键

  软件:Keil C

  *****************************************************************/

  #include //头文件

  #define uchar unsigned char //宏定义

  #define uint unsigned int

  sbit S1=P3^2; //中断0(比赛倒计时开始/暂停)

  sbit S2=P3^3; //中断1(24s倒计时重新开始)

  sbit key="P2"^4; //连接S3、S4、S5、S6(矩阵按键)

  sbit key_S3=P2^3; //连接S3

  sbit key_S4=P2^2; //连接S4

  sbit key_S5=P2^1; //连接S5

  sbit key_S6=P2^0; //连接S6

  sbit FM="P1"^5; //蜂鸣器接口

  sbit EN="P1"^0;

  sbit RS="P1"^1;

  char sec,min,num,time,sec_24s;

  uchar hpoint,rpoint;

  uchar code table1[]={"H.T 000:000 R.T "};

  //H.T(home team)代表主队,R.T(road team)代表客队,中间是比分

  uchar code table2[]={"12:00 SEC-1 24"};

  //SEC-X代表第X节比赛,左边是单节比赛倒计时,右边是24秒倒计时

  /***1ms延时子程序***/

  void delay(int z)

  {

  int x;

  uchar y;

  for(x=z;x>0;x--)

  for(y=110;y>0;y--);

  }

  /***LCD写指令***/

  void write_com(uchar com)

  {

  RS=0;

  P0=com;

  delay(5);

  EN=1;

  delay(5);

  EN=0;

  }

  /***LCD写数据***/

  void write_dat(uchar dat)

  {

  RS=1;

  P0=dat;

  delay(5);

  EN=1;

  delay(5);

  EN=0;

  }

  /***初始化程序***/

  void init(void)

  {

  uchar i;

  hpoint=0; //H.T分数初始化

  rpoint=0; //R.T分数初始化

  time=0;

  TMOD=0x10; //定时器1初始化

  TL1=0x00;

  TH1=0x4c;

  EA=1; //开总中断

  ET1=1; //开定时器1

  TR1=0; //定时器1不工作

  EX0=1; //开中断0

  EX1=1; //开中断1

  IT0=1; //中断0为边沿触发

  IT1=1; //中断1为边沿触发

  EN=0;

  sec=0;

  min=12;

  num=1;

  sec_24s=24;

  write_com(0x38); //LCD设置初始化

  write_com(0x0c);

  write_com(0x06);

  write_com(0x01);

  write_com(0x80); //LCD显示初始化

  for(i=0;i<16;i++)

  {

  write_dat(table1[i]);

  }

  write_com(0x80+0x40);

  for(i=0;i<16;i++)

  {

  write_dat(table2[i]);

  }

  }

  /***LCD分数更新***/

  void point_lcd(uchar add,uchar dat)

  {

  write_com(0x80+add);

  write_dat(0x30+dat/100);

  write_dat(0x30+(dat%100)/10);

  write_dat(0x30+dat%10);

  }

  /***按键检测***/

  void keyscan(void)

  {

  key=0;

  if(key_S3==0) //S3按下H.T分数加一

  {

  hpoint++;

  point_lcd(0x04,hpoint); //分数显示更新

  if(key_S3==0) //松手检测

  {

  while(key_S3==0);

  delay(20);

  }

  }

  else if(key_S4==0) //S4按下H.T分数减一

  {

  hpoint--;

  point_lcd(0x04,hpoint);

  if(key_S4==0)

  {

  while(key_S4==0);

  delay(20);

  }

  }

  else if(key_S5==0) //S5按下R.T分数加一

  {

  rpoint++;

  point_lcd(0x08,rpoint);

  if(key_S5==0)

  {

  while(key_S5==0);

  delay(20);

  }

  }

  else if(key_S6==0) //S6按下R.T分数减一

  {

  rpoint--;

  point_lcd(0x08,rpoint);

  if(key_S6==0)

  {

  while(key_S6==0);

  delay(20);

  }

  }

  }

  /***比赛倒计时/24s倒计时(同步)***/

  void counter_down(void)

  {

  uchar i;

  if(time>=20) //每1s倒计时做减一操作

  {

  sec--;

  sec_24s--;

  write_com(0x80+0x4e); //24s倒计时显示

  write_dat(0x30+sec_24s/10);

  write_dat(0x30+sec_24s%10);

  if(sec_24s==0) //24s结束发出3s连续报警

  {

  FM="0";

  delay(3000);

  FM="1";

  sec_24s=24;

  }

  if((sec==0)&&(min==0)) //检测一节比赛是否结束

  {

  TR1=0; //定时器1暂停

  write_com(0x80+0x44);

  write_dat(0x30);

  num++;

  sec_24s=24; //24s计时复位

  write_com(0x80+0x4e); //24s倒计时显示

  write_dat(0x30+sec_24s/10);

  write_dat(0x30+sec_24s%10);

  if(num<5) //每节结束蜂鸣器发出8s的间断报警

  {

  for(i=80;i>0;i--)

  {

  FM="0";

  delay(500);

  FM="1";

  delay(500);

  }

  }

  if(num==5) //终场结束,蜂鸣器发出10s的连续警报声

  {

  FM="0";

  delay(10000);

  num="1";

  }

  FM="1"; //蜂鸣器关闭

  write_com(0x80+0x4b); //更新"SEC-?"

  write_dat(0x30+num);

  sec="0"; //倒计时复位

  min="12";

  }

  if(sec==-1)

  {

  sec="59";

  min--;

  }

  write_com(0x80+0x40); //更新倒计时显示

  write_dat(0x30+min/10);

  write_dat(0x30+min%10);

  write_com(0x80+0x43);

  write_dat(0x30+sec/10);

  write_dat(0x30+sec%10);

  time=0;

  }

  }

  /***主程序***/

  void main()

  {

  init();

  while(1)

  {

  keyscan(); //分数按键检测

  }

  }

  /***S1按键中断0***/

  void exter0() interrupt 0 //比赛时间开始/暂停

  {

  TR1=~TR1; //定时器1工作/暂停

  if(TR1==1) //当倒计时工作时,S1按下定时器立即停止工作

  {

  PT1=0;

  }

  else //倒计时不工作时,S1按下倒计时立即工作

  {

  PT1=1;

  }

  if(S1==0) //松手检测

  {

  while(S1==0)

  {

  counter_down();

  }

  delay(20);

  }

  }

  /***S2按键中断1***/

  void exter1() interrupt 2 //24s倒计时重新开始

  {

  sec_24s=24;

  write_com(0x80+0x4e); //24s倒计时显示

  write_dat(0x30+sec_24s/10);

  write_dat(0x30+sec_24s%10);

  if(S2==0) //松手检测

  {

  while(S2==0)

  {

  counter_down();

  }

  delay(20);

  }

  }

  /***定时器1中断***/

  void timer1() interrupt 3 //定时器1中断20次为1s

  {

  time++;

  TL1=0x00;

  TH1=0x4c;

  counter_down(); //倒计时

  }

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分