这是一个用定时器1设置在50ms时间内产生一个中断, 在50ms的时间内,外部中断一直打开,(上升源脉冲,下降源脉冲中断,这里我接受的信号一直都存在,在50MS内收到的信号远远大于5)一旦出现一次外部中断,NUM++; 在定时器1到达50MS的时候,出现一个中断,里面判断 NUM 的值 如果有大于5的值,那么端口RA0 = 1;如果 NUM== 0 端口RA0 = 0;
为什么我RA0端口输出的时候会在大概 2S 的时间内出现一个低电平0? 我要的是一直输出高电平1,而且在我没有停止发信号之前 NUM == 0 的可能是不会出现的,到底是为什么啊,来位热心的大神指导一下。
#include <htc.h>
//配置芯片的功能
//__CONFIG(0X3B71);
#define WDTDIS 0x3FFB // 看门狗关闭
#define PWRTDIS 0x3FFF // 上电延时定时器关闭
#define BORDIS 0x3FBF // 低电压复位禁止
#define RC 0x3FFF // RC振荡
//定义某些功能端口
#define LED LATAbits.LATA0
#define PWM_OUT LATAbits.LATA2
#define PWM_IN PORTAbits.RA4
int NUM = 0;
volatile unsigned char OutPwmCycle=0x9c,OutPwmDuty=0x06;//确定输出的PWM参数.(默认为脉宽100us,5Hz,1%).
void pwd_out_init(unsigned char pwn_cycle,unsigned int pwm_duty);
void systeminit(void);
void ap_an_init(void);
void init_irq(void);
void interrupt ap(void);
void time_1_init(void);
void init_fosc(void);
int main(void)
{
//配置
systeminit();
init_fosc();
//边缘触发
init_irq();
ap_an_init();
time_1_init();
// pwd_out 持续输出;
pwd_out_init(OutPwmCycle,OutPwmDuty);
//主功能
while(1)
{
}
return 0;
}
void interrupt ap(void)
{
//外部中断函数
if(IOCIE && IOCIF)
{
IOCIF = 0;
NUM++;
}
//定时器中断函数
if(TMR1IF && TMR1IE) //产生中断,溢出
{
TMR1H = 0Xe7;
TMR1L = 0X96; //TMR1赋初值 定时器的定时值清零
TMR1IF = 0; //清溢出
if( 5 < NUM )
{
LED = 1;
}
if(0 == NUM)
{
LED = 0;
}
NUM = 0;
}
}
void time_1_init(void)
{
// TMR1CS = 1; //T1CON<1> 将timer1配置位定时器
TMR1H = 0Xe7;
TMR1L = 0X96; //TMR1赋初值 定时器的定时值清零
TMR1IF = 0;
TMR1IE = 1;
T1CON = 0x31;
//T1CON = 0xb0; //1011 0000 配置位一次16位对Timer1寄存器进行读写 1:8预分频
//TMR1ON = 1; // 使能计时器
}
void init_irq(void)
{
GIE = 1; //开始总中断
PEIE = 1; //开始外部中断
}
void ap_an_init(void)
{
IOCIE = 1; //使能电平中断
IOCAP4 = 1; //上升源触发使能
IOCAN4 = 1;
IOCAF = 0; //清零中断标志位
}
#if 1
// PIC12f1822 所有端口的配置方向
void systeminit(void)
{
TRISAbits.TRISA0 = 0; // RA0 = out led
TRISAbits.TRISA1 = 0; // RA1 = out 开关(负载)
TRISAbits.TRISA2 = 0; // RA2 = out 输出一个正弦波
TRISAbits.TRISA3 = 0; // RA3 = nc
TRISAbits.TRISA4 = 1; // RA4 = in 接受一个峰波
TRISAbits.TRISA5 = 0; // RA5 = nc
LED =0;
}
//配置PWD的首要端口 开关
void pwd_out_init(unsigned char pwn_cycle,unsigned int pwm_duty)
{
PR2=pwn_cycle; //设置PWM周期.
CCPR1L=(unsigned char)((pwm_duty>>2)&0x00ff); //設置PWM占空比.
CCP1CON=(unsigned char)((pwm_duty<<4)&0x0030)|0x0c;
T2CON=0x07; //启动TMR2.(TMR2预分频比1:4).
}
void init_fosc(void)
{
OSCCON = 0x6a;//4mhz
}
|