可以分几个部分
创新互联-成都网站建设公司,专注成都做网站、网站制作、网站营销推广,域名申请,网页空间,网站运营有关企业网站制作方案、改版、费用等问题,请联系创新互联。
不过入口只能有一个。
也就是说,中断的时候,只能执行一个入口函数。
但这个函数里面,可以调用其它函数 这样就可以分部分了。
首先,PIC和51单片机再寄存器上就有很大的不同,比如说51单片机的IO没有方向性,读IO就是输入数据,写IO就是输出数据。而PIC单片机的IO输入数据和输出数据需要用一个方向寄存器来确定,比如A口要全部做输出高电平,则需要先设置A口的方向寄存器TRISA=0x00,然后给A口的数据寄存器赋值PORTA=0xFF。
而51单片机因为没有方向性,如需要给P1口输出则直接给P1=0xFF.
这是因为硬件上的不同所以软件上的较大区别。
另外PIC几乎所有寄存器和存储器都可以位寻址,比如8位高档PIC和16位PIC可以直接给位赋值:C1CTRLbits.REQOP=7,就是给C1CTRL这个寄存器的最高三个位赋值二进制数111,其他位不动。
在语法上,PICC(PIC的C语言编译器,不是中国人保)不允许重入函数。51单片机有中断向量表,所以中断函数可以有多个。因为8位中档PIC没有中断向量表,所以需要在中断函数里判断中断类型(有且仅有一个中断函数)。16位PIC单片机有中断向量表,但在设置中断类型上较为麻烦。
#pragma vector= 0x04
//Interrupt Service Routine
__interrupt void series_int(void)
{
if (中断触发事件)
{
RCIE=0;
// 在这里写中断后的function
RCIE=1;
}
return;
}
一定要放在其他程序的前面,其他程序该怎么写还怎么写
你怎么判断它只执行了一次呢???
补充:首先不清楚你的芯片具体是什么型号的,从程序上看应该是PIC16或者pic18系列的。也不清楚晶振频率是多少。
我提出我的怀疑及其推论:首先我怀疑while不是没有循环,而是一直循环了,但是Vsrb_average[0]并没有被赋值超过50以上的数值。(你可以加一条语句,在wihile大括号里,但不在任何if语句内的:loop++;让一个自定义变量自加,运行一两秒后看loop的数数值肯定很大)
因此怀疑AD采集过程并不准确。而为什么AD采集不准确呢,一般设置好并开启AD后采样和保持需要时间的(PIC单片机的数据手册里也提到)但你的程序设置是T0定时溢出后在中断里执行AD采集。这时候问题来了,你的TO的option_org寄存器等于0B11001111,也就是说设置T0定时器使用内部指令周期时钟(就是用单片机晶振所输入的频率定时)但PSA=0,预分频器不用于T0,所以当你的晶振是4M的时候,定时器0从计数到溢出只需要256uS。也就是说程序从WHILE开始到采集AD信号这段时间才比256us大不了多少,这根本不符合PIC单片机规定的采集时间。所以采集到的数据很小,根本不足进入while循环内部的哪两个if语句(一个IF语句是判断[50,600]这个区间,另一个是判断大于680这个范围)。
但当你屏蔽掉T0的初始化程序后,注意,这时候0PTION_REG寄存器等于0B11111111,如果TRCKI这个引脚是有脉冲充输入的话,T0定时器是会自动计数的,当溢出之后是会自动置位T0IF的(虽然没有设置T0IE,但T0IF满足条件后是会置位的),而你的总中断开关在主函数里INTCON|=0XC0;所以当T1定时器溢出之后,程序会在中断子函数里进行对T0的操作。
还有你的程序有些逻辑错误,AD结果应该是10位的,但你接收AD结果的数组a[2]却是8位的,那就丢失了两个位了。
如果还有问题,给我留言。
首先,在初始化中设置好I/O口功能。开中断,初始化串口。
然后写个串口中断函数,例如:
void interrupt isr(void)
if(RCIERCIF) //串口接收中断
{
while(!RCIF);
NOP();NOP();NOP();
recive_dat[1]=RCREG; //接收1位数据
NOP();NOP();NOP();
CREN=0;
NOP();NOP();NOP();
CREN=1;
}
当然,你把括号中加上你的函数就好了。
本人建议不要在中断中处理函数,最好在中断中返回个标志位,然后在主函数中执行函数。
如果一定要在中断中执行函数,这个函数最好在其他地方不使用,否则容易出错哦。
你说的RXIF我不知道,我只知道RCIF。
这个应该是自己定义的函数 这里只能看出来这个函数无返回值 要有两个int型的参数 其他的没办法看出来,具体要看函数是如何定义的