1、總設計框圖
1.png (17.58 KB, 下載次數: 28)
下載附件
2021-11-26 20:48 上傳
2、硬件仿真圖
2.png (254.76 KB, 下載次數: 25)
下載附件
2021-11-26 20:48 上傳
3、主函數和定時器代碼
51hei圖片20211126154736.png (68.97 KB, 下載次數: 26)
下載附件
2021-11-26 15:47 上傳
數碼管倒計時設計
51hei圖片20211126155001.png (36.23 KB, 下載次數: 36)
下載附件
2021-11-26 15:50 上傳
中斷控制程序
51hei圖片20.png (45.71 KB, 下載次數: 29)
下載附件
2021-11-26 15:53 上傳
單片機源程序如下:
- #include<reg51.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- //對應數碼管顯示數字0-9
- int u_m=20,u_n=0,u_x=0,u_y=0,u_i=0,h=0,k;
- //定義全局變量并初始化,m,n表示分鐘與秒,x,y表示A,B兩隊分數
- sbit P1_0=P1^0;
- sbit P1_1=P1^1;
- sbit P1_2=P1^2;
- sbit P1_3=P1^3;
- sbit P3_2=P3^2;
- sbit P3_3=P3^3;
- sbit P3_6=P3^6;
- sbit P3_7=P3^7;
- void delay(uint x)//定義延時程序,通過設置參數x,改變延時時間長度
- {
- while(x--)
- {
- uint y;
- for(y=0;y<200;y++);
- }
- }
- /*顯示子程序,變量i,j分別是分秒,變量x,y是A,B兩隊的分數*/
- void display(int u_i,int u_j,int u_x,int u_y)
- {
- P2=~0xfe; //刷新數碼管顯示時間的分鐘十位,調用延時程序
- P0=~seg[u_i%100/10];
- delay(1); //延時數碼管點亮
- P2=0x00;
- P0=0xff;
- P2=~0xfd; //刷新刷管分鐘位的個位
- P0=~seg[u_i%10];
- delay(1);
- P2=0x00;
- P0=0xff;
- P2=~0xfb; //刷新數碼管秒位的十位
- P0=~seg[u_j%100/10];
- delay(1);
- P2=0x00;
- P0=0xff;
- P2=~0xf7; //刷新數碼管秒位的個位
- P0=~seg[u_j%10];
- delay(1);
- P2=0x00;
- P0=0xff;
- P2=~0xef; //刷新數碼管A對分數的十位
- P0=~seg[u_x%100/10];
- delay(1);
- P2=0x00;
- P0=0xff;
- P2=~0xdf; //刷新數碼管A對分數的個位
- P0=~seg[u_x%10];
- delay(1);
- P2=0x00;
- P0=0xff;
- P2=~0xbf; //刷新數碼管B隊分數的十位
- P0=~seg[u_y%100/10];
- delay(1);
- P2=0x00;
- P0=0xff;
- P2=~0x7f; //刷新數碼管B隊分數的個位
- P0=~seg[u_y%10];
- delay(1);
- P2=0x00;
- P0=0xff;
- }
- void t0() interrupt 1 //定義中斷程序,調用定時器T0
- {
- TH0=0xb1; //對定時器T0送入初值,TH0=0xb1
- TL0=0x10; //TL0=0X10定時器定時為20ms
- if(u_n<0) //每20ms調用一次
- {
- u_n=59;
- u_m--;
-
- }
- u_i++;
- if(u_i==50) //定義I為50,50*20ms=1s
- {
- u_n--;
- u_i=0;
- }
- display(u_m,u_n,u_x,u_y);//調用數碼管顯示程序,每20ms刷新
- }
- void int0() interrupt 0 //外部中斷0的控制程序,每次按鍵按下,加2操作
- {u_x+=2;if(u_x>98)u_x=98;}
- void int1() interrupt 2 //外部中斷1的控制程序,每次按鍵按下,加2操作
- {u_y+=2;if(u_y>98)u_y=98;}
- void timing() //定義調時程序
- {
- if(P1_2==0) //當按下P1_2時
- {
- delay(1); //延時消抖
- if(P1_2==0)
- {
- u_n++; //秒位加1
- if(u_n==60)//當秒位到60時
- {
- u_m++;//分位加1,秒變1
- u_n=1;
- }
- }
- }if(P1_3==0) //當按下P1_3時
- {
- delay(1);
- if(P1_3==0)
- {
- u_n--;//秒位減1
- if(u_n<0) //當秒位減到0時,分位減1,秒位變59
- { u_n=59;
- u_m--;
-
- }}}}
- void exchange() //定義比分交換程序
- {
- int u_t; //定義中間變量
- if(P1_1==0) //當P1_1按下時
- {
- delay(1); //延時消抖
- while(P1_1==0);
- u_t=u_x; //利用中間變量t,將A,B兩隊比分交換
- u_x=u_y;
- u_y=u_t;
- display(u_m,u_n,u_x,u_y); //刷新數碼管
- }
- }
- void suspend() //定義暫停程序
- {
- if(P1_0==0) //當按下P1_0時
- {
- delay(1); //延時消抖
- while(P1_0==0);
- EA=0; //關中斷,進入死循環
- while(1)
- {
- display(u_m,u_n,u_x,u_y);
- if(P1_0==0) //當再次按下P1_0時,跳出死循環
- {
- delay(1);
- while(P1_0==0)
- EA=1;
- break;
- }}}}
- void alertor() //定義報警程序
- {
- if(((u_m==0)&&(u_n==0))|(P3_2==0)|(P3_3==0)|(P1_0==0)|(P1_1==0)|(P1_2==0)|(P1_3==0))
- {
- P3_7=1;
- P3_6=1;//P3_7和P3_6間隔輸出高低電平,使蜂鳴器響
- delay(5);
- P3_7=0;
- P3_6=0;
- delay(5);
- }
- }
- void conclude() //定義結束子程序
- {
- M: if(h==1) //當時間條件滿足時,關閉中斷,使數碼管保持狀態顯示
- {
- EA=0;
- delay(20);
- u_m=0;
- u_n=0;
- P3_6=1;
- P3_7=1;
- delay(200);
- P3_7=0;
- P3_6=0;
- while(1)
- {
- display(u_m,u_n,u_x,u_y);
- exchange();
- if(P1_0==0) //當P1_0再次按下時,跳出循環
- {
- delay(1);
- while(P1_0==0)
- {
- EA=1;
- u_m=20; //重新賦予初始值,開始比賽
- u_n=0;
- h=0;
- goto M ;
- }
- }
- }
- }
- }
- void main() //定義主程序
- {
- EX0=1;//外部中斷0的分開關打開
- EX1=1;//外部中斷1的分開關打開
- IT0=1;//外部中斷0為下降沿觸發
- IT1=1;//外部中斷1為下降沿觸發
- PX1=1;//外部中斷1為高優先級
- PX0=0;//外部中斷0為低優先級
- TMOD=0x01; //初始化程序
- EA=1; //開關總中斷打開
- ET0=1;
- P3_7=0;
- P0=0xff;
- P2=0x00;
- if(P1_0==0) //第一次按下P1_0,單片機啟動,顯示初始值
- { //由于調用了一次暫停功能,會顯示初始值
- TH0=0xb1;
- TL0=0x10;
- TR0=1; //啟動定時器
- P3=0xff;
- P1=0x7f;
- P3_7=0;
- while(1)
- {
- timing(); //調時子程序
- exchange(); //比分交換程序
- suspend(); //暫停程序
- alertor(); //報警程序
- if((u_m==0)&&(u_n==1)) //判斷子程序結束調用條件
- {
- h=1;
- }
- conclude(); //結束子程序
- }
- }
- }
復制代碼
仿真代碼51hei附件下載:
仿真程序.7z
(61.93 KB, 下載次數: 47)
2021-11-27 02:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|