麻煩大家看看 我寫的這個程序 測量方波頻率沒什么問題可是測量其他波形頻率的時候 誤差很大
順便想問問測量脈寬的思路是什么?
- #include <reg52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit DU = P2^6;//數碼管段選
- sbit WE = P2^7;//數碼管段選
- sbit LED1 = P1^0;//LED1
- //共陰數碼管段選表0-9
- uchar code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
- long uint mSec;//毫秒和秒儲存變量
- long uint freq;
- /*====================================
- 函數 : delay(uint z)
- 參數 :z 延時毫秒設定,取值范圍0-65535
- 返回值 :無
- 描述 :12T/Fosc11.0592M毫秒級延時
- ====================================*/
- void delay(uint z)
- {
- uint x,y;
- for(x = z; x > 0; x--)
- for(y = 114; y > 0 ; y--);
- }
- /*====================================
- 函數 :display(uchar i)
- 參數 :i 顯示數值,取值范圍0-255
- 返回值 :無
- 描述 :三位共陰數碼管動態顯示
- ====================================*/
- void display(uchar i)
- {
- uchar A,B,C,D,E,F,G,H;
- A = i % 100000000 / 1000000;
- B = i % 10000000 / 1000000;
- C = i % 1000000 / 100000;
- D = i % 100000 / 10000;
- E = i % 10000 / 1000;
- F = i % 1000 / 100; //236 / 100 = 2
- G = i % 100 / 10; //236 % 100 / 10 = 3
- H = i % 10;//236 % 10 =6
-
- //第一位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0XFE; //1111 1110
- WE = 0;//鎖存位選數據
- DU = 1;//打開段選鎖存器
- P0 = tabel[A];//
- DU = 0;//鎖存段選數據
- delay(1);
- //第二位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0XFD; //1111 1101
- WE = 0;//鎖存位選數據
- DU = 1;//打開段選鎖存器
- P0 = tabel[B];//
- DU = 0;//鎖存段選數據
- delay(1);
- //第三位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0XFB; //1111 1011
- WE = 0;//鎖存位選數據
- DU = 1;//打開段選鎖存器
- P0 = tabel[C];//
- DU = 0;//鎖存段選數據
- delay(1);
- //第四位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0XF7; //1111 1101
- WE = 0;//鎖存位選數據
- DU = 1;//打開段選鎖存器
- P0 = tabel[D];//
- DU = 0;//鎖存段選數據
- delay(1);
- //第五位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0XEF; //1111 1101
- WE = 0;//鎖存位選數據
- DU = 1;//打開段選鎖存器
- P0 = tabel[E];//
- DU = 0;//鎖存段選數據
- delay(1);
- //第六位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0XDF; //1111 1101
- WE = 0;//鎖存位選數據
- DU = 1;//打開段選鎖存器
- P0 = tabel[F];//
- DU = 0;//鎖存段選數據
- delay(1);
- //第七位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0XBF; //1111 1101
- WE = 0;//鎖存位選數據
- DU = 1;
- P0 = tabel[G];
- DU = 0;//鎖存段選數據
- delay(1);
- //第八位數碼管
- P0 = 0XFF;//清除斷碼
- WE = 1;//打開位選鎖存器
- P0 = 0X7F; //1111 1101
- WE = 0;//鎖存位選數據
- DU = 1;
- P0 = tabel[H];//打開段選鎖存器
- DU = 0;//鎖存段選數據
- delay(1);
- }
- void Timer_Config()
- {
- //--定時器T1做計數器,工作方式1(16位定時器),只由TRx打開計數器--//
- //--定時器T0做定時器,工作方式1(16位定時器),只由TRx打開定時器--//
- TMOD=0x51;
- //--設置定時器晶振為12MHZ時定時50ms--//
- TH0=0x4b;//高八位 定時器
- TL0=0xfd;//低八位
- // TH1=0XFF;//計數器
- //TL1=0XFF;//計數器
- //--打開中斷-//
- ET0=1;
- ET1=1;
- EA=1;
- //--打開定時器*/
- TR0=1;
- TR1=1;
- }
- void main()//main函數自身會循環
- {
- unsigned long z;//設置一個局部變量z
- Timer_Config();//進入中斷
- while(1)
- {
- if(TR1 == 0) //當計數器停下的時候,表明計數完畢 判斷是否到達一秒到達后讀取TL TH的值
- {
- freq = freq + TL1; //讀取TL的值
- freq = freq + (TH1 * 256); //讀取TH的值 高八位
- z=freq;
- //--顯示完,重新計算下一次頻率。--//
- freq = 0;//將計算的頻率清零
- TH1 = 0; //將計數器的值清零
- TL1 = 0;
- TR0 = 1; //開啟定時器 TR運行寄存器
- TR1 = 1; //開啟計數器
- }
- display(z); //數碼管顯示函數
- }
- }
- /*******************************************
- *函數名 :Timer0
- *功 能 :定時器0的中斷函數
- *輸 入 :無
- *輸 出 :無
- *******************************************/
- void Timer0() interrupt 1
- {
- //--12MHZ設置定時50ms的初值--//
- TH0=0x4b;
- TL0=0xfd;
- LED1=~LED1;
- mSec++;
- if(mSec == 20) //定時1秒到 20個50ms等于1秒 1000ms=1s
- {
- TR0=0; //關閉定時器
- TR1=0; //關閉計數器
- mSec = 0; //秒數清零
- }
- }
- /*******************************************
- *函數名 :Timer1
- *功 能 :定時器1的中斷函數
- *輸 入 :無
- *輸 出 :無
- *******************************************/
- void Timer1() interrupt 3
- {
- //--進入一次中斷,表明計數到了65536--//
- freq=freq+65536;
- // TH1=0XFF;
- // TL0=0XFF;
- }
復制代碼
|