单片机篮球计分牌C语言程序

合集下载

基于51单片机篮球记分牌设计

基于51单片机篮球记分牌设计

基于51单片机篮球记分牌设计(数码管显示)#include<reg51.h>unsigned char a1,b1,c1,a2,b2,c2,d1,d2,e3,f3,g3,h3,i,j,flag10,flag11,flag12;unsigned char af,bf,time=24,cnt1,cnt2;signed int time1=720;sbit aj=P1^0;sbit bj=P1^1;sbit cn=P1^2;sbit bn=P1^3;sbit en=P3^2;sbit fn=P3^3;sbit hn=P3^0;sbit gn=P3^4;sbit set=P1^4;sbit tj=P1^5;sbit tz=P1^6;sbit ot=P1^7;bit flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6,flag7,flag8,flag9; unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x79,0x3e};void delay(unsigned char i); void display();void sw();void abbfen();void esnny();void esnne();void esnns();void esfzw();void hfwz();void ot1();void setj ();void timej ();void timez ();void main(){TMOD=0x11;TH0=0x3c;TL0=0xb0;TH1=0x3c; TL1=0xb0; EA=1;ET0=1;ET1=1; while(1) {display();abbfen();sw();esnny();esnne();esnns();esnne();esfzw();hfwz();timej ();timez ();setj ();ot1();}}void delay(unsigned char i ) {unsigned char j,k;for (k=0;k<i;k++)for (j=0;j<10;j++);}void display(){a1=af/100;b1=af%100/10;c1=af%100%10;P2=0x00;P0=s[a1];delay(2);P2=0x01;P0=s[b1];delay(2);P2=0x02;P0=s[c1];delay(2);P2=0x03;P0=s[10];delay(2);a2=bf/100;b2=bf%100/10; c2=bf%100%10;P2=0x04;P0=s[10];delay(2);P2=0x05;P0=s[a2];delay(2);P2=0x06;P0=s[b2];delay(2);P2=0x07;P0=s[c2];delay(2);e3=time1/60/10;f3=time1/60%10; g3=time1%60/10; h3=time1%60%10;P2=0x08;P0=s[e3];delay(2);P2=0x09;P0=s[f3];delay(2);P2=0x0a;P0=s[g3];delay(2);P2=0x0b;P0=s[h3];delay(2);d1=time/10;d2=time%10;P2=0x0c;P0=s[d1];delay(2);P2=0x0d;P0=s[d2];delay(2);}void abbfen(){if(aj==0){delay(10);}if(aj==0){flag1=1;}if(flag1==1&&aj==1) {flag1=0;af++;}}void sw(){delay(10);}if(bj==0){flag2=1;}if(flag2==1&&bj==1) {flag2=0;bf++;}}void esnny(){if(cn==0){delay(10);}if(cn==0){flag3=1;}if(flag3==1&&cn==1) {flag3=0;TR0=1;}}void esnne(){{delay(10);}if(bn==0){flag4=1;}if(flag4==1&&bn==1) {flag4=0;TR0=0;}}void esfzw(){if(en==0){delay (10);}if(en==0){flag5=1;}if(flag5==1&&en==1) {flag5=0;TR1=1;}}void esnns(){if (fn==0){delay (10);}if(fn==0){flag6=1;}if(flag6==1&&en==1) {flag6=0;TR1=0;}}void hfwz(){if (gn==0){delay (10);}if(gn==0){flag7=1;}if(flag7==1&&gn==1) {flag7=0;time=24;}}void setj (){if (set==0){delay (10);}if(set==0){flag10=1;}if(flag10==1&&set==1) { flag10=0;j++;if (j==3) j=0;}}void ot1(){if (ot==0){delay (10);}if(ot==0){flag12=1;}if(flag12==1&&ot==1){flag12=0;time1=300;}}void timej (){if (tj==0){delay (10);}if(tj==0){flag8=1;}if(flag8==1&&tj==1){flag8=0;switch(j){case 0x00:break;case 0x01:time1--; break;case 0x02:time1=time1-60;break; default:break;}}void timez (){if (tz==0){delay (10);}if(tz==0){flag9=1;}if(flag9==1&&tz==1){flag9=0;switch(j){case 0x00:break;case 0x01:time1++; break;case 0x02:time1=time1+60;break; default:break;}}}void int1()interrupt 1 {TH0=0x3c;TL0=0xb0;cnt1++;if(cnt1==21){cnt1=0;time1--;}if(time1==-1){time1=720;}}void int3()interrupt 3 {TH1=0x3c;TL1=0xb0;cnt2++;if(cnt2==21){cnt2=0;time--;if(time==-1){time=24;hn=0;hn=1;}}}。

篮球计分器程序

篮球计分器程序

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

单片机课程设计篮球比赛计分牌的设计

