這個秒表目前可實現:開始計時、停止計時和清零三個功能。這個秒表的設計思路是這樣的:首先需要一個8位數碼管(因為要顯示分、秒、毫秒),用3-8譯碼器位選。再任選一個8位IO口進行段碼傳輸;按鍵的控制是使用74HC165芯片對鍵盤數據讀入單片機(并行轉串行);主要是使用定時器及其中斷,我使用的是Timer0,它配置見程序中的Timer0Init()函數。
單片機源程序如下:
- #include "reg52.h"
- #include "intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 code smgduan[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
- 0x7c,0x39,0x5e,0x79,0x71}; //共陰
- u8 code clear[8] = {0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f}; //8位數碼管歸零
- u8 Digdisplay[8]; //儲存分 秒 毫秒
- //全局變量
- u8 ssec, sec, min;
- u16 num;
- //3-8譯碼器控制引腳
- sbit LSA = P1^0;
- sbit LSB = P1^1;
- sbit LSC = P1^2;
- //74HC165芯片引腳
- sbit SF_LD = P1^3;
- sbit CLK = P1^4;
- sbit IN_data = P1^5;
- /****************************************
- 延時函數,延時大約10μs
- ****************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /****************************************
- 74HC165芯片讀獨立按鍵數據函數
- ****************************************/
- u8 Read74HC165()
- {
- u8 i;
- u8 indata = 0x00;
- SF_LD = 0;
- _nop_();
- SF_LD = 1;
- for(i = 0; i < 8; i++)
- {
- indata = indata << 1;
-
- CLK = 0;
- _nop_(); //低電平一段時間,寫入數據
- indata |= IN_data; //寫數據
-
- CLK = 1;
- }
- return indata;
- }
- /****************************************
- 秒表控制函數
- 用于秒表的開始、暫停和歸零
- ****************************************/
- void KeyPros()
- {
- u8 hc = Read74HC165();
- if(hc == 0xfe) //開始計時
- {
- TR0 = 1;
- }
- else if(hc == 0xfd)
- {
- TR0 = 0;
- }
- else if(hc == 0xfb)
- {
- ssec = 0;
- sec = 0;
- min = 0;
- }
- }
- /****************************************
- 數碼管掃描函數(使用3-8譯碼器)
- ****************************************/
- void DigPros()
- {
- u8 i;
- for(i = 0; i < 8; i++)
- {
- switch(i)
- {
- case 0: LSA = 0; LSB = 0; LSC = 0; break;
- case 1: LSA = 1; LSB = 0; LSC = 0; break;
- case 2: LSA = 0; LSB = 1; LSC = 0; break;
- case 3: LSA = 1; LSB = 1; LSC = 0; break;
- case 4: LSA = 0; LSB = 0; LSC = 1; break;
- case 5: LSA = 1; LSB = 0; LSC = 1; break;
- case 6: LSA = 0; LSB = 1; LSC = 1; break;
- case 7: LSA = 1; LSB = 1; LSC = 1; break;
- }
- P0 = Digdisplay[i]; //發送段碼
- delay(100); //隔一段時間掃描
- P0 = 0x00; //防止重影,清空數碼管
- }
- }
- /****************************************
- 分、秒、毫秒數據寫入全局數組
- ****************************************/
- void DigtalPros()
- {
- Digdisplay[0] = smgduan[min/10];
- Digdisplay[1] = smgduan[min%10];
- Digdisplay[2] = 0x40;
- Digdisplay[3] = smgduan[sec/10];
- Digdisplay[4] = smgduan[sec%10];
- Digdisplay[5] = 0x40;
- Digdisplay[6] = smgduan[ssec/10];
- Digdisplay[7] = smgduan[ssec%10];
- }
- /****************************************
- Timer0定時器配置
- ****************************************/
- void Timer0Init()
- {
- TMOD |= 0x01; //選擇定時器T0
- TH0 = 0xd8;
- TL0 = 0xf0; //設定初值55536 計時10ms
- ET0 = 1; //允許T0中斷
- EA = 1; //開啟總中斷
- //TR0 = 1; //開啟定時器T0
- // TR0 = 0; //關閉定時器T0
- }
- /****************************************
- 分、秒、毫秒處理函數
- ****************************************/
- void M_SEC_SSEC()
- {
- if(ssec >= 100)
- {
- ssec = 0; //清零
- sec++;
- if(sec >= 60)
- {
- sec = 0; //清零
- min++;
- if(min >= 60)
- {
- min = 0; //清零
- }
- }
- }
- }
- void main(void)
- {
- // GPIO_LED = 1; //初始化LED
- Timer0Init(); //初始化定時器T0
- while(1)
- {
- KeyPros(); //控制秒表函數
- M_SEC_SSEC();
- DigtalPros();
- DigPros(); //掃描數碼管
- }
- }
- /****************************************
- Timer0中斷處理函數
- ****************************************/
- void Time0() interrupt 1
- {
- TH0 = 0xd8;
- TL0 = 0xf0; //重裝載初值
- ssec++; //中斷一百次,ssec=100,即1s
- num++;
- }
復制代碼
以上程序51hei提供下載:
電子秒表.rar
(25.26 KB, 下載次數: 15)
2020-4-5 22:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|