这是我以前做的51单片机篮球计分器设计,
花了一个星期时间,
附件里面包括源代码;PCB原理图,
和proteus的仿真文件
都是自己原创的,大家多多指教
制作出来的篮球计分器实物图如下:
电路原理图如下:
篮球计分器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Altium Designer画的篮球计分器原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机篮球计分器程序源码:
- #include<reg51.h>//51单片机头文件
- typedef unsigned char uchar;
- typedef unsigned int uint;
- sbit K1=P3^2;//比赛倒计时开始/暂停
- sbit K2=P3^3;//24s倒计时重新开始
- sbit P20=P2^0;//乙队+1按键
- sbit P21=P2^1;//乙队+2按键
- sbit P22=P2^2;//甲队+1按键
- sbit P23=P2^3;//甲队+2按键
- sbit P24=P2^4;//甲队+3按键
- sbit P25=P2^5;//乙队+3按键
- sbit P26=P2^6;//预留按键
- sbit P27=P2^7;
- sbit beep=P3^6;//蜂鸣器接口
- sbit RS=P1^0;
- sbit RW=P1^1;
- sbit E=P1^2;
- char second,minute,num,time,aa;
- uchar dd,bb,cc;
- uchar code table1[]={"H.T 000:000 T.H "};
- uchar code table2[]={"12:00 SEC-1 24"};
- //延时子函数
- void delay(uint z)
- {
- uint x;
- uchar y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //LCD1602液晶写指令子函数
- void write_com(uchar com)
- {
- RW=0;
- RS=0;
- P0=com;
- delay(5);
- E=1;
- delay(5);
- E=0;
- }
- //LCD1602液晶写数据子函数
- void write_date(uchar date)
- {
- RW=0;
- RS=1;
- P0=date;
- delay(5);
- E=1;
- delay(5);
- E=0;
- }
- //LCD1602液晶初始化子函数
- void LCD1602_init()
- {
- uchar i;
- bb=0; //H.T分数初始化
- cc=0; //T.H分数初始化
- time=0;
- TMOD=0x10; //定时器1初始化
- TL1=0x00;
- TH1=0x4c;
- EA=1; //开总中断
- ET1=1; //开定时器1
- TR1=0; //开中断0
- EX1=1; //开中断1
- IT0=1; //中断0为边沿触发
- IT1=1; //中断1为边沿触发
- E=0;
- beep=0;
- second=0;
- minute=12;
- num=1;
- aa=24;
- write_com(0x38); //LCD设置初始化
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80); //LCD显示初始化
- for(i=0;i<16;i++)
- {
- write_date(table1[i]);
- }
- write_com(0x80+0x40);
- for(i=0;i<16;i++)
- {
- write_date(table2[i]);
- }
- }
- //分数更新子函数
- void point_lcd(uchar add,uchar dat)
- {
- write_com(0x80+add);
- write_date(0x30+dat/100);
- write_date(0x30+(dat%100)/10);
- write_date(0x30+dat%10);
- write_com(0x80+add);
- }
- //按键扫描子函数
- void keyscan()
- {
- P2=0xf0;
- if((P2&0xf0)!=0xf0)
- {
- delay(20);
- }
- if((P2&0xf0)!=0xf0)
- {
- P2=0xf7;
- if(P24==0)
- {
- while(P24==0); //P24按下H.T分数加1
- bb++;
- point_lcd(0x04,bb);
- if(P24==0)
- {
- while(P24==0);
- delay(20);
- }
- }
- else if(P25==0) //P25按下H.T分数加2
- {
- while(P25==0);
- bb=bb+2;
- point_lcd(0x04,bb);
- if(P25==0)
- {
- while(P25==0);
- delay(20);
- }
- }
- else if(P26==0) //P26按下H.T分数加3
- {
- while(P26==0);
- bb=bb+3;
- point_lcd(0x04,bb);
- if(P26==0)
- {
- while(P26==0);
- delay(20);
- }
- else if(P27==0) //P27按下T.H分数加一
- {
- while(P27==0);
- cc++;
- point_lcd(0x08,cc);
- if(P27==0)
- while(P27==0);
- delay(20);
- }
- }
- P2=0xfb;
- if(P24==0) //P24按下T.H分数加2
- {
- while(P24==0);
- cc=cc+2;
- point_lcd(0x08,cc);
- if(P24==0)
- {
- while(P24==0);
- delay(20);
- }
- }
- else if(P25==0) //P25按下T.H分数加3
- {
- while(P25==0);
- cc=cc+3;
- point_lcd(0x08,cc);
- if(P25==0)
- {
- while(P25==0);
- delay(20);
- }
- }
- else if(P26==0) //P26按下交换比分
- {
- while(P26==0);
- dd=bb;
- bb=cc;
- cc=dd;
- point_lcd(0x08,cc);
- point_lcd(0x04,bb);
- if(P26==0)
- {
- while(P26==0);
- delay(20);
- }
- }
- }
- //比赛倒计时/24s倒计时
- void counter_down()
- {
- uchar i;
- if(time>=20) //每1s倒计时做减一操作
- {
- second--;
- aa--;
- write_com(0x80+0x4e); //24s倒计时显示
- write_date(0x30+aa/10);
- write_date(0x30+aa%10);
- write_com(0x80+0x4e);
- beep=1;
- if(aa==0) //24s结束发出连续报警
- {
- beep=0;
- delay(3000);
- beep=1;
- aa=24;
- }
- if((second==0)&&(minute==0)) //检测一节比赛是否结束
- {
- TR1=0; //定时器1暂停
- write_com(0x80+0x44);
- write_date(0x30);
- num++;
- aa=24; //24s计时复位
- write_com(0x80+0x4e); //24s倒计时显示
- write_date(0x30+aa/10);
- write_date(0x30+aa%10);
- write_com(0x80+0x4e);
- if(num<5) //每节结束蜂鸣器发出间断报警
- {
- for(i=80;i>0;i--)
- {
- beep=0;
- delay(500);
- beep=1;
- delay(500);
- }
- }
- if(num==5) //终场结束,蜂鸣器发出连续警报声
- {
- beep=0;
- delay(10000);
- num=0;
- }
- beep=1; //蜂鸣器关闭
- write_com(0x80+0x4b); //更新"SEC-?"
- write_date(0x30+num);
- write_com(0x80+0x4b);
- second=0; //倒计时复位
- minute=12;
- }
- if(second==-1)
- {
- second=59;
- minute--;
- }
- write_com(0x80+0x40); //更新倒计时显示
- write_date(0x30+minute/10);
- write_date(0x30+minute%10);
- write_com(0x80+0x43);
- write_date(0x30+second/10);
- write_date(0x30+second%10);
- write_com(0x80+0x43);
- time=0;
- }
- }
复制代码
全部资料51hei下载地址:
源程序和原理图.rar
(299.14 KB, 下载次数: 895)
|