单片机课程设计篮球比赛计分牌的设计
操作简便:易于操作,便于裁判员使用
尺寸:适合篮球比赛场地,易于安装和拆卸
显示:清晰可见,易于读取分数和计时信息
设计:简洁大方,易于操作
颜色:鲜艳醒目,易于识别
显示清晰:能够清晰地显示比赛分数、时间等信息
操作简便:操作简单,易于使用
稳定性高:能够长时间稳定运行,避免故障
易于维护:易于维护和维修,降低维护成本
单片机最小系统包括:单片机、电源、晶振、复位电路
晶振:为单片机提供稳定的时钟信号
复位电路:在系统启动时,将单片机复位到初始状态
电源:为单片机提供稳定的电源电压
单片机最小系统设计需要考虑的因素:稳定性、可靠性、成本、可扩展性等
显示模块类型:LCD或LED
显示内容:比分、时间、犯规次数等
接口设计:I2C、SPI或其他
显示模块控制:通过单片机控制显示内容
显示模块接口:与单片机连接
显示模块尺寸:根据实际需求选择
功能:接收用户输入,控制计分牌的显示
应用实例:篮球比赛计分牌、电子秤、遥控器等
设计要点:按键的布局、微控制器的选择、显示模块的接口
模块组成:按键、微控制器、显示模块
电源模块的作用:为计分牌提供稳定的电源
电源模块的组成:电源适配器、电源线、电源开关等
电源模块的选择:根据计分牌的功率需求选择合适的电源模块
电源模块的安装:按照说明书进行安装,确保电源模块与计分牌的连接正确、牢固
电源滤波:使用电源滤波器,减少电源噪声干扰
屏蔽设计:使用金属外壳,屏蔽电磁干扰
接地设计:良好的接地设计,减少静电干扰
软件抗干扰:使用软件滤波算法,减少信号噪声干扰
C语言:广泛应用,易于理解和学习
功能测试:测试计分牌的各项功能,如计分、计时等

单片机篮球计分牌C语言程序

单片机篮球计分牌C语言程序
sbit P3_7 = P3^7;
/********延时函数******/
void delay(uchar z)
{
uchar x,y;
for(x=z;x&gt;0;x--)
for(y=110;y&gt;0;y--);
}
/* 甲队分数显示函数*/
void display_1(uint z)
}
if(~K1)
{
delay(10);
if(~K1)
{
delay(10);
fen1 = fen1+2;
}while(~K1);
}
/* if(~K2)
{
delay(10);
if(~K2)
{
delay(10);
fen1 = fen1+3;
}while(~K2);
} */
#include&lt;reg52.h&gt;
#define uchar unsigned char
#define uint unsigned int
unsigned t = 0x3cb0;
sbit K0 = P1^0;
sbit K1 = P1^1;
sbit K2 = P1^2;
sbit K3 = P1^3;
sbit K4 = P1^4;
sbit K5 = P1^5;
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
TMOD |= 0x01;
}
/* 赋初值*/

单片机篮球记分牌

单片机篮球记分牌

注:实际产品需要增加时钟、复位电路。

#include "reg51.h" //51头文件#define KEY_IO P0 //键盘接口#define Lcd_Port P2 //定义数据端口sbit Lcd_RS = P3^5; //定义和LCD的连接端口,写数据指令端口sbit Lcd_RW = P3^6; //读写端口sbit Lcd_E = P3^7; //使能端口sbit Lcd_Busy = P2^7; //读忙端口char aa[10]={'0','1','2','3','4','5','6','7','8','9'};int score_a=0,score_b=0; //用于存储双方比分char dis_buff[4]={'0','0','0','0'}; //用于存放两队比分的十位、个位int temp,keytemp1,keytemp2; //临时变量//延时函数void delay(int t){int i,j; //延时变量for(i=0;i<t;i++) //t表示循环次数for(j=0;j<100;j++);}// 读忙信号判断void Read_Busy(void){int k=255;Lcd_Port=0xff;Lcd_RS = 0;Lcd_RW = 1;Lcd_E = 1;while((k--)&&(Lcd_Busy));Lcd_E = 0;}// 写指令函数void Write_Comm(int lcdcomm){Read_Busy( ); //先读忙Lcd_RS = 0; //端口定义为写指令Lcd_RW = 0; //端口写入使能Lcd_E = 1; //端口输入总使能Lcd_Port=lcdcomm; //数据端送指令Lcd_E = 0; //端口输入总禁止}//写数据函数void Write_Chr(int lcddata){Read_Busy( ); //先读忙Lcd_RS = 1; //端口写数据使能Lcd_RW = 0; //端口写入使能Lcd_E = 1; //端口总输入使能Lcd_Port = lcddata; //数据端口送数据Lcd_E = 0; //端口总输入禁止}//初始化LCDvoid Init_LCD(void){delay(2); //稍微延时,等待LCD进入工作状态 Write_Comm(0x38); //8位2行5*8Write_Comm(0x0c); //显示开/关,光标开闪烁开Write_Comm(0x01); //清显示Write_Comm(0x06); //文字不动,光标右移Write_Comm(0x02); //光标归位}//LED显示动态扫描函数void display(){dis_buff[0]=score_a/10; //送score_a的十位到显示数组里面dis_buff[1]=score_a%10; //送score_a的个位到显示数组里面dis_buff[2]=score_b/10; //送score_b的十位到显示数组里面dis_buff[3]=score_b%10; //送score_b的个位到显示数组里面Write_Comm(0x83); //确定显示位置,第1行第3列Write_Chr('T');Write_Chr('e');Write_Chr('a');Write_Chr('m');Write_Chr(' ');Write_Chr('A');Write_Chr(':');Write_Chr(' ');Write_Chr(aa[dis_buff[0]]); //送显A队比分十位Write_Chr(aa[dis_buff[1]]); //送显A队比分个位Write_Comm(0xC3); //确定显示位置,第2行第3列Write_Chr('T');Write_Chr('e');Write_Chr('a');Write_Chr('m');Write_Chr(' ');Write_Chr('B');Write_Chr(':');Write_Chr(' ');Write_Chr(aa[dis_buff[2]]); //送显B队比分十位Write_Chr(aa[dis_buff[3]]); //送显B队比分个位}//外部中断0中断服务子函数void ext0(void) interrupt 0 using 0 //通过与门触发中断来扫描按键{EX0=0; //关闭外部中断KEY_IO=0x03; //反转法第一步,置键盘接口0000 0011 keytemp1=(~KEY_IO)&0x03; //临时存储按键行状态到keytemp1低4位 delay(1);KEY_IO=0xF0; //反转法第二步,置键盘接口1111 0000 keytemp2=(~KEY_IO)&0xF0; //临时存储按键列状态到keytemp2高4位 temp= keytemp1|keytemp2; //将按键行列号存入tempswitch(temp) //根据按键行列号判断{case 0x11: //按键在第1行第1列score_a++; //A队比分加1if(score_a==100)score_a=99;break;case 0x21: //按键在第1行第2列score_a+=2; //A队比分加2if(score_a>=100)score_a=99;break;case 0x41: //按键在第1行第3列score_a+=3; //A队比分加3if(score_a>=100)score_a=99;break;case 0x81: //按键在第1行第4列if(score_a!=0)score_a--; //A队比分减1break;case 0x12: //按键在第2行第1列score_b++; //B队比分加1if(score_b==100)score_b=99;break;case 0x22: //按键在第2行第2列score_b+=2; //B队比分加2if(score_b>=100)score_b=99;break;case 0x42: //按键在第2行第3列score_b+=3; //B队比分加3if(score_b>=100)score_b=99;break;case 0x82: //按键在第2行第4列if(score_b!=0)score_b--; //B队比分减1break;}do //等待按键释放,防止按键抖动{KEY_IO=0x03;temp=(~KEY_IO)&0x03;}while(temp!=0);}//主函数void main(){Init_LCD( );EA=1; //开全局中断EX0=1; //开外部中断0IT0=0; //外部中断0低电平触发while(1){KEY_IO=0x03; //赋初值0000 0011display(); //送显EX0=1; //开外部中断0,即可以按键扫描 }}。

