篮球记分牌主要分为两大部分:一部分是实现倒计时功能,和实验课所做的60S倒计时类似。另一部分是实现计分功能,其基本功能和计数器类似。同时外加两部分切换显示功能。
需要注意的是程序中的管脚与原理图中管脚必须一致,在画原理图时也一样应当注意复位电路、晶振、电源、数码管接在芯片正确的管脚。复位电路中REST接的是芯片第9脚,晶振电路中XTAL2和XTAL1分别接18、19脚,将晶振产生的时钟信号作为定时信号。芯片20脚接GND,40脚和31脚接VCC,数码管是共阴数码管。
程序源码如下: - #include<reg52.H> //*****头文件*****//
- #define uchar unsigned char //*定义变量*//
- #define uint unsigned int //*定义uint为无符号整形变量*//
- unsigned t = 0x3cb0;
- uchar CZ=24; //*计时初值*//
- uchar key=0;
- uchar score;
- uchar mode=1;//*模式变量*//
- uchar score1=0; //*甲队得分变量*//
- uchar score2=0; //*乙队得分变量*//
- uchar bittime=0,bitdisplay=0; //*定义变量*//
- uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //*段码0,1,2,3,4,5,6,7,8,9*//
- sbit J0=P3^0; //*独立按键 *//
- sbit J1=P3^1;
- sbit J2=P3^2;
- sbit J3=P3^3;
- sbit J4=P3^4;
- sbit J5=P3^5;
- sbit J6=P3^6;
- sbit LED1 = P1^0;
- sbit LED2 = P1^1;
- sbit LED3 = P1^2;
- sbit LED4 = P1^3;
- sbit SPK=P1^7;
- /********延时函数******/
- void delay(uchar z)
- {
- uchar x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /* 服务程序*/
- void timer0 (void) interrupt 1 using 0
- {
- TH0=0x3c; //*50ms*//
- TL0=0xb0;
- bittime++; //每来一次中断,中断次数bittime自加1
- while(bittime==20)
- {
- bittime=0; //每经一秒调用一次显示程序
- bitdisplay=1;
- if(bitdisplay)
- {
- bitdisplay = 0;
- CZ--;
- if(-1 == CZ) CZ=24;
- }
- }
- }
- /* 甲队分数显示函数*/
- void display_1(uint z)
- {
- P2 = 0XFE; /*11111101甲队个位分数显示*/
- P0 = tab[z%10];
- delay(10);
- P2 = 0XFD; /*11111110甲队十位分数显示*/
- P0 = tab[z/10];
- delay(10);
- }
- /* 乙队分数显示函数*/
- void display_2(uint z)
- {
- P2 = 0Xfb; /*11110111乙队个位分数显示*/
- P0 = tab[z%10];
- delay(10);
- P2 = 0Xf7; /*11111011乙队十位分数显示*/
- P0 = tab[z/10];
- delay(10);
- }
- /* 甲分数处理函数*/
- int inc1()
- {
-
- if(~J3)
- {
- delay(10);
- score1= score1+1;
- }while(~J3);
-
- if(~J4)
- {
- delay(10);
- score1= score1+2;
- }while(~J4);
- if(~J5)
- {
- delay(10);
- score1= score1+3;
- }while(~J5);
-
- return score1;
- }
- /* 乙分数处理函数*/
- int inc2()
- {
- if(~J3)
- {
- delay(10);
- score2= score2+1;
- }while(~J3);
-
- if(~J4)
- {
- delay(10);
- score2= score2+2;
- }while(~J4);
- if(~J5)
- {
- delay(10);
- score2= score2+3;
- }while(~J5);
-
- return score1;
- }
- /* 甲乙队切加分换处理函数*/
- uchar turn()
- {
- if(~J2)
- {
- delay(10);
- if(~J2)
- {
- delay(10);
- LED1 = 1;
- LED2 = 1;
- LED3 = 0;
- LED4 = 1;
- key = 1;
- }while(~J2);
- }
- if(~J6)
- {
- delay(10);
- if(~J6)
- {
- delay(10);
- LED1 = 1;
- LED2 = 1;
- LED3 = 1;
- LED4 = 0;
- key = 2;
- }while(~J6);
- }
- return key;
- }
- /* 加分显示函数*/
- void marks()
- {
- turn();
- if(key == 1)
- {
- inc1();
- if(score1<100)
- {
- display_1(score1);
- display_2(score2);
- }
- else score1 =score1-100;
- }
- else if(key == 2)
- {
- inc2();
- if(score2<100)
- {
- display_1(score1);
- display_2(score2);
- }
- else score2 = score2-100;
- }
- }
- /*模式选择函数*/
- uchar mode_select()
- {
- if(~J0)
- {
- delay(10);
- if(~J0)
- {
- delay(10);
- mode = 1;
- LED1 = 0;
- LED2 = 1;
- LED3 = 1;
- LED4 = 1;
- } while(~J0);
- }
- if(~J1)
- {
- delay(10);
- if(~J1)
- {
- delay(10);
- mode = 2;
- LED1 = 1;
- LED2 = 0;
- LED3 = 1;
- LED4 = 1;
- } while(~J1);
- }
- return mode;
- }
-
- /*倒计时处理*/
- void time_count()
- {
- TR0 = 1;
- P2 = 0XFB; /*11111010甲乙十位显示*/
- P0 = tab[CZ/10];
- delay(10);
- P2 = 0XFD; /*11110101甲乙个位显示*/
- P0 = tab[CZ%10];
- delay(10);
- }
- /* 主函数*/
- int main()
- {
- TMOD= 0x01;
- TH0=0x3c;
- TL0=0xb0;
- EA = 1; //cpu允许所有中断
- ET0 =1;//定时器T0中断允许
- TR0 = 0;//关闭定时器T0
- P2 = 0XF0;
- P0 = 0x3f;
- SPK=0;
- while(1)
- {
- mode_select();
- if(1 == mode) //加分功能
- {
- TR0 = 0;//关闭定时器
- CZ = 24; //重新赋初值24秒
- display_1(score1);
- delay(10);
- display_2(score2);
- marks();
- }
- if(2 == mode) //计时功能
- {
- if(CZ == 0){TR0 = 0,SPK=1;delay(30);SPK = 0;
- foul_sever();
- }
- time_count();}
-
- }
- return 0;
- }
复制代码
全部资料51hei下载地址:
篮球计分牌.rar
(101.49 KB, 下载次数: 64)
|