篮球计分器程序

合集下载

篮球计分器程序

篮球计分器程序

#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;}}。

篮球比赛计时计分

篮球比赛计时计分

摘要本设计是采用AT89C51单片机为核心设计的一个用于赛场的篮球计时计分器。

本设计采用定时器T0中断计时,显示部分分为计时和计分显示两部分,均采用共阴极LED显示。

计时部分计时范围宽,而且可定时设定与小时、分钟调整;计分部分调节灵活,显示范围宽,足以满足各种规模赛程需要。

两个显示模块均采用动态扫描方式显示。

在本设计中P3口(P3.0—P3.5)是计时计分显示共用的扫描口,P0口是计时数据输出口,P2口计分数据输出口,计时计分均设有显示缓冲区(40H—45H 计分显示缓冲区,30H—35H计时显示缓冲区)。

本设计共有K1—K6六个设置按键,K1是甲加分键(按一次加一分),K2是乙加分键(按一次加一分),K3是定时切换键(定时设置与计时调时切换),K4是小时调整键(计时与定时小时调整),K5是分钟调整键(计时与定时分钟调整),K6分数位置交换键(交换甲、乙两队比分的位置)。

按键与P1口相接,低电平输入有效,另外还有一个复位按键K7。

报警部分由555与扬声器组成,当计时时间到时,输出低电平,由555构成的电路工作输出脉冲信号驱动扬声器发出声音。

计时定时的原理与定时闹钟相同,为定时设置定时小时和定时分钟计数单元,通过比较定时与计时的时分计数单元判断比赛是否结束是否报警,定时与计时共用一个显示缓冲区,通过K3(定时切换键)进行显示切换,本设计可通过定时显示的秒位判断定时是否有效,如果秒位显示00说明无效(上次用过的定时),显示11说明有效(本次定时)。

定时时间到,扬声器报警,比赛结束,按K3键可停止报警(否则一直报警)。

本次设计的篮球计时计分器具有以下的功能:[I]能记录整个赛程的比赛时间,并能修改比赛时间。

[II]能随时刷新甲、乙两队在整个比赛过程中的比分。

[III]中场交换比赛场地时,能交换甲、乙两队比分的位置。

[IV]比赛结束时,能发出报警声。

目录1概述- 3 -1.1 单片机简介- 3 -1.2 单片机发展前景- 4 -1.3 课程设计的意义- 5 -1.4 任务与要求- 5 -2系统总体方案及硬件设计- 6 -2.1 系统总体方案设计- 6 -2.2 硬件系统设计- 6 -2.2.1 单片机选择- 6 -2.2.2 时钟电路模块- 7 -2.2.3 复位电路模块- 8 -2.2.4按键控制键盘模块- 8 -2.2.5 显示模块和定时报警模块- 9 -3 软件设计 - 11 -3.1 软件总体设计方案- 11 -3.2 程序模块设计- 11 -3.2.1 中断入口程序- 12 -3.2.2 主程序模块与定时设置子程序- 13 -3.2.3 定时器T0中断服务程序和计时加1秒的子程序- 15 -3.2.4计时定时值与计分转换到显示缓冲区子程序- 15 -3.2.5报警服务子程序与延时子程序- 16 -4 PROTEUS软件仿真- 17 -5 课程设计体会- 20 -参考文献- 21 -附1 源程序代码- 22 -附2 系统原理图- 30 -1 概述1.1 单片机简介单片机,亦称单片微电脑或单片微型计算机。

篮球计时计分器程序

篮球计时计分器程序

#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(':');}}。

篮球计分器 单片机 程序

