#include <AT89X52.H> #define uint unsigned int #define uchar unsigned char uchar code tabel[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};// 這個數組存放0~9 uint counter;//定義計數器,用來計量脈沖次數 sbit wei_ge=P1^0; //定義引腳 sbit wei_shi=P1^1; sbit wei_bai=P1^2; sbit wei_qian=P1^3; sbit BUZZER=P2^0; void delay_(unsigned int j) { unsigned int k; while (--j!=0) { for (k=0;k<600;k++); } } /* 延時子程序 *******************************************************/ void delay(uint xms) { uint j; for(;xms>0;xms--) for(j=110;j>0;j--); } /* 數碼管掃描顯示子程序 ************************************************/ void shuma_show(uint date) { uchar ge,shi,bai,qian;// 數碼管顯示變量聲明 ge=date%10;// 個位數換算 shi=date/10%10;// 十位換算 bai=date/100%10;// 百位換算 qian=date/1000;// 千位換算 wei_ge=1;// 打開個位顯示 P0=tabel[ge]; // 數據輸入數碼管內 delay(2);// 延時顯示 2ms wei_ge=0;// 關閉個位顯示 wei_shi=1;// 打開個位顯示 P0=tabel[shi]; // 數據輸入數碼管內 delay(2);// 延時顯示 2ms wei_shi=0;// 關閉個位顯示 wei_bai=1;// 打開個位顯示 P0=tabel[bai]; // 數據輸入數碼管內 delay(2);// 延時顯示 2ms wei_bai=0;// 關閉個位顯示 wei_qian=1;// 打開個位顯示 P0=tabel[qian]; // 數據輸入數碼管內 delay(2);// 延時顯示 2ms wei_qian=0;// 關閉個位顯示 } /* 初始化子程序 **********************************************************/ void inti() { wei_ge=wei_shi=wei_bai=wei_qian=0;// 各 I/O 口初始化 TMOD=0x05;// 設置計數器 0 工作方式 1 ,為 16 位計數器,且為外部計數 TH0=0;// 計數器高 8 位裝 0 TL0=0;// 計數器低 8 位裝 0 TR0=1;// 開計數器 } /* 主程序 ***************************************************************/ void main() { BUZZER=0; inti(); while(1) { counter=TH0*255+TL0;// 讀計數器數據 } if(counter==1000) { TH0=TL0=0; } // 計滿清零 shuma_show(counter);// 數碼管掃描顯示 if((counter%100==0)&& counter!=0)// 逢百提醒 { BUZZER=1; delay(500); BUZZER=1; } } }
|