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

发布者:荣耀使者最新更新时间:2023-06-05 来源: elecfans关键字:C代码  STC89C52RC 手机看文章 扫描二维码
随时随地手机看文章

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

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

  硬件: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(); //倒计时

  }


关键字:C代码  STC89C52RC 引用地址:源程序C代码:篮球比赛应用系统

上一篇:51单片机怎么驱动直流电机c语言
下一篇:基于STC89C52单片机的数字电流电压表设计

推荐阅读最新更新时间:2024-11-12 11:38

s3c2440裸机-代码重定位-3-清bss原理及实现
1.清bss的引入(为什么要清bss) 我们先举个例子: #include s3c2440_soc.h #include uart.h char g_Char = 'A'; //.data char g_Char3 = 'a'; const char g_Char2 = 'B'; //.rodata int g_A = 0; //bss int g_B; //bss int main(void) { uart0_init(); puts( nrg_A = ); printHex(g_A); puts( nr );
[单片机]
基于STC89C52RC单片机制作的频率及占空比均可调程序
注意 单片机必须是52rc不能用60s2 */ #include main.h #include peizhi.h #include smg.h #include eeprom.h sfr WDT_CONTR=0XE1; unsigned char HighRH = 0; //高电平重载值的高字节 unsigned char HighRL = 0; //高电平重载值的低字节 unsigned char LowRH = 0; //低电平重载值的高字节 unsigned char LowRL = 0; //低电平重载值的低字节 /***********************按键定义*****************
[单片机]
独立按键c语言代码,C51独立按键的识别示例程序
每按一次独立键盘的S2键,与P1口相连的一个发光二极管往下移动一位。 #include sbit BY1=P3^4; //定义按键的输入端S2键 unsigned char count; //按键计数,每按一下,count加1 unsigned char temp; unsigned char a,b; void delay10ms(void) //延时程序 {undefined unsigned char i,j; for(i=20;i 0;i--) for(j=248;j 0;j--); } key() //按键判断程序 {undefined if(BY1==0) //判断是否按下键盘,当单片机上电时所有IO口为//高电平,S
[单片机]
使用C8051F单片机程序下载器将代码写进单片机内
  在生成usbadl.hex代码文件后,需要使用C8051F单片机程序下载器方能将代码写到C8051F单片机内。具体操作如下:   ①选择、进入下载器软件:用鼠标左键点击flashutil.exe的图标,就可进入flash程序下载器的主界面。   ②点击USB调试器选择左边的小圆框,激活后字体变亮。   ③选择C8051F单片机接口方式,点击选中右边(C2)的小圆框。   ④连接好PC和USB下载器连线,并将下载器的1 0芯扁平线插头插入C8051F32X单片机开发板的对应10芯插座内,然后接通开发板电源。   ⑤点击连接后,将显示单片机器件名称(C8051F32X),这时,下载器已进入下载工作状态。   点击下载hex文件框,
[单片机]
代码助你理解I2C总线
  I2C 只是用两条双向的线,一条 Serial Data Line (SDA) ,另一条Serial Clock (SCL)。   SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。(边沿触发)   SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成“线与”关系。   为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:   如下图所示的写操作的时序图:      读时序的理解同理。对于时序不理解的朋友请参考“I2C总线概述及时序总结”   完整的程序如下:   #include   #define uchar unsigned c
[嵌入式]
[C51代码]LCD1602驱动
/************************************************LCD1602.c*************************************************************************/ #include Atmel/AT89X51.h #include delay.h #include lcd1602.h /*************声明变量****************/ uchar co de table ={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02, //年 0x1f,0x11
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved