找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5759|回复: 2
收起左侧

stc单片机PCA扩展外部中断程序

[复制链接]
ID:26188 发表于 2015-2-18 01:13 | 显示全部楼层 |阅读模式
10.4.用PCA功能扩展外部中断的示例程序(C程序和汇编程序)
1.  C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 用PCA功能扩展外部中断 -----------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web:-----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
/*Declare SFR associated with the PCA */
sfr    CCON     =   0xD8;     //PCA control register
sbit   CCF0     =   CCON^0;   //PCA module-0 interrupt flag
sbit   CCF1     =   CCON^1;   //PCA module-1 interrupt flag
sbit   CR       =   CCON^6;   //PCA timer run control bit
sbit   CF       =   CCON^7;   //PCA timer overflow flag
sfr    CMOD     =   0xD9;     //PCA mode register
sfr    CL       =   0xE9;     //PCA base timer LOW
sfr    CH       =   0xF9;     //PCA base timer HIGH
sfr    CCAPM0   =   0xDA;     //PCA module-0 mode register
sfr    CCAP0L   =   0xEA;     //PCA module-0 capture register LOW
sfr    CCAP0H   =   0xFA;     //PCA module-0 capture register HIGH
sfr    CCAPM1   =   0xDB;     //PCA module-1 mode register
sfr    CCAP1L   =   0xEB;     //PCA module-1 capture register LOW
sfr    CCAP1H   =   0xFB;     //PCA module-1 capture register HIGH
sfr    PCAPWM0  =   0xf2;
sfr    PCAPWM1  =   0xf3;
sbit   PCA_LED  =   P1^0;     //PCA test LED
void PCA_isr() interrupt 7 using 1
{
      CCF0 = 0;                         //Clear interrupt flag
      PCA_LED = !PCA_LED;               //toggle the test pin while CEX0(P1.3) have a falling edge
}
void main()
{
      CCON = 0;                         //Initial PCA control register
                                        //PCA timer stop running
                                        //Clear CF flag
                                        //Clear all module interrupt flag
      CL = 0;                           //Reset PCA base timer
      CH = 0;
      CMOD = 0x00;                      //Set PCA timer clock source as Fosc/12
                                        //Disable PCA timer overflow interrupt
      CCAPM0 = 0x11;                    //PCA module-0 capture by a negative tigger on CEX0(P1.3)   
                                        //and enable PCA interrupt
      //CCAPM0 = 0x21;                    //PCA module-0 capture by a rising edge on CEX0(P1.3)      
                                          //and enable PCA interrupt
      //CCAPM0 = 0x31;                    //PCA module-0 capture by a transition (falling/rising edge)   
                                          //on CEX0(P1.3) and enable PCA interrupt
      CR = 1;                           //PCA timer start run
      EA = 1;
      while (1);
}


