Allspace 发表于 2024-3-19 21:56:41

STC8G1K08 DFN8封装的芯片有脉冲计数功能吗?

数据手册已经看了,想再确认一下。

有的地方说不支持:


有的地方又说支持:


angmall 发表于 2024-3-20 00:27:02

你用的是STC8G1K08 DFN8封装还是STC8G1K08A DFN8封装的?

神农鼎 发表于 2024-3-20 05:51:41

脉冲计数,STC8 足够的快,就用
===INT0/INT1/INT2/INT3/INT4 有中断就软件计数就行了
===T0/T1 也可以计数,你要设置计多少个脉冲就溢出中断




Allspace 发表于 2024-3-20 08:50:53

angmall 发表于 2024-3-20 00:27
你用的是STC8G1K08 DFN8封装还是STC8G1K08A DFN8封装的?

STC8G1K08A DFN8. 所以根据上面的表格,STC8G1K08A DFN8是有PCA功能的,而STC8G1K08 DFN8是没有PCA功能的?

angmall 发表于 2024-3-20 18:41:33

Allspace 发表于 2024-3-20 08:50
STC8G1K08A DFN8. 所以根据上面的表格,STC8G1K08A DFN8是有PCA功能的,而STC8G1K08 DFN8是没有PCA功能的 ...

是的,STC8G1K08A DFN8是有PCA功能的


可以用这个程序来做脉冲计数。
/*
STC8G 系列 STC8G1K08ASOP8/DFN8/DIP8
Pin 1. CCP2_2/CCP2/MCLKO/NRST/SCL_2/MOSI/RxD_3/T1CLKO/T0/INT2/ADC4/P5.4
Pin 2. Vcc/AVc
Pin 3. ECI_2/ECI/CCP2_3/SDA_2/SS/TxD_3/T0CLKO/T1/INT3/ADC5/P5.5
Pin 4. Gnd/AGnd
Pin 5. P3.0/ADC0/RxD/INT4
Pin 6. P3.1/ADC1/TxD/CCP0_2/ECI_3
Pin 7. P3.2/ADC2/RxD_2/INT0/SCLK/SCL/CCP0/CCP0_3
Pin 8. P3.3/ADC3/TxD_2/INT1/MISO/SDA/CCP1/CCP1_2/CCP1_3

*/
//PCA 捕获测量脉冲宽度
#include "reg51.h"    //包含头文件 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   P_SW1   =   0xa2;


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;
       
    P_SW1 = 0x00;      //ECI/P5.5, CCP0/P3.2, CCP1/P3.3, CCP2/P5.4
//P_SW1 = 0x10;      //ECI_2/P5.5, CCP0_2/P3.1, CCP1_2/P3.3, CCP2_2/P5.4
//P_SW1 = 0x20;      //ECI_3/P3.1, CCP0_3/P3.2, CCP1_3/P3.3, CCP2_3/P5.5


    cnt = 0;                                    //用户变量初始化
    count0 = 0;
    count1 = 0;
    length = 0;
    CCON = 0x00;         //PCA 控制寄存器( CCON)停止PCA定时器, 清除CF和CCF0标志。
    CMOD = 0x09;                              //PCA时钟为系统时钟,使能PCA计时中断
    CL = 0x00;             //PCA 计数器寄存器( CL, CH)清零。
    CH = 0x00;             //CH 计数器寄存器清零。
    CCAPM0 = 0x11;                              //PCA模块0为16位捕获模式(下降沿捕获)
//CCAPM0 = 0x21;                              //PCA模块0为16位捕获模式(上升沿捕获)
//CCAPM0 = 0x31;                              //PCA模块0为16位捕获模式(边沿捕获)
    CCAP0L = 0x00;             //PCA 模块模式捕获值/比较值寄存器( CCAPnL, CCAPnH)
    CCAP0H = 0x00;         //清零
    CR = 1;                                     //启动PCA计时器
    EA = 1;                // CPU 允许响应中断请求。

    while (1);
}




页: [1]
查看完整版本: STC8G1K08 DFN8封装的芯片有脉冲计数功能吗?