篮球计分器  单片机  程序
if(fen==0&&miao==0){TR0=0;fm=0;} //比赛结束,关中断,响蜂鸣器
TH0=(65536-50000)/256; //初值重装
TL0=(65536-50000)%256;
count1++; // 计数加一,实现时间的计算
delayms(5) ;
}
void displayfen1(fen1) //显示时间分的个位
{ P2=0xfb ;
P0=table[fen1] ;
delayms(5) ;
}
void displaymiao10(miao10) // 显示时间秒 的十位
miao++;
if(miao==60) //计时一分时,分加一,秒重新开始
{ miao=0;
fen++;
displayfen(fen); //显示分的更新
sbit fm=P1^7 ; //蜂鸣器控制口
//定义全局变量
uchar count1,count2,miao10,miao1,fen10,fen1,adui10;
uchar adui1,bdui10,bdui1,fen,adui,bdui,x,a,b;
count2++; //count2加一,实现计时一秒 (20个中断 为时间一秒)
if(count2==20)
{
count2=0; //到一秒时,count2重新开始,时间秒加一
char miao;
char code table[]={
0x40,0x5B,0x22,0x0a, //数码管编码表
0x19,0x0c,0x04,0x5a,

篮球计分器程序

篮球计分器程序

/******************** //版权和版本声明* 文件标识:* 摘要:* 当前版本:* 作者:输入作者(或修改者)名字* 完成日期: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灯全亮,比赛暂停:。

篮球比分计分器

篮球比分计分器

#include<reg51.h>#include<intrins.h>#include<stdlib.h>#define uchar unsigned char#define uint unsigned int#define LCD_data P0sbit LCD_RS=P2^6;sbit LCD_RW=P2^5;sbit LCD_EN=P2^7;sbit LCD_PSB=P3^2;sbit LCD_RST=P3^7;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 BEEP=P3^0;uchar code tab1[]="湖人队vs火箭队"; uchar code tab2[]="0123456789:";uchar code tab3[]="0123456789: .";uchar code tab4[]="火箭队vs湖人队"; uchar code tab5[]="龙敏10级光电02班"; uchar code tab6[]="1ST";uchar code tab7[]="2ND";uchar code tab8[]="比分";uchar code tab9[]="3RD";uchar code tab10[]="4TH";char chang=48;char num=24;char fen=12;char miao=0;char xiaoshu=0;uchar count;uchar flag;uchar a;uchar b;void disp9(void) ;void Key8(void);/** 延时函数**/void delay_1ms(uint x){uint i,j;for(j=0;j<x;j++)for(i=0;i<110;i++);}/**写指令数据到LCD **/ void write_cmd(uchar cmd){ LCD_RS=0;LCD_RW=0;LCD_EN=0;P0=cmd;delay_1ms(5);LCD_EN=1;delay_1ms(5);LCD_EN=0;}/**写显示数据到LCD **/ void write_dat(uchar dat){LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delay_1ms(5);LCD_EN=1;delay_1ms(5);LCD_EN=0 ;}/***设定定显示位置***//**LCD初始化**/void icd_init(){ LCD_PSB=1;write_cmd(0x30);delay_1ms(5);write_cmd(0x0c);delay_1ms(5);}/**清屏函数**/void clr_screen(){write_cmd(0x34); //扩充指令操作delay_1ms(5);write_cmd(0x30); //基本指令操作delay_1ms(5);write_cmd(0x01); //清屏delay_1ms(5);}void disp1(){uchar i;icd_init();if(b==0) ;else{b--;write_cmd(0x90);i=0;while(tab8[i]!='\0'){write_dat(tab8[i]);i++;}write_dat(tab3[11]);write_dat(tab2[a/100]);write_dat(tab2[a/10%10]);write_dat(tab2[a%10]);write_dat(tab2[10]);write_dat(tab2[b/100]);write_dat(tab2[b/10%10]);write_dat(tab2[b%10]);}}void disp2(){uchar i;icd_init();b++;write_cmd(0x90);i=0;while(tab8[i]!='\0'){write_dat(tab8[i]);i++;}write_dat(tab3[11]);write_dat(tab2[a/100]);write_dat(tab2[a/10%10]);write_dat(tab2[a%10]);write_dat(tab2[10]);write_dat(tab2[b/100]);write_dat(tab2[b/10%10]);write_dat(tab2[b%10]);}void disp3(){uchar i;icd_init();if(a==0) ;else{a--;write_cmd(0x90);i=0;while(tab8[i]!='\0'){write_dat(tab8[i]);i++;}write_dat(tab3[11]);write_dat(tab2[a/100]);write_dat(tab2[a/10%10]);write_dat(tab2[a%10]);write_dat(tab2[10]);write_dat(tab2[b/100]);write_dat(tab2[b/10%10]);write_dat(tab2[b%10]);} }void disp4(){uchar i;icd_init();a++;write_cmd(0x90);i=0;while(tab8[i]!='\0'){write_dat(tab8[i]);i++;}write_dat(tab3[11]);write_dat(tab2[a/100]);write_dat(tab2[a/10%10]);write_dat(tab2[a%10]);write_dat(tab2[10]);write_dat(tab2[b/100]);write_dat(tab2[b/10%10]);write_dat(tab2[b%10]);}void disp5(){uchar i,k,p;icd_init();write_cmd(0x80);i=0;while(tab4[i]!='\0'){write_dat(tab4[i]);i++;}write_cmd(0x90);k=b;p=a;a=k;b=p;i=0;while(tab8[i]!='\0'){write_dat(tab8[i]);i++;}write_dat(tab3[11]);write_dat(tab2[a/100]);write_dat(tab2[a/10%10]);write_dat(tab2[a%10]);write_dat(tab2[10]);write_dat(tab2[b/100]);write_dat(tab2[b/10%10]);write_dat(tab2[b%10]);disp9();fen=12;miao=0;num=24;}void disp6(){ uchar i;write_cmd(0x88);if(chang>35){ i=0;while(tab6[i]!='\0'){write_dat(tab6[i]);i++;} }else if(chang>23){ i=0;while(tab7[i]!='\0'){write_dat(tab7[i]);i++;} }else if(chang>11){ i=0;while(tab9[i]!='\0'){write_dat(tab9[i]);i++;} }else if(chang>-1){ i=0;while(tab10[i]!='\0'){write_dat(tab10[i]);i++;} }write_dat(tab3[11]);write_dat(tab3[fen/10]);write_dat(tab3[fen%10]);write_dat(tab3[10]);write_dat(tab3[miao/10]);write_dat(tab3[miao%10]);write_dat(tab3[12]);write_dat(tab3[xiaoshu%10]);write_dat(tab3[11]);write_dat(tab3[num/10]);write_dat(tab3[num%10]);write_dat(tab3[12]);write_dat(tab3[xiaoshu%10]); }void disp7(){num=24;}void disp8(){flag=1;while(flag)Key8();}void disp9(){flag=1;while(flag)Key8();}void disp10(){if(fen==0&&miao==0){BEEP=0;delay_1ms(5000);BEEP=1;}}void Key1(){if(key1==0){delay_1ms(10);if(key1==0){while(!key1){while(!key1){ }disp1(); }}}}void Key2(){if(key2==0){delay_1ms(10);if(key2==0){while(!key2){while(!key2){ }disp2(); }}}}void Key3(){if(key3==0){delay_1ms(10);if(key3==0){while(!key3){while(!key3){ }disp3(); }}}}void Key4()if(key4==0){delay_1ms(10);if(key4==0){while(!key4){while(!key4){ }disp4(); }}}}void Key5(){if(key5==0){delay_1ms(10);if(key5==0){while(!key5){while(!key5){ }disp5(); }}}}void Key8(void){if(key8==0){delay_1ms(5);if(key8==0)flag=0;}}void Key6(){if(key6==0){delay_1ms(10);if(key6==0){flag=1;while(flag){Key8();}}}}void Key7()if(key7==0){delay_1ms(10);if(key7==0){while(!key7){while(!key7){ }disp7(); }}}}void dinshi(){TMOD=0X01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;}/**主函数**/void main(){ uchar i;dinshi();icd_init();write_cmd(0x80);i=0;while(tab1[i]!='\0'){write_dat(tab1[i]);i++;}write_cmd(0x98);i=0;while(tab5[i]!='\0'){write_dat(tab5[i]);i++;}write_cmd(0x90);i=0;while(tab8[i]!='\0'){write_dat(tab8[i]);i++;}write_dat(tab3[11]);write_dat(tab2[a/100]);write_dat(tab2[a/10%10]);write_dat(tab2[a%10]);write_dat(tab2[10]);write_dat(tab2[b/100]);write_dat(tab2[b/10%10]);write_dat(tab2[b%10]);disp8();while(1){ disp6();Key1();Key2();Key3();Key4();Key5();Key6();Key7();} }void timer0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==2){ xiaoshu--;count=0;if(xiaoshu==-1){xiaoshu=9;miao--;num--;}if(num==-1)num=23;if(miao==-1){miao=59;fen--;chang-- ;}if(fen==-1){miao=0;num=0;fen=12;}}}。

篮球比赛计时计分器

篮球比赛计时计分器

设计任务:1、显示内容,队名用英文名,3个大写字母20分队名1-A:队名2-B =xxx:xxx第x节剩余时间:XX分XX秒2、串口控制20分A+1% A队加1分,%为结束符A+2% A队加2分,%为结束符A+3% A队加3分,%为结束符B+1% B队加1分,%为结束符以此类推3、串口控制交换场地5分A-B% AB队交换4、20 分PAUSE% 计时暂停按键1-定义为PAUSE按键用ZLG7290RESTART%重新计时按键2-定义为RESTARTRESET%重新比赛按键3-定义为RESET5、存储近5场的成绩到AT24C02 格式:1-队名1队名2=90:100类推20分RECALL1% 提取存储的第1场成绩,在数码管上显示,只显示比分,串口传回队名+比分&整场结束,提示是否保存成绩,按键4-存储键按键5-放弃键15分源代码:接线说明:PSB-VCC RS-P1.0 RW-P1.1 P1.3-E INT-P3.2 TXD-P3.1 RXD-P3.0 SDA-P1.6 SCL-P1.7 I2C 总线的ABC》别接键盘的ABCD以程序为准凭记忆写出来的)主程序#include<reg51.h>#include<intrins.h>#include<string.h>#include<I2C.h>#include <ZLG7290.h>#define unchar unsigned char #define unit unsigned int #define Lcd_Bus P0#define unchar unsigned char unsigned char KeyValue,FlagINT; int ney;// 纪录第及场比赛sbit RS=P1A0;//LCD 显示屏sbit RW=P1A1;sbit E=P1A3;unchar code lcddata[]={"0123456789:"};unchar code duiming[]={'1','H','O','U',':','2','C','H','I','='};unchar bifen[7];unchar fen1;unchar fen2;unchar jie;unchar min;unchar sec;unchar control;unchar table[10];************** 延时函数***********************void delay(unsigned int t) { unsigned int i,j;for(i=0;i<t;i++) for(j=0;j<10;j++)/* ------------ 写命令到LCD ---------------------- */void write_com(unsigned char cmdcode) {//chk_busy();RS = 0; // 置零RW = 0;E = 1;Lcd_Bus = cmdcode;delay(10); // 在数据写入的时候加入适当的延时 E = 0;}/* ------------ 写数据到LCD ---------------------- */void write_data(unsigned char Dispdata){//chk_busy();RS = 1; // 写数据RW = 0;E = 1;Lcd_Bus = Dispdata;delay(10); // 在数据写入的时候加入适当的延时 E = 0;/******* 函数名称:Write_Char* 功能描述:写字符******/ void write_char(unsigned int num){// chk_busy();RS = 1;RW = 0;E = 1;Lcd_Bus = lcddata[num];E = 0;}/* ------------ 显示字符串----------------- */void hzkdis(unsigned char code *s){ while(*s>0){ write_data(*s);// 选择基本指令集 (30H )// 点设定,游标右移// 开显示控制 (无游标、不反白 )// 清除显示,并且设定地址指针为 00H //unchar duiming[]= "1-HOU:2-CHI";// 队名数组//unchar bifen[7];// 比分数组unchar k;// 记录第几场比赛void timer0init(void) {TMOD=0X21;TH0=0X31;TL0=0XB0;ET0=1;EA=1;TR0=1;//IT0=1;// EX0=1;}/***** 用作串口通信 ****/ void timer1init(void){TH1=0xf3;TL1=0XF3;SCON=0X50;EA=1;ES=1;TR1=1;}/**** 保存成绩 */void save(int ney){ s++;/* ------------ 初始化 LCD 屏 ----------------- */ /*** 用作计时***/void lcdreset() { write_com(0x30);delay(16); write_com(0x04);delay(16);write_com(0x0f); delay(16);write_com(0x01);delay(16);}(同时地址归为 )int i;unchar buff[7];// ney++;ZLG7290_Download(i,0,0,0X0A); bifen[2]=fen2/100;bifen[1]=(fen2%100-fen2%10)/10;bifen[0]=fen2%10;bifen[3]=0X1F;bifen[6]=fen1/100;bifen[5]=(fen1%100-fen1%10)/10;bifen[4]=fen1%10;for(i=0;i<7;i++){x24c02_write(i+7*ney,bifen[i]);}for(i=0;i<7;i++){buff[i]=x24c02_read(i+7*ney); delay(12);}for(i=0;i<7;i++){ZLG7290_Download(i,0,0,buff[i]);}/********** 将存储在at24c02 的数据通过串口通信发还给电脑**/ void fahuan(unsigned char k){unchar buff[7],i;for(i=0;i<10;i++){SBUF=duiming[i];while(!TI){;}TI=0;}for(i=0;i<7;i++){buff[i]=x24c02_read(i+7*k);delay(12);}for(i=0;i<7;i++){ZLG7290_Download(i,0,0,buff[i]);}for(i=6;i>3;i--){SBUF=buff[i]+48;while(!TI){;}TI=0;}SBUF=':';while(!TI){;}TI=0;SBUF=buff[2]+48;while(!TI){;}TI=0;SBUF=buff[1]+48; while(!TI){;} TI=0;SBUF=buff[0]+48; while(!TI){;} TI=0;P2=0xf0;}/**** 定时器中断用作计时**/ void timer0(void) interrupt 1 using 1 {static unchar count=0; unchar i;TH0=0X3C;TL0=0XB0; count++;if(count==20){count=0;sec--;if(sec==-1){sec=59; min--; if(min==-1) {if(jie<=3) {write_com(0x01); jie++;min=1; } else { // TR0=0;control=0; //save();}}}}/**** 主要用作显示比分**/void show_fen1(void){ write_com(0x80); hzkdis("2-CHI:1-HOU=");write_com(0x90); delay(16);write_char(fen2/ 100); delay(16);write_char((fen2%100-fen2% 10)/10); delay(16);write_char(fen2% 10); delay(16);write_char( 10 ); delay(16) ;write_char(fen1/ 100); delay(16);write_char((fen1%100-fen1% 10)/10); delay(16);write_char(fen1% 10); delay(16);}/**** 显示比分队名顺序相反**/void show_fen0(void){write_com(0x80);hzkdis("1-HOU:2-CHI=");write_com(0x90); delay(16);write_char(fen1/ 100); delay(16);write_char((fen1%100-fen1% 10)/10); delay(16);write_char(fen1% 10);write_char( 10 ); delay(16) ;write_char(fen2/ 100); delay(16); write_char((fen2%100-fen2%10)/10); delay(16);write_char(fen2% 10); delay(16);}/*** 显示时间**/void show_time(void){write_com(0x88);if(jie%10==1)hzkdis("第 1 节”);if(jie%10==2)hzkdis("第 2 节");if(jie%10==3)hzkdis("第 3 节");if(jie%10==4)hzkdis("第 4 节");write_com(0x8c);hzkdis("剩余时间");write_com(0x9a);delay(16);write_char( min / 10 );delay(16);write_char( min % 10 );delay(16);write_char( 10 );delay(16);write_char( sec / 10 );delay(16);write_char( sec % 10 );}void show(){write_com(0x80);hzkdis("是否保存成绩?”);write_com(0x90);hzkdis("y press butter 4"); write_com(0x88);hzkdis("n press butter 5 "); write_com(0x98);hzkdis(" ");}/***** 串口中断处理来自串口助手的命令*/ void chuanko() interrupt 4 {unchar i=0;unchar buff[]="wrong";while(1){ while(!RI);RI=0; if(SBUF=='%') break; table[i]=SBUF;i++;} if(table[0]=='A'&&table[1]=='+'&&table[2]=='1') fen1++;else if(table[0]=='A'&&table[1]=='+'&&table[2]=='2') {fen1++;fen1++;}else if(table[0]=='A'&&table[1]=='+'&&table[2]=='3') {fen1++;fen1++;fen1++;}else if(table[0]=='B'&&table[1]=='+'&&table[2]=='1')fen2++;else if(table[0]=='B'&&table[1]=='+'&&table[2]=='2'){fen2++;fen2++;}else if(table[0]=='B'&&table[1]=='+'&&table[2]=='3'){fen2++;fen2++;fen2++;}else if(table[0]=='A'&&table[1]=='-'&&table[2]=='B'){control=2;// 交换场地}elseif(table[0]=='P'&&table[1]=='A'&&table[2]=='U'&&table[3]=='S'&&table[4]=='E'){TRO=(~TRO);〃暂停}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='S'&&table[3]=='T'&&table[4]=='A'&&table[5]==' R'& &table[6]=='T'){TR0=0;min=11;sec=59;TR0=1;〃重新计时}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='S'&&table[3]=='E'&&table[4]=='T'){ timer0init();// TR0=0;min=11;sec=59;jie=1;fen1=0;fen2=0;TR0=1;〃重新开始write_com(0x01);control=1;}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='1'){ ZLG7290_Download(i,0,0,0X0E);fahuan(0);//shuma(1);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]=='L'& &table[6]=='2'){ fahuan(1);//shuma(2);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='3'){ fahuan(2);//shuma(3);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='4'){ fahuan(3);//shuma(4);}elseif(table[0]=='R'&&table[1]=='E'&&table[2]=='C'&&table[3]=='A'&&table[4]=='L'&&table[5]==' L'& &table[6]=='5'){ fahuan(4);//shuma(5);}else{ for(i=0;i<6;i++) {SBUF=buff[i]; while(!TI); TI=0;/**** 外部中断初始化响应按键中断**/void SystemInit(){I2C_Init();EA = 0;IT0 = 1; // 负边沿触发中断EX0 = 1; // 允许外部中断EA = 1; // 等待ZLG7290 复位完毕}/***** 外部中断函数响应各个按键**/void INT0_SVC() interrupt 0 {unchar i; ZLG7290_ReadReg(ZLG7290_Key,&KeyValue);// 显示键值DispValue(0,KeyValue); if(KeyValue==0x09) {TRO=(~TRO);//暂停} if(KeyValue==0x0a){TR0=0;min=11;sec=59;TR0=1;//重新计时} if(KeyValue==0x0b)timer0init(); write_com(0x01);TR0=0;min=11;sec=59;jie=1;fen1=0;fen2=0;control=1;TR0=1;〃重新开始} if(KeyValue==0x0c) { save(ney);ney++;timer0init();// 响应完中断记得重新初始化不然可能会出错timer1init();SystemInit();}main(){min=11;sec=59;fen1=0;fen2=0;jie=1;control=1;ney=0;timer0init();timer1init();lcdreset();SystemInit();//系统初始化while(1){if(control==1){show_fen0(); show_time();}if(control==0){show();// 比赛结束提示}if(control==2){show_fen1();// 交换场地show_time();}I2C.C标准80C51单片机模拟I2C总线的主机程序Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved.本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/#i nclude "I2C.h"//定义延时变量,用于宏l2C_Delay()un sig ned char data I2C_Delay_t;/*宏定义:I2C_Delay()功能:延时,模拟I2C总线专用*/#defi ne I2C_Delay()\{\I2C_Delay_t = (I2C_DELAY_VALUE);\ while ( --I2C_Delay_t != 0 );\/*函数:I2C_I nit()功能:I2C总线初始化,使总线处于空闲状态说明:在main()函数的开始处,通常应当要执行一次本函数*/void I2C_I nit(){I2C_SCL = 1;I2C_Delay();I2C_SDA = 1;I2C_Delay();/*函数:I2C_Start()功能:产生I2C 总线的起始状态说明:SCL处于高电平期间,当SDA出现下降沿时启动I2C总线不论SDA和SCL处于什么电平状态,本函数总能正确产生起始状态本函数也可以用来产生重复起始状态本函数执行后,I2C总线处于忙状态*/void I2C_Start(){I2C_SDA = 1;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SDA = 0;I2C_Delay();I2C_SCL = 0;I2C_Delay();} /* 函数:I2C_Write()功能:向I2C总线写1个字节的数据参数:dat:要写到总线上的数据*/ void I2C_Write(char dat){unsigned char t = 8;do{I2C_SDA = (bit)(dat & 0x80);dat <<= 1;I2C_SCL = 1;I2C_Delay();I2C_SCL = 0;I2C_Delay();} while ( --t != 0 );/*函数:I2C_Read() 功能:从从机读取 1 个字节的数据返回:读取的一个字节数据*/char I2C_Read(){char dat;unsigned char t = 8;I2C_SDA = 1; //在读取数据之前,要把SDA拉高do {I2C_SCL = 1;I2C_Delay();dat <<= 1;if ( I2C_SDA ) dat |= 0x01;I2C_SCL = 0;I2C_Delay();} while ( --t != 0 ); return dat;}/*函数:I2C_GetAck() 功能:读取从机应答位返回:0:从机应答1 :从机非应答说明:从机在收到每个字节的数据后,要产生应答位从机在收到最后 1 个字节的数据后,一般要产生非应答位*/bit I2C_GetAck(){bit ack;I2C_SDA = 1;I2C_Delay();I2C_SCL = 1;I2C_Delay();ack = I2C_SDA; I2C_SCL = 0;I2C_Delay();return ack;/*函数:I2C_PutAck() 功能:主机产生应答位或非应答位参数:ack=O:主机产生应答位ack=1 :主机产生非应答位说明:主机在接收完每一个字节的数据后,都应当产生应答位主机在接收完最后一个字节的数据后,应当产生非应答位*/void I2C_PutAck(bit ack){I2C_SDA = ack;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SCL = 0;I2C_Delay();}/*函数:I2C_Stop()功能:产生I2C 总线的停止状态说明:SCL处于高电平期间,当SDA出现上升沿时停止I2C总线不论SDA和SCL处于什么电平状态,本函数总能正确产生停止状态本函数执行后,I2C总线处于空闲状态*/void I2C_Stop(){unsigned int t = I2C_STOP_WAIT_VALUE;I2C_SDA = 0;I2C_Delay();I2C_SCL = 1;I2C_Delay();I2C_SDA = 1;I2C_Delay();while ( --t != 0 ); // 在下一次产生Start 之前,要加一定的延时} /*函数:I2C_Puts()功能:I2C总线综合发送函数,向从机发送多个字节的数据参数:SlaveAddr:从机地址(7位纯地址,不含读写位)SubAddr:从机的子地址SubMod:子地址模式,0—无子地址,1 —单字节子地址,2—双字节子地址*dat :要发送的数据Size:数据的字节数返回:0:发送成功1 :在发送过程中出现异常说明:本函数能够很好地适应所有常见的I2C 器件,不论其是否有子地址当从机没有子地址时,参数SubAddr 任意,而SubMod 应当为0*/bit I2C_Puts(unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size){// 定义临时变量unsigned char i;char a[3];// 检查长度if ( Size == 0 ) return 0;// 准备从机地址a[0] = (SlaveAddr << 1);// 检查子地址模式if ( SubMod > 2 ) SubMod = 2;// 确定子地址switch ( SubMod ){case 0: break;case 1:a[1] = (char)(SubAddr);break;case 2:a[1] = (char)(SubAddr >> 8);a[2] = (char)(SubAddr);break;default: break;}// 发送从机地址,接着发送子地址(如果有子地址的话) SubMod++;I2C_Start();for ( i=0; i<SubMod; i++ ){I2C_Write(a[i]);if ( I2C_GetAck() ){I2C_Stop(); return 1;}}// 发送数据do{I2C_Write(*dat++);if ( I2C_GetAck() ) break;} while ( --Size != 0 );//发送完毕,停止I2C总线,并返回结果I2C_Stop();if ( Size == 0 ){return 0;}else{return 1;}}/*函数:I2C_Gets()功能:I2C总线综合接收函数,从从机接收多个字节的数据参数:SlaveAddr:从机地址(7位纯地址,不含读写位)SubAddr:从机的子地址SubMod:子地址模式,0—无子地址,1 —单字节子地址, *dat :2—双字节子地址保存接收到的数据Size:数据的字节数返回:0:接收成功1 :在接收过程中出现异常说明:本函数能够很好地适应所有常见的I2C 器件,不论其是否有子地址当从机没有子地址时,参数SubAddr 任意,而SubMod 应当为0 */bit I2C_Gets(unsigned char SlaveAddr, unsigned int SubAddr, unsigned char SubMod, char *dat, unsigned int Size){// 定义临时变量unsigned char i; char a[3];// 检查长度if ( Size == 0 ) return 0;// 准备从机地址a[0] = (SlaveAddr << 1);// 检查子地址模式if ( SubMod > 2 ) SubMod = 2;// 如果是有子地址的从机,则要先发送从机地址和子地址if ( SubMod != 0 ){//确定子地址if ( SubMod == 1 ){a[1] = (char)(SubAddr);}else{a[1] = (char)(SubAddr >> 8); a[2] = (char)(SubAddr);} //发送从机地址,接着发送子地址SubMod++;I2C_Start();for ( i=0; i<SubMod; i++ ){ I2C_Write(a[i]); if ( I2C_GetAck() ) {I2C_Stop();return 1;}}//这里的l2C_Start()对于有子地址的从机是重复起始状态//对于无子地址的从机则是正常的起始状态l2C_Start();// 发送从机地址l2C_Write(a[0]+1);if ( l2C_GetAck() ){l2C_Stop();return 1;}//接收数据for (;;){*dat++ = l2C_Read();if ( --Size == 0 ){ l2C_PutAck(1); break;} l2C_PutAck(0);}//接收完毕,停止I2C总线,并返回结果l2C_Stop();return 0;}/*ZLG7290.c数码管显示与键盘管理芯片ZLG7290的标准80C51驱动程序C文件Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved.本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/ #include "I2C.h"#include "ZLG7290.h" /*函数:ZLG7290_WriteReg()功能:向ZLG7290的某个内部寄存器写入数据参数:RegAddr:ZLG7290的内部寄存器地址dat :要写入的数据返回:0:正常1:访问ZLG7290时出现异常*/bit ZLG7290_WriteReg(unsigned char RegAddr, char dat){bit b;b = I2C_Puts(ZLG7290_I2C_ADDR,RegAddr,1,&dat,1); return b;}/*函数:ZLG7290_ReadReg()功能:从ZLG7290的某个内部寄存器读出数据参数:RegAddr:ZLG7290的内部寄存器地址*dat :保存读出的数据返回:0:正常1:访问ZLG7290时出现异常*/bit ZLG7290_ReadReg(unsigned char RegAddr, char *dat){bit b;b = I2C_Gets(ZLG7290_I2C_ADDR,RegAddr,1,dat,1); return b;}/*函数:ZLG7290_cmd()功能:向ZLG7290发送控制命令参数:cmdO :写入CmdBufO寄存器的命令字(第1字节) cmdl :写入CmdBufl寄存器的命令字(第2字节) 返回:0:正常1:访问ZLG7290时出现异常*/bit ZLG7290_cmd(char cmd0, char cmd1){bit b;char buf[2];buf[0] = cmd0;buf[1] = cmd1;b = I2C_Puts(ZLG7290_I2C_ADDR,ZLG7290_CmdBuf,1,buf,2); return b; }/* 函数:ZLG7290_SegOnOff()功能:段寻址,单独点亮或熄灭数码管(或LED)中的某一段参数:seg:取值0〜63,表示数码管(或LED)的段号b:0 表示熄灭, 1 表示点亮返回:0:正常1:访问ZLG7290时出现异常说明:在每一位数码管中,段号顺序按照“ a,b,c,d,e,f,g,dp ”进行*/bit ZLG7290_SegOnOff(char seg, bit b){char cmd;cmd = seg & 0x3F;if ( b ) cmd |= 0x80;return ZLG7290_cmd(0x01,cmd);}/*函数:ZLG7290_Download() 功能:下载数据并译码参数:addr :取值0〜7,显示缓存DpRamO〜DpRam7的编号dp:是否点亮该位的小数点,0 —熄灭,1—点亮flash:控制该位是否闪烁,0—不闪烁,1—闪烁dat :取值0〜31,表示要显示的数据返回:0:正常1:访问ZLG7290时出现异常说明:显示数据具体的译码方式请参见ZLG7290的数据手册*/bit ZLG7290_Download(char addr, bit dp, bit flash, char dat){char cmd0;char cmd1;cmd0 = addr & 0x0F;cmd0 |= 0x60;cmd1 = dat & 0x1F;if ( dp ) cmd1 |= 0x80;if ( flash ) cmd1 |= 0x40;return ZLG7290_cmd(cmd0,cmd1);} /*I2C.h标准80C51单片机模拟I2C总线的主机程序头文件Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved. 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/#ifndef _I2C_H_ #define _I2C_H_#include <reg51.h>//模拟I2C总线的引脚定义sbit I2C_SCL = P1A6;sbit I2C_SDA = P"7;//定义I2C总线时钟的延时值,要根据实际情况修改,取值1〜255//SCL信号周期约为(I2C_DELAY_VALUE*4+15个机器周期#define I2C_DELAY_VALUE 12//定义I2C总线停止后在下一次开始之前的等待时间,取值1〜65535〃等待时间约为(I2C_STOP_WAIT_VALUE*8个机器周期//对于多数器件取值为 1 即可;但对于某些器件来说,较长的延时是必须的#defineI2C_STOP_WAIT_VALUE 120//I2C 总线初始化,使总线处于空闲状态void I2C_Init();void x24c02_write(unsigned char address,unsigned char info); unsigned charx24c02_read(unsigned char address); //unsigned char x24c02_read(unsigned char address);//I2C 总线综合发送函数,向从机发送多个字节的数据bit I2C_Puts(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod, char *dat, unsigned int Size);//I2C 总线综合接收函数,从从机接收多个字节的数据bit I2C_Gets(unsigned char SlaveAddr,unsigned int SubAddr,unsigned char SubMod, char *dat, unsigned int Size);#endif //_I2C_H_/*ZLG7290.h数码管显示与键盘管理芯片ZLG7290的标准80C51驱动程序头文件Copyright (c) 2005,广州周立功单片机发展有限公司All rights reserved. 本程序仅供学习参考,不提供任何可靠性方面的担保;请勿用于商业目的*/#ifndef _ZLG7290_H_#define _ZLG7290_H_#include <reg51.h> //ZLG7290 中断请求信号的引脚定义sbit ZLG7290_pi nINT = P3A2;II定义ZLG7290在I2C总线协议中的从机地址// 这是7 位纯地址,不含读写位#define ZLG7290_I2C_ADDR 0x38II定义ZLG7290内部寄存器地址(子地址)#define ZLG7290_SystemReg 0x00 II系统寄存器#define ZLG7290_Key 0x01 II 键值寄存器II#define ZLG7290_RepeatCnt 0x02 II 连击次数寄存器II#define ZLG7290_FunctionKey 0x03 II 功能键寄存器#define ZLG7290_CmdBuf 0x07 II 命令缓冲区起始地址#define ZLG7290_CmdBuf0 0x07 II 命令缓冲区0#define ZLG7290_CmdBuf1 0x08 //命令缓冲区 1//#define ZLG7290_FlashOnOff 0x0C //闪烁控制寄存器#define ZLG7290_ScanNum 0x0D //扫描位数寄存器#define ZLG7290_DpRam 0x10 // 显示缓存起始地址#define ZLG7290_DpRam0 0x10 //显示缓存0/#define ZLG7290_DpRam10x11 //显示缓存 1#define ZLG7290_DpRam2 0x12 //显示缓存 2#define ZLG7290_DpRam3 0x13 //显示缓存 3#define ZLG7290_DpRam5 0x15 //显示缓存 5#define ZLG7290_DpRam6 0x16 //显示缓存 6#define ZLG7290_DpRam7 0x17 //显示缓存7//向ZLG7290的某个内部寄存器写入数据bit ZLG7290_WriteReg(unsigned char RegAddr, char dat);//从ZLG7290的某个内部寄存器读出数据bit ZLG7290_ReadReg(unsigned char RegAddr, char *dat);//向ZLG7290发送控制命令bit ZLG7290_cmd(char cmd0, char cmd1);//段寻址,单独点亮或熄灭数码管(或LED)中的某一段bit ZLG7290_SegOnOff(char seg, bit b);//下载数据并译码bit ZLG7290_Download(char addr, bit dp, bit flash, char dat);〃闪烁控制指令(Fn应当是字节型)//Fn 的8 个位分别控制数码管的8 个位是否闪烁,0-不闪烁,1-闪烁#define ZLG7290_Flash(Fn) ZLG7290_cmd(0x70,(Fn))#endif //_ZLG7290_H_#include <reg51.h>#include <intrins.h>#include <I2C.h>//sbit dula=P2A6;//sbit wela=P2A7; unsigned char j,c;void de(unsigned char i) // 延时程序{for(j=i;j>0;j--)for(c=125;c>0;c--);}/*24C02 读写驱动程序*/void flash()// 短时间的延时,几微秒左右{ ; ;}void init() //24c02 初始化子程序{I2C_SCL=1;flash();I2C_SDA=1;flash();}void start() // 启动I2C 总线{I2C_SDA=1;flash();I2C_SCL=1;flash();I2C_SDA=0;flash();// scl=0;// flash();}void stop() // 停止I2C 总线{I2C_SDA=0;flash();I2C_SCL=1;flash();I2C_SDA=1;flash();}void writex(unsigned char j) // 写一个字节{ unsigned char i,temp;temp=j;for (i=0;i<8;i++){ temp=temp<<1; I2C_SCL=0; flash(); I2C_SDA=CY; flash(); I2C_SCL=1; flash();}I2C_SCL=0;flash();I2C_SDA=1;flash();} unsigned char readx() // 读一个字节{unsigned char i,z;I2C_SCL=0;flash();I2C_SDA=1;for (i=0;i<8;i++){ flash(); I2C_SCL=1; flash();if (I2C_SDA==1) j=1; else j=0;z=(z<<1)|j;// 先左移,然后在最低位读入值I2C_SCL=0;}flash();return(z);}void clock() //I2C 总线时钟响应{unsigned char i=0;I2C_SCL=1;flash();while ((I2C_SDA==1)&&(i<255))i++;I2C_SCL=0;flash();//////// 从24c02 的地址address 中读取一个字节数据///// unsigned charx24c02_read(unsigned char address) {unsigned char i; start();writex(0xa8);//A1 A2 A3 全部低电平// clock();writex(address);clock();start(); writex(0xa9);clock(); i=readx();stop(); de(10);return(i); }////// 向24c02 的address 地址中写入一字节数据info///// void x24c02_write(unsigned char address,unsigned char info) {EA=0;start(); writex(0xa8);clock(); writex(address);clock(); writex(info);clock();stop();de(50);。

篮球赛计时计分器

篮球赛计时计分器

目录一设计任务 (4)二设计要求 (4)三系统设计方案 (4)系统构成框图 (4)四器件选择 (4)五球赛计时计分器的工作原理过程 (5)六各部件基本功能介绍 (6)计时电路的工作原理 (6)计分电路的工作原理 (7)赛程结束报警 (8)各部件功能图 (9)七篮球赛计时计分器原理图及程序 (9)篮球赛计时计分器程序流程图 (10)计分电路原理图 (11)计时电路原理图 (12)篮球赛计时计分器程序代码 (13)二篮球计时计分器设计一 设计任务设计并制作一个用于赛场的篮球赛计时计分器。

二 设计要求1 能记录整个赛程的比赛时间,并能修改比赛时间﹑暂停比赛时间。

2 能随时刷新甲﹑乙两队在整个赛程中的比分。

3 中场交换比赛场地时,能交换甲﹑乙两队比分的位置。

4 比赛时间结束时,能发出报警指令。

三 系统设计方案系统构成框图基于单片机系统的篮球赛计时计分器的系统构成框图如图所示。

四 器件选择本系统在设计过程中主要选取了以下一些器件: 单片机:8751计时显示复位晶振赛程时间 设置键盘8751CD4094 计分显示74ls21赛程比分 调整键盘球赛计时计分器系统图4511●四—七段BCD译码芯片:CD4511●并行/串行转换芯片:CD4094●四输入与门:74LS21●显示器件:7段共阴LED显示器五球赛计时计分器的工作原理过程整个篮球赛计时计分器的工作过程如下:首先在比赛之前,接通电源,系统自动复位此时计时电路与计分电路的共阴极数码管全部显示为0000和000 000;任何我们按计时电路中的K5按键来设置比赛时间的十位数,例如比赛时间上半场为20分钟,则通过K5键,使数码管1显示“2”即可;再按K6键,设置比赛时间的个位数,使数码管2显示“0”即可。

一般比赛时间为40分钟,所示只需按K5显示4,按K6显示0即可。

时间设置好时,等待赛程开始,当裁判吹响开始哨声时,立即按K7键,启动计时,这时计时电路便工作,计时采用倒计时方式,即从20分钟减为0分钟表示上半场结束。

篮球计时记分

篮球计时记分

一设计总体思路篮球计时记分系统的计时部分包括每节比赛的12分钟,以及每次进攻的24秒。

这两个模块可以利用12进制,60进制,以及24进制的减法计数器来表示。

用一个四位的循环移位寄存器连接四个LED来表示比赛的四个赛节。

计分模块可以使用2个可逆计数器来分别表示双方的比分。

其中,使用一个数据选择器来选择得分的一方。

在得分后,24秒的计数器需要清零,以表示下一次进攻的开始。

程序总体框图为:二单元电路设计2.124秒减法计数器24秒减法计数器是用来显示每一次进攻的时间。

根据实际比赛需要,在每一次得分后,无论24秒是否结束计数器都要清零。

若在24秒内没有打完一次进攻,则需要在24秒结束后发出报警信号。

为了实现这个目的,所以将得分器的输出信号作为24秒计数器的清零端。

当CLK有效时进行减法计数,CR等于1时整个计数器清零,EN等于1时计数器暂停计数。

当计数器减到0之后,CO输出一个高电平,即报警信号。

程序可以表示为:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY c24 ISPORT( clk : IN STD_LOGIC;cr : IN STD_LOGIC;en : IN STD_LOGIC;co : OUT STD_LOGIC;q1 : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);y10: OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END c24;ARCHITECTURE a OF c24 ISSIGNAL bcd1n : STD_LOGIC_VECTOR (3 DOWNTO 0);SIGNAL vcd10n : STD_LOGIC_VECTOR (3 DOWNTO 0); BEGINPROCESS (clk,cr)BEGINIF (cr = '0') THENbcd1n <= "0000";ELSIF (clk'EVENT AND clk = '1') THENIF ((bcd1n=0) and (vcd10n=1 or vcd10n=2)) THENbcd1n<="1001";ELSEIF ((bcd1n=0) and vcd10n=0 ) THENbcd1n <= "0011";else IF (en='1') THENbcd1n <= bcd1n - 1;ELSE bcd1n <= bcd1n;END IF;END IF;END IF;END IF;END PROCESS;q1 <= bcd1n;y10<=vcd10n;PROCESS (clk, cr)BEGINIF (cr = '0')THENvcd10n<="0000";ELSIF (clk'EVENT AND clk = '1') THENif(vcd10n=0 and bcd1n=0)thenvcd10n<="0010";elsIF (en='1'and bcd1n=0) THENvcd10n <= vcd10n - 1;ELSEvcd10n <= vcd10n;END IF;END IF;END PROCESS;PROCESS (bcd1n,vcd10n)beginif (bcd1n=0 and vcd10n=0) thenco<='1';else co<='0';END IF;END PROCESS;END A;仿真波形如下:2.212进制减法计数器这个计数器用来表示每一节比赛的分钟位,它的时钟脉冲应由前一个60进制计数器的CO提供。

篮球计时记分操作说明

篮球计时记分操作说明

篮球计时记分操作说明一、引言篮球比赛中的计时记分系统是比赛的核心组成部分,对于保证比赛的公正性和准确性至关重要。

本文将详细阐述篮球计时记分系统的操作流程和注意事项,帮助相关工作人员更好地理解和掌握该系统。

二、操作流程1、开场准备:在比赛开始前,计时员需要检查记分板和计时器是否工作正常,确认比分初始值为0。

同时,要与裁判员确认比赛时间规则和暂停次数。

2、比赛开始:当裁判员吹响比赛开始的哨声时,计时员需要按下计时器开始按钮,让比赛计时开始。

3、计时操作:每场比赛有四个计时器,分别对应四个节。

在每个节的比赛开始和结束时,计时员需要手动按下开始和结束按钮。

同时,裁判员会在每个节开始和结束时吹哨,提供清晰的时间点。

4、暂停操作:当球队请求暂停时,计时员需要记录暂停次数,并在记分板上更新比分。

同时,需要与裁判员确认暂停时间是否超出规定时间。

5、比赛结束:当裁判员吹响比赛结束的哨声时,计时员需要立即停止计时器,并确认比赛时间是否超出规定时间。

如果比赛时间未超出规定时间,则比赛结束;否则,需要进行加时赛。

6、加时赛操作:如果需要进行加时赛,计时员需要在记分板上更新比分,并重新开始计时器。

加时赛的规则和正常比赛相同。

7、赛后整理:比赛结束后,计时员需要将比赛数据整理保存,以便后续分析和统计。

三、注意事项1、准确性:计时员需要时刻保持注意力集中,确保准确记录比赛时间和比分变化。

2、公正性:在处理暂停、犯规等情况下,计时员需要遵循裁判员的判断,保证比赛的公正性。

3、及时性:计时员需要在规定时间内完成各项操作,如暂停记录、比分更新等,确保比赛的顺利进行。

4、稳定性:在比赛过程中,计时员需要保持稳定的心态,应对突发情况,如设备故障、比分争议等。

5、培训与沟通:计时员需要定期参加培训,熟悉比赛规则和操作流程。

同时,要加强与裁判员和其他工作人员的沟通协作,确保比赛过程的顺利进行。

6、预防与处理:在比赛前,计时员需要对设备进行仔细检查,预防可能出现的问题。

篮球计分器FPGA附程序讲课教案

篮球计分器FPGA附程序讲课教案

篮球计分器F P G A附程序单片机接口实验篮球计分器的设计姓名: 苗茂宇班级: 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概述 (3)1.1.4. 总结 (4)1.2. FPGA简介 (4)1.2.1. FPGA概述 (4)1.2.2. FPGA原理 (5)1.3. LCD1602 (6)1.4. 产品现状及发展 (7)1.5. 总体设计要求 (8)1.5.1. 设计流程 (8)1.5.2. 设计要求 (8)1.6. 本章小结 (8)2. 实验方案设计 (9)2.1. 分频模块 (9)2.2. 计时模块 (10)2.3. 24秒计时模块 (12)2.4. 计分模块 (14)2.5. lcd驱动模块 (15)2.6. 本章小结 (22)3. 实验结论 (22)4. 结束语 (23)参考文献 (24)附录 1 (25)摘要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 design of 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, good real-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.EDA简介1.1.1.EDA定义EDA是电子设计自动化(Electronic Design Automation)的缩写。

篮球赛计时计分器课程设计

篮球赛计时计分器课程设计

篮球赛计时计分器课程设计目录第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个部分:信息输入、信息处理、显示输出。

单片机毕业设计-篮球比赛倒计时计分器(论文+外文翻译+程序)

单片机毕业设计-篮球比赛倒计时计分器(论文+外文翻译+程序)

目录第1章引言 (I)1.1背景知识介绍 (3)1.2 设计意义 (2)1.3 设计目的 (3)第2章系统硬件介绍 (3)2.1 MCS-51单片机简述 (4)2.1.1单片机AT89C51简介 (4)2.1.2 主要特性 (7)2.1.3 管脚说明 (7)2.1.4 芯片擦除 (9)2.1.5 空闲节电模式 (9)2.1.6 掉电模式 (10)2.1.7 程序储存器的加密 (11)2.1.8 AT89C51的极限参数 (11)2.2 显示器及其接口 (12)2.2.1显示器介绍 (12)2.2.2结构与原理 (13)2.2.3 LED显示器显示方式 (15)2.2.4 LED显示器接口实例 (17)2.3 CD4511芯片介绍 (19)2.4 CD4094芯片介绍 (21)2.5 74LS21芯片介绍 (22)2.6 报警器 (23)2.6.1报警器的分类 (23)2.6.2报警器工作原理 (23)第3章硬件电路设计 (24)3.1Protel99软件介绍 (24)III3.1.1 关于EDA技术与Protel99简要介绍 (24)3.1.2 Protel99界面及功能简述 (25)3.1.3 Protel99设计电路步骤 (26)3.2系统方案设计 (27)3.2.1系统构成框图 (27)3.2.2器件选择 (28)3.2.3基本功能介绍 (28)3.3硬件总体设计 (30)3.4 计时电路部分 (32)3.4.1.振荡电路 (32)3.4.2计时电路原理 (33)3.4.3计分电路原理图 (34)3.4.4 计时电路的工作原理 (35)3.5计分电路部分 (35)3.5.1 串行接口工作原理 (36)3.5.2比分校正控制电路 (37)3.5.3计分电路原理图 (38)3.5.4 计分电路的工作原理 (39)3.6球赛计时计分器的工作过程 (40)3.7硬件电路PCB板图 (41)第4章软件编程及调试 (42)4.1开发环境介绍 (42)4.1.1汇编语言特点简介 (42)4.1.2开发软件介绍 (43)4.2软件设计 (44)4.2.1 编程设置及总流程框图 (44)4.2.2主要模块说明 (46)4.3系统调试 (47)4.3.1软件调试 (47)4.3.2仿真调试 (49)第5章结论 (50)IV参考文献 (52)致谢 (53)附录 (54)外文资料原文 (60)摘要篮球比赛计时计分器是为了解决篮球比赛时计分与计时准确的问题。

EDA课程设计——篮球球比赛计分器_2

EDA课程设计——篮球球比赛计分器_2

<<电子设计自动化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单片机篮球计分器毕业设计

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。

篮球比赛计时计分器程序

篮球比赛计时计分器程序
#define NIXIE65
#define NIXIE76
#define NIXIE87
sbit IO_Beep=P3^0;
sbit IO_LED=P3^1;
sbitIO_Key1=P1^0; //定义按键输入口
sbitIO_Key2=P1^1;
sbitIO_Key3=P1^2;
sbitIO_Key4=P1^3;
unsigned int R_SetTimeCount;
//--------------------------
void Delay(unsigned int number) //延时函数
{
unsigned int R_count_;
for(R_count_=0;R_count_<=number;R_count_++)
sbitIO_Key5=P1^4;
sbitIO_Key6=P1^5;
sbitIO_Key7=P1^6;
sbitIO_Key8=P1^7;
#define KEY10
#define KEY21
#define KEY32
#define KEY43
#define KEY54
#define KEY65
#define KEY76
R_DisplayNUM[5]=R_Minute%100/10;
R_DisplayNUM[4]=R_Minute%10;
}
void display(void)//显示数据函数
{
R_DisplayPoint++;
if(R_DisplayPoint>7)
{
R_DisplayPoint=0;
}
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/******************** //版权和版本声明
* 文件标识:
* 摘要:
* 当前版本:
* 作者:输入作者(或修改者)名字
* 完成日期: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();
}
}
/*************************************************/。

相关文档
最新文档