基于单片机的篮球计分器设计c语言

基于单片机的篮球计分器设计c语言

基于单片机的篮球计分器设计(C语言)篮球比赛是一项充满激情和竞争的体育运动,而比赛中的计分系统则是至关重要的。

为了简化裁判员的工作,提高比赛的进行效率,我们需要设计一个基于单片机的篮球计分器。

本文将基于C语言来设计一个简单而实用的篮球计分器,并且通过详细的步骤和代码解释来展示整个过程。

一、需求分析在设计篮球比赛计分器时,我们首先要明确需求,包括但不限于:1. 计分功能:能够记录两支球队的得分,并且在比赛进行中能够进行加减分操作。

2. 计时功能:能够记录比赛的时间,并在比赛开始和结束时进行提示。

3. 显示功能:能够在LED或LCD上清晰地显示比赛的得分和时间。

4. 操作功能:提供简单的按钮操作来实现计分和计时的控制。

二、硬件设计基于需求分析,我们需要准备以下硬件设备:1. 单片机:选择一款常见的单片机,如STC89C52或者Arduino等。

2. 显示器件:可以选择LED数码管、LCD液晶显示器等。

3. 按钮开关:用于进行得分和时间的控制操作。

4. 电源供应:提供单片机和显示器件所需的电源。

三、软件设计1. 硬件连接:将单片机与显示器件、按钮开关进行合理的连接。

2. 编码开发:编写C语言程序,实现计分、计时和显示功能。

3. 调试测试:通过单片机仿真器或者实际硬件进行测试,确保程序的稳定可靠。

4. 优化完善:根据测试结果进行程序的优化和完善,确保篮球计分器能够满足实际比赛需求。

四、C语言程序设计在C语言程序设计过程中,我们需要着重考虑以下几个方面:1. 硬件端口定义:定义单片机与显示器件、按钮开关的硬件端口连接。

2. 初始化设置:初始化单片机和显示器件,包括显示模式、按键响应等。

3. 计分功能实现:编写加减分的逻辑判断和显示更新代码。

4. 计时功能实现:编写定时器中断和计时显示更新代码。

5. 用户操作响应:编写按钮按键中断的响应代码,实现得分和时间的控制。

五、程序调试在程序编写完成后,需要进行充分的调试测试,以确保程序的稳定性和可靠性。

单片机c51篮球计时计分器课程设计

单片机c51篮球计时计分器课程设计

单片机微机原理及应用课目:篮球记分牌的设计学院:电气工程学院班级:自动化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)软件调试及组装软件的编程调试首先要抓住计分和计时两大模块,在这两大模块成功的基础上再进行其他细小模块的组装和完善。

单片机实训篮球记分牌程序代码

