本帖最后由 WXJPCY888 于 2013-8-9 14:57 编辑
使用MPLAB IDEv8.92,mplab c18-v3.46编译器,芯片采用PIC18F2520,外部晶振10MHZ,用MPLAB SIM仿真RA0端口是延时了2秒后置1,但把程序下载的芯片内,一上电RA0就输出高电平5V,想让RA0端口延时2秒后再输出高电平5V,起不到延时效果。不知是什么原因,本人新手,求各位高手大侠点拨一下,多谢!!!
#include <p18F2520.h> /*头文件*/
void PIC18F_High_isr(void);/*中断服务函数声明*/
void PIC18F_Low_isr(void); /*中断服务函数声明*/
#define RA0 PORTAbits.RA0
#define RC7 PORTCbits.RC7
unsigned int intnum;
/*高优先级中断入口*/
#pragma code high_vector_section=0x8
void high_vector (void)
{
_asm goto PIC18F_High_isr _endasm
}
/*低优先级中断入口*/
#pragma code low_vector_section=0x18
void low_vector (void)
{
_asm goto PIC18F_Low_isr _endasm
}
/*高优先级中断服务程序函数*/
#pragma code
#pragma interrupt PIC18F_High_isr
void PIC18F_High_isr (void) /*每进入一次中断需要200us*/
{
intnum++; /*计数器加一*/
TMR0L=20; /*TMR0重新置初值*/
INTCONbits.TMR0IF=0;/*中断标志位清零*/
}
/*低优先级中断服务程序函数*/
#pragma interruptlow PIC18F_Low_isr
void PIC18F_Low_isr (void)
{
RC7=1; /* 输出高电位*/
INTCON3bits.INT1IF=0; /*外部中断标志位清零*/
}
/*初始化函数*/
void init()
{
WDTCONbits.SWDTEN = 0; /* 看门狗关闭*/
RCONbits.POR =0; /*上电复位使能*/
OSCCON=0xfc; /* 使能外部晶振10MHZ*/
TRISAbits.TRISA0=0; /* 端口为输出*/
TRISCbits.TRISC7=0; /* 端口为输出*/
}
/*扫描函数*/
void scanf()
{
if(intnum==10000) /*如果2秒到*/
{
intnum=0; /*计数器清零*/
RA0=1; /* 输出高电位*/
T0CONbits.TMR0ON=0; /*关闭TMR0定时器*/
}
}
/*TMR0定时器初始化函数*/
void TMR0_init()
{
T0CON=0x40; /*8位定时器未分频*/
TMR0L=20; /*TMR0定时器赋初值*/
INTCONbits.TMR0IF=0; /*中断标志位清零*/
INTCONbits.TMR0IE=1; /*TMR0定时器中断允许*/
T0CONbits.TMR0ON=1; /*TMR0定时器中断使能*/
}
/*主函数*/
void main(void)
{
init(); /*初始化*/
TMR0_init(); /*TMR0定时器初始化*/
INTCONbits.GIE=0; /*关全局中断*/
RCONbits.IPEN=1; /*使能中断优先级*/
INTCON2bits.TMR0IP=1; /*TMR0中断为高优先级*/
INTCON3bits.INT1IP=0; /*外部中断为低优先级*/
INTCON2bits.INTEDG1=1;/*外部中断上升沿触发*/
INTCON3bits.INT1IF=0; /*外部中断标志位清零*/
INTCON3bits.INT1IE=1; /*外部中断允许*/
INTCONbits.PEIE=1; /*开低优先级全局中断*/
INTCONbits.GIE=1; /*开全局中断*/
while(1)
{
scanf(); /*扫描函数*/
}
} |