10.5.用PCA功能实现定时器的示例程序(C程序和汇编程序)
1.  C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 用PCA功能实现16位定时器 --------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web:-----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define   FOSC     18432000L
#define   T100Hz   (FOSC / 12 / 100)
typedef   unsigned  char   BYTE;
typedef   unsigned  int   WORD;
/*Declare SFR associated with the PCA */
sfr   CCON          =   0xD8;                 //PCA control register
sbit   CCF0         =   CCON^0;              //PCA module-0 interrupt flag
sbit   CCF1         =   CCON^1;              //PCA module-1 interrupt flag
sbit   CR            =   CCON^6;              //PCA timer run control bit
sbit   CF             =   CCON^7;              //PCA timer overflow flag
sfr   CMOD          =   0xD9;                 //PCA mode register
sfr   CL             =   0xE9;                 //PCA base timer LOW
sfr   CH             =   0xF9;                 //PCA base timer HIGH
sfr   CCAPM0        =   0xDA;                 //PCA module-0 mode register
sfr   CCAP0L        =   0xEA;                 //PCA module-0 capture register LOW
sfr   CCAP0H       =   0xFA;                 //PCA module-0 capture register HIGH
sfr   CCAPM1        =   0xDB;                 //PCA module-1 mode register
sfr   CCAP1L        =   0xEB;                 //PCA module-1 capture register LOW
sfr   CCAP1H        =   0xFB;                 //PCA module-1 capture register HIGH
sfr   PCAPWM0       =   0xf2;
sfr   PCAPWM1       =   0xf3;
sbit   PCA_LED      =   P1^0;                 //PCA test LED
BYTE   cnt;
WORD   value;
void PCA_isr() interrupt 7 using 1
{
      CCF0 = 0;                             //Clear interrupt flag
      CCAP0L = value;
  CCAP0H = value >> 8;                //Update compare value
      value += T100Hz;
      if (cnt-- == 0)
      {
            cnt = 100;                      //Count 100 times
            PCA_LED = !PCA_LED;           //Flash once per second
      }
}
void main()
{
      CCON = 0;                             //Initial PCA control register
                                            //PCA timer stop running
                                            //Clear CF flag
                                            //Clear all module interrupt flag
      CL = 0;                               //Reset PCA base timer
      CH = 0;
      CMOD = 0x00;                          //Set PCA timer clock source as Fosc/12
                                            //Disable PCA timer overflow interrupt
      value = T100Hz;
      CCAP0L = value;
  CCAP0H = value >> 8;                //Initial PCA module-0
      value += T100Hz;
      CCAPM0 = 0x49;                       //PCA module-0 work in 16-bit timer mode
            //and enable PCA interrupt
      CR = 1;                               //PCA timer start run
      EA = 1;
      cnt = 0;
      while (1);
}


10.6.PCA输出高速脉冲的示例程序(C程序和汇编程序)
1.  C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 PCA输出高速脉冲 --------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web:-----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define   FOSC     18432000L
#define   T100KHz (FOSC / 4 / 100000)
typedef   unsigned  char   BYTE;
typedef   unsigned  int   WORD;
/*Declare SFR associated with the PCA */
sfr   CCON          =   0xD8;                 //PCA control register
sbit   CCF0         =   CCON^0;              //PCA module-0 interrupt flag
sbit   CCF1         =   CCON^1;              //PCA module-1 interrupt flag
sbit   CR            =   CCON^6;              //PCA timer run control bit
sbit   CF             =   CCON^7;              //PCA timer overflow flag
sfr   CMOD          =   0xD9;                 //PCA mode register
sfr   CL             =   0xE9;                 //PCA base timer LOW
sfr   CH             =   0xF9;                 //PCA base timer HIGH
sfr   CCAPM0        =   0xDA;                 //PCA module-0 mode register
sfr   CCAP0L        =   0xEA;                 //PCA module-0 capture register LOW
sfr   CCAP0H       =   0xFA;                 //PCA module-0 capture register HIGH
sfr   CCAPM1        =   0xDB;                 //PCA module-1 mode register
sfr   CCAP1L        =   0xEB;                 //PCA module-1 capture register LOW
sfr   CCAP1H        =   0xFB;                 //PCA module-1 capture register HIGH
sfr   PCAPWM0       =   0xf2;
sfr   PCAPWM1       =   0xf3;
sbit   PCA_LED      =   P1^0;                 //PCA test LED
BYTE   cnt;
WORD   value;
void PCA_isr( ) interrupt 7 using 1
{
      CCF0 = 0;                           //Clear interrupt flag
      CCAP0L = value;
  CCAP0H = value >> 8;    //Update compare value
      value += T100KHz;
}
void main()
{
      CCON = 0;                           //Initial PCA control register
                                          //PCA timer stop running
                                          //Clear CF flag
                                          //Clear all module interrupt flag
      CL = 0;                             //Reset PCA base timer
      CH = 0;
      CMOD = 0x02;                        //Set PCA timer clock source as Fosc/2
                                          //Disable PCA timer overflow interrupt
      value = T100KHz;
      CCAP0L = value;                     //P1.3 output 100KHz square wave
  CCAP0H = value >> 8;              //Initial PCA module-0
      value += T100KHz;
      CCAPM0 = 0x4d;                     //PCA module-0 work in 16-bit timer mode
          //and enable PCA interrupt, toggle the output pin CCP0(P1.3)
      CR = 1;                             //PCA timer start run
      EA = 1;
      cnt = 0;
      while (1);
}

