STC8G1K08 DFN8封装的芯片有脉冲计数功能吗?
数据手册已经看了,想再确认一下。有的地方说不支持:
有的地方又说支持:
你用的是STC8G1K08 DFN8封装还是STC8G1K08A DFN8封装的?
脉冲计数,STC8 足够的快,就用
===INT0/INT1/INT2/INT3/INT4 有中断就软件计数就行了
===T0/T1 也可以计数,你要设置计多少个脉冲就溢出中断
angmall 发表于 2024-3-20 00:27
你用的是STC8G1K08 DFN8封装还是STC8G1K08A DFN8封装的?
STC8G1K08A DFN8. 所以根据上面的表格,STC8G1K08A DFN8是有PCA功能的,而STC8G1K08 DFN8是没有PCA功能的? 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]