|
发表于 2011-5-30 17:02:53
|
显示全部楼层
回复【2楼】ba_wang_mao
-----------------------------------------------------------------------
楼主弄出来了没,,,我也正在看马老师的书想做一个频率计
但书上的程序有的地方没看懂,请指点
我觉得下面的程序有问题,怎么都是icp_2呢,应该第一个为icp_1,不知我这样理解是否正确,
还有就是那个while(1)中的测频算法有点看不懂,,,请指点。。我的qq:383953468
if (icp_ok == 1) // 完成一次测量
{
if (icp_v2 >= icp_v1) // 计算N个上升沿的时钟脉冲个数,
icp_2 = icp_v2 - icp_v1;
else
icp_2 = 65536 - icp_v1 + icp_v2;
void main(void)
{
unsigned int icp_1,icp_2;
long fv;
DDRA=0xFF; // LED段码输出
PORTC=0xFF;
DDRC=0x3F; // LED位控输出
PORTD=0x40; // PD6(icp)输入方式,上拉有效
// T/C2 初始化
TCCR2=0x0C; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
OCR2=0xf9;//7c; // OCR2 = 0xf9(249),(249+1)/62.5=4ms
// T/C1初始化
TCCR1B = 0x41; // T/C1正常计数方式,上升沿触发输入捕捉,4M/1计数时钟
TIMSK = 0xA4; // 允许T/C2比较匹配中断,允许T/C1输入捕捉、溢出中断
icp_n = 0;
max_icp =1;
#asm("sei") // 开放全局中断
while (1)
{
if (icp_ok == 1) // 完成一次测量
{
if (icp_v2 >= icp_v1) // 计算N个上升沿的时钟脉冲个数,
icp_2 = icp_v2 - icp_v1;
else
icp_2 = 65536 - icp_v1 + icp_v2;
if (!(icp_v2 >= icp_v1 && full_ok)) // 有溢出,数据无效
{
if (icp_2 == icp_1) // 两次个数相等,测量有效
{
fv = 4000000 * (long)max_icp / icp_2; // 换算成频率值
f_2_d = 1; // 允许新频率送显示
if (fv > 4000)
max_icp = 64; // 如果频率大于4Khz,N=64
else
max_icp = 1; // N=1
} |
|