原创 篮球计时记分系统

2008-5-7 11:12 7692 10 13 分类: MCU/ 嵌入式

        今年寒假就搞定的,放到Q空间了,忘放到这来大家共享了,今天补上~~~


        算是个人的第一个独立作品吧,耗时一天半,绝对原创!基本能实现NBA记分牌上的功能,至于可靠性方面当然不敢媲美。个人爱好,仅供娱乐!       


        键盘有点多,用到的就六个,两个连中断口的独立键盘,四个矩阵键盘用作调整比分。


原理图:


点击看大图 


万用板制作:


9baa6d76-d854-411a-8f79-714cca0654b5.jpg


程序如下:


 


/*****************************************************************
题目:篮球比赛计时记分系统
硬件:STC89C52RC、1602LCM液晶屏、六个按键
软件:Keil C
作者:特权
时间:08.02.
*****************************************************************/
#include<reg52.h>    //头文件
#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);
}
write_com(0x80+0x40);
for(i=0;i<16;i++)
{
  write_dat(table2);
}
}
/***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();     //倒计时
}b.gifpdf

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户588212 2016-5-12 11:45

他这个你完全读懂了,没有不明白的,按照这个就能做了?我咋没整出来呢,TCO最大最小的值,你告诉我是怎么怎么来的呗?请教您了

用户588212 2016-5-12 11:44

我就不明白了,既然博客上有错误还有提问的,为啥不改了和给解释了呢。要不你就别写,要写你就好好写,欺世盗名吗

用户440820 2014-12-1 18:44

08年特权同学本科毕业,我09年毕业,看这篇文章就像是看到了当年的自己。当然,特权同学比我厉害多了。

用户377235 2013-7-28 08:14

你好!SDRAM的数据好找,可是图5、6、7的数据从何而来?你的文章中说“在TimeQuest的路径分析报告中也能找到这些参数”,是说不用TimeQuest可以得到吗?如果必须用TimeQuest进行约束才能得到需要数据的话,是否要循环多次?你看,我们的目的是确定时钟相位,可在约束时就必须先输入SDRAM时钟相位啊,是多少?初步设为0吗?如果约束通过,何必再调相位?还是要约束的内容与相位无关?

用户288952 2011-9-23 16:02

特权大哥,您写的公式我能看懂,但是对Tco(MAX)和 Tco(min)在timequest中是如何得来的却不是很清楚。您能给小弟讲一下吗? (我的邮箱xflu86@163.com)

用户301374 2011-7-19 09:11

楼上的 供电! 大哥~~~

用户183270 2011-1-12 14:46

特权大哥 你那个第一个read延时的推导公式按你自己的定义是不是写反了因该是 Tshirft1 + Th < Toh => Tshirft1 < Toh -Th

ilove314_323192455 2010-12-13 11:24

请参考《特权和你一起学NIOS2 第五章》内容,这里的计算是有一些问题。谢谢

用户1649635 2010-12-11 15:55

我看Altera官方的例子发现最终计算是这样的, The SDRAM clock can lag the controller clock by the lesser of Read Lag or Write Lag: Read Lag = tOH(SDRAM) – tH_MAX(FPGA) = 2.5 ns – (–5.607 ns) = 8.107 ns or Write Lag= tCLK – tCO_MAX(FPGA) – tDS(SDRAM) = 20 ns – 2.477 ns – 2 ns = 15.523 ns The SDRAM clock can lead the controller clock by the lesser of Read Lead or Write Lead: Read Lead= tCO_MIN(FPGA) – tDH(SDRAM) = 2.399 ns – 1.0 ns = 1.399 ns or Write Lead= tCLK – tHZ(3)(SDRAM) – tSU_MAX(FPGA) = 20 ns – 5.5 ns – 5.936 ns = 8.564 ns Therefore, for this example you can shift the phase of the SDRAM clock from –8.107 ns to 1.399 ns relative to the controller clock. Choosing a phase shift in the middle of this window results in the value (–8.107 + 1.399)/2 = –3.35 ns. 那是不是应该这样算啊(-Maximum Lag + Maximum Lead)/ 2?

用户1695575 2010-10-22 09:48

第一个读滞后公式弄反了吧,Tshift1
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
3
10
关闭 站长推荐上一条 /3 下一条