篮球计分器程序
- 格式:doc
- 大小:55.50 KB
- 文档页数:8
篮球赛计时计分器摘要单片机自20世纪70年代问世以来,以极为高的性价比受到人们的重视和关注,因此应用很广,进展专门快。
由于单片机的集成度高,功能强,通用性好,专门是它具有体积小、重量轻、能耗低、价钱廉价、靠得住性高、抗干扰能力强和利用方便等独特的优势,使单片机迅速取得了推行应用。
目前已经成为测量操纵应用系统中的优选机种和新电子产品的关键部位,许多用单片机做操纵的球赛计时计分系统也应运而生,如:用单片机操纵液晶显示(LCD)计时计分器,用单片机操纵LED七段显示器计时计分器等。
篮球计时计分器以单片机为核心,由计时器、计分器、综合操纵器等组成。
系统采纳模块化设计,主体分为计时显示模块、计分显示模块、按时报警、按键操纵键盘模块。
每一个模块的程序结构简单、任务明确,易于编写、调试和修改。
程序可读性好,对程序的修改可局部进行,其他部份可维持不变。
编程后利用Keil C51软件来进行编译,再将生成的HEX文件装入芯片中,采纳Proteus软件仿真,查验功能是不是能够正常实现,随后可用Protel99画出硬件电路图。
本设计中系统硬件电路要紧由以下几个部份组成:单片机AT89C51、计时电路、计分电路、报警电路和按键开关。
本次设计用由AT89C51编程操纵LED七段数码管作显示的球赛计时计分系统。
该系统具有赛程按时设置、赛程时刻暂停、及时刷新甲乙两边的成绩和赛后成绩暂存等功能。
它具有价钱低廉、性能稳固、操作方便而且易于携带等特点,普遍适合各类学校或小型集体作为赛程计时计分。
关键词:单片机,计时,计分,显示器,接口TIME BASKETBALL SCORING DEVICEABSTRACTSince the inception the 20th century 70 years, single-chip microcomputer (SCM) causes people’s attention and concern because of extremely cost-effective, so its application is very broad and rapid developing. SCM has many advantages, such as small size, light weight, anti-interference ability, less demanding on the environment, low cost, high reliability, good flexibility, developing more easily and so on. Now, it has become the preferred model in measurement control system and a key component of new electronic products. Many time scoring matches using SCM has also come into being, such as the timer with liquid crystal display (LCD), the timer with LED seven-segment display ,etc. Time basketball scoring device as the core of SCM includes the timer, scoring devices, integrated controller and other components.This system is used of the modular design, in which the main display module is divided into time display module, scoring display module, timing alarm module, and key control keyboard module. Program structure of each module is simple and clear. So it is easy to write, debug and modify. Because the program is readable, part of program can be modified and other parts may remain unchanged. After programming, firstly we can use Keil C51 software to compile and then generate the HEX file into the chip. Secondly we use the Proteus software simulation to test whether the normal function to achieve. Finally we draw the hardware circuit diagram with Protel99. The design of hardware circuit mainly consists of the five components, including AT89C51, timing circuit, scoring circuit, alarm circuit and key switch circuit.The design uses AT89C51 to program and to control LED digital tube for seven-segment display of match time scoring. The system has many features, such as setting the schedule time, scheduling time to pause, refreshing result ofboth parties timely, storing temporarily results after the match and so on. Because this system has low price, stable performance, and easy to operate and carry, it is widely suitable for all types of schools and small groups as the calendar time points.KEY WORDS:Microcontroller, Timing, Scoring, Display, Interface前言 (1)第1章系统方案说明 (1)方案选择 (2)篮球赛计时计分器设计的现状 (2)系统整体设计方案 (2)系统大体功能介绍 (3)第2章系统硬件电路设计 (6)篮球赛计时计分电路原理图 (6)篮球赛计时计分器电路工作进程 (6)系统硬件电路组成 (6)计时电路 (6)计分电路 (13)器件选择及介绍 (17)§2.4.1 AT89C51 (18)§2.4.2 CD4511芯片介绍 (21)§2.4.3 CD4094芯片的介绍 (22)§2.4.4 74LS21芯片介绍 (23)第3章软件编程及调试 (24)整体程序设计 (24)初始化程序设计 (25)计时系统程序设计 (26)计分系统程序设计 (27)系统调试 (28)软件调试 (28)仿真调试 (29)结论 (29)参考文献 (31)致谢 (32)附录 (33)随着单片机在各个领域的普遍应用,许多用单片机做操纵的球赛计时计分系统也应运而生,如用单片机操纵LCD液晶显示器[1]计时计分器,用单片机操纵LED七段显示器计时计分器等。
#include <reg51.h>#include "intrins.h" //_nop_();延时函数用#define uchar unsigned char#define uint unsigned int#define Lcd_Port P3 //定义数据端口#define KEY_IO P0 //键盘接口sbit RS = P2^1; //定义和LCM的连接端口sbit RW = P2^2;sbit E = P2^5;sbit Busy = P3^7;uchar data keytemp,key;uchar L=0;uchar k=0;uchar c =0;uchar b=0;uchar j=0;uchar e=1;uchar d =0;uchar hour1=24;uchar min = 11;uchar sec = 59; //赋初值uchar data flag=0x00;bit flag_key=0;uchar code Lcddata[] = {"0123456789:"};uchar h1='A';uchar h2='B';uchar sub,abj;/****************************************************************************** ************* 函数名称:Timer0Init* 功能描述:定时器0初始化******************************************************************************* ***********/void Timer0Init(void){TMOD=0x11;TH0 = 0x3c;TL0 = 0xb0; //50ms定时初值TH1=0x3c;TL1=0xb0; //10MS定时初值(T1计时用)ET0=1;ET1=1;TR0=1;TR1=1;EA=1;}/****************************************************************************** ************* 函数名称:IsrTimer0* 功能描述:T0 50mS中断程序******************************************************************************* ***********/void IsrTimer0(void) interrupt 1 using 1 //T0 50mS中断程序{ static uchar count = 0;uchar i=0,b=0;TH0 = 0x3c;TL0 = 0xb0;count++;if(count ==20) //定时1s时间到{count = 0;sec--;if(sec == 0) //1分钟时间到{if(min == 0) //12分钟时间到{min = 11;sec = 59;TR0=0;for(i=1000;i<=0;i--) //延时5秒{for(b=1000;b<=0;b--){_nop_();_nop_();_nop_();_nop_();_nop_();}}}else{sec = 59;min--;}}}}/****************************************************************************** ************* 函数名称:Delay* 功能描述:延时子程序,延时(1MS*t) S******************************************************************************* ***********/void Delay(uchar t){uchar a;while(t-- != 0){for(a = 0; a < 125; a++);}}/****************************************************************************** ************* 函数名称:Read_Busy* 功能描述:读忙信号判断******************************************************************************* ***********/void Read_Busy(void){uchar i=50;Lcd_Port=0xff;RS = 0;RW = 1;E = 1;while((i--)&&Busy);E=0;}/****************************************************************************** ************* 函数名称:Write_Comm* 功能描述:写指令函数ok******************************************************************************* ***********/void Write_Comm(uchar lcdcomm){Read_Busy();RS = 0;RW = 0;E = 1;Lcd_Port=lcdcomm;E = 0;}/****************************************************************************** ************* 函数名称:Write_Char* 功能描述:写字符函数ok******************************************************************************* ***********/void Write_Char(uint num)//写字符函数{Read_Busy();RS = 1;RW = 0;E = 1;Lcd_Port = Lcddata[num];E = 0;}/****************************************************************************** ************* 函数名称:Write_Data* 功能描述:写数据函数ok******************************************************************************* ***********/void Write_Data(uchar lcddata){Read_Busy();RS = 1;RW = 0;E = 1;Lcd_Port = lcddata;E = 0;}/****************************************************************************** ************* 函数名称:Init_LCD* 功能描述:初始化LCD******************************************************************************* ***********/void Init_LCD(void){Delay(400); //稍微延时,等待LCM进入工作状态Write_Comm(0x38); //8位2行5*8Write_Comm(0x0c); //显示开/关,光标开闪烁开Write_Comm(0x01); //清显示Write_Comm(0x06); //文字不动,光标右移Write_Comm(0x02); //光标归位}/****************************************************************************** ************* 函数名称:Show_Time* 功能描述:LCD上显示当前时间******************************************************************************* ***********/void Show_Time(void){Lcd_Port = 0xa0;Write_Comm(0x80+0x08); //显示首地址Write_Char( hour1 / 10 );//显示分Write_Char( hour1 % 10 );Write_Comm(0x80+0x4b);Write_Char( min / 10 ); //显示倒计时分钟Write_Char( min % 10 );Write_Char( 10 ); //显示“:”Write_Char( sec / 10 ); //显示倒计时秒Write_Char( sec % 10 );Write_Comm(0x80+0x0d);Write_Char(e%10);Write_Data('S');Write_Data('t');Write_Comm(0x80+0x43);Write_Char( c /10 );Write_Char( c % 10 );Write_Comm(0x83);Write_Char(d /10 );Write_Char(d % 10 );}//***************按键扫描函数/*************void keyscan(){uchar i,t=0xef; //1110 1111KEY_IO=0x0f;keytemp=(~KEY_IO)&0x0e;if(keytemp!=0) //0000 0000 ;0000 1000; 0000 0100; 0000 0010; 0000 0001;{Delay(20);for(i=0;i<4;i++){KEY_IO=t;keytemp=(~KEY_IO)&0x0e;if(keytemp!=0&flag_key==0){flag_key=1;switch(keytemp){case 0x08:key=0*4+i;break;case 0x04:key=1*4+i;break;case 0x02:key=2*4+i;break;case 0x01:key=3*4+i;break;default:break;}switch(key){case0:{d++;j=1;if(d>=99){ Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;case1:{d++;d++;j=1;if(d>=99){ Write_Comm(0x84);Write_Data('1');d=0;}b=0;}break;case2:{d++;d++;d++;if(d>=99){ Write_Comm(0x84);Write_Data('1');d=0;} j=1;b=0;}break;case 3:{d--;if(d==0)d=0;}break;case4:{c++;if(c>=99){ Write_Comm(0x80+0x44);Write_Data('1');c=0;};b=1;j=0;}break;case5:{c++;c++;if(c>=99){ Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;case6:{c++;c++;c++;if(c>=99){ Write_Comm(0x80+0x44);Write_Data('1');c=0;}b=1;j=0;}break;case 7: {c--;if(c==0)c=0;}break;case 8:TR0=~TR0;TR1=~TR1;L=0;k=0;break;case 9:e++;if (e==5)e=1;Write_Comm(0x80+0x0d);Write_Char(e%10); break;case 0x0a: hour1=24;b=1;break;case 0x0b: abj=h1;h1=h2;h2=abj;RS=0;RW=0;P3=0x80+0x43;Delay(5);E=1;E=0;RS=1;RW=0;P3=h1;Delay(5);E=1;E=0;RS=0;RW=0;P3=0x83;Delay(5);E=1;E=0;RS=1;RW=0;P3=h2;Delay(5);E=1; E=0;sub=c;c=d;d=sub;b=1;break;//case 0x0c:TR0=1;TR1=1;break;default:break;}}t=(t<<1)|0x01;}}else flag_key=0;}void IsrTimer1(void) interrupt 3 using 3//T1 50mS中断程序{uchar i=0,m=0,a=0;static uchar ta20ms= 24;TH1=0x3c;TL1=0xb0;ta20ms--;if(ta20ms==0){ta20ms=24;hour1--;if(hour1==0)hour1=24 ;}k=1;L=1;}/****************************************************************************** ************* 函数名称:main* 功能描述:主函数******************************************************************************* ***********/void main(void){Init_LCD(); //初始化LCMTimer0Init(); //初始化定时器TR0=0;TR1=0;while(1){Show_Time(); //显示时间keyscan();Write_Comm(0x80);Write_Data(h1);Write_Data(':');Write_Comm(0x80+0x40);Write_Data(h2);Write_Data(':');}}。
单片机微机原理及应用课目:篮球记分牌的设计学院:电气工程学院班级:自动化08-2姓名:库万古丽(20082102427)麦地楠木(20082102426)指导教师:帕子来提完成时间:2011年12月11日篮球赛计时计分器一设计目的设计并制作一个用于赛场的篮球赛计时计分器,实现如下基本功能:(1)能记录整个赛程的比赛时间,并能修改比赛时间,暂停比赛时间。
(2)能随时刷新甲,乙两队在整个赛程中的比分。
(3)中场交换场地时,能交换甲,乙两队比分的位置。
(4)比赛时间结束时,能发出报警指令。
二设计意义通过篮球计分计时器的制作,可以使我熟悉,了解单片机开发设计实例的过程,并能使读者加深对单片机的理解和运用以及掌握单片机与外围接口的一些方法和技巧,这主要表现在以下的一些方面:(1)篮球计分计时器包含了8051系列单片机的最小应用系统的构成,同时在此基础上扩展了一些实用性强的外围接口。
(2)掌握键盘接口原理,能正确地把键盘使用到单片机系统中,可以了解到LED显示器的结构,工作原理以及这种显示器的接口实例。
(3)学会调试电路,分析电路故障,积累电路调试经验。
三具体设计内容1 系统框图构成基于单片机系统的篮球计分计时器的系统构成框图如下所示:2硬件电路改进:由于原来的电路比较复杂,用了很多芯片,浪费成本,而且给后期调试的调试会带来较多麻烦,故对原来的硬件电路进行了改动。
改动方面主要关于数码管显示的驱动和位选的,前期的电路设计采用了大量的CD4511和CD4094来进行数码管显示的驱动和位选,而这次的电路设计只用了8个三极管就实现了这项功能。
下面前期电路设计的计时部分的原理图,还有更为复杂的计分原理图未给出a b c d e f gLEDa b c d e f gLEDa b c d e f gLEDa b c d e f gLEDCD4511a b c d e f gVCCAB C D LELTGNDBICD4511a b c d e f gVCCAB C D LELTGNDBICD4511a b c d e f gVCCAB C D LELTGNDBICD4511a b c d e f gVCCAB C D LELTGNDBI123a1a2a32526271641234a4a1a2a3a4a1a2a3a412349181920RESET X TAL2X TAL1GNDP2.4P2.5P2.6P3.6VCC8765b1b2b3b4b1b2b3b45678EAb3P1.0P1.1P1.2P1.3P2.0P2.1P2.2P2.3b4403171234212223248GNDK5K6K7调时启动\暂停\交换C130pF C230pFU112MHZ C322uF R11k¦¸GNDVDD5VVDD5V调时VSS5V蜂鸣器GND后期改进的整体原理图:(3)软件调试及组装软件的编程调试首先要抓住计分和计时两大模块,在这两大模块成功的基础上再进行其他细小模块的组装和完善。
/******************** //版权和版本声明* 文件标识:* 摘要:* 当前版本:* 作者:输入作者(或修改者)名字* 完成日期:2013年3月25日**********************************/#include <> //头文件unsigned char code Tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x08,0x03}; //段码表unsigned char dat[6]={0,0,0,0,0,0};sbit key1=P1^0; //位定义sbit key2=P1^1;sbit key3=P1^2;sbit key4=P1^3;sbit key5=P1^4;sbit key6=P1^5;sbit key7=P1^6;sbit key8=P1^7;sbit key9=P3^0;sbit key10=P3^2;/***************************** 函数名称:延时函数* 函数功能:* 输入/输出参数:* 返回值:***************************************/void delay(unsigned int xms){ unsigned int i,j;for(i=0;i<xms;i++){ for(j=0;j<115;j++){;}}}/***************************** 函数名称:显示函数* 函数功能:* 输入/输出参数:* 返回值:***************************************/unsigned int h,h1,j,j1,m,k,k1;void fenli(){ //一队分离dat[0]=k/100; // 取百位dat[1]=k%100/10; // 取十位dat[2]=k%100%10; // 取个位//二队分离dat[3]=k1/100; // 取百位dat[4]=k1%100/10; // 取十位dat[5]=k1%100%10; // 取个位/**********************显示**************************************/ if(key10==1) // 两队中场切换{h=0x01; //A队队名P2=Tab[10];P0=h;delay(1);P2=0xff;h1=0x02;for(m=0;m<3;m++){P2=Tab[dat[m]]; //送段码P0=h1; //送位码delay(1); //延时P2=0xff; //关断h1=h1<<1; //左移}j=0x10; // b队队名P2=Tab[11];P0=j;delay(1);P2=0xff;j1=0x20;for(m=3;m<6;m++){P2=Tab[dat[m]];P0=j1;delay(1);P2=0xff;j1=j1<<1;}}/****************************切换**************************************************/else{h=0x01; // 队名P2=Tab[11];P0=h;delay(1);P2=0xff;h1=0x02;for(m=3;m<6;m++){P2=Tab[dat[m]];//送段码P0=h1; //送位码delay(1); //延时P2=0xff; //关断h1=h1<<1; //左移}j=0x10; // 队名P2=Tab[10];P0=j;delay(1);P2=0xff;j1=0x20; //送初值for(m=0;m<3;m++){P2=Tab[dat[m]];// 送段码P0=j1; //送位码delay(1); // 延时P2=0xff; // 关断j1=j1<<1; // 左移}}}/***************************** 函数名称:指示灯函数* 函数功能:* 输入/输出参数:* 返回值:***************************************/ void lingsheng(){P3_7=0X00;delay(200);P3_7=0x01;}/***************************** 函数名称:按键输入函数* 函数功能:* 输入/输出参数:* 返回值:***************************************/ void anjian(){if (key1==0) //减一{delay(40);if (key1==0){k--;if(k>835){k=0;}lingsheng();}}if (key2==0) //加一{delay(40);if (key2==0){k++;lingsheng();}}if (key3==0) //加二delay (40);if (key3==0){k=k+2;lingsheng();}}if (key4==0) //加三{delay(40);if (key4==0){k=k+3;lingsheng();}}if (key5==0) //减一{delay(40);if (key5==0){k1--;if(k1>835){k1=0;}lingsheng();}}if (key6==0) //加一{delay (40);if (key6==0){k1++;lingsheng();}}if (key7==0) //加二{delay(40);if (key7==0)k1=k1+2;lingsheng();}}if (key8==0) //加三{delay(40);if (key8==0){k1=k1+3;lingsheng();}}/**************清零*******************/if (key9==0){delay(40);if (key9==0){k1=0; k=0;lingsheng();}}}/***************************** 函数名称:主函数* 函数功能:* 输入/输出参数:* 返回值:***************************************/void main(){while (1){fenli();anjian();}}/************************** ***********************/。
3.12 篮球计时计分器设计(8学时)一、设计原理该篮球计时计分器,由九个功能模块组成: 时钟产生模块、按键输入模块、系统的计时模块、24秒计时模块、数码管输出模块、led输出模块、计分模块、lcd输出模块、比分交换模块实现的主要功能:S1、S2分别用于两队比分的减1,S3、S4分别用于两队比分的加1,S5用于控制比赛的开始和暂停,S6用于24秒的重新置位,和进入下一节的显示切换,S7用于系统的复位,S8用于对比赛总时间减一分(调试时用,实际中不需要这个按键)。
液晶屏显示比分,数码管显示一节时间和24秒倒计时;当按下S7时,系统复位,液晶屏显示000:000 1st,数码管显示12 00 24;当按下S5时系统开始计时,若再按下S5则处于暂停状态;当24秒倒计时剩余时间小于一秒时,则显示为秒表计时方式;当24秒时间到了,则8个led灯全亮,比赛暂停,此时先按下S5再按S6则重新从24秒开始倒计时;当一节比赛结束时,8个led灯全亮,比赛暂停,此时先按下S5再按S6则进入下一节;当比赛进行到第三节时,则比分交换显示。
二、设计1、顶层图:2、各子模块及对应程序:(1)数码管输出模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity shumaguan isport( clk : in std_logic;ledag : out std_logic_vector(7 downto 0);del : out std_logic_vector(2 downto 0);m10 : in std_logic_vector(3 downto 0);m : in std_logic_vector(3 downto 0);s10 : in std_logic_vector(3 downto 0);s : in std_logic_vector(3 downto 0);s24_10 : in std_logic_vector(3 downto 0);s24 : in std_logic_vector(3 downto 0)); end shumaguan;architecture rtl of shumaguan issignal cq: std_logic_vector(3 downto 0);signal dount : std_logic_vector(2 downto 0);beginprocess(clk) --数码管动态扫描beginif(clk'event and clk='1' )thendount<=dount+1;end if;del<=dount;end process;process(dount,s24,s24_10,s,s10,m,m10)beginif(dount=0)thencq<=m10;elsif(dount=1)thencq<=m;elsif(dount=2)thencq<=s10;elsif(dount=3)thencq<=s;elsif(dount=4)thencq<="1111";elsif(dount=5)thencq<="1111";elsif(dount=6)thencq<=s24_10;elsif(dount=7)thencq<=s24;end if;end process;process(cq)--数码管显示begincase cq iswhen "0000" => ledag <="11000000";when "0001" => ledag <="11111001";when "0010" => ledag <="10100100";when "0011" => ledag <="10110000";when "0100" => ledag <="10011001";when "0101" => ledag <="10010010";when "0110" => ledag <="10000010";when "0111" => ledag <="11111000";when "1000" => ledag <="10000000";when "1001" => ledag <="10010000";when "1010" => ledag <="11111111";when "1011" => ledag <="11111111";when "1100" => ledag <="11111111";when "1101" => ledag <="11111111";when "1110" => ledag <="11111111";when "1111" => ledag <="11111111";when others => null;end case;end process;end rtl;(2)时钟产生模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity shizhong isport(clk:in std_logic;beep:out bit;clk_25hz,clk_100hz,clk_1khz:out std_logic); end shizhong;architecture rtl of shizhong issignal clk_100hz_s:std_logic;beginprocess(clk_100hz_s)variable q2:integer range 0 to 9;beginif(clk_100hz_s='1'and clk_100hz_s'event)then if(q2=3)thenclk_25hz<='1';q2:=q2+1;elsif(q2=4)thenclk_25hz<='0';q2:=0;else clk_25hz<='0';q2:=q2+1;end if;end if;end process;process(clk)variable q3:integer range 0 to 499999; beginif(clk='1'and clk'event)thenif(q3=499999)thenq3:=0;elseif(q3<250000)thenclk_100hz<='0';clk_100hz_s<='0';else clk_100hz<='1';clk_100hz_s<='1';end if;q3:=q3+1;end if;end if;end process;process(clk)variable q4:integer range 0 to 49999;beginif(clk='1'and clk'event)thenif(q4=49999)thenq4:=0;elseif(q4<25000)thenclk_1khz<='0';else clk_1khz<='1';end if;q4:=q4+1;end if;end if;end process;beep<='1';end rtl;(3)led输出模块library ieee;use ieee.std_logic_1164.all;entity led isport(ledin:in std_logic;ledout:out std_logic_vector(7 downto 0));end led;architecture rtl of led isbeginprocess(ledin)beginif(ledin='0')thenledout<="00000000";else ledout<="11111111";end if;end process;end rtl;(4)lcd输出模块library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity lcd isPort ( Clk : in std_logic; --状态机时钟信号,同时也是液晶时钟信号,其周期应该满足液晶数据的建立时间Aout_100,Aout_10,Aout,Bout_100,Bout_10,Bout: in std_logic_vector(3 downto 0);period:in std_logic_vector(2 downto 0);LCD_RS : out std_logic; --寄存器选择信号LCD_RW : out std_logic; --液晶读写信号LCD_EN : out std_logic; --液晶时钟信号LCD_Data : out std_logic_vector(7 downto 0)); --液晶数据信号end lcd;architecture Behav of lcd istype STATE_TYPE is (START,write_C,write_D,WRITE_BYTE_C,WRITE_BYTE_D,wait_3m1,wait_3m2,wa it_5m1,wait_5m2,wait_100m); --12个状态,START:初始化各信号量,write_C(write_D):判断初始化指令(显示数据)是否输出完毕,WRITE_BYTE_C (WRITE_BYTE_D):输出一个指令(数据),wait_3m1,wait_3m2,wait_5m1,wait_5m2,wait_100m:延时type MY_ARRAY_C is array(0 to 4) of std_logic_vector(7 downto 0); --初始化的数据(控制指令)type MY_ARRAY_D is array(0 to 11) of std_logic_vector(7 downto 0);constant c_d: MY_ARRAY_C:=(x"38",x"0c",x"06",x"01",x"C3");signal d_d: MY_ARRAY_D;signal STATE: STATE_TYPE:=START;signal w_c_flag : integer range 0 to 2:=0; --写指令时用到的标志 signal w_d_flag : integer range 0 to 2:=0; --写数据时用到的标志signal write_c_cnt : integer range 0 to 5:=0; --指令的指针signal write_d_cnt : integer range 0 to 12:=0; --数据的指针signal cnt : integer range 0 to 100:=0; --延时用到的计数器beginLCD_RW <= '0' ; --写数据d_d(0)<="0000"&Aout_100+x"30";d_d(1)<="0000"&Aout_10+x"30";d_d(2)<="0000"&Aout+x"30";d_d(3)<="00111010";d_d(4)<="0000"&Bout_100+x"30";d_d(5)<="0000"&Bout_10+x"30";d_d(6)<="0000"&Bout+x"30";d_d(7)<="00100000";d_d(8)<="00100000";d_d(9)<="00000"&period+x"31";d_d(10)<="01110011";d_d(11)<="01110100";process(Clk,STATE) --液晶驱动控制器beginif rising_edge(Clk) thencase STATE iswhen START=>LCD_EN<='0';w_c_flag<=0;w_d_flag<=0;write_c_cnt<=0;write_d_cnt<=0;STATE<=WRITE_C; --下一个状态(即要执行的)是WRITE_C(相当于跳转)when WRITE_C=>case write_c_cnt iswhen 0 to 4=> --小于5,五个初始化指令未输出完,则要输出STATE<=WRITE_BYTE_C;when 5=>write_c_cnt<=0; --等于5,五个初始化指令已输出完,转入数据输出STATE<=WRITE_D; --转入数据输出end case;when WRITE_BYTE_C=>if(w_c_flag=0) then --w_c_flag=0,通道选择,数据输出LCD_RS<='0';LCD_Data<=c_d(write_c_cnt);w_c_flag<=1;STATE<=wait_3m1; --延时elsif(w_c_flag=1) then --w_c_flag=1,使能en='1' LCD_EN<='1';w_c_flag<=2;STATE<=wait_5m1; --延时elsif(w_c_flag=2) then --w_c_flag=2,使能en='0' LCD_EN<='0';w_c_flag<=0;write_c_cnt<=write_c_cnt+1; --当前数据已输出完,write_c_cnt加一指向下一个数据,并转入下一个数据输出WRITE_CSTATE<=WRITE_C;end if;when WRITE_D=>case write_d_cnt iswhen 0 to 11=>STATE<=WRITE_BYTE_D;when 12=>write_d_cnt<=0;STATE<=wait_100m; --所有数据输出完毕 end case;when WRITE_BYTE_D=>if(w_d_flag=0) thenLCD_RS<='1';LCD_Data<=d_d(write_d_cnt);w_d_flag<=1;STATE<=wait_3m2;elsif(w_d_flag=1) thenLCD_EN<='1';w_d_flag<=2;STATE<=wait_5m2;elsif(w_d_flag=2) thenLCD_EN<='0';w_d_flag<=0;write_d_cnt<=write_d_cnt+1;STATE<=WRITE_D;end if;when wait_3m1=>if (cnt>=3) thenSTATE<=WRITE_BYTE_C;cnt<=0;elsecnt<=cnt+1;STATE<=wait_3m1;end if;when wait_5m1=>if (cnt>=5) thenSTATE<=WRITE_BYTE_C;cnt<=0;elsecnt<=cnt+1;STATE<=wait_5m1;end if;when wait_3m2=>if (cnt>=3) thenSTATE<=WRITE_BYTE_D;cnt<=0;elsecnt<=cnt+1;STATE<=wait_3m2;end if;when wait_5m2=>if (cnt>=5) thenSTATE<=WRITE_BYTE_D;cnt<=0;elsecnt<=cnt+1;STATE<=wait_5m2;end if;when wait_100m=>if (cnt>=100) thenSTATE<=START; --该轮次的所有数据(指令,显示)都已输出,回到START,开始新一轮的输出cnt<=0;elsecnt<=cnt+1;STATE<=wait_100m;end if;end case;end if;end process;end Behav;(5)24秒计时模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY jishi24_cnt10 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END jishi24_cnt10;ARCHITECTURE rtl OF jishi24_cnt10 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 9;BEGINIF(res='1')THENq:=0;borrow<='0';ELSIF(reset='1'AND en='0')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=9;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt1_10 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt1_10;ARCHITECTURE rtl OF cnt1_10 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 9;BEGINIF(res='1')THENq:=4;borrow<='0';ELSIF(reset='1'AND en='0')THENq:=4;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=9;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt_2 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt_2;ARCHITECTURE rtl OF cnt_2 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 2;BEGINIF(res='1')THENq:=2;borrow<='0';ELSIF(reset='1'AND en='0')THENq:=2;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=2;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity mux1 isport(s1_10,s1,sec1_10,sec1,s10,s,sec10,sec:in std_logic_vector(3 downto 0);s10_out:out std_logic_vector(3 downto 0);s_out:out std_logic_vector(3 downto 0);ctrl_1,ctrl_2:in std_logic;pause:out std_logic;res:in std_logic);end mux1;architecture rtl of mux1 isbeginprocess(s1_10,s1,sec1_10,sec1,s10,s,sec10,sec,ctrl_1,ctrl_2)beginif(ctrl_1='1')thenif((s1_10<s10)or(s1_10=s10 and s1<=s))thens10_out<=s1_10;s_out<=s1;elses10_out<=s10;s_out<=s;end if;elsif(ctrl_2='1') thens10_out<=sec10;s_out<=sec;elseif(s1_10=0 and s1=0)thens10_out<=sec1_10;s_out<=sec1;elses10_out<=s1_10;s_out<=s1;end if;end if;end process;process(s1_10,s1,sec1_10,sec1,s10,s,sec10,sec,ctrl_1,ctrl_2)beginif(res='1')thenpause<='1';elsif((s1_10=0 and s1=0 and sec1_10=0 and sec1=0)or((ctrl_1='1'orctrl_2='1')and s10=0 and s=0 and sec10=0 and sec=0))then pause<='0';else pause<='1';end if;end process;end rtl;(6)计分模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jifen_cnt10 isport(res,decA,decB,incA,incB:in std_logic;Aout,Bout:buffer std_logic_vector(3 downto 0);b_decA,b_incA,b_incB,b_decB:out std_logic);end jifen_cnt10;architecture rtl of jifen_cnt10 issignal alter_A,alter_B:std_logic;beginalter_A<=decA or incA;alter_B<=decB or incB;process(res,decA,incA)beginif(res='1')thenAout<="0000";b_decA<='0';elsif(alter_A='1'and alter_A'event)thenif(decA='1')thenif(Aout="0000")thenAout<="1001";b_decA<='1';elseAout<=Aout-1;b_decA<='0';end if;elsif(incA='1')thenif(Aout="1001")thenAout<="0000";b_incA<='1';elseAout<=Aout+1;b_incA<='0';end if;end if;end if;end process;process(res,decB,incB)beginif(res='1')thenBout<="0000";b_decB<='0';elsif(alter_B='1'and alter_B'event)thenif(decB='1')thenif(Bout="0000")thenBout<="1001";b_decB<='1';elseBout<=Bout-1;b_decB<='0';end if;elsif(incB='1')thenif(Bout="1001")thenBout<="0000";b_incB<='1';elseBout<=Bout+1;b_incB<='0';end if;end if;end if;end process;end rtl;(7)系统计时模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dectect isport(datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0); datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_sec10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_sec:IN STD_LOGIC_VECTOR(3 DOWNTO 0);discon:out std_logic;resetin:in std_logic;res:in std_logic;resetout:out std_logic;extra:out std_logic);end dectect;architecture rtl of dectect isbeginprocess(datain_m10,datain_m,datain_s10,datain_s,datain_sec10,datain_s ec,resetin)beginif(res='1')thenresetout<='0';elsif(datain_m10="0000" and datain_m="0000" and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")then resetout<=resetin;else resetout<='0';end if;end process;process(datain_m10,datain_m,datain_s10,datain_s,datain_sec10,datain_s ec,resetin)beginif(res='1')thenextra<='0';elsif(datain_m10="0000" and datain_m="0000" and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")then if(resetin='1'and resetin'event)thenextra<='1';end if;end if;end process;process(datain_m10,datain_m,datain_s10,datain_s,datain_sec10,datain_s ec,resetin)beginif(res='1')thendiscon<='0';elsif(((datain_m10="0010" ANDdatain_m="0100")or(datain_m10="0011" AND datain_m="0110")or(datain_m10="0001" AND datain_m="0010")) and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")thenif(resetin='1' and resetin'event)thendiscon<='1';end if;elsif(((datain_m10="0010" AND datain_m="0011")or(datain_m10="0011" AND datain_m="0101")or(datain_m10="0001" AND datain_m="0001")) and datain_s10="0000" and datain_s="0000" and datain_sec10="0000" and datain_sec="0000")thendiscon<='0';end if;end process;end rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt4 ISPORT(res,en,clk: IN STD_LOGIC;reset:IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END cnt4;ARCHITECTURE rtl OF cnt4 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 4;BEGINIF(res='1')THENq:=4;borrow<='0';ELSIF(reset='1')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=4;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt6 ISPORT(res,en,clk: IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt6;ARCHITECTURE rtl OF cnt6 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 5;BEGINIF(res='1')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=5;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY cnt10 ISPORT(res,en,clk: IN STD_LOGIC;borrow:OUT STD_LOGIC;dataout:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END cnt10;ARCHITECTURE rtl OF cnt10 ISBEGINPROCESS(res,en,clk)VARIABLE q:INTEGER RANGE 0 TO 9;BEGINIF(res='1')THENq:=0;borrow<='0';ELSIF(en='1')THENIF(clk='1'AND clk'EVENT)THENIF(q=0)THENq:=9;borrow<='1';ELSEq:=q-1;borrow<='0';END IF;END IF;END IF;dataout<=CONV_STD_LOGIC_VECTOR(q,4);END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY conv ISPORT( discon:IN STD_LOGIC;datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);dataout_m10:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);dataout_m:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);extra:IN STD_LOGIC);END conv;ARCHITECTURE rtl OF conv ISBEGINPROCESS(datain_m10,datain_m)BEGINIF(extra='1')THENdataout_m10<=datain_m10;dataout_m<=datain_m;ELSIF((datain_m10="0001" AND datain_m<2)OR(datain_m10="0000")OR(datain_m10="0001" AND datain_m=2 AND discon='1'))THENdataout_m10<=datain_m10;dataout_m<=datain_m;ELSIF((datain_m10="0010" AND datain_m<4 AND datain_m>=2)OR(datain_m10="0001" AND datain_m>=2)OR(datain_m10="0010" AND datain_m=4 AND discon='1'))THENdataout_m10<=datain_m10-1;dataout_m<=datain_m-2;ELSIF(datain_m10="0010" AND datain_m<2)THENdataout_m10<="0000";dataout_m<=10+datain_m-2;ELSIF((datain_m10="0011" AND datain_m<6 AND datain_m>=4)OR(datain_m10="0010" AND datain_m>=4)OR(datain_m10="0011" AND datain_m=6 AND discon='1'))THENdataout_m10<=datain_m10-2;dataout_m<=datain_m-4;ELSIF(datain_m10="0011" AND datain_m<4)THENdataout_m10<="0000";dataout_m<=10+datain_m-4;ELSIF((datain_m10="0100" AND datain_m<=8 AND datain_m>=6)OR(datain_m10="0011" AND datain_m>=6))THENdataout_m10<=datain_m10-3;dataout_m<=datain_m-6;ELSIF(datain_m10="0100" AND datain_m<6)THENdataout_m10<="0000";dataout_m<=10+datain_m-6;END IF;END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ctrl ISPORT(res:IN STD_LOGIC;datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_s:IN STD_LOGIC_VECTOR(3 DOWNTO 0);ctrl_1:OUT STD_LOGIC;ctrl_2:OUT STD_LOGIC);END ctrl;ARCHITECTURE rtl OF ctrl ISBEGINPROCESS(res,datain_m10,datain_m,datain_s10,datain_s)BEGINIF(res='1')THENctrl_1<='0';ctrl_2<='0';ELSIF((datain_m10="0000" AND datain_m="0000" )AND ((datain_s10="0010" AND datain_s<=4)OR(datain_s10="0001")OR(datain_s10="0000" AND datain_s>=1)))THENctrl_1<='1';ctrl_2<='0';ELSIF((datain_m10="0000" AND datain_m="0000" )AND (datain_s10="0000" AND datain_s="0000"))THENctrl_1<='0';ctrl_2<='1';ELSEctrl_1<='0';ctrl_2<='0';END IF;END PROCESS;END rtl;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY period ISPORT(res:IN STD_LOGIC;reset:IN STD_LOGIC;discon:IN STD_LOGIC;datain_m10:IN STD_LOGIC_VECTOR(3 DOWNTO 0);datain_m:IN STD_LOGIC_VECTOR(3 DOWNTO 0);period:out std_logic_vector(2 downto 0);extra:IN STD_LOGIC);END period;ARCHITECTURE rtl OF period ISSIGNAL period_s:STD_LOGIC_VECTOR(2 downto 0);BEGINPROCESS(res,datain_m10,datain_m,extra,discon,RESET)BEGINIF(res='1')THENperiod_s<="000";ELSIF(extra='0')THENIF((datain_m10=1 AND datain_m<2)OR(datain_m10=0)OR(datain_m10=1 AND datain_m=2 AND discon='1'))THENperiod_s<="011";ELSIF((datain_m10=2 AND datain_m<4)OR(datain_m10=1 AND datain_m>=2)OR(datain_m10=2 AND datain_m=4 AND discon='1'))THENperiod_s<="010";ELSIF((datain_m10=3 AND datain_m<6)OR(datain_m10=2 AND datain_m>=4)OR(datain_m10=3 AND datain_m=6 AND discon='1'))THENperiod_s<="001";ELSIF((datain_m10=4 AND datain_m<=8)OR(datain_m10=3 AND datain_m>=6))THENperiod_s<="000";END IF;ELSIF(reset='0'AND reset'EVENT)THENperiod_s<=period_s+1;END IF;period<=period_s;END PROCESS;END rtl;(8)交换模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity jiaohuan isport(Ain_100:in std_logic_vector(3 downto 0); Ain_10:in std_logic_vector(3 downto 0);Ain:in std_logic_vector(3 downto 0);Bin_100:in std_logic_vector(3 downto 0); Bin_10:in std_logic_vector(3 downto 0);Bin:in std_logic_vector(3 downto 0);period:in std_logic_vector(2 downto 0);Aout_100:out std_logic_vector(3 downto 0); Aout_10:out std_logic_vector(3 downto 0); Aout:out std_logic_vector(3 downto 0);Bout_100:out std_logic_vector(3 downto 0); Bout_10:out std_logic_vector(3 downto 0); Bout:out std_logic_vector(3 downto 0));end jiaohuan;architecture behav of jiaohuan isbeginprocess(Ain_100,Ain_10,Ain,Bin_100,Bin_10,Bin,period)beginif(period<=1)thenAout_100<=Ain_100;Aout_10<=Ain_10;Aout<=Ain;Bout_100<=Bin_100;Bout_10<=Bin_10;Bout<=Bin;elseAout_100<=Bin_100;Aout_10<=Bin_10;Aout<=Bin;Bout_100<=Ain_100;Bout_10<=Ain_10;Bout<=Ain;end if;end process;end behav;(9)按键输入模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY anjian ISPORT(S1,S2,S3,S4,S5,S6,S7,S8,clk2: IN STD_LOGIC;dec,pause,res,reset,decA,decB,incA,incB: OUT STD_LOGIC); END anjian;ARCHITECTURE behav OF anjian ISSIGNALres2,res1,re,incA2,incA1,incB2,incB1,decA2,decA1,decB2,decB1,pause2,p ause1,pause_s,pause_s1,reset2,reset1,dec1,dec2:STD_LOGIC;BEGINPROCESS(S7,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENres2<=res1;res1<=S7;END IF;re<=res1 AND (NOT res2) AND clk2;END PROCESS;PROCESS(S1,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENincA2<=incA1;incA1<=S1;END IF;incA<=incA1 AND (NOT incA2) AND clk2; END PROCESS;PROCESS(S2,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENincB2<=incB1;incB1<=S2;END IF;incB<=incB1 AND (NOT incB2) AND clk2; END PROCESS;PROCESS(S3,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENdecA2<=decA1;decA1<=S3;END IF;decA<=decA1 AND (NOT decA2) AND clk2; END PROCESS;PROCESS(S4,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENdecB2<=decB1;decB1<=S4;END IF;decB<=decB1 AND (NOT decB2) AND clk2; END PROCESS;PROCESS(S5,clk2)BEGINIF(clk2='0' AND clk2'EVENT) THENpause2<=pause1;pause1<=S5;pause_s<=pause1 AND (NOT pause2) AND clk2; END PROCESS;PROCESS(pause_s)BEGINIF(re='1')THENpause_s1<='0';ELSIF(pause_s='1'AND pause_s'EVENT) THEN pause_s1<=NOT pause_s1;END IF;pause<=pause_s1;END PROCESS;PROCESS(S6,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENreset2<=reset1;reset1<=S6;END IF;reset<=reset1 AND (NOT reset2) AND clk2; END PROCESS;PROCESS(S8,clk2)BEGINIF(clk2='1' AND clk2'EVENT) THENdec2<=dec1;dec1<=S8;END IF;dec<=dec1 AND (NOT dec2) AND clk2;END PROCESS;END behav;三、引脚分配表四、设计结果当按下S7时,系统复位,液晶屏显示000:000 1st,数码管显示12 00 24当24秒时间到了,则16个led灯全亮,比赛暂停:。
毕业设计设计题目:单片机篮球计分器设计要求:1.本次设计的篮球计时计分器,电路简单,而且易懂,使操作利用者利用超级方便,本钱较低,灵敏靠得住,记录准确,程序简单,具有超级高的有效价值。
2.竞赛时加减分,加分按键有1分、2分、三分。
在加错的情形下要求能够减分,按键一次减1分。
3.设计内容包括计分器、,能够使参加竞赛的成员、裁判和观众一目了然的看到所有参加者的成绩,以最快的速度评出结果,该篮球计时计分还鞥普遍应用于各类只是竞赛。
设计进度要求:第一周:选定论文题目第二周:查找相关资料第三周:整理资料第周围:把握单片机硬件、软件的组成和应用第五周:完成论文,编程调试第六周:经教师检查后进行修改毕业论文第七周:打印论文,完成毕业论文第八周:答辩目录1概述 (4)2系统设计方案 (5)大体功能介绍 (5)系统组成框图 (5)3系统硬件设计 (6)3.1 A T89C51简介 (6)3.2 单片机的工作条件 (9)3.2.1 时钟电路 (10)3.2.2 复位电路 (12)4软件设计 (14)软件的设计 (14)总的程序设计代码 (17)致谢 (19)参考文献 (21)总结 (22)附录1 硬件原理图 (23)1概述单片机把咱们带入了智能化的电子领域,许多繁琐的系统假设由单片机进行设计,便能收到电路更简单、功能更齐全的良好成效。
假设把更经典的点子系统看成一个僵死的点子系统,那么智能化的现代电子系统那么是一个具有"生命"的电子系统。
而随着技术的进步,单片机与串口通信的结合更多地应用到各个电子系统中已成一种趋势。
单片机具有体积笑、功能强、应用面广等优势,目前正以前所未见的速度取代着传统电子线路组成的经典系统,蚕食着传统数字电路与模拟电路固有的领域。
同时,一个学习与应用单片机的新高潮正在大规模地兴起。
可是,单片机并非像传统数字电路或模拟电路那样直观,缘故是除“硬件”之外,还存在一个“软件”的因素。
篮球计时记分操作说明一、引言篮球比赛中的计时记分系统是比赛的核心组成部分,对于保证比赛的公正性和准确性至关重要。
本文将详细阐述篮球计时记分系统的操作流程和注意事项,帮助相关工作人员更好地理解和掌握该系统。
二、操作流程1、开场准备:在比赛开始前,计时员需要检查记分板和计时器是否工作正常,确认比分初始值为0。
同时,要与裁判员确认比赛时间规则和暂停次数。
2、比赛开始:当裁判员吹响比赛开始的哨声时,计时员需要按下计时器开始按钮,让比赛计时开始。
3、计时操作:每场比赛有四个计时器,分别对应四个节。
在每个节的比赛开始和结束时,计时员需要手动按下开始和结束按钮。
同时,裁判员会在每个节开始和结束时吹哨,提供清晰的时间点。
4、暂停操作:当球队请求暂停时,计时员需要记录暂停次数,并在记分板上更新比分。
同时,需要与裁判员确认暂停时间是否超出规定时间。
5、比赛结束:当裁判员吹响比赛结束的哨声时,计时员需要立即停止计时器,并确认比赛时间是否超出规定时间。
如果比赛时间未超出规定时间,则比赛结束;否则,需要进行加时赛。
6、加时赛操作:如果需要进行加时赛,计时员需要在记分板上更新比分,并重新开始计时器。
加时赛的规则和正常比赛相同。
7、赛后整理:比赛结束后,计时员需要将比赛数据整理保存,以便后续分析和统计。
三、注意事项1、准确性:计时员需要时刻保持注意力集中,确保准确记录比赛时间和比分变化。
2、公正性:在处理暂停、犯规等情况下,计时员需要遵循裁判员的判断,保证比赛的公正性。
3、及时性:计时员需要在规定时间内完成各项操作,如暂停记录、比分更新等,确保比赛的顺利进行。
4、稳定性:在比赛过程中,计时员需要保持稳定的心态,应对突发情况,如设备故障、比分争议等。
5、培训与沟通:计时员需要定期参加培训,熟悉比赛规则和操作流程。
同时,要加强与裁判员和其他工作人员的沟通协作,确保比赛过程的顺利进行。
6、预防与处理:在比赛前,计时员需要对设备进行仔细检查,预防可能出现的问题。
篮球赛计时计分器课程设计目录第1章系统概述 (1)1.1 功能简述 (1)1.2 按钮设置 (1)第2章总体方案设计 (2)2.1系统框图 (2)2.2 软件总体设计 (2)第3章系统硬件设计 (3)3.1 80C51单片机 (3)3.2 3×4矩阵式键盘 (3)3.3 8段数码管显示器 (3)3. 4 系统原理图........................ (3)第4章软件设计 (4)4.1 主函数设计 (4)4.2 按键码获取,按键处理函数 (5)4.3 显示子函数 (6)4.4 延时子函数 (7)第5章系统的安装调试说明 (8)5.1 软件调试 (8)5.2 软硬联调 (8)总结 (9)参考文献 (10)附录A 系统原理图 (11)附录B 源程序清单 (12)第1章系统概述1.1 功能简述本设计内容为比赛计分器,主要用于各种体育比赛记录分数。
采用矩阵式键盘作为输入,用户可分别对两队比分进行加1、加2、加3和减1减2、减3操作,其加减1,2,3分可以通过加减1分、2分和3分的切换按钮实现,并通过指示灯显示其每次按下加减分键所加减的分值。
可以实现预置分。
比分通过4个8段数码管显示器进行显示,每队比分显示2位,1.2 按钮设置计分器应该有7个按键分别标注于原理图,见图1-1。
图1-1按钮功能图其中1/2/3分切换由发光二极管指示,加1减1分别对应。
预置分是事先设定分数可以分别设定甲乙两队的初始分数。
按下清零后,显示的分数清零。
第2章总体方案设计2.1 系统框图系统框图,见图2-1。
图2-1 系统框图本设计用80C51单片机为核心,利用4个8段数码管显示器.采用动态显示输出比分,用户信息输入则采用3×4矩阵式键盘。
89C52单片机有32根I/O线,所以不用扩展I/O口。
用一片单片机即可满足本设计的输入输出。
2.2 软件总体设计软件设计主要分为3个部分:信息输入、信息处理、显示输出。
<<电子设计自动化EDA技术>>课程设计报告题目: 篮球比赛记分牌姓名:院系:专业:学号:指导教师:完成时间: 年月日目录1 课程设计题目`内容与要求………………………1.1 设计内容1.2 具体要求2系统设计…………………………2.1 设计思路2.2 系统原理3 系统实现……………………………………………4 系统仿真……………………………………………5硬件验证(操作)说明………………………………6 总结…………………………………………………7参考书目……………………………………………一、课程设计题目、内容与要求1.1课程设计的题目: 篮球比赛记分牌1、1.2课程设计内容:2、根据比赛实际情况记录两队得分, 罚球进的1分, 进球的2分;3、记分牌要具有纠错功能, 能减1分、2分功能;4、利用3个译码显示管输出比赛的分;二、系统设计2.1设计思路:篮球比赛记分牌是记录两队比赛的得分情况, 并能够进行纠错功能;根据系统设计的要求, 篮球记分牌的电路原理框图如下:2.2 系统原理与设计说明系统各个模块的功能如下:1.D触发器电路模块实现翻转功能当出错时, 输出为1, 使电路回到上一个正确的状态。
2.4为二进制全加器电路模块实现加法计数功能。
3、移位寄存器电路模块保存比赛两队得分情况的4个相邻状态, 出错时将调用上一个正确状态。
4.二选一数据选择器电路模块用来控制移位寄存器5. LED数码管驱动电路模块三、系统实现各模块电路的源程序如下:1、D触发器电路模块及程序:set输入(Q=1), 清零应该可以用复位键reset吧(Q=0)。
library ieee;use ieee.std_logic_1164.all;entity sync_rsdff isport(d,clk : in std_logic;set : in std_logic;reset: in std_logic;q,qb : out std_logic);end sync_rsdff;architecture rtl_arc of sync_rsdff isbeginprocess(clk)beginif (clk'event and clk='1') thenif(set='0' and reset='1') thenq<='1';qb<='0';elsif (set='1' and reset='0') thenq<='0';qb<='1';elseq<=d;qb<=not d;end if;end if;end process;end rtl_arc;移位寄存器模块电路及程序:library IEEE;use IEEE.std_logic_1164.all;entity shft_reg isport (DIR : in std_logic;CLK : in std_logic;CLR : in std_logic;SET : in std_logic;CE : in std_logic;LOAD : in std_logic;SI : in std_logic;DATA : in std_logic_vector(3 downto 0);data_out : out std_logic_vector(3 downto 0) );end shft_reg;architecture shft_reg_arch of shft_reg issignal TEMP_data_out : std_logic_vector(3 downto 0);beginprocess(CLK)beginif rising_edge(CLK) thenif CE = '1' thenif CLR = '1' thenTEMP_data_out <= "0000";elsif SET = '1' thenTEMP_data_out <= "1111";elsif LOAD = '1' thenTEMP_data_out <= DATA;elseif DIR = '1' thenTEMP_data_out <= SI & TEMP_data_out(3 downto 1);elseTEMP_data_out <= TEMP_data_out(2 downto 0) & SI;end if;end if;end if;end if;end process;data_out <= TEMP_data_out;end architecture;3.二选一数据选择器电路模块及程序:entity mux isport(do,d1:in bit;sel:in bit;q:out bit);end mux;architecture a of mux isbeginq<=(do and sel)or(not sel and d1);end a;4.加法计数器的电路模块及程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY add4 ISPORT(a1,a2,a3,a4:IN STD_LOGIC;b1,b2,b3,b4:IN STD_LOGIC;sum1,sum2,sum3,sum4:OUT STD_LOGIC;cout4:OUT STD_LOGIC);END add4;ARCHITECTURE add_arc OF add4 ISSIGNAL cout1,cout2,cout3:STD_LOGIC;COMPONENT halfaddPORT(a,b:IN STD_LOGIC;sum,hcarry:OUT STD_LOGIC);END COMPONENT;COMPONENT fulladdPORT(in1,in2,cin:STD_LOGIC;fsum,fcarry:OUT STD_LOGIC);END COMPONENT;BEGINu1:halfadd PORT MAP(a=>a1,b=>b1,sum=>sum1,hcarry=>cout1);u2:fulladd PORT MAP(in1=>a2,in2=>b2,cin=>cout1,fsum=>sum2,fcarry=>cout2);u3:fulladd PORT MAP(in1=>a3,in2=>b3,cin=>cout2,fsum=>sum3,fcarry=>cout3);u4:fulladd PORT MAP(in1=>a4,in2=>b4,cin=>cout3,fsum=>sum4,fcarry=>cout4);END add_arc;5.七段译码电路及程序:library ieee;use ieee.std_logic_1164.all;entity deled isport(datain:in std_logic_vector(3 downto 0);qout:out std_logic_vector(6 downto 0));end deled;architecture func of deled isbeginprocess(datain)beginif datain= "0000" then qout<="1111110";elsif datain= "0001" then qout<="0110000";elsif datain= "0010" then qout<="1101101";elsif datain= "0011" then qout<="1111001";elsif datain= "0100" then qout<="0110011";elsif datain= "0101" then qout<="1011011";elsif datain= "0110" then qout<="1011111";elsif datain= "0111" then qout<="1110000";elsif datain= "1000" then qout<="1111111";elsif datain= "1001" then qout<="1111011";else null;end if;end process;end func;四、系统仿真1.D触发器电路模块仿真波形:2.移位寄存器模块电路仿真波形:3.二选一数据选择器电路模块仿真波形:4.加法计数器的电路模块仿真波形:5.七段译码电路仿真波形:五﹑硬件验证说明这次设计采用的硬件电路有芯片EP1K10TC100-3,实验板上标准时钟电路、LED 显示等, 六、总结七、参考书目[1]《PLD与数字系统设计》李辉西安电子科技大学出版社 2005[2]《EDA技术及可编程逻辑器件应用实训》沈明山北京科学出版社 2004[3]《VHDL数字系统设计与高层次综合》林敏方颖立著北京: 电子工业出版社2002[4]《VHDL程序设计》曾繁泰陈美金著北京: 清华大学出版社 2001[5]《EDA技术实验与课程设计》曹昕燕周风臣清华大学出版社 2005[6]《PLD器件与EDA技术》李冬梅北京广播学院出版社2000。
篮球电子计分器操作方法篮球电子计分器是一种用于计分和计时的设备,广泛应用于篮球比赛中。
操作篮球电子计分器可以帮助裁判、教练和观众准确记录比赛进展和结果。
下面将详细介绍篮球电子计分器的操作方法。
1. 打开电子计分器大多数篮球电子计分器都有一个开关按钮,通常位于设备的一侧或底部。
按下开关按钮,电子计分器的屏幕将亮起,并显示默认的初始数字。
2. 设置比赛时间在大多数篮球比赛中,比赛时间一般为四个十分钟的节,每个节之间还包括两分钟的休息时间。
操作电子计分器设置比赛时间的方法通常如下:- 按下或旋转计时器上的"分钟/秒钟" 按钮或旋钮,以调整比赛时间。
- 按下或旋转计时器上的"加号" 和"减号" 按钮或旋钮,以调整时间的分钟或秒钟。
一般来说,比赛开始时将时间设置为40分钟(4个十分钟的节),每个节之间的休息时间设置为2分钟。
当倒计时开始,屏幕上会显示剩余比赛时间。
3. 记录比分篮球电子计分器通常具有两个用于记录比分的屏幕:主队得分屏幕和客队得分屏幕。
记录比分的操作方法如下:- 按下主队得分屏幕上的加减按钮,可以增加或减少主队的得分。
- 按下客队得分屏幕上的加减按钮,可以增加或减少客队的得分。
比分屏幕通常显示两个数字,一个用于表示主队的得分,另一个用于表示客队的得分。
当按下加分按钮时,屏幕上的数字会增加对应的分数。
当按下减分按钮时,屏幕上的数字会减少对应的分数。
4. 控制暂停和恢复比赛篮球比赛中,通常有各种原因需要暂停比赛,比如叫暂停、换人或其他情况。
电子计分器通常具有暂停和恢复比赛的功能,操作方法如下:- 在电子计分器上找到暂停按钮,按下该按钮可以停止比赛计时,并将屏幕上的时间暂停在当前秒数。
- 按下恢复按钮,可以恢复比赛计时,使屏幕上的时间继续递减。
5. 重置计时器和比分比赛结束后,需要将计时器和比分重置为初始状态,准备下一场比赛。
操作方法通常如下:- 按下电子计分器上的重置按钮,可以将比赛时间设置为初始时间,将比分归零。
51单片机篮球计分器毕业设计序言计分器是篮球比赛中必不可少的设备,它能够记录比赛的得分情况,帮助裁判员和观众清晰地了解比赛进程。
在传统的篮球比赛中,计分器通常是由人工操作的,但是随着科技的发展,人工操作的计分器已经逐渐被自动化的电子计分器所取代。
而随着计算机科学与技术的不断发展,单片机技术在这方面的应用也越来越广泛。
本篇文章将介绍一种基于51单片机的篮球计分器设计方案,尝试探讨如何利用单片机技术实现篮球比赛计分的自动化。
一、设计方案的背景与意义在传统的篮球比赛中,计分工作通常由工作人员手动操作。
这种方式需要有专门的工作人员负责计分,不仅浪费人力资源,而且容易出现人为错误。
引入自动化的电子计分器,既能够提高比赛的计分效率,又能够减少人为错误的发生,提高了比赛的公正性。
利用单片机技术实现篮球计分器,不仅仅只是提供了一款便携、高效的计分器,更是为单片机技术在现实生活中的应用提供了一种有益的示范。
二、设计方案的具体实施1. 系统整体设计本设计方案将基于51单片机,通过按键输入、LED/LCD显示,实现对篮球比赛的实时计分和时间计时功能。
为了方便观众和裁判员的观看,还会配备蜂鸣器作为得分提示。
2. 功能设计本篮球计分器设计将主要包括以下功能:(1)得分计数功能:通过按键输入,实现对两支球队的得分计数功能。
(2)时间计时功能:通过按键输入,设置比赛的计时时长,并且实时显示比赛剩余时间。
(3)得分提示功能:在每次得分后,通过蜂鸣器提示观众和裁判员有球队得分。
(4)数据保存功能:为了防止断电导致数据丢失,设计方案将引入EEPROM芯片,实现数据的保存与恢复功能。
三、硬件设计1. 单片机选择本设计方案将选择51单片机作为主控芯片,它具有低功耗、高性能和丰富的外设资源,非常适合用于嵌入式系统的设计。
2. 输入输出设备为了实现按键输入和LED/LCD显示,本设计方案将使用矩阵键盘和LED/LCD模块作为输入输出设备。
篮球计时计分器汇编程序ORG 0000HLJMP MAINORG 0003HLJMP CHANGEORG 000BHLJMP TIMEORG 0013HLJMP TIAOSHIORG 001BHLJMP YANSHIMAIN: MOV SP,#50HMOV TCON,#04HMOV 20H,#00H ;秒MOV 21H,#0CH ;分MOV 22H,#00H ;A队分数MOV 23H,#00H ;B队分数MOV 24H,#02HMOV 25H,#01HMOV 26H,#0CH ;分钟定时区MOV 30H,#00H MOV 31H,#00H ;时间缓冲区MOV 32H,#02HMOV 33H,#01HMOV 34H,#00HMOV 35H,#00H ;分数显示缓冲区MOV 36H,#00H MOV 37H,#00HMOV 39H,#03H ;TIAN HEIHEIMOV TMOD,#11HMOV TH0,#0D8HMOV TL0,#0F0HMOV TH1,#0D8HMOV TH1,#0F0HMOV IE,#10001111BMOV IP,#05HMOV R2,#64HCLR P3.6START:LCALL DISPTLCALL DISPFJNB P1.0,PP1 ;A队加一分JNB P1.1,PP2 ;A队加两分JNB P1.2,PP3 ;A队加三分JNB P1.3,PP4 ;A队减一分JNB P1.4,PP55 ;B队加一分JNB P1.5,PP66 ;B队加两分JNB P1.6,PP77 ;B队加三分JNB P1.7,PP88 ;B队减一分JB P3.0,STARTLCALL DELAYJB P3.0,STARTSTOP1:JNB P3.0,STOP1LCALL DELAYJNB P3.0,STOP1CPL TR0 ;按键奇数次开始,偶数次暂停LJMP STARTPP55: LJMP PP5PP66: LJMP PP6PP77: LJMP PP7PP88: LJMP PP8PP1: LCALL DELAYJB P1.0,PPBSTOP11:JNB P1.0,STOP11 LCALL DELAYJNB P1.0,STOP11INC 22HMOV A,22HLJMP STOREAPP2:LCALL DELAYJB P1.1,PPBSTOP22:JNB P1.1,STOP22 LCALL DELAYJNB P1.1,STOP22MOV A,22HADD A,#02MOV 22H,ALJMP STOREAPP3: LCALL DELAYJB P1.2,PPBSTOP33:JNB P1.2,STOP33 LCALL DELAYJNB P1.2,STOP33MOV A,22HADD A,#03MOV 22H,ALJMP STOREAPP4: LCALL DELAYJB P1.3,PPBSTOP44:JNB P1.3,STOP44 LCALL DELAYJNB P1.3,STOP44 DEC 22HMOV A,22H STOREA:MOV B,#0AH DIV ABMOV 34H,BMOV 35H,APPB: LJMP START PP5: LCALL DELAYJB P1.4,PPCSTOP55:JNB P1.4,STOP55 LCALL DELAYJNB P1.4,STOP55INC 23HMOV A,23HLJMP STOREB PP6: LCALL DELAYJB P1.5,PPCSTOP66:JNB P1.5,STOP66 LCALL DELAYJNB P1.5,STOP66 MOV A,23HADD A,#02 MOV 23H,ALJMP STOREB PP7: LCALL DELAYJB P1.6,PPCSTOP77:JNB P1.6,STOP77 LCALL DELAYJNB P1.6,STOP77 MOV A,23HADD A,#03MOV 23H,ALJMP STOREB PP8: LCALL DELAYJB P1.7,PPC STOP88:JNB P1.7,STOP88 LCALL DELAY JNB P1.7,STOP88 DEC 23HMOV A,23H STOREB:MOV B,#0AH DIV ABMOV 36H,BMOV 37H,APPC: LJMP STARTDELAY:MOV R4,#5HDL00: MOV R5,#0FFHDL11: DJNZ R5,DL11DJNZ R4,DL00RET ;;;;;;;;;;;;;;;;;;时间中断程序;;;;;;;;;;;;;;; TIME: PUSH ACCPUSH PSWMOV TH0,#0D8HMOV TL0,#0F0HDJNZ R2,RET0MOV R2,#64HMOV A,20HCLR CDEC AMOV 20H,AMOV A,21HCJNE A,#00H,PFF ;非0分跳转MOV A,20HCJNE A,#00H,PFF ;非0分0秒情况跳转CLR TR0 ;比赛结束停止计时MOV 20H,#00HMOV 21H,#00HMOV 32H,#00HMOV 33H,#00HLCALL MINGYINMOV 21H,26HMOV 30H,#00HMOV 31H,#00HMOV 32H,24HMOV 33H,25HLJMP RET0PFF: MOV A,20HCJNE A,#0FFH,OUTMOV 20H,#59 ;MOV 30H,#09HMOV 31H,#05HMOV A,21HDEC AMOV 21H,AOUT: MOV A,20HMOV B,#0AHDIV ABMOV 30H,BMOV 31H,AMOV A,21HMOV B,#0AHDIV ABMOV 32H,BMOV 33H,ARET0: POP PSWPOP ACCRETIYANSHI:PUSH ACC ;定时器1中断PUSH PSW MOV TH1,#0D8HMOV TL1,#0F0HDJNZ R2,RET1MOV R2,#64HDJNZ 39H,RET1MOV 39H,#03H ;TIAN HEIHEIMOV R2,#64HCLR TR1CLR P3.6RET1: POP PSWPOP ACCRETI;;;;;;;;;;;;;;鸣音子程序;;;;;;;;;;;; MINGYIN: SETB P3.6SETB TR1RETI;;;;;;;时间显示程序;;;;;;;;;;;DISPT: MOV R0,#30HMOV R3,#0F7HMOV A,R3PLAYT:MOV P2,AMOV A,@R0MOV DPTR,#DSEG1MOVC A,@A+DPTRMOV P0,ALCALL DL1MOV P2,#0FFHMOV A,R3RR AJNB ACC.7,LD1INC R0MOV R3,ALJMP PLAYTLD1: RET ;;;;;;;;;;比分显示程序;;;;;;;;;;;;;; DISPF:MOV R0,#34H MOV R3,#7FHMOV A,R3PLAYF:MOV P2,AMOV A,@R0MOV DPTR,#DSEG1MOVC A,@A+DPTRMOV P0,ALCALL DL1MOV P2,#0FFHMOV A,R3RR AJNB ACC.3,LD1INC R0MOV R3,ALJMP PLAYFAJMP LD1 ;;;;;;;;;;调时时间显示程序;;;;;;;;;; DISPW: MOV R0,#24H MOV R3,#0F7HMOV A,R3PLAYW:MOV P2,AMOV A,@R0MOV DPTR,#DSEG1MOVC A,@A+DPTRMOV P0,ALCALL DL1MOV P2,#0FFHMOV A,R3RR AJNB ACC.1,LD1INC R0MOV R3,ALJMP PLAYWDL1: MOV R7,#05HDL: MOV R6,#0FFHDL6: DJNZ R6,DL6DJNZ R7,DLRETDSEG1:DB 3FH,06H,5BH,4FH,66H DB6DH,7DH,07H,7FH,6FH ;;;;;;;;;调时子程序;;;;;;;;;;;;; TIAOSHI:PUSH ACCPUSH PSWJB P3.3,CHULCALL DELAYJB P3.3,CHU STOPQ:JNB P3.3,STOPQLCALL DELAYJNB P3.3,STOPQIF10: LCALL DISPWLCALL DISPFJNB P1.3,DECTJB P1.0,WHAIT2 LCALL DELAYJB P1.0,WHAIT2STOPE:MOV C,P1.0JNC STOPELCALL DELAYMOV C,P1.0JNC STOPEINC 26HLJMP STOREDECT: MOV C,P1.3LCALL DELAYJC WHAIT2STOPY:MOV C,P1.3JNC STOPYLCALL DELAYMOV C,P1.3JNC STOPYDEC 26HSTORE: MOV 21H,26HMOV 20H,#00HMOV A,26HMOV B,#0AHDIV ABMOV 24H,BMOV 25H,AMOV 30H,#00HMOV 31H,#00HMOV 32H,24HMOV 33H,25HLJMP IF10 WHAIT2:JB P3.3,IF10 LCALL DELAYJB P3.3,IF10 STOPG:JNB P3.3,STOPG LCALL DELAYJNB P3.3,STOPG CHU: POP PSWPOP ACCRETI ;;;;;;;;;;交换场地程序;;;;;;;;;;; CHANGE: PUSH PSW PUSH ACC JB P3.2,QULCALL DELAYJB P3.2,QUSTOPCH: JNB P3.2,STOPCHLCALL DELAYJNB P3.2,STOPCHMOV A,22HXCH A,23HMOV 22H,AMOV A,34HXCH A,36HMOV 34H,AMOV A,35HXCH A,37HMOV 35H,A QU: POP ACCPOP PSW RETI END。
单片机接口实验篮球计分器的设计**: ***班级: 14级12班学号: ********** **: ***专业: 控制科学与工程成绩评定学生:苗茂宇学号:**********学生:苗茂宇学号:1408202007 目录摘要 (1)Abstract (1)1. FPGA及系统设计概述 (2)1.1. EDA简介 (2)1.1.1. EDA定义 (2)1.1.2. EDA发展概述 (2)1.1.3. HDL概述 (2)1.1.4. 总结 (3)1.2. FPGA简介 (3)1.2.1. FPGA概述 (3)1.2.2. FPGA原理 (4)1.3. LCD1602 (4)1.4. 产品现状及发展 (5)1.5. 总体设计要求 (5)1.5.1. 设计流程 (5)1.5.2. 设计要求 (5)1.6. 本章小结 (6)2. 实验方案设计 (6)2.1. 分频模块 (6)2.2. 计时模块 (7)2.3. 24秒计时模块 (9)2.4. 计分模块 (10)2.5. lcd驱动模块 (11)2.6. 本章小结 (17)3. 实验结论 (17)4. 结束语 (18)参考文献 (19)附录 1 (20)摘要FPGA(现场可编程逻辑器件)以其体积小、功耗低、稳定性高等优点被广泛应用于各类电子产品的设计中。
FPGA是基于硬件可编程的器件,设计者需要掌握硬件描述语言,Verilog HDL就是一种硬件描述语言。
Verilog HDL语言是在C 语言的基础上发展而来的,语法结构上与C语言有很多相似之处,继承了C语言的语法结构,但是其与C语言有着本质上的区别。
本设计是基于FPGA的篮球计时计分系统的设计,结合篮球比赛的实际过程,对系统进行了模块化设计,最终组合调试。
硬件实验表明本系统计时计分准确,实时性好,能够很好的反应比赛进度,此次设计达到了设计预期。
关键词:FPGA;Verilog HDL;计时计分;模块化AbstractFPGA (field programmable logic device) with its small size, low power consumption, high stability has been widely used in various types of electronic products design. FPGA is a programmable device based on hardware, designers need to master the hardware description language, Verilog HDL is a hardware description language. Verilog HDL language is developed on the basis of C language, grammar structure and C language have many similarities, inherited the grammar structure of C language and C language, but there's a difference between. This design is the designof FPGA basketball timing and scoring system based on the actual process, combined with the game of basketball, the system of modular design, the final assembly debugging. Hardware experiments show that the system timing accuracy, goodreal-time performance, can very good response competition schedule, the design achieves the expected design.Keywords: FPGA;Verilog HDL ; timing and scoring; modular1.FPGA及系统设计概述1.1.E DA简介1.1.1.EDA定义EDA是电子设计自动化(Electronic Design Automation)的缩写。
数理与信息工程学院《单片机原理及应用》期末课程设计题目:基于单片机的篮球赛计时计分器专业:计算机科学与技术(专升本)班级:计算机081班姓名:李骏学号:08191121指导老师:余水宝成绩:(2009.6)目录第1节引言 (1)1.1本设计的任务和主要内容 (1)第2节系统主要硬件电路设计 (2)2.1 单片机控制原理 (2)2.2 单片机主机系统电路 (3)2.2.1计时电路 (4)2.2.2计分电路 (5)第3节系统的软件设计 (6)3.1 篮球赛计时计分器程序源代码 (6)3.2篮球赛计时计分器程序流程图 (16)结束语 (17)参考文献 (18)基于单片机的篮球计时计分器数理与信息工程学院 08计算机专升本李骏指导教师:余水宝第1节引言随着单片机载各个领域的广泛应用,许多用单片机作控制的球赛计时计分器系统也应运产生,如用单片机控制LCD液晶显示器计时计分器,用单片机控制LED七段显示器计时计分器等。
本文介绍一种有AT89C51编程控制LED七段数码管作显示的球赛计时计分系统。
本系统具有赛程定时设置、赛程时间暂停、及时刷新甲、乙队双方的成绩以及赛后成绩暂存等功能。
它具有价格低廉、性能稳定、操作方便且易携带等特点。
广泛适合各类学校和小团体作为赛程计时计分。
1.1本设计的任务和主要内容这次课程设计的主要任务是:设计制作一个用于赛场的篮球赛计时计分器。
主要内容如下:①能记录整个赛程的比赛时间,并能修改比赛时间、暂停比赛时间。
②能随时刷新甲、乙两队在整个赛程中的比分。
③中场交换比赛场地时,能交换甲、乙两队比分的位置。
④比赛时间结束时,能发出报警指令。
第2节系统主要硬件电路设计2.1 单片机控制原理图2-1 球赛计时计分器系统图2.2 单片机主机系统电路本系统采用单片机AT89C51作为本设计的核心元件。
利用7段共阴LED作为显示器件。
在此设计中共接入10个7段共阴LED显示器,其中6个用于记录甲、乙两队的分数每队3个LED显示器显示分数范围可达到0-999分,足够满足赛程需要。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar code table[]=".. Play ball! ....";uchar code table1[]="Welcome to here!" ;sbit key_ST=P1^5; //功能键(开始/暂停)sbit key_A1=P1^0; //功能键(A队分数加1)sbit key_A2=P1^3; //功能键(A队分数加2)sbit key_1A=P1^6; //功能键(A队分数减1)sbit key_B1=P1^1; //功能键(B队分数加1)sbit key_B2=P1^4; //功能键(B队分数加2)sbit key_1B=P1^7; //功能键(B队分数减1)sbit key_EX=P1^2; //功能键(交换场地,A/B两队分数交换)sbit key_JS=P3^0; //功能键(比赛节数加1)sbit FMQ=P3^3; //蜂鸣器sbit lcdrs=P3^5; //LCD显示的数据/命令选择端sbit lcden=P3^4; //LCD显示的使能信号uchar flag,ms,mg,ss,sg,ags,agg,bgs,bgg,num,num1,num2,js=1,C,D,t,min=0,time_fmq;int sec=12;void delayms(uint xms) //定义延时函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void write_data(uchar date) //定义为数据模式{lcdrs=1;P0=date;delayms(5);lcden=1;delayms(5);lcden=0;}void write_com(uchar com) //定义为命令模式{lcdrs=0;P0=com;delayms(5);lcden=1;delayms(5);lcden=0;}void lcd_init() //LCD显示屏的初始化{lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);}void init() //LCD显示屏的初始化2(即输出“T-”、“Q-”、“A:”、“B:”){lcden=0;write_com(0x82);write_data('T');write_data('-');write_com(0x8a);write_data('Q');write_data('-');write_com(0x80+0x43);write_data('A');write_data(':');write_com(0x80+0x49);write_data('B');write_data(':');}void init_start() //LCD显示屏的初始化2(即输出“T-”、“Q-”、“A:”、“B:”){lcden=0;write_com(0x80+0x10);for(num2=0;num2<16;num2++){write_data(table1[num2]);delayms(5);}write_com(0x80+0x50);for(num2=0;num2<17;num2++){write_data(table[num2]);delayms(5);}for(num2=0;num2<16;num2++){write_com(0x18);delayms(400);}}void display(uchar min,int sec,uchar C,uchar D,uchar js) //显示函数{ss=sec/10;sg=sec%10;ms=min/10;mg=min%10;ags=C/10;agg=C%10;bgs=D/10;bgg=D%10;write_com(0x84);write_data(0x30+ms);write_data(0x30+mg);write_data(':');write_data(0x30+ss);write_data(0x30+sg);write_com(0x8d-1);write_data(0x30+js);write_com(0x80+0x45);write_data(0x30+ags);write_data(0x30+agg);write_com(0x80+0x4b);write_data(0x30+bgs);write_data(0x30+bgg);}void main(){TMOD=0x11;//定义定时器0的工作方式为0001TH0=(65536-45872)/256; //装初值TL0=(65536-45872)%256;TH1=(65536-45872)/256; //装初值TL1=(65536-45872)%256;EA=1;//打开总中断ET0=1;//打开定时器0的中断TR0=0;ET1=1;TR1=0;lcd_init();init_start();while(1){TR1=0;if(key_ST==0){delayms(5);if(key_ST==0){FMQ=0;if(flag==0){lcd_init();init();}flag=1;TR0=~TR0;}while(!key_ST)display(min,sec,C,D,js);FMQ=1;}if(key_A1==0){delayms(5);if(key_A1==0){FMQ=0;C++;}while(!key_A1)display(min,sec,C,D,js);FMQ=1;}if(key_A2==0){delayms(5);if(key_A2==0){FMQ=0;C+=2;}while(!key_A2)display(min,sec,C,D,js);FMQ=1;}if(key_1A==0){delayms(5);if(key_1A==0){FMQ=0;C--;}while(!key_1A)display(min,sec,C,D,js);FMQ=1;}if(key_B1==0){delayms(5);if(key_B1==0){FMQ=0;D++;}while(!key_B1)display(min,sec,C,D,js);FMQ=1;}if(key_B2==0){delayms(5);if(key_B2==0){FMQ=0;D+=2;}while(!key_B2)display(min,sec,C,D,js);FMQ=1;}if(key_1B==0){delayms(5);if(key_1B==0){FMQ=0;D--;}while(!key_1B)display(min,sec,C,D,js);FMQ=1;}while(min==0&&sec==0){TR0=0;TR1=1;if(key_ST==0){if(key_ST==0){FMQ=0;min=11;sec=60;TR0=~TR0;}while(!key_ST)display(min,sec,C,D,js);FMQ=1;}if((key_EX==0)&&(js==2)){delayms(10);if((key_EX==0)&&(js=2)){FMQ=0;write_com(0x80+0x43);write_data('B');write_com(0x80+0x49);write_data('A');t=C;C=D;D=t;}while(!key_EX)display(min,sec,C,D,js);FMQ=1;}if(key_JS==0){delayms(10);if(key_JS==0){FMQ=0;js++;}while(!key_JS)display(min,sec,C,D,js);FMQ=1;}}display(min,sec,C,D,js);}}void T0_time()interrupt 1 //中断0控制晶码管显示时间{TH0=(65536-45872)/256; // 重装初值TL0=(65536-45872)%256;num++;if(num==20){num=0;sec--;if(sec<0){sec=59;min--;}}}void T1_time()interrupt 3 //中断0控制晶码管显示时间{TH1=(65536-45872)/256; // 重装初值TL1=(65536-45872)%256;num1++;if(num1==20){num1=0;time_fmq++;if(time_fmq>=4)FMQ=1;elseFMQ=0;}}。