找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2385|回复: 5
打印 上一主题 下一主题
收起左侧

这个公式是什么意思?看不懂啊

[复制链接]
跳转到指定楼层
楼主
ID:546224 发表于 2019-9-23 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
((unsigned char*)&count1)[3]=CCAP0L;
((unsigned char*)&count1)[2]=CCAP0H;
((unsigned char*)&count1)[1]=cnt;
((unsigned char*)&count1)[0]=0;

最佳答案

查看完整内容

你的count1 应该是一个unsigned long型,一个unsigned long是4个字节。 ((unsigned char *)&count1)[3]=CCAP0L :这句话是把CCAP0L数据存放在(count1 )的第4个字节中, 同样CCAP0H存放在(count1 )的第3个字节中, cnt存放在(count1 )的第2个字节中, 0存放在(count1 )的第1个字节中。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2019-9-23 16:34 | 只看该作者
你的count1 应该是一个unsigned long型,一个unsigned long是4个字节。

((unsigned char *)&count1)[3]=CCAP0L :这句话是把CCAP0L数据存放在(count1 )的第4个字节中,
同样CCAP0H存放在(count1 )的第3个字节中,
cnt存放在(count1 )的第2个字节中,
0存放在(count1 )的第1个字节中。

  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 PCA实现16位捕获举例---------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-755-82905966 -------------------------------------------*/
  6. /* --- Tel: 86-755-82948412 -------------------------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
  9. /* 如果要在文章中应用此代码,请在文章中注明使用了宏晶科技的资料及程序   */
  10. /*---------------------------------------------------------------------*/

  11. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  12. //假定测试芯片的工作频率为18.432MHz

  13. #include "reg51.h"
  14. #include "intrins.h"

  15. #define FOSC    18432000L

  16. typedef unsigned char BYTE;
  17. typedef unsigned int WORD;
  18. typedef unsigned long DWORD;

  19. sfr P_SW1       = 0xA2;             //外设功能切换寄存器1

  20. #define CCP_S0 0x10                 //P_SW1.4
  21. #define CCP_S1 0x20                 //P_SW1.5

  22. sfr CCON        =   0xD8;           //PCA控制寄存器
  23. sbit CCF0       =   CCON^0;         //PCA模块0中断标志
  24. sbit CCF1       =   CCON^1;         //PCA模块1中断标志
  25. sbit CR         =   CCON^6;         //PCA定时器运行控制位
  26. sbit CF         =   CCON^7;         //PCA定时器溢出标志
  27. sfr CMOD        =   0xD9;           //PCA模式寄存器
  28. sfr CL          =   0xE9;           //PCA定时器低字节
  29. sfr CH          =   0xF9;           //PCA定时器高字节
  30. sfr CCAPM0      =   0xDA;           //PCA模块0模式寄存器
  31. sfr CCAP0L      =   0xEA;           //PCA模块0捕获寄存器 LOW
  32. sfr CCAP0H      =   0xFA;           //PCA模块0捕获寄存器 HIGH
  33. sfr CCAPM1      =   0xDB;           //PCA模块1模式寄存器
  34. sfr CCAP1L      =   0xEB;           //PCA模块1捕获寄存器 LOW
  35. sfr CCAP1H      =   0xFB;           //PCA模块1捕获寄存器 HIGH
  36. sfr CCAPM2      =   0xDC;           //PCA模块2模式寄存器
  37. sfr CCAP2L      =   0xEC;           //PCA模块2捕获寄存器 LOW
  38. sfr CCAP2H      =   0xFC;           //PCA模块2捕获寄存器 HIGH
  39. sfr PCA_PWM0    =   0xf2;           //PCA模块0的PWM寄存器
  40. sfr PCA_PWM1    =   0xf3;           //PCA模块1的PWM寄存器
  41. sfr PCA_PWM2    =   0xf4;           //PCA模块2的PWM寄存器

  42. sbit EPCA       =   IE^6;           //PCA中断允许位

  43. BYTE cnt;                           //存储PCA计时溢出次数
  44. DWORD count0;                       //记录上一次的捕获值
  45. DWORD count1;                       //记录本次的捕获值
  46. DWORD length;                       //存储信号的时间长度(count1 - count0)

  47. void main()
  48. {
  49.     ACC = P_SW1;
  50.     ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
  51.     P_SW1 = ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
  52.    
  53. //  ACC = P_SW1;
  54. //  ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=1 CCP_S1=0
  55. //  ACC |= CCP_S0;                  //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
  56. //  P_SW1 = ACC;  
  57. //  
  58. //  ACC = P_SW1;
  59. //  ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=1
  60. //  ACC |= CCP_S1;                  //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
  61. //  P_SW1 = ACC;  

  62.     CCON = 0;                       //初始化PCA控制寄存器
  63.                                     //PCA定时器停止
  64.                                     //清除CF标志
  65.                                     //清除模块中断标志
  66.     CL = 0;                         //复位PCA寄存器
  67.     CH = 0;
  68.     CCAP0L = 0;
  69.     CCAP0H = 0;
  70.     CMOD = 0x09;                    //设置PCA时钟源为系统时钟,且使能PCA计时溢出中断
  71.     CCAPM0 = 0x21;                  //PCA模块0为16位捕获模式(上升沿捕获,可测从高电平开始的整个周期),且产生捕获中断
  72. //  CCAPM0 = 0x11;                  //PCA模块0为16位捕获模式(下降沿捕获,可测从低电平开始的整个周期),且产生捕获中断
  73. //  CCAPM0 = 0x31;                  //PCA模块0为16位捕获模式(上升沿/下降沿捕获,可测高电平或者低电平宽度),且产生捕获中断

  74.     CR = 1;                         //PCA定时器开始工作
  75.     EPCA = 1;                       //使能PCA中断
  76.     EA = 1;

  77.     cnt = 0;
  78.     count0 = 0;
  79.     count1 = 0;

  80.     while (1);
  81. }

  82. void PCA_isr() interrupt 7 using 1
  83. {
  84.     if (CF)
  85.     {
  86.         CF = 0;
  87.         cnt++;                      //PCA计时溢出次数+1
  88.     }
  89.     if (CCF0)
  90.     {
  91.         CCF0 = 0;
  92.         count0 = count1;            //备份上一次的捕获值
  93.         ((BYTE *)&count1)[3] = CCAP0L;  //保存本次的捕获值
  94.         ((BYTE *)&count1)[2] = CCAP0H;
  95.         ((BYTE *)&count1)[1] = cnt;
  96.         ((BYTE *)&count1)[0] = 0;
  97.         length = count1 - count0;   //计算两次捕获的差值,即得到时间长度
  98.     }
  99. }
