仿真
新建 Microsoft Word 文檔.docx
(1.1 MB, 下載次數(shù): 14)
2017-12-9 20:13 上傳
點擊文件名下載附件
報告
led鏁扮爜綆÷風鐞冭鏃惰鍒嗗櫒.doc
(572.5 KB, 下載次數(shù): 9)
2017-12-9 20:13 上傳
點擊文件名下載附件
程序和仿真
新建文件夾 (3).rar
(17.83 KB, 下載次數(shù): 7)
2017-12-9 20:14 上傳
點擊文件名下載附件
程序和仿真
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
code unsigned seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int m=1,n=60,x=0,y=0,i=0,jie=2,zidong=1,bujin=1,zanting=0,chuzanting=0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit k1=P3^0; //A+1
sbit k2=P3^1; //B+1
sbit k3=P3^2; //回表按鍵
sbit k4=P3^3; //時間快進
sbit k5=P3^4; //A-1
sbit k6=P3^5; //B-1
sbit P1_0=P1^0; //暫停、啟動
//#include <REGX51.H>為頭文件P1口各位分別用P1_0等表示
void delay(int t) // 延時子程序 通過參數(shù)t,可以調(diào)整暫停時間
{
while(t--)
{
unsigned int i;
for(i=0;i<200;i++);
}
}
void display(int i,int j,int x,int y) // 數(shù)碼管動態(tài)刷新顯示程序
{
if(jie==1&&bujin!=2) //中間變量jie==1時,為上半場,對P1賦值
P1=0xbf; //P1=0xbf, 即P1=1011 1111B,點亮對應上半場指示燈
P2=0xfe; //數(shù)碼管動態(tài)刷新顯示程序 P2=1111 1110,i為分鐘
P0=seg[i%100/10]; //刷新顯示時間顯示分鐘十位,調(diào)用延時程序,
delay(1); //延時數(shù)碼管的點亮
P2=0xff;
P0=0;
P2=0xfd; //同理,動態(tài)刷新時分鐘個位并延時點亮
P0=seg[i%10];
delay(1);
P2|=0xff;
P0=0;
P2=0xfb; //同理,動態(tài)刷新時秒鐘十位并延時點亮
P0=seg[j%100/10];
delay(1);
P0=0;
P2=0xff;
P2=0xf7; //同理,動態(tài)刷新時秒鐘個位并延時點亮
P0=seg[j%10];
delay(1);
P0=0;
P2=0xff;
P2=0xef; //同理,動態(tài)刷新甲隊分數(shù)十位并延時點亮
P0=seg[x%100/10];
delay(1);
P2=0xff;
P0=0;
P2=0xdf; //同理,動態(tài)刷新甲隊分數(shù)個位并延時點亮
P0=seg[x%10];
delay(1);
P2=0xff;
P0=0;
P2=0xbf; //同理,動態(tài)刷新乙隊分數(shù)十位并延時點亮
P0=seg[y%100/10];
delay(1);
P0=0;
P2=0xff;
P2=0x7f; //同理,動態(tài)刷新乙隊分數(shù)十位并延時點亮
P0=seg[y%10];
delay(1);
P0=0;
P2=0xff;
}
void t0(void) interrupt 1 //調(diào)用定時器T0 基本計時單位秒
{ TH0=0xb1; //利用定時器T0,送入計數(shù)初值TH0=0xb1; TL0=0x10;
TL0=0x10; //定時器定時單位為20毫秒
if(n==0)
{ //分鐘與秒時間調(diào)整 當秒減到0以后分鐘減1
n=60;m--;
}
i++;
if(i==50)
{ //利用中間變量i 令i值為50 50*20毫秒=1秒
n--; //以實現(xiàn)一秒計時
i=0;
}
display(m,n-1,x,y); //調(diào)用動態(tài)刷新顯示程序
}
void keyjiafen1() //加分按鍵子程序,在主程序中不斷調(diào)用該子程序
{ //當檢測到甲隊加分按鍵按下時,對應加分
if(k1==0)
{ //調(diào)用延時子程序 實現(xiàn)消除按鍵抖動功能,即,當
delay(1); //檢測到按鍵按下時候,延時,按鍵仍按下,說明按鍵
if(k1==0) //確實按下,非抖動,甲隊對應加分
{
while(k1==0);
x++;
}
}
if(k2==0) //同理,檢測乙隊加分按鍵時候按下,并加分
{
delay(1);
if(k2==0)
{
while(k2==0);
y++;
}
}
}
void keyjianfen1() //減分按鍵檢測子程序,其基本算法及功能與加
{
if(k5==0) //相同
{
delay(1);
if(k5==0)
{
while(k5==0);
x--;
}
}
if(k6==0)
{
delay(1);
if(k6==0)
{
while(k6==0);
y--;
}
}
}
void key2() //顯示時間調(diào)整程序,即回表和快表
{
if(k3==0)
{ //在比賽中有時經(jīng)常需要回表,故寫此程序
delay(10);
if(k3==0) //回表子程序,檢測到INT0按下時,使時間回倒
{
chuzanting==0; // chuzanting==0; zanting=1;為附加變量,當回表按鍵
zanting=1; //松開時,表暫停,這兩個變量用來調(diào)用暫停
n++;
if(n==60)
{
m++;
n=1;
}
}
}
if(k4==0) //快表子程序,檢測到INT1按下時,使倒計加快,
{ //通常情況下與回表子程序配合使用,即當回表
//回過的時候,按此鍵調(diào)整時間
delay(10); // chuzanting==0; zanting=1;作用同上
if(k4==0)
{
chuzanting==0;
zanting=1;
n--;
}
}
}
void shijian() //該程序使回表和快表按鍵松開時候能自動暫停
{
if(zanting==1&&k3==1&&k4==1&&chuzanting==0 )
{
EA=0; // zanting==1&&k3==1&&k4==1&&chuzanting==0作用為
zanting=0; //當按鍵松開的時候,調(diào)用暫停程序條件
chuzanting=0; //zanting=0;chuzanting=0,初始化,以便下次回表和快表
while(1) //按鍵松開時候仍能調(diào)用暫停程序
{
display(m,n,x,y);
if(P1_0==0) //檢測暫停鍵按下,開中斷,跳出暫停
{
delay(1);
if(P1_0==0)
{
while(P1_0==0);
EA=1;
break;
}
}
}
}
}
void key3()
{ //半場交換場地時自動交換雙方比賽分數(shù)子程序{
int temp; //定義中間變量temp,檢測到有按鍵按下時候
if(zidong==1&&jie==1) //交換甲隊,乙隊比賽分數(shù)
{
temp=x; // zidong==1&&jie==1是判斷半場的條件 //
y=temp;
display(m,n,x,y);
zidong=0;
bujin=0;
}
}
void key4() //比賽暫停子程序
{
if(P1_0==0) //檢測到暫停按鍵按下時候,令EA=0關(guān)閉中斷
{
delay(1); //同通過死循環(huán)程序while(1),不斷刷新數(shù)碼管
if(P1_0==0) //當暫停鍵再次按下時候,開中斷,以使比賽時間
{ //繼續(xù)倒計時,由于在暫停的時候,程序處于死循
while(P1_0==0);
EA=0; //無法回到主程序,故主程序中檢測按鍵按下的
while(1) //無法回到主程序,即實現(xiàn)了暫停時,除了暫停鍵
{ //其他按鍵按下均無效
display(m,n,x,y);
if(P1_0==0)
{ //當暫停鍵再次按下時候,EA=1開中斷,計時數(shù)碼管
delay(1); //繼續(xù)倒計時,同時通過break語句,跳出死循環(huán)
if(P1_0==0)
{
while(P1_0==0);
EA=1;
break;
}
}
}
}
}
}
void over() //比賽結(jié)束及及點亮下半場指示燈程序
{
if((m==0)&&(n==0)) //當m,n均為0的時候,通過變量jie的值判斷比賽
{ //是否結(jié)束
if(jie>1) //如果jie>1,說明半場到了,比賽沒有結(jié)束, {
{ //jie--,關(guān)中斷,再次按下暫停鍵時候繼續(xù)倒計時
m=2;
n=0;
EA=0;
T1=1;
delay(400);
T1=0;
while(1)
{
display(m,n,x,y);
if(P1_0==0)
{
delay(1);
if(P1_0==0)
{
while(P1_0==0);
EA=1;
break;
}
}
}
jie--;
}
if(jie==1&&bujin==2) //如果jie==1&&bujin==2,說明比賽結(jié)束了,令EA=0,
{ //比關(guān)閉中斷,比賽秒表不再走動,同時不短刷新數(shù)碼管,
EA=0; //全場比賽結(jié)束蜂鳴器開始報警
m=0;
n=0;
T1=1;
delay(400);
T1=0;
P1=0x3f; // P1=0x3f上下半場指示燈同時點亮,比賽結(jié)束
while(1)
display(m,n,x,y); //不斷刷新數(shù)碼管
}
}
}
void main() // 主程序
{ TMOD=0x01; //設置定時器工作方式
EA=1;
ET0=1;
TH0=0xb1; //定時器送計數(shù)初值,EA=1,開中斷,P3口電平拉高
TL0=0x10; // P1=0x7f, 上半場指示燈點亮
TR0=1;
P3=0xff;
P1=0x7f;
T1=0;
while(1)
{ //通過 while(1),反復調(diào)用循環(huán)體內(nèi)的子程序
keyjiafen1(); //執(zhí)行相應的功能
keyjianfen1();
key2();
if(zidong==1) //zidong==1為key3()執(zhí)行條件,僅當半場結(jié)束時候執(zhí)行
key3();
if(n==18&&bujin==0)
{
bujin=2; //修改變量bujin的值,設定over()中第二個if語句的執(zhí)行條件
}
shijian();
key4();
over();
}
}
|