|
|
這些是我自己做的
11111111111111.png (13.66 KB, 下載次數: 34)
下載附件
2017-12-9 20:24 上傳
22311.png (327.13 KB, 下載次數: 45)
下載附件
2017-12-9 20:24 上傳
11122.png (310.34 KB, 下載次數: 34)
下載附件
2017-12-9 20:24 上傳
2313.png (324.94 KB, 下載次數: 33)
下載附件
2017-12-9 20:24 上傳
這張是應該成功后的
我自己做的C和仿真
新建文件夾 (3).rar
(17.83 KB, 下載次數: 27)
2017-12-9 20:29 上傳
點擊文件名下載附件
這是我自己照著打出來的
單片機源程序:
- #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) // 延時子程序 通過參數t,可以調整暫停時間
- {
- while(t--)
- {
- unsigned int i;
- for(i=0;i<200;i++);
- }
- }
-
- void display(int i,int j,int x,int y) // 數碼管動態刷新顯示程序
- {
- if(jie==1&&bujin!=2) //中間變量jie==1時,為上半場,對P1賦值
- P1=0xbf; //P1=0xbf, 即P1=1011 1111B,點亮對應上半場指示燈
-
- P2=0xfe; //數碼管動態刷新顯示程序 P2=1111 1110,i為分鐘
- P0=seg[i%100/10]; //刷新顯示時間顯示分鐘十位,調用延時程序,
- delay(1); //延時數碼管的點亮
- P2=0xff;
- P0=0;
- P2=0xfd; //同理,動態刷新時分鐘個位并延時點亮
- P0=seg[i%10];
- delay(1);
- P2|=0xff;
- P0=0;
- P2=0xfb; //同理,動態刷新時秒鐘十位并延時點亮
- P0=seg[j%100/10];
- delay(1);
- P0=0;
- P2=0xff;
- P2=0xf7; //同理,動態刷新時秒鐘個位并延時點亮
- P0=seg[j%10];
- delay(1);
- P0=0;
- P2=0xff;
- P2=0xef; //同理,動態刷新甲隊分數十位并延時點亮
- P0=seg[x%100/10];
- delay(1);
- P2=0xff;
- P0=0;
- P2=0xdf; //同理,動態刷新甲隊分數個位并延時點亮
- P0=seg[x%10];
- delay(1);
- P2=0xff;
- P0=0;
-
- P2=0xbf; //同理,動態刷新乙隊分數十位并延時點亮
- P0=seg[y%100/10];
- delay(1);
- P0=0;
- P2=0xff;
- P2=0x7f; //同理,動態刷新乙隊分數十位并延時點亮
- P0=seg[y%10];
- delay(1);
- P0=0;
- P2=0xff;
- }
- void t0(void) interrupt 1 //調用定時器T0 基本計時單位秒
- { TH0=0xb1; //利用定時器T0,送入計數初值TH0=0xb1; TL0=0x10;
- TL0=0x10; //定時器定時單位為20毫秒
- if(n==0)
- { //分鐘與秒時間調整 當秒減到0以后分鐘減1
- n=60;m--;
- }
- i++;
- if(i==50)
- { //利用中間變量i 令i值為50 50*20毫秒=1秒
- n--; //以實現一秒計時
- i=0;
- }
- display(m,n-1,x,y); //調用動態刷新顯示程序
- }
- void keyjiafen1() //加分按鍵子程序,在主程序中不斷調用該子程序
- { //當檢測到甲隊加分按鍵按下時,對應加分
- if(k1==0)
- { //調用延時子程序 實現消除按鍵抖動功能,即,當
- 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() //顯示時間調整程序,即回表和快表
- {
- if(k3==0)
- { //在比賽中有時經常需要回表,故寫此程序
- delay(10);
- if(k3==0) //回表子程序,檢測到INT0按下時,使時間回倒
- {
- chuzanting==0; // chuzanting==0; zanting=1;為附加變量,當回表按鍵
- zanting=1; //松開時,表暫停,這兩個變量用來調用暫停
- n++;
- if(n==60)
- {
- m++;
- n=1;
- }
- }
- }
- if(k4==0) //快表子程序,檢測到INT1按下時,使倒計加快,
- { //通常情況下與回表子程序配合使用,即當回表
- //回過的時候,按此鍵調整時間
- 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; //當按鍵松開的時候,調用暫停程序條件
- chuzanting=0; //zanting=0;chuzanting=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;
- }
- }
- }
- }
- }
- void key3()
- { //半場交換場地時自動交換雙方比賽分數子程序{
- int temp; //定義中間變量temp,檢測到有按鍵按下時候
- if(zidong==1&&jie==1) //交換甲隊,乙隊比賽分數
- {
- 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關閉中斷
- {
- delay(1); //同通過死循環程序while(1),不斷刷新數碼管
- if(P1_0==0) //當暫停鍵再次按下時候,開中斷,以使比賽時間
- { //繼續倒計時,由于在暫停的時候,程序處于死循
- while(P1_0==0);
- EA=0; //無法回到主程序,故主程序中檢測按鍵按下的
- while(1) //無法回到主程序,即實現了暫停時,除了暫停鍵
- { //其他按鍵按下均無效
- display(m,n,x,y);
- if(P1_0==0)
- { //當暫停鍵再次按下時候,EA=1開中斷,計時數碼管
- delay(1); //繼續倒計時,同時通過break語句,跳出死循環
- if(P1_0==0)
- {
- while(P1_0==0);
- EA=1;
- break;
- }
- }
-
- }
- }
- }
- }
- void over() //比賽結束及及點亮下半場指示燈程序
- {
- if((m==0)&&(n==0)) //當m,n均為0的時候,通過變量jie的值判斷比賽
- { //是否結束
- if(jie>1) //如果jie>1,說明半場到了,比賽沒有結束, {
- { //jie--,關中斷,再次按下暫停鍵時候繼續倒計時
- 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,說明比賽結束了,令EA=0,
- { //比關閉中斷,比賽秒表不再走動,同時不短刷新數碼管,
- EA=0; //全場比賽結束蜂鳴器開始報警
- m=0;
- n=0;
- T1=1;
- delay(400);
- T1=0;
- P1=0x3f; // P1=0x3f上下半場指示燈同時點亮,比賽結束
- while(1)
- display(m,n,x,y); //不斷刷新數碼管
- }
- }
- }
- void main() // 主程序
- { TMOD=0x01; //設置定時器工作方式
- EA=1;
- ET0=1;
- TH0=0xb1; //定時器送計數初值,EA=1,開中斷,P3口電平拉高
- TL0=0x10; // P1=0x7f, 上半場指示燈點亮
- TR0=1;
- P3=0xff;
- P1=0x7f;
- T1=0;
- while(1)
- { //通過 while(1),反復調用循環體內的子程序
- keyjiafen1(); //執行相應的功能
- keyjianfen1();
- key2();
- if(zidong==1) //zidong==1為key3()執行條件,僅當半場結束時候執行
- key3();
- if(n==18&&bujin==0)
- {
- bujin=2; //修改變量bujin的值,設定over()中第二個if語句的執行條件
- }
- shijian();
-
- key4();
- over();
- }
- }
- 下面的是我看的原來的程序
- #include <REGX51.H> //#include <REGX51.H>為頭文件P1口各位分別用P1_0等表示
- code unsignedseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //其中{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
- //分別對應數碼管顯示的字形0到9
- intm=1,n=60,x=0,y=0,i=0,jie=2,zidong=1,bujin=1,zanting=0,chuzanting=0;
- //定義全局變量m,n,x,y,i,jie,zidong,bujin,zanting,chuzanting
- //并初始化,其中m,n分別表示分鐘與秒計時,x,y分別表示甲乙//兩隊的分數,其余中間變量
- void delay(int t) // 延時子程序 通過參數t,可以調整暫停時間
- {
- while(t--)
- {
- unsigned int i;
- for(i=0;i<200;i++);
- }
- }
-
- void display(int i,int j,int x,int y) // 數碼管動態刷新顯示程序
- {
- if(jie==1&&bujin!=2) //中間變量jie==1時,為上半場,對P1賦值
- P1=0xbf; //P1=0xbf, 即P1=1011 1111B,點亮對應上半場指示燈
-
- P2=0xfe; //數碼管動態刷新顯示程序 P2=1111 1110,i為分鐘
- P0=seg[i%100/10]; //刷新顯示時間顯示分鐘十位,調用延時程序,
- delay(1); //延時數碼管的點亮
- P2=0xff;
- P0=0;
- P2=0xfd; //同理,動態刷新時分鐘個位并延時點亮
- P0=seg[i%10];
- delay(1);
- P2|=0xff;
- P0=0;
- P2=0xfb; //同理,動態刷新時秒鐘十位并延時點亮
- P0=seg[j%100/10];
- delay(1);
- P0=0;
- P2=0xff;
- P2=0xf7; //同理,動態刷新時秒鐘個位并延時點亮
- P0=seg[j%10];
- delay(1);
- P0=0;
- P2=0xff;
- P2=0xef; //同理,動態刷新甲隊分數十位并延時點亮
- P0=seg[x%100/10];
- delay(1);
- P2=0xff;
- P0=0;
- P2=0xdf; //同理,動態刷新甲隊分數個位并延時點亮
- P0=seg[x%10];
- delay(1);
- P2=0xff;
- P0=0;
-
- P2=0xbf; / /同理,動態刷新乙隊分數十位并延時點亮
- P0=seg[y%100/10];
- delay(1);
- P0=0;
- P2=0xff;
- P2=0x7f; //同理,動態刷新乙隊分數十位并延時點亮
- P0=seg[y%10];
- delay(1);
- P0=0;
- P2=0xff;
- }
- void t0(void) interrupt 1 //調用定時器T0 基本計時單位秒
- { TH0=0xb1; //利用定時器T0,送入計數初值TH0=0xb1; TL0=0x10;
- TL0=0x10; //定時器定時單位為20毫秒
- if(n==0)
- { //分鐘與秒時間調整 當秒減到0以后分鐘減1
- n=60;m--;
- }
- i++;
- if(i==50)
- { //利用中間變量i 令i值為50 50*20毫秒=1秒
- n--; //以實現一秒計時
- i=0;
- }
- display(m,n-1,x,y); //調用動態刷新顯示程序
- }
- void keyjiafen1() //加分按鍵子程序,在主程序中不斷調用該子程序
- { //當檢測到甲隊加分按鍵按下時,對應加分
- if(RXD==0)
- { //調用延時子程序 實現消除按鍵抖動功能,即,當
- delay(1); //檢測到按鍵按下時候,延時,按鍵仍按下,說明按鍵
- if(RXD==0) //確實按下,非抖動,甲隊對應加分
- {
- while(RXD==0);
- x++;
- }
- }
- if(TXD==0) //同理,檢測乙隊加分按鍵時候按下,并加分
- {
- delay(1);
- if(TXD==0)
- {
- while(TXD==0);
- y++;
- }
- }
- }
- void keyjianfen1() //減分按鍵檢測子程序,其基本算法及功能與加{
- if(WR==0) //相同
- {
- delay(1);
- if(WR==0)
- {
- while(WR==0);
- x--;
- }
- }
- if(RD==0)
- {
- delay(1);
- if(RD==0)
- {
- while(RD==0);
- y--;
- }
- }
- }
- void key2() //顯示時間調整程序,即回表和快表
- {
- if(INT0==0)
- { //在比賽中有時經常需要回表,故寫此程序
- delay(10);
- if(INT0==0) //回表子程序,檢測到INT0按下時,使時間回倒
- {
- chuzanting==0; // chuzanting==0; zanting=1;為附加變量,當回表按鍵
- zanting=1; //松開時,表暫停,這兩個變量用來調用暫停
- n++;
- if(n==60)
- {
- m++;
- n=1;
- }
- }
- }
- if(INT1==0) //快表子程序,檢測到INT1按下時,使倒計加快,
- { //通常情況下與回表子程序配合使用,即當回表
- //回過的時候,按此鍵調整時間
- delay(10); // chuzanting==0; zanting=1;作用同上
- if(INT1==0)
- {
- chuzanting==0;
- zanting=1;
- n--;
- }
- }
- }
- void shijian() / /該程序使回表和快表按鍵松開時候能自動暫停
- {
- if(zanting==1&&INT0==1&&INT1==1&&chuzanting==0 )
- {
- EA=0; //zanting==1&&INT0==1&&INT1==1&&chuzanting==0作用為
- zanting=0; //當按鍵松開的時候,調用暫停程序條件
- chuzanting=0; //zanting=0;chuzanting=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;
- }
- }
- }
- }
- }
- void key3() //半場交換場地時自動交換雙方比賽分數子程序{
- inttemp; //定義中間變量temp,檢測到有按鍵按下時候
- if(zidong==1&&jie==1) //交換甲隊,乙隊比賽分數
- {
- 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關閉中斷
- {
- delay(1); //同通過死循環程序while(1),不斷刷新數碼管
- if(P1_0==0) //當暫停鍵再次按下時候,開中斷,以使比賽時間
- { //繼續倒計時,由于在暫停的時候,程序處于死循
- while(P1_0==0);
- EA=0; //無法回到主程序,故主程序中檢測按鍵按下的
- while(1) //無法回到主程序,即實現了暫停時,除了暫停鍵
- { //其他按鍵按下均無效
- display(m,n,x,y);
- if(P1_0==0)
- { //當暫停鍵再次按下時候,EA=1開中斷,計時數碼管
- delay(1); //繼續倒計時,同時通過break語句,跳出死循環
- if(P1_0==0)
- {
- while(P1_0==0);
- EA=1;
- break;
- }
- }
-
- }
- }
- }
- }
- void over() //比賽結束及及點亮下半場指示燈程序
- {
- if((m==0)&&(n==0)) //當m,n均為0的時候,通過變量jie的值判斷比賽
- { //是否結束
- if(jie>1) //如果jie>1,說明半場到了,比賽沒有結束, {
- { //jie--,關中斷,再次按下暫停鍵時候繼續倒計時
- 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,說明比賽結束了,令EA=0, { //比關閉中斷,比賽秒表不再走動,同時不短刷新數碼管, EA=0;
- //全場比賽結束蜂鳴器開始報警
- m=0;
- n=0;
- T1=1;
- delay(400);
- T1=0;
- P1=0x3f; // P1=0x3f上下半場指示燈同時點亮,比賽結束
- while(1)
- display(m,n,x,y); //不斷刷新數碼管
- }
- }
- }
- void main() // 主程序
- { TMOD=0x01; //設置定時器工作方式
- EA=1;
- ET0=1;
- TH0=0xb1; //定時器送計數初值,EA=1,開中斷,P3口電平拉高
- TL0=0x10; // P1=0x7f, 上半場指示燈點亮
- TR0=1;
- P3=0xff;
- P1=0x7f;
- T1=0;
- while(1)
- { //通過 while(1),反復調用循環體內的子程序
- keyjiafen1(); //執行相應的功能
- keyjianfen1();
- key2();
- if(zidong==1) //zidong==1為key3()執行條件,僅當半場結束時候執行
- key3();
- if(n==18&&bujin==0)
- {
- bujin=2; //修改變量bujin的值,設定over()中第二個if語句的執行條件
- }
- shijian();
-
- key4();
- over();
- }
- }
復制代碼
|
|