#include <stc15w401as.h>
#define FOSC 12000000L
#define Foot (FOSC / 12 / 1000) //1ms
bit dog_flag=0;
unsigned int value;
void ConfigIoWdt();
void ConfigCCP();
//sbit LED=P2^3;
void main()
{
// unsigned int j;
ConfigIoWdt();
ConfigCCP();
EA=1; // 打开总中断
// P2=0X70; // 测试指示灯
// P3=0X3F; //
while(1)
{
/* j++;
if(j>=1000)
{
j=0;
LED=~LED;
}
*/
//---------------------
while(!dog_flag); // 在此等待dog_flag=1,控制CPU指针不能跳出循环
dog_flag=0;
WDT_CONTR=WDT_CONTR | 0x10; // 喂狗,等同于CLRWDT指令
}
}
void ConfigIoWdt()
{
//端口模式:
P1M1 =0xff; // 1111 1111
P1M0 =0; // 0000 0000 P1高阻输入(M1=1,M0=0 高阻)
P2M1 =0; // 0000 0000
P2M0 =0xff; // 1111 1111 P2口推挽输出 (M1=0,M0=1 推挽)
P3M1 =0x04; // 0000 0100
P3M0 =0xfb; // 1111 1011
P5M1 =0; // 0000 0000
P5M0 =0xff; // 1111 1111 P5口推挽输出
//看门狗设置
WDT_CONTR=0x3f; // 开门狗软件启动,分频比为256,空闲也计数,看门狗溢出时间8.4秒
}
void ConfigCCP()
{
CCON = 0; //初始化PCA控制寄存器//PCA定时器停止//清除CF标志 //清除模块中断标志
CL=0; //复位PCA寄存器
CH=0;
CMOD = 0x00; //空闲模式下PCA计数器继续工作//设置PCA时钟源//禁止PCA定时器溢出中断
value = Foot; //设计步长
CCAP0L = value;
CCAP0H = value >> 8; //初始化PCA模块
CCAPM0 = 0x49; //PCA模块0为16位定时器模式
//CCP1上升沿捕获模式,同步信号
//CCAP1L = 0;
//CCAP1H = 0;
//CCAPM1 = 0x21; //上升沿捕获,产生中断
CR = 1; //PCA定时器开始工作
}
void PCA_isr() interrupt 7 using 1
{
if(CCF0)
{
CCF0 = 0; //清中断标志
value += Foot;
CCAP0L = value;
CCAP0H = value >> 8;
dog_flag = 1;
}
}