超級秒表,具有計時功能,暫停功能,定時器功能,用起來超級好玩。
單片機源程序如下:
- #ifndef _TM1638_H
- #define _TM1638_H
- #include <REG52.H>
- #define DATA_COMMAND 0X40
- #define DISP_COMMAND 0x80
- #define ADDR_COMMAND 0XC0
- //TM1638模塊引腳定義
- sbit DIO=P1^0;
- sbit CLK=P1^1;
- sbit STB=P1^2;
- //共陰數碼管顯示代碼
- unsigned char code tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
- 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
- void TM1638_Write(unsigned char DATA) //寫數據函數
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- CLK=0;
- if(DATA&0x01)
- {
- DIO=1;
- }
- else
- {
- DIO=0;
- }
- CLK=1;
- DATA>>=1;
- }
- }
- unsigned char TM1638_Read(void) //讀數據函數
- {
- unsigned char i;
- unsigned char temp=0x00;
- DIO=1;
- for(i=0;i<8;i++)
- {
- temp>>=1;
- CLK=0;
- if(DIO)
- {
- temp|=0x80;
- }
- else
- {
- temp&=0x7f;
- }
- CLK=1;
- }
- return temp;
- }
- void Write_COM(unsigned char cmd) //發送命令字
- {
- STB=0;
- TM1638_Write(cmd);
- STB=1;
- }
- unsigned char Read_key()
- {
- unsigned char Key[4],i,Keyvalue=0;
- STB=0;
- // Write_COM(0x42);
- TM1638_Write(0x42);
- for(i=0;i<4;i++)
- {
- Key[i]=TM1638_Read();
- }
- STB=1;
- for(i=0;i<4;i++)
- {
- Keyvalue|=Key[i]<<i;
- }
- for(i=0;i<8;i++)
- {
- if((0x01<<i)==Keyvalue)
- {break;}
- }
- return i;
- }
- /*
- unsigned char Read_key(void)
- {
- unsigned char c[4],i,key_value=0;
- STB=0;
- TM1638_Write(0x42); //讀鍵掃數據 命令
- for(i=0;i<4;i++)
- c[i]=TM1638_Read();
- STB=1; //4個字節數據合成一個字節
- for(i=0;i<4;i++)
- key_value|=c[i]<<i;
- for(i=0;i<8;i++)
- if((0x01<<i)==key_value)
- break;
- return i;
- }
- */
- void Write_DATA(unsigned char add,unsigned char DATA) //指定地址寫入數據
- {
- Write_COM(0x44);
- STB=0;
- TM1638_Write(0xc0|add);
- TM1638_Write(DATA);
- STB=1;
- }
- /*
- void Write_oneLED(unsigned char num,unsigned char flag) //單獨控制一個LED函數,num為需要控制的led序號,flag為0時熄滅,不為0時點亮
- {
- if(flag)
- Write_DATA(2*num+1,1);
- else
- Write_DATA(2*num+1,0);
- } */
- void Write_allLED(unsigned char LED_flag) //控制全部LED函數,LED_flag表示各個LED狀態
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if(LED_flag&(1<<i))
- //Write_DATA(2*i+1,3);
- Write_DATA(2*i+1,1);
- else
- Write_DATA(2*i+1,0);
- }
- }
- //TM1638初始化函數
- void init_TM1638(void)
- {
- unsigned char i;
- Write_COM(0x8b); //亮度 (0x88-0x8f)8級亮度可調
- Write_COM(0x40); //采用地址自動加1
- STB=0; //
- TM1638_Write(0xc0); //設置起始地址
- for(i=0;i<16;i++) //傳送16個字節的數據
- TM1638_Write(0x00);
- STB=1;
- }
- #endif
復制代碼- #include<reg52.h>
- #include "tm1638.h"
- #define u16 unsigned int
- #define u8 unsigned char
- /*
- 制作一個秒表 要求: a. 可以計時至少 10 分鐘,并且精確到0.01s,在數碼管上實時顯示 當前時間;
- b. 按下 S1,開始計時;按下 S2 暫停/啟動;按下 S3 結束計時;
- c.(選做)增加一個模式選擇鍵以及數字輸入按鍵,按下后可在計時模 式和設置模式切換。
- 在設置模式中,可設置一個時間(利用按鍵輸入), 切換回計時模式時,當計到設置時間時,蜂鳴器響。
- */
- u16 TIMERBAT=0;
- bit flag=0;
- u8 state=0; //0沒開始計時或者暫停 1開始計時 2設置模式
- u8 hym;//按鍵鍵碼控制
- void Timer0Init(void);
- void Display();
- void Set_Bell();
- void Clock_System();
- void CLR_Time();
- void CLRBell();
- bit Judge_Baba();
- u8 code distab[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};
- u8 shijian[5]; //0爸爸 1秒 2分 3時
- u8 shijianshezhi[4]; //0秒 1分 2時
- void main()
- {
- init_TM1638();
- Timer0Init();
- flag=0;
- while(1)
- {
- if(state==2)
- {
- Set_Bell();
- }
- else
- {
- Clock_System();
- }
-
- }
- }
- void Set_Bell()
- {
- TR0=0;
- while(state==2)
- {
- hym=Read_key();
- if(hym!=8)
- {
- switch(hym)
- {
- case 3:state=0;break;
- case 4:shijianshezhi[2]++;shijianshezhi[2]%=24;break;
- case 5:shijianshezhi[1]++;shijianshezhi[1]%=60;break;
- case 6:shijianshezhi[0]++;shijianshezhi[0]%=60;break;
- case 7:CLRBell();break;
- }
- while(Read_key()==hym);
- }
- Display();
- }
- }
- void Clock_System()
- {
- while(state!=2)
- {
- TR0=state;
- hym=Read_key();
- if(hym!=8)
- {
- switch(hym)
- {
- case 0:state=1;break;
- case 1:if(state==1){state=0;} else{state=1;}break;
- case 2:state=0;CLR_Time();break;
- case 3:state=2;break;
- }
- while(Read_key()==hym);
- }
- if(flag)
- {
- flag=0;
- shijian[0]++;
- }
- if(shijian[0]==100)
- {
- shijian[0]=0;
- shijian[1]++;
- }
- if(shijian[1]==60)
- {
- shijian[1]=0;
- shijian[2]++;
- }
- if(shijian[2]==60)
- {
- shijian[2]=0;
- shijian[3]++;
- shijian[3]%=24;
- }
- Display();
- if(Judge_Baba())
- {
- Write_allLED(0xff);
- }
- else
- {
- Write_allLED(0x00);
- }
- }
- }
- void CLR_Time()
- {
- u8 i;
- for(i=0;i<4;i++)
- {
- shijian[i]=0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
超級秒表.zip
(32.39 KB, 下載次數: 139)
2020-11-24 23:40 上傳
點擊文件名下載附件
|