打印
[C语言]

有老哥帮忙解释一下STC单片机里面PCA捕获里面的代码吗

[复制链接]
1836|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
令界剑|  楼主 | 2018-9-28 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void PCA_isr() interrupt 7 using 1
{
    if (CCF0)
    {
        CCF0 = 0;
        if (CF && ((CCAP0H & 0x80) == 0))
        {
            CF = 0;
            cnt++;
        }
        count0 = count1;            //备份上一次的捕获值
        ((BYTE *)&count1)[3] = CCAP0L;  //保存本次的捕获值
        ((BYTE *)&count1)[2] = CCAP0H;
        ((BYTE *)&count1)[1] = cnt;
        ((BYTE *)&count1)[0] = 0;
       //我想知道这上面的四条语句的意思,最终count1的值是多少?
        length = count1 - count0;   //计算两次捕获的差值,即得到时间长度
        ((BYTE *)&length)[0] = 0;
    }
    if (CF)
    {
        CF = 0;
        cnt++;                      //PCA计时溢出次数+1
    }
}


相关帖子

沙发
令界剑|  楼主 | 2018-9-28 10:46 | 只看该作者
count1和count0都是unsigned long int类型。

使用特权

评论回复
板凳
雪山飞狐D| | 2018-9-28 12:42 | 只看该作者
本帖最后由 雪山飞狐D 于 2018-9-28 12:49 编辑

cnt 是16位计数器溢出次数,放在第16位(从0开始算),所以在两个字节位以后+1,表示计数了65536,unsigned long有四个字节,STC存储应该是小端模式,低位字节存储在高位地址, ((BYTE *)&count1)[ ] 这个把count1强制转换为字节数组(其实是指针*P++模式),所以数组有4个。。。数组的储存模式是从低位地址到高位地址,这样程序就对应上了CCAP0L和CCAP0H里面计数值

使用特权

评论回复
地板
雪山飞狐D| | 2018-9-28 12:43 | 只看该作者
if (CF && ((CCAP0H & 0x80) == 0))
        {
            CF = 0;
            cnt++;
        }

这里本人其实也不是很理解,因为下面做了溢出计数了,实测好像不用这段也是正确的,这段要来干嘛的暂时不知道

使用特权

评论回复
5
令界剑|  楼主 | 2018-9-28 15:04 | 只看该作者
雪山飞狐D 发表于 2018-9-28 12:42
cnt 是16位计数器溢出次数,放在第16位(从0开始算),所以在两个字节位以后+1,表示计数了65536,unsigned ...

嗯,谢谢你

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:多学多问多做

27

主题

137

帖子

2

粉丝