四、元器件清單 五、C語言程序
- *******************************/
- /* 智能秒表(完美版) */
- /*******************************/
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit key1=P2^0; //定義"啟動/暫停"按鈕
- sbit key2=P2^1; //定義"復位"按鈕
- sbit key3=P2^2; //定義"模式"按鈕
- sbit key4=P2^3; //定義"查看"按鈕
- sbit wei1=P2^4; //定義位選
- sbit wei2=P2^5;
- sbit wei3=P2^6;
- sbit wei4=P2^7;
- bit flag_start,flag_mode,flag_5sec;
- uchar temp,temp1,aa,aa1,shi,ge,shifen,baifen,num,i,j;
- uchar time_data1[11],time_data2[11];
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71}; //不帶小數點共陰極數碼管編碼
- uchar code tabledp[]={
- 0xbf,0x86,0xdb,0xcf,
- 0xe6,0xed,0xfd,0x87,
- 0xff,0xef,0xf7,0xfc,
- 0xb9,0xde,0xf9,0xf1}; //帶小數點共陰極數碼管編碼
- void display(uchar shi,uchar ge,uchar shifen,uchar baifen); //聲明顯示子函數
- void delay(uint z); //聲明延時子函數
- void init(); //聲明初始化函數
- void key(); //聲明鍵掃描函數
- void display_process(); //聲明顯示處理函數
- void main()
- {
- init(); //調用初始化子程序
- while(1)
- {
- key();
- display_process();
- display(shi,ge,shifen,baifen); //調用顯示子函數
- }
- }
- void delay(uint z) //延時子函數
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display(uchar shi,uchar ge,uchar shifen,uchar baifen) //顯示子程序
- {
- P0=table[shi]; //使用動態掃描的方法實現數碼管顯示
- wei1=0;
- delay(1);
- wei1=1;
- P0=tabledp[ge];
- wei2=0;
- delay(1);
- wei2=1;
-
- P0=table[shifen];//使用動態掃描的方法實現數碼管顯示
- wei3=0;
- delay(1);
- wei3=1;
- P0=table[baifen];
- wei4=0;
- delay(1);
- wei4=1;
- }
- void init() //初始化子程序
- {
- temp=0;
- TMOD=0x01; //使用定時器T0的方式1
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256; //定時50ms中斷一次
- EA=1; //中斷總允許
- ET0=1; //允許定時器T0中斷
- }
- void key()
- {
- if(key1==0) //檢測"啟動"按鈕是否按下
- {
- delay(5); //延時去抖動
- if(key1==0) //再次檢測"啟動"按鈕是否按下
- {
- while(!key1); //松手檢測
- flag_start=~flag_start;
- if(flag_mode==0)
- {
- if(flag_start==1)
- TR0=1; //啟動定時器開始工作
- else
- TR0=0;
- }
- else
- {
- if(flag_start==1)
- TR0=1;
- else
- TR0=0;
- }
- }
- }
- if(key2==0) //檢測"停止"按鈕是否按下
- {
- delay(5);
- if(key2==0)
- {
- while(!key2);
- if(flag_mode==0||i!=0)
- {
- shi=0; //關閉定時器
- ge=0;
- shifen=0;
- baifen=0;
- aa=0;
- temp=0;
- TR0=0;
- i=0;
- num=0;
- for(j=0;j<=10;j++)
- {
- time_data1[j]=0;
- time_data2[j]=0;
- }
- }
- else
- {
- num++;
- if(num==11)
- num=1;
- aa1=aa;
- temp1=temp;
- time_data1[num]=aa1;
- time_data2[num]=temp1;
- flag_5sec=0;
- }
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3);
- flag_mode=~flag_mode;
- }
- }
- if(key4==0)
- {
- delay(5);
- if(key4==0)
- {
- while(!key4);
- i++;
- TR0=0;
- if(i==11)
- i=1;
- }
- }
- }
- void display_process()
- {
- shifen=aa%100/10;
- baifen=aa%10;
- shi=temp%100/10;
- ge=temp%10;
- if(flag_mode==1&&num!=0&&flag_5sec==0)
- {
- shi=time_data2[num]/10;
- ge=time_data2[num]%10;
- shifen=time_data1[num]/10;
- baifen=time_data1[num]%10;
- if(temp-time_data2[num]==2)
- flag_5sec=~flag_5sec;
- }
- if(i!=0)
- {
- shi=time_data2[i]/10;
- ge=time_data2[i]%10;
- shifen=time_data1[i]/10;
- baifen=time_data1[i]%10;
- }
- }
- void timer0() interrupt 1
- {
- TH0=(65536-10000)/256; //重新賦初值
- TL0=(65536-10000)%256;
- aa++; //中斷一次變量aa的值加1
- if(aa==100) //中斷100次后,定時時間為100*10ms=1000ms=1s,將變量temp的值加1
- {
- aa=0;
- temp++;
- if(temp==100) //秒表到達100s后回零
- temp=0;
- }
- }
復制代碼
|