复制代码


回复

使用道具 举报

板凳
ID:235200 发表于 2019-9-23 19:57 | 只看该作者
count1 是一个int型数据,占4个字节。((unsigned char *)&count1)[3]=CCAP0L :这句话是把CCAP0L数据存放在(count1 )的第4个字节中,同样CCAP0H存放在(count1 )的第3个字节中,cnt存放在(count1 )的第2个字节中,0存放在(count1 )的第1个字节中.
回复

使用道具 举报

地板
ID:278179 发表于 2019-9-23 22:01 | 只看该作者
这个不是公式,是单片机外部捕捉信号计时脉冲用的
回复

使用道具 举报

5#
ID:278179 发表于 2019-9-23 22:03 | 只看该作者
完整的数据是,CCAP0L定时器计时脉冲低位,CCAP0H定时器计时脉冲高位,cnt定时器溢出中断次数
回复

使用道具 举报

6#
ID:546224 发表于 2019-9-24 10:44 | 只看该作者
angmall 发表于 2019-9-23 16:34
你的count1 应该是一个unsigned long型,一个unsigned long是4个字节。

((unsigned char *)&count1)[3]= ...

谢了,原来是这个意思。我是说套用运算符算不通。看来要多学习算法。我用这个算法捕获的脉冲速度很快,不知道可行不?我用的是8A4K32S2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表