脈沖信號由AT89C51的P3.5輸入,由單片機測量出脈沖信號的頻率,并由4位數碼管顯示,具體電路如圖5-19 所示。P1.0腳外接一開關key,按一下key則進行頻率測試。其效果見如圖5-19——頻率7.458K的脈沖測試結果顯示。
軟件代碼 - /*****脈沖信號由P3.5輸入,按下key顯示其頻率*****/
- #include<reg51.h> //定義8051寄存器的頭文件
- sbit KEY=P1^0;//聲明開關接于P1.0腳
- unsigned char TAB[11]={
- 0xc0,0xf9,0xa4,0xb0,0x99, //數字0~4
- 0x92,0x82,0xf8,0x80,0x90, //數字5~9
- 0xbf};//"-"號
- unsigned char disp[4];//聲明顯示區數組
- unsigned char times = 0;
- /********聲明基本變量*******/
- bit status_F = 1; //是否完成測量狀態標志位
- unsigned char scan = 0X01; //掃描信號
- unsigned int freq = 0; //頻率數值變量
- sfr16 DPTR = 0X82; //聲明DPTR
- /*****函數聲明*****/
- void delayms(int);
- void measure(void);
- void display(int);
- /******主程序*****/
- main(){
- while(1){
- if(KEY==0){ //按鍵按下開始測量
- delayms(20);//延時消抖
- if(KEY==0){ //確認按鍵按下
- status_F=0;
- startmeasure();
- while(status_F==0);//等待1S時間到
- }
- }
- display(freq);
- }
- }
- /*********開始測量函數***********/
- void startmeasure(){
- P3=0XFF;
- IE=0X82; //啟用T0、T1中斷
- TMOD=0X51;//T1為計數器,T0為定時器,均為方式1
- TH0=(65536-50000)/256 //定時器初值的高8位
- TL0=(65536-50000)%256 //定時器初值的低8位
- TH1=0;TL1=0;//設置T1歸零
- TR0=1;TR1=1;//啟動T0、T1
- }
- /*********T0中斷服務程序,定時時間50mS***********/
- void T0_int () interrupt1{
- TH0=(65536-50000)/256 //定時器初值的高8位
- TL0=(65536-50000)%256 //定時器初值的低8位
- if(++times==20){ //若1S時間到
- times=0; //重新計次
- status_F=1; //完成測量
- TR1=0,TR0=0; //關閉T1、T0
- DPL=TL1;DPH=TH1; //脈沖計數值高、低8位
- freq=DPTR;//脈沖計數值存入freq變量
- }
- }
- /***********顯示函數*************/
- void display(int dat){
- uchar i;
- if(dat>=10000){ //若計數值大于10K,即頻率超過10KHz
- disp[0]=TAB[10];//負號填入千位數顯示區
- disp[1]=TAB[10];//負號填入百位數顯示區
- disp[2]=TAB[dat/10000];//計數值的"萬"位填入十位顯示區
- disp[3]=TAB[(dat/1000)%10];//計數值的"千"位填入個位顯示區
- }
- else{ //頻率低于10KHz
- disp[0]=TAB[(dat/1000)%10];//填入千位數顯示區
- disp[1]=TAB[(dat/100)%10]; //填入百位數顯示區
- disp[2]=TAB[(dat/10)%10]; //填入十位數顯示區
- disp[3]=TAB[dat%10]; //填入個位數顯示區
- }
- P3=0x01;//初始掃描信號
- for(i=0;i<4;i++){//掃描4次
- P2 =0XFF; //關閉7段LED數碼管
- P3=~scan;//輸出掃描信號
- P2=disp[ i];//[ i]輸出顯示信號
- delayms(4);//延時4ms
- P3<<=1; //下一個掃描信號
- }
- }
復制代碼
|