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

[复制链接]
2096|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++;
        }

这里本人其实也不是很理解,因为下面做了溢出计数了,实测好像不用这段也是正确的,这段要来干嘛的暂时不知道
 楼主| 令界剑 发表于 2018-9-28 15:04 | 显示全部楼层
雪山飞狐D 发表于 2018-9-28 12:42
cnt 是16位计数器溢出次数,放在第16位(从0开始算),所以在两个字节位以后+1,表示计数了65536,unsigned ...

嗯,谢谢你
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:多学多问多做

27

主题

137

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部