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