大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
看了半天,选D。
创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站制作、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的日照网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
第一次遇到pic函数调用时,输出图形为一行10个*,至此排除A和C。
主函数往下走,遇到for循环函数。其循环次数通过计算为三次。先看第一次循环,可得输出结果是9个*,至此排除B。后面都不要看了。
另外此被调函数pic()为无返回值的函数,所以调用前必须先声明,或者放置在主函数上端。
另外D答案的图形在百度上表示不出准确,在第二行之后每行起始一定有空格。
你怎么判断它只执行了一次呢???
补充:首先不清楚你的芯片具体是什么型号的,从程序上看应该是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位的,那就丢失了两个位了。
如果还有问题,给我留言。
定时器的初始化要在中断函数外部做,作为一个功能函数,定时器的初始值一定不要在中断函数中给出啊,而是要在外部初始化函数中,这里给出的是定时器1的设置,可以做个参考
void T1Init(void)
{
T1CONbits.TON = 0; /* Stop timer */
T1CONbits.TCKPS = 0; /* Set prescaler to 1:1 */
T1CONbits.TCS = 0; /* Use internal clock */
T1CONbits.TGATE = 0; /* Disable gated time accumulation */
TMR1 = 0; /* Reset timer value */
PR1 = TIME_1MS; /* Set interupt duration,TIME_1MS为1ms 定义的宏,与时钟设置大小有关*/
IPC0bits.T1IP = 1;
IFS0bits.T1IF = 0; /* Reset interrupt flag */
IEC0bits.T1IE = 1; /* Enable interrupt */
T1CONbits.TON = 1; /* Start timer */
}
中断函数中处理定时处理的事件。
void __attribute__((interrupt))_T1Interrupt(void)
{
/* 1mS gone */
/* Handle all auxiliary timers based on 1mS clock */
Adc_1ms_Timer(); //AD采样处理函数
PwmCmd_1msTimer(); //pwm 处理函数
IFS0bits.T1IF = 0; /* Reset interrupt flag */
}
首先,在初始化中设置好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。