標(biāo)題:
籃球計分器 單片機(jī)程序
[打印本頁]
作者:
crrr
時間:
2025-4-10 09:30
標(biāo)題:
籃球計分器 單片機(jī)程序
#include<reg51.h>//51單片機(jī)頭文件
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K1=P3^2;//比賽倒計時開始/暫停
sbit K2=P3^3;//24s倒計時重新開始
sbit K3=P1^3;//乙隊+1按鍵
sbit K4=P1^2;//乙隊+2按鍵
sbit K5=P1^1;//甲隊+1按鍵
sbit K6=P1^0;//甲隊+2按鍵
sbit K7=P1^4;//乙隊+3按鍵
sbit K8=P1^5;//甲隊+3按鍵
sbit K9=P1^6;//半場積分互換
sbit K10=P1^7;//分?jǐn)?shù)清0
sbit K11=P2^1;//乙隊-1按鍵
sbit K12=P2^2;//甲隊-1按鍵
sbit K13=P2^3;//乙隊犯規(guī)按鍵
sbit K14=P2^4;//甲隊犯規(guī)按鍵
sbit LED1=P2^6;//乙隊犯規(guī)燈
sbit LED2=P3^4;//乙隊犯規(guī)燈
sbit LED3=P3^0;//甲隊犯規(guī)燈
sbit LED4=P3^1;//甲隊犯規(guī)燈
sbit K15=P3^5;//乙隊犯規(guī)清0按鍵
sbit K16=P3^6; //甲隊犯規(guī)清0按鍵
sbit beep=P2^0;//蜂鳴器接口
sbit RS=P2^7;
sbit E=P2^5;
char miao,fen,num,time,aa;
uchar bb,cc,tt;
uchar code table1[]={"H.T 000:000 R.T "};
uchar code table2[]={"10:00 SEC-1 24"};
bit key_pressed = 0; // 按鍵按下標(biāo)志
bit key_pressed1 = 0; // 按鍵按下標(biāo)志
unsigned char led_state = 0; // LED狀態(tài): 0=都滅, 1=LED1亮, 2=都亮
unsigned char led_state1 = 0; // LED狀態(tài): 0=都滅, 1=LED1亮, 2=都亮
//延時子函數(shù)
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//LCD1602液晶寫指令子函數(shù)
void write_com(uchar com)
{
RS=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶寫數(shù)據(jù)子函數(shù)
void write_date(uchar date)
{
RS=1;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
//LCD1602液晶初始化子函數(shù)
void LCD1602_init()
{
uchar i;
bb=0; //H.T分?jǐn)?shù)初始化
cc=0; //R.T分?jǐn)?shù)初始化
time=0;
TMOD=0x10; //定時器1初始化
TL1=0x00;
TH1=0x4c;
EA=1; //開總中斷
ET1=1; //開定時器1
TR1=0; //定時器1不工作
EX0=1; //開中斷0
EX1=1; //開中斷1
IT0=1; //中斷0為邊沿觸發(fā)
IT1=1; //中斷1為邊沿觸發(fā)
E=0;
beep=0;
miao=0;
fen=10;
num=1;
aa=24;
write_com(0x38); //LCD設(shè)置初始化
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]);
}
}
//分?jǐn)?shù)更新子函數(shù)
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);
}
//按鍵掃描子函數(shù)
void keyscan()
{
if(K3==0) //K3按下H.T分?jǐn)?shù)加一
{
while(K3==0);
bb++;
point_lcd(0x04,bb); //分?jǐn)?shù)顯示更新
if(K3==0) //松手檢測
{
while(K3==0);
delay(20);
}
}
else if(K4==0) //K4按下H.T分?jǐn)?shù)加二
{
while(K4==0);
bb=bb+2;
point_lcd(0x04,bb);
if(K4==0)
{
while(K4==0);
delay(20);
}
}
else if(K7==0) //K7按下H.T分?jǐn)?shù)加3
{
while(K7==0);
bb=bb+3;
point_lcd(0x04,bb);
if(K7==0)
{
while(K7==0);
delay(20);
}
}
else if(K5==0) //K5按下R.T分?jǐn)?shù)加一
{
while(K5==0);
cc++;
point_lcd(0x08,cc);
if(K5==0)
{
while(K5==0);
delay(20);
}
}
else if(K6==0) //K6按下R.T分?jǐn)?shù)加2
{
while(K6==0);
cc=cc+2;
point_lcd(0x08,cc);
if(K6==0)
{
while(K6==0);
delay(20);
}
}
else if(K8==0) //K9按下R.T分?jǐn)?shù)加3
{
while(K8==0);
cc=cc+3;
point_lcd(0x08,cc);
if(K8==0)
{
while(K8==0);
delay(20);
}
}
else if(K10==0) //K10按下分?jǐn)?shù)清0
{
while(K10==0);
bb=0;
cc=0;
point_lcd(0x04,bb);
point_lcd(0x08,cc);
if(K10==0)
{
while(K10==0);
delay(20);
}
}
else if(K9==0) //K9半場場地互換,積分互換
{
while(K9==0);
{
// uchar code table3[]={"R.T 000:000 H.T "};
tt=bb;bb=cc;cc=tt;
}
point_lcd(0x04,bb);
point_lcd(0x08,cc);
if(K9==0)
{
while(K9==0);
delay(20);
}
}
if(K13 == 0) //K13乙隊犯規(guī)按鍵
{
delay(10); // 消抖延時
if(K13 == 0 && !key_pressed) {
key_pressed = 1; // 設(shè)置按鍵按下標(biāo)志
// 根據(jù)當(dāng)前狀態(tài)切換LED
if(led_state == 0) {
LED1 = 1; // 點亮第一個LED
led_state = 1;
}
else if(led_state == 1) {
LED2 = 1; // 點亮第二個LED
led_state = 2;
}
// 當(dāng)led_state == 2時不做任何操作
}
} else {
key_pressed = 0; // 按鍵釋放,清除標(biāo)志
}
if(K14 == 0) //K13甲隊犯規(guī)按鍵
{
delay(10); // 消抖延時
if(K14 == 0 && !key_pressed1) {
key_pressed1 = 1; // 設(shè)置按鍵按下標(biāo)志
// 根據(jù)當(dāng)前狀態(tài)切換LED
if(led_state1 == 0) {
LED3 = 1; // 點亮第一個LED
led_state1 = 1;
}
else if(led_state1 == 1) {
LED4 = 1; // 點亮第二個LED
led_state1 = 2;
}
// 當(dāng)led_state == 2時不做任何操作
}
} else {
key_pressed1 = 0; // 按鍵釋放,清除標(biāo)志
}
if(K15==0) //K15按下乙隊犯規(guī)清0
{
while(K15==0);
LED1=0;
LED2=0;
if(K15==0) //松手檢測
{
while(K15==0);
delay(20);
}
}
if(K16==0) //K15按下乙隊犯規(guī)清0
{
while(K16==0);
LED3=0;
LED4=0;
if(K16==0) //松手檢測
{
while(K16==0);
delay(20);
}
}
}
//比賽倒計時/24s倒計時
void counter_down()
{
uchar i;
if(time>=20) //每1s倒計時做減一操作
{
miao--;
aa--;
write_com(0x80+0x4e); //24s倒計時顯示
write_date(0x30+aa/10);
write_date(0x30+aa%10);
write_com(0x80+0x4e);
if(aa==0) //24s結(jié)束發(fā)出3s連續(xù)報警
{
beep=1;
delay(3000);
beep=0;
aa=24;
}
if((miao==0)&&(fen==0)) //檢測一節(jié)比賽是否結(jié)束
{
TR1=0; //定時器1暫停
write_com(0x80+0x44);
write_date(0x30);
num++;
aa=24; //24s計時復(fù)位
write_com(0x80+0x4e); //24s倒計時顯示
write_date(0x30+aa/10);
write_date(0x30+aa%10);
write_com(0x80+0x4e);
if(num<5) //每節(jié)結(jié)束蜂鳴器發(fā)出8s的間斷報警
{
for(i=80;i>0;i--)
{
beep=1;
delay(500);
beep=0;
delay(500);
}
}
if(num==5) //終場結(jié)束,蜂鳴器發(fā)出10s的連續(xù)警報聲
{
beep=1;
delay(10000);
num=0;
}
beep=0; //蜂鳴器關(guān)閉
write_com(0x80+0x4b); //更新"SEC-?"
write_date(0x30+num);
write_com(0x80+0x4b);
miao=0; //倒計時復(fù)位
fen=10;
}
if(miao<=0)
{
miao=59;
fen--;
}
write_com(0x80+0x40); //更新倒計時顯示
write_date(0x30+fen/10);
write_date(0x30+fen%10);
write_com(0x80+0x43);
write_date(0x30+miao/10);
write_date(0x30+miao%10);
write_com(0x80+0x43);
time=0;
}
}
//主函數(shù)
void main()
{
LCD1602_init();
LED1 = 0; // 初始關(guān)閉LED1
LED2 = 0; // 初始關(guān)閉LED2
LED3 = 0; // 初始關(guān)閉LED1
LED4 = 0; // 初始關(guān)閉LED2
while(1)
{
keyscan(); //分?jǐn)?shù)按鍵檢測
}
}
//外部0中斷子函數(shù)
void wb0() interrupt 0 //比賽時間開始/暫停
{
TR1=~TR1; //定時器1工作/暫停
if(TR1==1) //當(dāng)?shù)褂嫊r工作時,S1按下定時器立即停止工作
{
PT1=0;
}
else //倒計時不工作時,S1按下倒計時立即工作
{
PT1=1;
}
if(K1==0) //松手檢測
{
while(K1==0);
counter_down();
// delay(20);
}
}
//外部1中斷子函數(shù)
void wb1() interrupt 2 //24s倒計時重新開始
{
aa=24;
write_com(0x80+0x4e); //24s倒計時顯示
write_date(0x30+aa/10);
write_date(0x30+aa%10);
write_com(0x80+0x4e);
if(K2==0) //松手檢測
{
while(K2==0)
{
counter_down();
}
delay(20);
}
}
//定時器1中斷子函數(shù)
void t1() interrupt 3 //定時器1中斷20次為1s
{
time++;
TL1=0x00;
TH1=0x4c;
counter_down(); //倒計時
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1