是的,STC8G1K08A DFN8是有PCA功能的
可以用这个程序来做脉冲计数。
- /*
- STC8G 系列 STC8G1K08A SOP8/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)[3] = CCAP0L;
- ((unsigned char *)&count1)[2] = CCAP0H;
- ((unsigned char *)&count1)[1] = cnt;
- ((unsigned char *)&count1)[0] = 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);
- }
-
复制代码
|