仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設(shè)計(jì)編號(hào):【D04】
1.? 簡(jiǎn)介
? 本文介紹一種用AT89C51作為核心部件進(jìn)行邏輯控制及信號(hào)產(chǎn)生的單片機(jī)技術(shù)和C語言編程設(shè)計(jì)的籃球比賽計(jì)時(shí)器。此籃球計(jì)時(shí)計(jì)分器在硬件方面主要采用AT89C51單片機(jī)作為主控核心,由獨(dú)立按鍵、蜂鳴器、LCD1602顯示屏顯示。具有靈活方便、適用范圍廣的特點(diǎn),基本能夠滿足實(shí)踐需求。
2.? 主要功能
a.支持按鍵設(shè)置開始、暫停、24S倒計(jì)時(shí)復(fù)位、甲隊(duì)加分、乙隊(duì)加分。
b.支持LCD1602顯示甲隊(duì)、乙隊(duì)分?jǐn)?shù)、比賽時(shí)間、24S倒計(jì)時(shí)。
c.支持比賽結(jié)束后蜂鳴器告警。
3.? 源程序(Keil5)
本設(shè)計(jì)采用keil5 C51軟件(內(nèi)附安裝包)實(shí)現(xiàn)程序設(shè)計(jì)。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
#include<reg51.h>//51單片機(jī)頭文件
typedef unsigned char uchar;
typedef unsigned int uint;
sbit K1=P3^2;//比賽倒計(jì)時(shí)開始/暫停
sbit K2=P3^3;//24s倒計(jì)時(shí)重新開始
sbit K3=P1^3;//甲隊(duì)+1按鍵
sbit K4=P1^4;//甲隊(duì)+2按鍵
sbit K8=P1^5;//乙隊(duì)+3按鍵
sbit K5=P1^0;//乙隊(duì)+1按鍵
sbit K6=P1^1;//乙隊(duì)+2按鍵
sbit K7=P1^2;//甲隊(duì)+3按鍵
sbit beep=P2^0;//蜂鳴器接口
sbit RS=P2^7;
sbit E=P2^5;
char miao,fen,num,time,aa;
uchar bb,cc;
uchar code table1[]={"H.T 000:000 R.T "};
uchar code table2[]={"12:00 SEC-1 24"};
//延時(shí)子函數(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; //定時(shí)器1初始化
TL1=0x00;
TH1=0x4c;
EA=1; //開總中斷
ET1=1; //開定時(shí)器1
TR1=0; //定時(shí)器1不工作
EX0=1; //開中斷0
EX1=1; //開中斷1
IT0=1; //中斷0為邊沿觸發(fā)
IT1=1; //中斷1為邊沿觸發(fā)
E=0;
beep=0;
miao=0;
fen=12;
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) //松手檢測(cè)
{
while(K3==0);
delay(20);
}
}
else if(K4==0) //S4按下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) //S4按下H.T分?jǐn)?shù)加二
{
while(K7==0);
bb=bb+3;
point_lcd(0x04,bb);
if(K7==0)
{
while(K7==0);
delay(20);
}
}
else if(K5==0) //S5按下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) //S6按下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) //S6按下R.T分?jǐn)?shù)加2
{
while(K8==0);
cc=cc+3;
point_lcd(0x08,cc);
if(K8==0)
{
while(K8==0);
delay(20);
}
}
}
4.? 仿真proteus8.6
? 本設(shè)計(jì)采用proteus8.6軟件(內(nèi)附安裝包)實(shí)現(xiàn)仿真設(shè)計(jì),如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導(dǎo)出的,所以請(qǐng)盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
開始:
加分:
5.? 設(shè)計(jì)報(bào)告
設(shè)計(jì)報(bào)告主要包括硬件電路、軟件設(shè)計(jì)、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計(jì)資料主要包括C程序+仿真+設(shè)計(jì)報(bào)告+使用說明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤下載鏈接:【D04】百度網(wǎng)盤下載鏈接
更多單片機(jī)仿真設(shè)計(jì)合集:單片機(jī)仿真設(shè)計(jì)合集