我所编写的变频器程序在调整频率后,使用示波器来观察频率时,发现波形有抖动的现象,请问如何才能解决这个问题,单片机的型号是STC89C51。ヽ(*。>Д<)o
#include <REGX52.H>
sbit WAVE_OUT = P1^0;
volatile unsigned int count;
volatile unsigned int count1;
volatile unsigned int freq = 1000;
volatile unsigned short high_count;
volatile unsigned short low_count;
volatile bit wave_state = 0;
#define SYS_CLK 11059200UL
#define INTERRUPT_DELAY 3
#define MIN_FREQ 50
#define MAX_FREQ 10000
void calculate_timer_counts() {
unsigned long period_us;
unsigned long high_us;
unsigned long low_us;
period_us = 1000000UL / freq;
high_us = period_us / 2;
low_us = period_us - high_us;
high_count = (unsigned short)( (high_us * SYS_CLK) / 12000000UL );
low_count = (unsigned short)( (low_us * SYS_CLK) / 12000000UL );
if (high_count > INTERRUPT_DELAY)
high_count -= INTERRUPT_DELAY;
else
high_count = 1;
if (low_count > INTERRUPT_DELAY)
low_count -= INTERRUPT_DELAY;
else
low_count = 1;
}
void timer0_init() {
TMOD &= 0xF0;
TMOD |= 0x01;
ET0 = 1;
EA = 1;
}
void timer0_isr() interrupt 1 {
if (wave_state) {
WAVE_OUT = 0;
TH0 = (65536 - low_count) >> 8;
TL0 = (65536 - low_count) & 0xFF;
count++;
} else {
WAVE_OUT = 1;
TH0 = (65536 - high_count) >> 8;
TL0 = (65536- high_count) & 0xFF;
count1++;
}
wave_state = !wave_state;
}
void set_frequency(unsigned int freq_val) {
EA = 0;
if (freq_val < MIN_FREQ)
freq_val = MIN_FREQ;
if (freq_val > MAX_FREQ)
freq_val = MAX_FREQ;
freq = freq_val;
calculate_timer_counts();
if (wave_state) {
TH0 = (65536 - low_count) >> 8;
TL0 = (65536 - low_count) & 0xFF;
} else {
TH0 = (65536 - high_count) >> 8;
TL0 = (65536 - high_count) & 0xFF;
}
EA = 1;
}
void main() {
timer0_init();
set_frequency(9000);
TR0 = 1;
while(1)
{
P2_0 = WAVE_OUT;
}
}


1
举报
更多回帖