10.7.PCA输出PWM的示例程序(C程序和汇编程序)
1.  C程序:
/*------------------------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------- ---------------------------------------*/
/* --- 演示 STC 1T 系列单片机 PCA输出PWM -------------------------*/
/* --- Mobile: (86)13922809991 -----------------------------------------------*/
/* --- Fax: 86-755-82905966 ---------------------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------------------*/
/* --- Web: www.STCMCU.com -----------------------------------------------*/
/* 如果要在程序中使用或在文章中引用该程序, -------------------- ---*/
/* 请在程序中或文章中注明使用了STC的资料及程序 -----------*/
/*-------------------------------------------------------------------------------------*/
#include "reg51.h"
#include "intrins.h"
#define   FOSC     18432000L
typedef   unsigned  char   BYTE;
typedef   unsigned  int   WORD;
/*Declare SFR associated with the PCA */
sfr   CCON          =   0xD8;                 //PCA control register
sbit   CCF0         =   CCON^0;              //PCA module-0 interrupt flag
sbit   CCF1         =   CCON^1;              //PCA module-1 interrupt flag
sbit   CR            =   CCON^6;              //PCA timer run control bit
sbit   CF             =   CCON^7;              //PCA timer overflow flag
sfr   CMOD          =   0xD9;                 //PCA mode register
sfr   CL             =   0xE9;                 //PCA base timer LOW
sfr   CH             =   0xF9;                 //PCA base timer HIGH
sfr   CCAPM0        =   0xDA;                 //PCA module-0 mode register
sfr   CCAP0L        =   0xEA;                 //PCA module-0 capture register LOW
sfr   CCAP0H       =   0xFA;                 //PCA module-0 capture register HIGH
sfr   CCAPM1        =   0xDB;                 //PCA module-1 mode register
sfr   CCAP1L        =   0xEB;                 //PCA module-1 capture register LOW
sfr   CCAP1H        =   0xFB;                 //PCA module-1 capture register HIGH
sfr   PCAPWM0       =   0xf2;
sfr   PCAPWM1       =   0xf3;
void main()
{
      CCON = 0;                           //Initial PCA control register
                                          //PCA timer stop running
                                          //Clear CF flag
                                          //Clear all module interrupt flag
      CL = 0;                             //Reset PCA base timer
      CH = 0;
      CMOD = 0x02;                        //Set PCA timer clock source as Fosc/2
                                          //Disable PCA timer overflow interrupt
      CCAP0H = CCAP0L = 0x80;           //PWM0 port output 50% duty cycle square wave
      CCAPM0 = 0x42;                     //PCA module-0 work in 8-bit PWM mode
          //and no PCA interrupt
      CCAP1H = CCAP1L = 0xff;           //PWM1 port output 0% duty cycle square wave
      PCAPWM1 = 0x03;
      CCAPM1 = 0x42;                     //PCA module-1 work in 8-bit PWM mode
          //and no PCA interrupt
      CR = 1;                             //PCA timer start run
    while (1);
}





回复

使用道具 举报

ID:376438 发表于 2019-3-23 15:56 | 显示全部楼层
谢谢!学习了
回复

使用道具 举报

ID:748788 发表于 2021-1-19 17:01 | 显示全部楼层
逐一测试了4个程序,前三个没有任何反应,最后一个P1.3输出窄脉冲、P1.4输出宽脉冲
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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