最近翻出快旧版子,发现硬件用的是pca侧频率,用了几个方案,测得都不对,最接近的是下面的代码
实际频率6590hz,测得7142hz误差很大啊,错在哪里,晶振110592
#include "REG_MPC82L54.H"
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define PS 0x10
#define PSH 0x10
uint cap_tmp;
uint pulse_width;
uint capturer1,capturer2;
uchar out_data[2];
bit flag;
bit capture_ok;
#define led P32
///////////////////////////////////////////////////
Init_Com()
{
TMOD = 0x22;
TH1 = 0xFd;
TL1 = 0xFd;
TH0 = 0xED;
TL0 = 0xED;
SCON = 0x50;
TR1 = 1;
TR0 = 1;
}
///////////////////////////////////////////////////
send232byte(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
///////////////////////////////////////////////////
void Initial()
{
CMOD = 0X04; // ECF = 1;开PCA中断标志
CCAPM1 = 0X21; // CAPN0 = 1; 下降沿捕获。ECCF0 = 1; 开捕获中断。
CL = 0;
CH = 0; // PCA计数器清零
CCAP1L = 0;
CCAP1H = 0; // 捕获寄存器清零
IE = 0xC0; // 开PCA中断
CR = 1;
}
///////////////////////////////////////////////////
void PCA_Interrupt() interrupt 6
{
CF=0;
CCF1=0;
// if (flag==0)
//{
capturer1=CCAP1L|(CCAP1H<<8);
CH=0;
CL=0;
// flag=1;
}
///////////////////////////////////////////////////
void delay()
{
unsigned int x;
for(x=0;x<65535;x++);
}
///////////////////////////////////////////////////
Main()
{
uint tmp;
uint dat;
P35 = 1;
Init_Com();
Initial();
EA=1;
while (1)
{
dat=50000/capturer1;
send232byte(dat>>8);
send232byte(dat);
dat=0;
delay();
}
}
|