標題:
單片機測頻率程序 能在下降沿反應(yīng)但測不準?
[打印本頁]
作者:
半糖漣漪
時間:
2023-6-2 23:28
標題:
單片機測頻率程序 能在下降沿反應(yīng)但測不準?
求大佬解答,真的非常感謝我使用這段單片機代碼他能在下降沿反應(yīng)但他測不出來準確的值
求大佬幫幫,非常感謝
nsigned char c[50];
float a=0;
void Timer0_Isr(void) interrupt 1
{
a=(float)(((TL1*256)+TH1)/0.65535);
TL1 = 0; //設(shè)置定時初始值
TH1 = 0; //設(shè)置定時初始值
TR1 = 1;
}
void Timer0_Init(void)
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設(shè)置定時器模式
TL0 = 0; //設(shè)置定時初始值
TH0 = 0; //設(shè)置定時初始值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能定時器0中斷
}
void Timer1_Init(void)
{
TMOD &= 0x0F; //設(shè)置定時器模式
TMOD |= 0xD0; //設(shè)置定時器模式
TL1 = 0; //設(shè)置定時初始值
TH1 = 0; //設(shè)置定時初始值
TF1 = 0; //清除TF1標志
//定時器1開始計時
}
void main()
{
EA=1;
P3M0 &= ~0xdf; P3M1 &= ~0xdf;
P2M0 = 0xff; P2M1 = 0x00;
P4M0 = 0XFF; P4M1 = 0X00;
///////////////////////////
XOSCCR=0XC8;
while(XOSCCR&1);
CLKDIV=0X00;
CLKSEL=0X01;
//////////////////////////
EAXFR=1;
CKCON=0X00;
WTST=0X00;
/////////////////////////
OLED_Init();
Timer0_Init();
Timer1_Init();
//PWM_init();
/////////////////////////
// P3M0 &= ~0x20; P3M1 |= 0x20;
// P0M0 = 0x00; P0M1 = 0x00;
// P1M0 = 0x00; P1M1 = 0x00;
// P2M0 = 0x00; P2M1 = 0x00;
// P5M0 = 0x00; P5M1 = 0x00;
// P6M0 = 0x00; P6M1 = 0x00;
// P7M0 = 0x00; P7M1 = 0x00;
///////////////////////////
while(1)
{
sprintf(bug,"%.3f",a);
OLED_ShowString(2,2,c,8);
//delay_ms(1000);
}
}
作者:
Hephaestus
時間:
2023-6-2 23:52
float運算對于51來說太浪費時間了,放在中斷里面運算非常不合理,把TL1/TH1的值賦給整形變量,浮點運算在main函數(shù)while循環(huán)里面做。
作者:
xianfajushi
時間:
2023-6-3 08:09
剛好昨天做了個頻率測試效果不錯51單片機極致測量到1M,測量再高頻就要用到分頻器,代碼按2秒累積計數(shù)均值,當然按1秒也很準確,不過頻率越高則出現(xiàn)誤差概率越大,誤差在0.99范圍,高精度建議用倍數(shù)累積求均值,測得數(shù)據(jù)后用哪種顯示都是一樣,測頻原理很簡單,打開定時器和外部中斷計數(shù)>時間到關(guān)閉總中斷>處理數(shù)據(jù)去顯示>數(shù)據(jù)清零>打開總中斷再次測量。
28196b9a807a1a2969ab29f5c41cb331.png
(39.69 KB, 下載次數(shù): 38)
下載附件
2023-6-3 09:03 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1