用四位led数码管作显示器的篮球比赛24秒计时器求c语言代码,单片机编程控制LED七段数码管作显示的篮球赛计时计分系统...
本次設計用由AT89C51編程控制LED七段數碼管作顯示的球賽計時計分系統。系統應具有賽程定時設置,賽程時間暫停,及時刷新甲、乙雙方的成績以及賽后成績暫存等功能。
內容包括:顯示、鍵盤、時鐘等內容設計說明
2.1需求分析
2.1.1 計分系統
分為“A隊”和“B隊”的“3分”,“2分”,“1分”各六個按鍵輸入部分,以及兩隊比分的LED顯示部分。在每次增加分數的同時,“24秒”計時恢復為初始值,“12分鐘”計時暫停,等待比賽的繼續進行
2.1.2 計時系統
(1)比賽開始/繼續:當“比賽開始/繼續”鍵按下后,“24s”和“12分鐘”計時器開始倒計時;
(2)手動24s復位:當“24s復位” 鍵按下后,“24s”倒計時恢復初始值,“12分鐘”倒計時暫停,等待比賽的繼續;
(3)比賽暫停:“比賽暫停”鍵按下后,“24s”倒計時和“12分鐘”倒計時均暫停,等待比賽的繼續進行;
(4)自動增加比賽節數:當“12分鐘”倒計時完成后,判斷當前節數是否為最后一節,若不是,則節數自動增加,并“12分鐘”和“24s”均恢復默認值,等待下一節比賽的進行。
2.2原理分析
采用單片機AT89C51作為本設計的核心元件。利用7段共陰LED作為顯示器件。在此設計中共接入了6個7段共陰LED顯示器,其中2個4位LED顯示器用于記錄AB隊的分數,每隊1個4位LED顯示器顯示范圍可達到0~999分,足夠滿足賽程需要;2個兩位LED顯示器用來記錄賽程時間,其中1個用于顯示分鐘,1個用于顯示秒鐘;使用1個2位LED顯示器用于顯示“24s”倒計時,賽程計時均采用倒計時方式。即比賽前將時間設置好,即12分鐘,比賽開始時啟動計時,直至計時到零為止。本設計中設立了10個按鍵,其中6個用于設置兩隊的比分,1個用于比賽開始/比賽繼續,1個用于暫停,1個用于手動增加比賽節數,一個用于恢復“24s”倒計時等功能。
2.3總體設計
系統主要包括單片機、LED顯示電路、按鍵控制電路、時鐘電路及復位電路等組成
2.4軟硬件設計
2.4.1 硬件設計
設計思路:
(1)按鍵模塊設計 :
按鍵接至P1口和P3口,按鍵按下時輸入是低電平。鍵的設置如下:“A1”,“A2”,“A3”鍵是A隊加1分、加2分,加3分鍵盤,B隊同理。“比賽開始/比賽繼續”是啟動鍵,“比賽暫停”是暫停鍵。此外,還有兩個按鍵, “24s”復位鍵,“增加比賽節數”鍵。
(2) LED顯示模塊設計 :
顯示分為計時和計分顯示兩個部分,均采用共陰極LED數碼管動態掃描顯示,由2個四位一體和4個兩位一體的共陰極數碼管構成。數碼管的7個段控端輸出經過74HC573驅動器進行電流放大驅動接至P0口。采用動態掃描方式,在足夠短的周期內,使各位數碼管逐個輪流受控顯示。
設計截圖:
2.4.2 軟件設計
軟件設計采用C語言模塊設計方法,程序由主程序、T0中斷程序、顯示程序、外部中斷0程序、按鍵程序、初始函數、計時函數、延時函數組成。
測試結果與分析
設計采用C語言編程,在Keil C51軟件編譯環境中,經過編譯和連接,生成十六進制的目標代碼文件.hex。在硬件上,用Proteus軟件繪制出原理圖,經過純電路調試無誤后,將生成的目標代碼文件加載到Proteus界面的AT89C51中。接著再進行軟硬件聯合調試,反復調試,直至所有顯示及按鍵功能實現,直至仿真成功。
運行截圖:
框圖
C語言程序代碼:
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit A8=P2^0;
sbit A9=P2^1;
sbit A10=P2^2;
sbit A11=P2^3;
sfr P00=0x80;
uchar code wei_1[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
uchar code table[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7c,0x39,0x5e,0x79,0x71,0X00,0X40};
uchar minute=12;??//分
uchar second=0;? ?//秒
uchar key_status=0;? ???//按鍵狀態值
uchar scoreA=0;? ???//A隊得分
uchar scoreB=0;? ???//B隊得分
uchar count1=20;? ? //記錄定時器時間
uchar match=1;? ?? ?//比賽節數
uchar rule_time=24; //記錄24秒規則
uchar rule_flag=0;? ?? ?? ? //記錄24秒規則是否啟用
/*
初始化IO口
*/
void IO_init(){
A8=0;
A9=0;
}
/*
初始化時間
*/
void time_init(){
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA = 1;
ET0 = 1;
}
/*
延時函數
*/
void delay_ms(uint z){
uint i;
uchar j;
for(i=0;i
for(j=0;j<100;j++);
}
}
/*
計時函數
*/
void T0_Time() interrupt 1 using 1{
if (count1-- == 0)
{
second--;
rule_time--;
count1 = 20;
}
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
}
/*
時間顯示函數
*/
void time_display(uchar w2,uchar d2){
uchar shi1,ge1;
shi1=d2/10;
ge1=d2%10;
P00=wei_1[w2];
A10=1;
A10=0;
P00=table[shi1];;
A8=1;
A8=0;
delay_ms(5);
P00=0;
A10=1;
A10=0;
A8=1;
A8=0;
P00=wei_1[w2+1];
A10=1;
A10=0;
P00=table[ge1];
A8=1;
A8=0;
delay_ms(5);
P00=0;
A10=1;
A10=0;
A8=1;
A8=0;
}
/*
分數顯示函數
*/
void score_dispaly(uchar w2,uchar d2){
uchar qian2,shi2,ge2;
qian2=d2/100;
shi2=d2%100/10;
ge2=d2%100%10;
P00=wei_1[w2];
A9=1;
A9=0;
P00=table[qian2];;
A8=1;
A8=0;
delay_ms(10);
P00=0;
A9=1;
A9=0;
A8=1;
A8=0;
P00=wei_1[w2+1];
A9=1;
A9=0;
P00=table[shi2];
A8=1;
A8=0;
delay_ms(10);
P00=0;
A9=1;
A9=0;
A8=1;
A8=0;
P00=wei_1[w2+2];
A9=1;
A9=0;
P00=table[ge2];
A8=1;
A8=0;
delay_ms(10);
P00=0;
A9=1;
A9=0;
A8=1;
A8=0;
}
/*
鍵盤輸入函數
*/
void key(){
static uchar key_new = 0, key_l;
key_status = 0;
P1 = 0x0f;
if((P1 & 0x0f) != 0x0f)
{
delay_ms(1);
if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
{
key_new = 0;
/*
矩陣鍵盤掃描
*/
key_l = (P1 | 0xf0);
P1 = key_l;
switch(P1)
{
/*
開始計時/比賽繼續
*/
case 0x7e:
TR0=1;
rule_flag=1;
time_display(6,rule_time);
break;
/*
暫停比賽
*/
case 0x7d:
TR0=0;
break;
/*
加分,同時24秒清零和總計時器停止計時
*/
case 0xee:
TR0=0;
scoreA +=3;
rule_time=24;
rule_flag=0;
break;
case 0xed:
TR0=0;
scoreA +=2;
rule_time=24;
rule_flag=0;
break;
case 0xeb:
TR0=0;
scoreA +=1;
rule_time=24;
rule_flag=0;
break;
case 0xde:
TR0=0;
scoreB +=3;
rule_time=24;
rule_flag=0;
break;
case 0xdd:
TR0=0;
scoreB +=2;
rule_time=24;
rule_flag=0;
break;
case 0xdb:
TR0=0;
scoreB +=1;
rule_time=24;
rule_flag=0;
break;
/*
增加比賽節數,同時24秒復位和總計時器復位
*/
case 0xbd:
match++;
minute=12;
second=0;
TR0=0;
rule_time=24;
rule_flag=0;
break;
/*
手動24秒復位
*/
case 0xbe:
if(TR0==1){
rule_time=0;
rule_flag=0;
}else{
rule_flag=0;
}
break;
}
}
}
else
{
key_new = 1;
}
}
void main()
{
IO_init();
time_init();
while(1){
key();
if(second==0){
/*
判斷某節比賽是否結束
*/
if(minute==0){
/*
判斷是否為最后一節比賽
*/
if(match<4){
/*
計時系統恢復為默認值,比賽節數加一
*/
second=60;
minute=11;
match++;
rule_time=24;
rule_flag=0;
}
TR0=0;
}
/*
比賽分鐘數減一
*/
else {
second=60;
minute--;
}
}
/*
24秒結束,計時器暫停和24秒復位
*/
if(rule_time<=0){
TR0=0;
rule_time=24;
}
/*
顯示
*/
time_display(0,minute);
time_display(2,second);
time_display(4,match);
time_display(6,rule_time);
score_dispaly(1,scoreA);
score_dispaly(5,scoreB);
}
}復制代碼以上的Word格式文檔51黑下載地址:
單片機文檔 18電3 趙俊杰.docx
(540.65 KB, 下載次數: 8)
2020-12-25 09:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
總結
以上是生活随笔為你收集整理的用四位led数码管作显示器的篮球比赛24秒计时器求c语言代码,单片机编程控制LED七段数码管作显示的篮球赛计时计分系统...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件工程结构化建模的方法和工具_软件工程
- 下一篇: 电脑4次连续故障音_格力空调电子膨胀阀故