布鲁士 发表于 2026-3-5 16:10:54

小白请教以下代码的意思,看不懂 | qianwen.com



这是完整代码

#include "reg51.h"
#include "intrins.h"

sfr   CCON    =   0xd8;
sbit    CF      =   CCON^7;
sbit    CR      =   CCON^6;
sbit    CCF2    =   CCON^2;
sbit    CCF1    =   CCON^1;
sbit    CCF0    =   CCON^0;
sfr   CMOD    =   0xd9;
sfr   CL      =   0xe9;
sfr   CH      =   0xf9;
sfr   CCAPM0=   0xda;
sfr   CCAP0L=   0xea;
sfr   CCAP0H=   0xfa;
sfr   PCA_PWM0 =0xf2;
sfr   CCAPM1=   0xdb;
sfr   CCAP1L=   0xeb;
sfr   CCAP1H=   0xfb;
sfr   PCA_PWM1 =0xf3;
sfr   CCAPM2=   0xdc;
sfr   CCAP2L=   0xec;
sfr   CCAP2H=   0xfc;
sfr   PCA_PWM2 =0xf4;

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

unsigned char cnt;                              //存储PCA计时溢出次数
unsigned long count0;                           //记录上一次的捕获值
unsigned long count1;                           //记录本次的捕获值
unsigned long length;                           //存储信号的时间长度

void PCA_Isr() interrupt 7
{
    if (CF)
    {
      CF = 0;
      cnt++;                                  //PCA计时溢出次数+1
    }
    if (CCF0)
    {
      CCF0 = 0;
      count0 = count1;                        //备份上一次的捕获值
      ((unsigned char *)&count1) = CCAP0L;
      ((unsigned char *)&count1) = CCAP0H;
      ((unsigned char *)&count1) = cnt;
      ((unsigned char *)&count1) = 0;
      length = count1 - count0;               //length保存的即为捕获的脉冲宽度
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    cnt = 0;                                    //用户变量初始化
    count0 = 0;
    count1 = 0;
    length = 0;
    CCON = 0x00;
    CMOD = 0x09;                              //PCA时钟为系统时钟,使能PCA计时中断
    CL = 0x00;
    CH = 0x00;
    CCAPM0 = 0x11;                              //PCA模块0为16位捕获模式(下降沿捕获)
//CCAPM0 = 0x21;                              //PCA模块0为16位捕获模式(上升沿捕获)
//CCAPM0 = 0x31;                              //PCA模块0为16位捕获模式(边沿捕获)
    CCAP0L = 0x00;
    CCAP0H = 0x00;
    CR = 1;                                     //启动PCA计时器
    EA = 1;

    while (1);
}


ercircle 发表于 2026-3-5 16:43:47

这种问题发给Ai能更快速的得到答案:



xxxevery 发表于 2026-3-6 22:18:07

写成这样*((unsigned char *)&count1+3) = CCAP0L;
               *((unsigned char *)&count1+2) = CCAP0H;
               *((unsigned char *)&count1+1) = cnt;
               *((unsigned char *)&count1)   = 0;
应该更容易让人理解
页: [1]
查看完整版本: 小白请教以下代码的意思,看不懂 | qianwen.com