|
51單片機(jī)電子跑表課程設(shè)計(jì)
http://www.torrancerestoration.com/bbs/dpj-119818-1.html
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code Tab0[]= //定義數(shù)碼管數(shù)組,沒有小數(shù)點(diǎn)
- {
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
- };
- uchar code Tab1[]= //定義數(shù)碼管數(shù)組,有小數(shù)點(diǎn)
- {
- 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
- };
- uchar miaobiao[80]; //定義存儲(chǔ)秒表數(shù)組
- sbit K1=P3^2; //模式選擇鍵,本程序三種模式,分別是時(shí)間顯示、秒表、時(shí)間設(shè)置
- sbit K2=P3^3; //設(shè)置時(shí)間時(shí)加一/開始(暫停)秒表按鍵
- sbit K3=P3^4; //切換設(shè)置位/清零秒表按鍵
- sbit K4=P3^5; //秒記錄
- void Delay(uchar x); //延時(shí)函數(shù)
- void Display0(); //時(shí)間顯示函數(shù)
- void Display1(); //秒表顯示函數(shù)
- void Display2(); //時(shí)間設(shè)置顯示函數(shù)
- void Display3(); //保存的秒表顯示函數(shù)
- void Init(); //中斷初始化函數(shù)
- void Mode_K1(); //模式切換函數(shù)
- void KEY_MiaoBiao(); //檢測(cè)秒表操作按鍵
- void KEY_Time_Set(); //檢測(cè)時(shí)間設(shè)置按鍵
- void KEY_MiaoBiao_keep(); //檢測(cè)秒表記錄顯示按鍵操作
- uchar Hours=12,Minutes=00,seconds=00; //分別定義三個(gè)變量表示時(shí)、分、秒
- uchar Time0_bit=0; //用于定時(shí)器0的溢出標(biāo)志
- bit Set_Time=0; //設(shè)置時(shí) 閃爍時(shí)長的標(biāo)志位
- bit Set0=0; //設(shè)置時(shí)間標(biāo)志,確定是設(shè)置‘分’還設(shè)置‘時(shí)’
- uchar K1_bit=0,m=0; //用于模式切換的標(biāo)志
- uchar Miao_Biao0,Miao_Biao1,Miao_Biao2,Miao_Biao3,Miao_Biao4; //用于秒表的變量
- uchar Miao_Biao11,Miao_Biao22,Miao_Biao33,Miao_Biao44; //用于保存秒表顯示時(shí)的變量
- void main()
- {
- Init(); //中斷初始化
- while(1) //死循環(huán)
- {
- Mode_K1(); //模式掃描
- switch(K1_bit) //模式選擇
- {
- case 0:
- {
- Display0(); //顯示時(shí)間
- break;
- }
- case 1:
- {
- Display1(); //顯示秒表
- KEY_MiaoBiao(); //掃描秒表操作
- break;
- }
- case 2:
- {
- Display2(); //設(shè)置時(shí)間時(shí)的顯示程序,可閃爍定位
- KEY_Time_Set(); //掃描按鍵
- break;
- }
- case 3:
- {
- Display3(); //顯示秒表
- KEY_MiaoBiao_keep(); //掃描秒表操作
- break;
- }
- }
- }
- }
- void KEY_Time_Set() //設(shè)置時(shí)間時(shí)的按鍵掃描函數(shù)
- {
- if(K1_bit==2) //判斷是否為時(shí)間設(shè)置模式
- {
- if(K2==0) //K2有按下(下同)
- {
- Delay(10); //延時(shí)消抖(下同)
- if(K2==0) //再次檢測(cè)是否為誤按
- {
- if(Set0==0) //檢測(cè)是設(shè)置‘時(shí)’還是分,Set0為0時(shí)設(shè)置‘分’,Set0為1時(shí)設(shè)置‘時(shí)’
- {
- Minutes++; //‘分’加1
- if(Minutes==60) //當(dāng)'分'加到60時(shí),重新賦值0
- Minutes=0;
- }
- else
- {
- Hours++; //‘時(shí)’加1
- if(Hours==24) //當(dāng)'時(shí)'加到24時(shí),重新賦值0
- Hours=0;
- }
- while(!K2);//按鍵松開檢測(cè),消除松開按鍵時(shí)的抖動(dòng)干擾
- }
- }
- if(K3==0)
- {
- Delay(10);
- if(K3==0)
- {
- Set0=~Set0; //K3每按一次Set0取反,時(shí)分切換,Set0為0時(shí)設(shè)置‘分’,Set0為1時(shí)設(shè)置‘時(shí)’
- while(!K3);
- }
- }
- }
- }
- void KEY_MiaoBiao() //檢測(cè)秒表按鍵操作
- {
- if(K1_bit==1) //判斷是否為秒表模式
- {
- if(K2==0)
- {
- Delay(10);
- if(K2==0)
- {
- TR1=~TR1; //K2每按一次TR1取反,0暫;1開始定時(shí)器1,達(dá)到暫;蜷_始秒表的目的
- while(!K2);
- }
- }
- if(K4==0) //當(dāng)K4按下時(shí)秒表記錄一組數(shù)據(jù)
- {
- Delay(10);
- if(K4==0)
- {
- miaobiao[4*m]=Miao_Biao1;
- miaobiao[4*m+1]=Miao_Biao2;
- miaobiao[4*m+2]=Miao_Biao3;
- miaobiao[4*m+3]=Miao_Biao4;
- m++;
- while(!K4);
- }
- }
- if(K3==0)
- {
- Delay(10);
- if(K3==0) //當(dāng)K3按下時(shí)秒表所有數(shù)據(jù)清零,并停止定時(shí)器1
- {
- uchar i;
- for(i=0;i<81;i++)
- {
- miaobiao[i]=0; //清除所有秒記錄數(shù)據(jù)
- }
- TR1=0; //停止定時(shí)器1
- Miao_Biao0=0; //清零數(shù)據(jù)
- Miao_Biao1=0;
- Miao_Biao2=0;
- Miao_Biao3=0;
- Miao_Biao4=0;
- m=0; //秒表記錄清零
- while(!K3);
- }
- }
- }
- }
- void KEY_MiaoBiao_keep() //檢測(cè)秒表記錄顯示按鍵操作
- {
- if(K1_bit==3) //判斷是否為秒表記錄顯示模式
- {
-
- if(K2==0)
- {
- Delay(10);
- if(K2==0)
- {
- m++;
- while(!K2);
- }
- }
- Miao_Biao11=miaobiao[4*m];
- Miao_Biao22=miaobiao[4*m+1];
- Miao_Biao33=miaobiao[4*m+2];
- Miao_Biao44=miaobiao[4*m+3];
- if(K3==0)
- {
- Delay(10);
- if(K3==0) //當(dāng)K3按下時(shí)秒表所有數(shù)據(jù)清零,并停止定時(shí)器1
- {
- uchar i;
- for(i=0;i<81;i++)
- {
- miaobiao[i]=0; //清除所有秒記錄數(shù)據(jù)
- }
- while(!K3);
- }
- }
- }
- }
- void Mode_K1() //模式選擇鍵,本程序三種模式,分別是時(shí)間顯示、秒表、時(shí)間設(shè)置
- {
- if(K1==0)
- {
- Delay(10);
- if(K1==0)
- {
- K1_bit++;
- // if(K1_bit==1) m=0;
- if(K1_bit==3) m=0;
- if(K1_bit==4)
- {
- K1_bit=0;
- }
- while(!K1);
- /***********************************************************************
- *************當(dāng)K1_bit為0時(shí)顯示時(shí)鐘,為1時(shí)進(jìn)入秒表,*********************
- *******************為2時(shí)進(jìn)入時(shí)間設(shè)置模式,3時(shí)進(jìn)入秒表記錄顯示***********
- ***********************************************************************/
- }
- }
- }
- void Time1() interrupt 3 //定時(shí)器1函數(shù)
- {
- TH1=(65536-50000)/256; //重裝初值
- TL1=(65536-50000)%256;
- Miao_Biao0++;
- if(Miao_Biao0==2) //以下為秒表數(shù)據(jù)處理,每?jī)纱窝h(huán)進(jìn)行一次操作
- {
- Miao_Biao0=0;
- Miao_Biao1++; //Miao_Biao1每加1次為100ms
- if(Miao_Biao1==10)
- {
- Miao_Biao1=0;
- Miao_Biao2++;
- if(Miao_Biao2==60)
- {
- Miao_Biao2=0;
- Miao_Biao3++;
- if(Miao_Biao3==60)
- {
- Miao_Biao3=0;
- Miao_Biao4++;
- if(Miao_Biao4==10)
- Miao_Biao4=0;
- }
- }
- }
- }
- }
- void Time0() interrupt 1 //定時(shí)器0函數(shù)
- {
- TH0=(65536-50000)/256; //重裝初值
- TL0=(65536-50000)%256;
- Time0_bit++;
- if((Time0_bit%10)==0) //每溢出10次Time0_bit取反一次
- Set_Time=~Set_Time; //0.5秒閃爍一次
- if(Time0_bit==20) //以下為時(shí)間數(shù)據(jù)處理
- {
- Time0_bit=0;
- seconds++;
- if(seconds==60)
- {
- seconds=0;
- Minutes++;
- if(Minutes==60)
- {
- Minutes=0;
- Hours++;
- if(Hours==24)
- {
- Hours=0;
- }
- }
- }
- }
- }
- void Init() //中斷初始化函數(shù)
- {
- EA=1; //開總中斷
- TMOD=0X11; //定時(shí)器工作方式選擇,定時(shí)器0和定時(shí)器1都選擇第1種工作方式
- TH0=(65536-50000)/256; //定時(shí)器0裝初值,定時(shí)50ms
- TL0=(65536-50000)%256;
- ET0=1; //開定時(shí)器0開關(guān)
- TR0=1; //開定時(shí)器0小開關(guān)
- TH1=(65536-50000)/256; //定時(shí)器1裝初值,定時(shí)50ms
- TL1=(65536-50000)%256;
- ET1=1; //開定時(shí)器1開關(guān)
- TR1=0; //關(guān)定時(shí)器1小開關(guān)
- }
- void Display3() //顯示保存的秒表
- {
- P0=Tab0[Miao_Biao11%10]; //顯示1/10秒的個(gè)位
- P1=0xdf; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Miao_Biao22%10]; //顯示秒的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xef; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Miao_Biao22/10]; //顯示秒的十位
- P1=0xf7; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Miao_Biao33%10]; //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xfb; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Miao_Biao33/10]; //顯示分的十位
- P1=0xfd; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Miao_Biao44%10]; //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xfe; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- void Display2() //時(shí)間設(shè)置時(shí)的顯示函數(shù)
- {
- if(Set0==0) //判斷是否為設(shè)置‘時(shí)’還是‘分’
- {
- P0=Tab0[seconds%10]; //顯示秒的個(gè)位
- P1=0xdf; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[seconds/10]; //顯示秒的十位
- P1=0xef; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- if(Set_Time) //這個(gè)if語句實(shí)現(xiàn)分鐘以0.5秒的頻率閃爍
- {
- P0=Tab1[Minutes%10]; //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xf7; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Minutes/10]; //顯示分的十位
- P1=0xfb; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- else
- {
- P0=0x00; //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xf7; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=0x00; //顯示分的十位
- P1=0xfb; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- P0=Tab1[Hours%10]; //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xfd; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Hours/10]; //顯示時(shí)的十位
- P1=0xfe; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- else //‘時(shí)’鐘閃爍
- {
- P0=Tab0[seconds%10]; //顯示秒的個(gè)位
- P1=0xdf; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[seconds/10]; //顯示秒的十位
- P1=0xef; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Minutes%10]; //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xf7; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Minutes/10]; //顯示分的十位
- P1=0xfb; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- if(Set_Time) //這個(gè)if語句實(shí)現(xiàn)‘時(shí)’鐘以0.5秒的頻率閃爍
- {
- P0=Tab1[Hours%10]; //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xfd; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Hours/10]; //顯示時(shí)的十位
- P1=0xfe; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- else
- {
- P0=0x00; //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xFF; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=0X00; //顯示時(shí)的十位
- P1=0xFF; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- }
- }
- void Display1() //顯示秒表
- {
- P0=Tab0[Miao_Biao1%10]; //顯示1/10秒的個(gè)位
- P1=0xdf; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Miao_Biao2%10]; //顯示秒的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xef; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Miao_Biao2/10]; //顯示秒的十位
- P1=0xf7; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Miao_Biao3%10]; //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xfb; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Miao_Biao3/10]; //顯示分的十位
- P1=0xfd; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Miao_Biao4%10]; //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xfe; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- void Display0() //顯示時(shí)鐘
- {
- P0=Tab0[seconds%10]; //顯示秒的個(gè)位
- P1=0xdf; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[seconds/10]; //顯示秒的十位
- P1=0xef; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Minutes%10]; //顯示分的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xf7; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Minutes/10]; //顯示分的十位
- P1=0xfb; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab1[Hours%10]; //顯示時(shí)的個(gè)位,需要加上小數(shù)點(diǎn)做分隔符
- P1=0xfd; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- P0=Tab0[Hours/10]; //顯示時(shí)的十位
- P1=0xfe; //段選
- Delay(10); //延時(shí)
- P0=0X00; //消隱
- }
- void Delay(uchar x) //延時(shí)
- {
- uchar i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
復(fù)制代碼
|
|