单片机实训篮球记分牌程序代码
unsigned char a=0,b=0,ag=0,bg=0;
unsigned char miao=24,go=0,qh=0;
unsigned int bittime=0,bitdisplay=0;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
if(qh==2)P0=Tab[bg%10];
break;
}
bitdisplay++;bittime++;
if(bitdisplay==4) {bitdisplay=0;}
if(bittime==500)
{bittime=0;
if(go)
if(miao--==0)
{go=0;miao=24;P3=0x7f;fm=1;}
switch (bitdisplay)
{
case 0:
P2=0xfe;
if(qh==0)P0=Tab[a/10];
if(qh==1)P0=Tab[miao/10];
if(qh==2)P0=Tab[ag/10];
break;
case 1:
P2=0xfd;
if(qh==0)P0=Tab[a%10];
if(qh==1)P0=Tab[miao%10];
#include<reg52.h>
//***************************数码管段代码表**********************************//
unsigned char Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x0;

篮球计分器 单片机 程序

篮球计分器  单片机  程序
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,

单片机课程设计(篮球记分器)

单片机课程设计(篮球记分器)

单片机课程设计(篮球记分器)电路图:本程序已经通过软件仿真与硬件制作,首发于:51hei,代码可任意修改,但不可用于商业目的.单片机型号是:stc89c52,晶振12 兆赫.用了3个4 为一体化的数码管.完整代码下载地址:51hei/f/lqwwe.rar#include #define uchar unsigned char#define uint unsigned intvoid delay(uchar x); //延时(时间较短)void delay1(uchar x); //延时(时间较长)void Js_Jf_Scan(void); //数码管动态扫描显示函数void Key_if(void); //A、B 两队分值处理函数void Js_50ms(void); //定时50ms 中断函数void Key_Y(void); //预置时间函数void Ptime(uchar); //时间处理函数void sound(void); //鸣笛警示函数void jiaohuan(void); //场地交换sbit CL1=P2; //B 队4 位计分数码管位控线sbit CL2=P2;sb it CL3=P2 ;sbitCL4=P2;sb it KL1=P2;// A 队4 位计分数码管位控线sbit KL2=P2 ;sbitKL3=P2;sb it KL4=P2;sb it S1=P1;//驱动4 位计时数码管位控线sbitS2=P1 ;sbit S3=P1;sb it S4=P1;sbit YK1=P1;//预置分钟的十位sbit YK2=P1;//预置分钟的个位sbit music=P1;//P1.4 接喇叭,发声,鸣笛sbit Key1=P3; //B队加分键sbit Key2=P3;//B 队减分键sbit Key3=P3;//A 队加分键sbitKey4=P3 ; //A 队减分键sbit JH=P1 ;sbit Int_Key=P3 ; //鸣笛键sbit Star=P3;//开始按钮sbit Puse=P3;//停止按钮int m=0,ms=0,mg=0; //秒钟的十位、个位以及秒钟的变量说明int fs=0,fg=0,f,fy,num=0; //分钟的十位、个位以及分钟的变量说明int g,s,b,q,sum=0; //B 队定义个十百位int g1,s1,b1,q1,sum1=0; // A 队定义个十百位int LED_Num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,}; //段码void main(void){ TMOD=0x01; //设置T0 为工作方式1,作为16 位计数器TH0=(65535-50000)/256; //设置T0 的高8 位,并且T0 的计数值为50ms TL0=(65535-50000)%256; //设置T0 的低8 位music=0; //初值喇叭不响EA=1; //。

基于C51单片机的篮球计分器设计

基于C51单片机的篮球计分器设计

基于C51单片机的篮球计分器设计题目要求:1. 设计一款能够显示篮球比分的记分牌;2. 通过加分按钮可以给A队,或B队加分;3. 设计对调功能,更换场地后,AB队分数互换;仿真截图:完整源代码:#include<reg51.h>code unsigned seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 分别对应数码管显示字形0-9int m=15,n=00,x=0,y=0,jie=2,bujin=1,zanting=0,chuzanting=0;//初始化,m、n为分、秒计时x、y为A、B两队分数,其余为中间变量sbit A_add = P3^0; // A队加分按钮sbit B_add = P3^1; // B队加分按钮sbit Time_add = P3^2; // 时间加按钮sbit Time_sub = P3^3; // 时间减按钮sbit A_sub = P3^4; // A队减分按钮sbit B_sub = P3^5; // B队减分按钮sbit pause = P3^6; // 暂停、启动按钮sbit change = P3^7; // 换场地按钮void keyScan(); //按键扫描函数void delay(int t) //延时子程序,通过参数t,可以调整暂停时间{while(t--){unsigned int i;for(i=0;i<200;i++); //设置变量i的变化范围,能调整延时的单位时间长度,i越小,延时单位时间越短,精度越高}}void display(int m,int n,int x,int y)//数码管动态刷新显示程序{if(jie==1&&bujin!=2) //中间变量jie=1时,为上半场,对p1赋值P1=0xbf; //p1=0xbf,即p1=1011111B,点亮上半场对应指示灯P2=0xfe; //数码管动态刷新显示程序p2=11111110,i为分钟P0=seg[m/10]; //刷新显示时间显示分钟十位,调用延时程序delay(1); //延时数码管的点亮P2=0xff;P0=0;P2=0xfd; //同理,分钟个位并延时点亮P0=seg[m%10];delay(1);P2=0xff;P0=0;P2=0xfb; //秒钟十位P0=seg[n/10];delay(1);P0=0;P2=0xff;P2=0xf7; //秒钟个位P0=seg[n%10];delay(1);P0=0;P2=0xff;P2=0xef; // A队分数十位P0=seg[x/10];delay(1);P2=0xff;P0=0;P2=0xdf; //A队分数个位P0=seg[x%10];delay(10);P2=0xff;P0=0;P2=0xbf; //B队分数十位P0=seg[y/10];delay(1);P0=0;P2=0xff;P2=0x7f; //B队分数个位P0=seg[y%10];delay(1);P0=0;P2=0xff;}void t0(void) interrupt 1 //调用定时器T0 基本计时单位秒中断{int i;TH0=0xb1; //利用定时器T0,送入计数初值TH0,TL0TL0=0x10; //定时器定时单位为20msi++;if(i==50) //利用中间变量i,令i的值为50 50*20ms=1秒{if(n==0) //分钟与秒时间的调整当秒减到0后分钟减1{n=60;if(m > 0) m--;}n--; //实现1秒计时i=0;}}void main() //主程序{TMOD=0x01; //设置定时器工作方式EA=1;ET0=1;TH0=0xb1; //定时计送计数初值,EA=1,开中断p3口电平拉高TL0=0x10; //p1-0x7f,上半场指示灯点亮TR0=1;P3=0xff;P1=0x7f;while(1) //通过while(1),反复调用循环体内子程序{display(m,n,x,y); //调用动态刷新显示程序keyScan(); //按键处理函数if(m <=0 && n<=0) //时间结束了{ET0=0; //关闭中断,停止计时TR0 = 0;}}}void keyScan() //按键扫描函数{int temp; //中间变量temp,检测到有按键按下时交换A,B两队分数if(A_add==0) //当检测到A队加分按键按下,对应加分{delay(1); //调用延时子程序,实现按键抖动功能,即当检测到按键按下时,延时,按键仍按下,说明非抖动,A队对应加分if(A_add==0){x++;}}if(B_add==0) //B队加分键被按下{delay(1);if(B_add==0){y++;}}if(A_sub==0) //A队减分{delay(1);if(A_sub==0){if(x>=1) x--;}}if(B_sub==0) //B队减分{delay(1);if(B_sub==0){if(y>=1)y--;}}if(Time_add==0) //时间增加按钮{delay(10);if(Time_add==0){n++;if(n==60){m++;n=1;}}}if(Time_sub==0) //时间减少{delay(10);if(Time_sub==0){if(!(m == 0 && n == 0)) //防止被减成了负数{if(n <= 0){n = 60;m--;}n--;}}}if(change==0) //交换场地{delay(1);if(change==0){temp=x; //两个分数值对调x=y;y=temp;}}if(pause==0) //检测到暂停键按下是,令EA =0关闭中断{delay(1);if(pause==0){if(EA == 0){EA = 1;}else{EA = 0;}}}//当有按键没被松开时不要接着往下执行,防止按键被重复检测while(A_add ==0 || B_add ==0 || A_sub ==0 || B_sub==0 || pause==0 || change==0){display(m,n,x,y); //等待按钮被松开}}Proteus仿真图:。

51单片机 篮球记分牌

51单片机  篮球记分牌
while(1)
{
keyscan();
score_display();
temperature_display();
time_display();
if(mbit) play_music();
}
}
void Time0_Int() interrupt 1 using 1
while(n!=0) beep=~beep,delay_music(m); //等待节拍完成, 通过P1口输出音频(可多声道哦!)
}
}
#endif
#ifndef _key_h
#define _key_h
{
TH1=0xd8;
TL1=0xef;
n--;
}
void int2() interrupt 2
{
EX1=0;
TR0=~TR0;
mbit=~mbit;
delay_1ms(5);
EX1=1;
}
#ifndef _MYTYPE_H
#include<reg52.h>
#include"MYTYPE.h"
#include"12864.h"
#include"delay.h"
#include"ds_18b20.h"
#include"key.h"
#include"IO.h"
void score_init()
{
write_com(0x80);
0x18, 0x20, 0x15 , 0x20,
0x1C, 0x20, 0x20 , 0x20,

基于单片机的篮球计时计分器设计(C语言编程、含proteus仿真图)_课程设计

基于单片机的篮球计时计分器设计(C语言编程、含proteus仿真图)_课程设计

基于单片机的篮球计时计分器设计摘要单片机,亦称单片微电脑或单片微型计算机。

它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。

本设计是基于AT89S52单片机的篮球计时计分器,利用7段共阴LED作为显示器件。

在此设计中共接入了1个四位一体7段共阴LED显示器,2个两位一体7段共阴LED显示器,前者用来记录赛程时间,其中2位用于显示分钟,2位用于显示秒钟,后者用于记录甲乙队的分数,每队2个LED显示器显示范围可达到0~99分。

赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。

其次,为了配合计时器和计分器校正调整时间和比分,我们特定在本设计中设立了7个按键,用于设置,调整时间,启动,调整分数和暂停等功能。

采用单片机控制是这个系统按键操作使用简洁,LED显示,安装方便。

主控芯片采用AT89S52单片机,采用C语言进行编程,编程后利用Keil uVision3来进行编译,再生成的HEX文件装入芯片中,采用proteus软件来仿真,检验功能是否能够正常实现。

仿真成功后,焊接硬件电路,通过ISP下载器将hex文件烧制到单片机。

目录1. 概述 (3)1.1 背景知识介绍 (3)1.2 设计内容 (3)1.3计任务和要求 (4)1.4 设计意义 (4)2.系统总体方案及硬件设计 (5)2.1 系统总体方案设计 (5)2.2 硬件电路设计 (6)2.2.1时钟电路模块 (7)2.2.2 复位电路模块 (7)2.2.3显示模块 (8)2.2.4 报警模块 (9)2.2.5总硬件电路设计 (10)3 软件设计 (11)3.1 软件总体设计方案 (11)3.2 软件设计具体过程 (12)3.2.1延时模块设计 (13)3.2.2 数码管动态刷新显示程序 (13)3.2.3 T0中断程序 (15)3.2.4 加分子程序 (16)3.2.5减分子程序 (16)3.2.6 调整时间子程序 (17)3.2.7 半场交换比分子程序 (19)3.2.8 比赛暂停子程序 (20)3.2.9 中场指示灯程序 (21)3.2.10 主程序 (22)4 . PROTEUS仿真 (24)4.1 PROTEUS简介 (24)4.2仿真过程 (24)5. 硬件焊接与调试 (27)6.课程设计体会 (28)参考文献 (29)附1 源程序 (30)附2 系统原理图............................................................................................ 错误!未定义书签。

篮球计时计分牌 C语言

篮球计时计分牌 C语言

#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar temp;uchar seg[]="0123456789"; //0~9驱动码sbit lcden=P2^7;sbit lcdrs=P2^5;sbit lcdrw=P2^6;int h,b;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //写指令{lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) //写数据{lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){lcdrw=0;lcden=0;write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);}void disp(uint num,uint num1,uint f1,uint f2) {uchar f[3],h[3],t[2],m[2],x,y;write_com(0x80+0x05);t[0]=f1/10;t[1]=f1%10;m[0]=f2/10;m[1]=f2%10;write_data('F');write_data(0x20);write_data('A');write_data(':');write_data(seg[t[0]]);write_data(seg[t[1]]);write_data(0x20);write_data('B');write_data(':');write_data(seg[m[0]]);write_data(seg[m[1]]);write_com(0x80+0x40);f[0]=num/100;x=num%100;f[1]=x/10;f[2]=x%10;h[0]=num1/100;y=num1%100;h[1]=y/10;h[2]=y%10;write_data('A');write_data(0x20);write_data(seg[f[0]]);write_data(seg[f[1]]);write_data(seg[f[2]]);write_data(':');write_data(seg[h[0]]);write_data(seg[h[1]]);write_data(seg[h[2]]);write_data(0x20);write_data('B');}void shijian(){uchar s[2];write_com(0x80);s[0]=h/10;s[1]=h%10;write_data(seg[s[0]]);delay(20);write_data(seg[s[1]]);write_data('s');delay(20);}void stop(){TR0=0;temp=P1;while(temp!=0xbd) //停止暂停,启动单片机{temp=P1;}delay(5);while(temp!=0xbd){temp=P1;}TR0=1;}void main(){uint num,num1,f1,f2;TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;init();f1=0;f2=0;num=0; //A队分数num1=0; //B队分数h=24; //24秒b=20; //定时器连续定时20次,恰好是一秒while(1){shijian();P1=0xef;temp=P1;temp=temp&0x0f;if(temp!=0x0f){delay(5);temp=P1;temp=temp&0x0f;if(temp!=0x0f) //去抖动{temp=P1;switch(temp){case 0xee:num=num+1; disp(num,num1,f1,f2);break; //按s1,A队加一分case 0xed:num=num-1; disp(num,num1,f1,f2);break; //按s2,A队减一分case 0xeb:num1=num1+1; disp(num,num1,f1,f2);break; //按s3,B队加一分case 0xe7:num1=num1-1; disp(num,num1,f1,f2);break; //按s4,B队减一分}while(temp!=0x0f) //松手检测{temp=P1;temp=temp&0x0f;}}}P1=0xdf;temp=P1;temp=temp&0x0f;if(temp!=0x0f){delay(5);temp=P1;temp=temp&0x0f;if(temp!=0x0f) //去抖动{temp=P1;switch(temp){case 0xde:num=num+2; disp(num,num1,f1,f2);break; //按s5,A队加两分case 0xdd:num1=num1+2; disp(num,num1,f1,f2);break; //按s6,B队加两分case 0xdb:num=num+3;disp(num,num1,f1,f2);break; //按s7,A队加三分case 0xd7:num1=num1+3;disp(num,num1,f1,f2);break; //按s8,B队加三分}while(temp!=0x0f) //松手检测{temp=P1;temp=temp&0x0f;}}}P1=0xbf;temp=P1;temp=temp&0x0f;if(temp!=0x0f){delay(5);temp=P1;temp=temp&0x0f;if(temp!=0x0f) //去抖动{temp=P1;switch(temp){case 0xbb:h=24;break; //按s11,归24秒case 0xbe:stop();break; //按s9,暂停}while(temp!=0x0f) //松手检测{temp=P1;temp=temp&0x0f;}}}P1=0x7f;temp=P1;temp=temp&0x0f;if(temp!=0x0f){delay(5);temp=P1;temp=temp&0x0f;if(temp!=0x0f) //去抖动{temp=P1;switch(temp){case 0x7e:f1=f1+1; disp(num,num1,f1,f2);break;//按s13A队犯规次数加一次case 0x7d:f2=f2+1; disp(num,num1,f1,f2);break;//按s14B队犯规次数加一次case 0x7b:f1=f1-1; disp(num,num1,f1,f2);break;//按s15A队犯规次数减一次case 0x77:f2=f2-1; disp(num,num1,f1,f2);break;//按s14B队犯规次数减一次}while(temp!=0x0f) //松手检测{temp=P1;temp=temp&0x0f;}}}else disp(num,num1,f1,f2); //分数不变}}void exter0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;b=b-1;if(b==0){h=h-1;if(h<0){h=24;}b=20;}}。

单片机课程设计篮球比赛计分牌的设计

单片机课程设计篮球比赛计分牌的设计

西安文理学院机械与材料工程学院课程设计报告专业班级课程单片机课程设计题目单片机课程设计篮球比赛计分牌的设计学号学生姓名指导教师2016年11月西安文理学院机械与材料工程学院课程设计任务书学生姓名 专业班级 学 号指导教师 职 称 讲师 教研室课 程 单片机课程设计 题目篮球比赛计分牌的设计 任务与要求设计任务:以AT89S51单片机为核心,设计一个篮球比赛计分牌。

裁判控制开始、暂停、清除和两队的加分按键。

比赛每节10分钟,允许暂停,且使用不同LED 表示比赛状态。

比赛开始,按下可开始按键,绿色LED 亮,进入10分钟倒计时。

比赛期间,若暂停键按下,倒计时暂停,黄色LED 亮;当再次按下暂停按键,比赛继续进行。

当倒计时为0,比赛结束,红色LED 亮,蜂鸣器响5秒。

比赛期间,裁判可通过加分按键分别给A 队或B 队加分,每按下一次加2分。

当清除按键按下,时间与分数全部清零。

设计要求:1.完成系统的硬件电路设计与软件设计;2.采用C51语言编程;3.采用Proteus 、Keil C 等软件实现系统的仿真调试;4.设计报告要求思路清晰,结构合理,语言流畅,书写格式符合要求。

开始日期 2016.11.7 完成日期 2016.11.222016年11月3日A 队成绩倒计时开始加分加分暂停暂停B 队成绩摘要单片机,亦称单片微电脑或单片微型计算机。

它是把中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。

本设计是基于AT89S51单片机的篮球计时计分器,利用7段共阴LED 作为显示器件。

在此设计中共接入了3个两位一体7段共阴LED显示器,一个用来记录赛程时间,其中2位用于显示A队成绩,2位用于显示B 队成绩,每队2个LED显示器显示范围可达到0~99分。

赛程计时采用倒计时方式,比赛开始时启动计时,直至计时到零为止。

《单片机原理及应用》篮球记分牌

《单片机原理及应用》篮球记分牌

《单片机原理及应用》篮球记分牌1 系统设计1.1 设计要求1.1.1 设计任务设计一个用单片机实现两队的计分功能和24秒倒计时的篮球记分牌,实现两队的加分,包括加一分,加两分,加三分和犯规模式下只能加一分的功能。

1.1.2 性能指标要求(1)按照题目要求独立设计系统所需电路,并完成硬件电路的制作及调试。

(2)结合硬件能够正常计分(1、2、3)。

(3)能够正常显示分值。

(4)能够正常修改工作模式(计分与24秒)。

(5)能够24秒的误差不小于1秒。

发挥部分:能够对两队球员的犯规次数进行计数。

1.2 设计思路及设计框图1.2.1设计思路以AT89C51 单片机芯片功能为主,采用C语言进行编程,在程序中具体为延时函数,按键控制函数,中断方式,和主函数。

在主函数中通过按键的按下与否来实现加分,犯规计数和切换工作模式和倒计时等功能。

设计在篮球比赛中的计分,计时,模式修改以及可实现两队的加分个数和犯规计数的功能。

利用按键来控制实现显示切换等。

然后采用延时程序来对比赛双方进行计分和加 1、2、3分以及对 24 秒倒计时的重置,以及对队员犯规次数的计数。

1.2.2总体设计框图2 各个模块程序的设计晶振、复位电路模块:晶振电路:晶振模块给电路提供一定频率的稳定的震荡、脉冲、信号。

复位电路:使单片机的状态处于初始化状态,让单片机的程序从头开始执行。

按键模块:按键控制加分、切换、计时控制和犯规等。

蜂鸣器模块:经过三极管的开关电路接通蜂鸣器,使蜂鸣器开始工作,表示倒计时的时间到了。

3 调试过程先在用proteus 进行电路的仿真测试。

在仿真测试阶段可适当调整各个元件位置,以便硬件的焊接,按照仿真图进行焊接。

在焊接时注意要把线焊实,不能有虚焊也不能断,在焊接一条线后应该用万用表进行测量,检查是否焊接好,尤其是跳线,因为此次跳线居多,若跳线没有焊接好,后面出现问题很难发现问题所在,跳线也应该先用万用表测量是否有质量问题,在焊接完所有的硬件之后仔细检查是否玉仿真图一致,检查是否有错焊,漏焊。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机篮球计分牌C语言程序
#include&lt;reg52.h&gt;
#define uchar unsigned char
#define uint unsigned int
unsigned t = 0x3cb0;
uchar CZ=24; //计时初值
uchar key = 0; //
uchar fen1 = 0; //甲队得分变量
uchar fen2 = 0; //乙队得分变量
uchar bittime=0,bitdisplay=0,sz=0; //*定义变量*//
uchar code table1[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,};
//0,1,2,3,4,5,6,7,8,9
sbit K0 = P1^0;
sbit K1 = P1^1;
sbit K2 = P1^2;
sbit K3 = P1^3;
sbit K4 = P1^4;
sbit K5 = P1^5;
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;
sbit P3_6 = P3^6;
sbit P3_7 = P3^7;
/********延时函数******/ void delay(uchar z)
{
uchar x,y;
for(x=z;x&gt;0;x--)
for(y=110;y&gt;0;y--);
}
/* 甲队分数显示函数*/ void display_1(uint z)
{
P2 = 0XFD;
P0 = table1[z%10];
delay(10);
P2 = 0XFE;
P0 = table1[z/10];
delay(10);
/* 乙队分数显示函数*/ void display_2(uint z) {
P2 = 0Xf7;
P0 = table1[z%10]; delay(10);
P2 = 0Xfb;
P0 = table1[z/10];
delay(10);
}
/* 甲分数处理函数*/ int key_scan1()
{
if(~K0)
{
delay(10);
if(~K0)
{
delay(10);
fen1 = fen1+1;
}while(~K0);
if(~K1)
{
delay(10);
if(~K1)
{
delay(10);
fen1 = fen1+2;
}while(~K1);
}
/* if(~K2)
{
delay(10);
if(~K2)
{
delay(10);
fen1 = fen1+3;
}while(~K2);
} */
return fen1;
}
/* 乙分数处理函数*/
int key_scan3() {
if(~K0)
{
delay(10);
if(~K0)
{
delay(10);
fen2 = fen2+1; }while(~K0); }
if(~K1)
{
delay(10);
if(~K1)
{
delay(10);
fen2 = fen2+2; }while(~K1); }
/* if(~K2) {
delay(10);
if(~K2)
{
delay(10);
fen2 = fen2+3;
}while(~K2);
} */
return fen2;
}
/* 甲乙队切加分换处理函数*/ uchar key_scan2()
{
if(~K3)
{
delay(10);
if(~K3)
{
delay(10);
key = 1;
P3_4 = 0;
P3_5 = 1;
}while(~K3);
if(~K4)
{
delay(10);
if(~K4)
{
delay(10);
key = 2;
P3_4 = 1;
P3_5 = 0;
}while(~K4);
}
return key;
}
/* 加分显示函数*/ void gaifen()
{
key_scan2();
if(key == 1)
{
key_scan1();
if(fen1&lt;100)
display_1(fen1);
display_2(fen2);
}
else fen1 = fen1-100;
}
else if(key == 2)
{
key_scan3();
if(fen2&lt;100)
{
display_1(fen1);
display_2(fen2);
}
else fen2 = fen2-100;
}
}
/* 倒计时与计分切换函数*/ void shijian()
{
if(~K2)
delay(100);
if(~K2)
{
delay(100);
TR0=1;
P3_6 = 0;
P3_7 = 1;
sz = 1;
if(~K2 &amp;&amp; sz) {
delay(100);
if(~K2 &amp;&amp; sz) {
delay(100);
TR0=0;
P3_6 = 1;
P3_7 = 0;
sz = 2;
}
}
}
}
/* 定时器工作方式设置*/
void timer0init()
{
TMOD &amp;= 0xf0; //定时器0工作方式1 TMOD |= 0x01;
}
/* 赋初值*/
void settimer0(unsigned int t)
{
TL0
= t &amp; 0xff;
TH0 = t &gt;&gt; 8 &amp; 0xff;
}
/* 服务程序*/
void timer0 (void) interrupt 1 using 0
{
TH0=0x3c;
TL0=0xb0;
bittime++;
while(bittime==20)
{
bittime=0; //每经一秒调用一次显示程序(Fosc=24MH
z)
bitdisplay=1;
if(bitdisplay)
{
bitdisplay = 0;
CZ--;
if(-1 == CZ) CZ=24;
}
}
}
void gongzuo()
{
shijian();
if(1 == sz)
{
P2 = 0XFA;
P0 = table1[CZ/10]; delay(100);
P2 = 0XF5;
P0 = table1[CZ%10]; delay(100);
}
if(2 == sz)
{
display_1(fen1); delay(10);
display_2(fen2); gaifen();
CZ = 24;
}
}
/* 主函数*/
int main()
{
timer0init(); settimer0(t);
EA=1;
ET0=1;
TR0=0;
P2 = 0XF0; P0 = 0x3f; while(1) { gongzuo(); }
return 0; }。

相关文档
最新文档