看了半天,選D。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站制作、網站設計、企業(yè)官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯(lián)網時代的日照網站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
第一次遇到pic函數調用時,輸出圖形為一行10個*,至此排除A和C。
主函數往下走,遇到for循環(huán)函數。其循環(huán)次數通過計算為三次。先看第一次循環(huán),可得輸出結果是9個*,至此排除B。后面都不要看了。
另外此被調函數pic()為無返回值的函數,所以調用前必須先聲明,或者放置在主函數上端。
另外D答案的圖形在百度上表示不出準確,在第二行之后每行起始一定有空格。
你怎么判斷它只執(zhí)行了一次呢???
補充:首先不清楚你的芯片具體是什么型號的,從程序上看應該是PIC16或者pic18系列的。也不清楚晶振頻率是多少。
我提出我的懷疑及其推論:首先我懷疑while不是沒有循環(huán),而是一直循環(huán)了,但是Vsrb_average[0]并沒有被賦值超過50以上的數值。(你可以加一條語句,在wihile大括號里,但不在任何if語句內的:loop++;讓一個自定義變量自加,運行一兩秒后看loop的數數值肯定很大)
因此懷疑AD采集過程并不準確。而為什么AD采集不準確呢,一般設置好并開啟AD后采樣和保持需要時間的(PIC單片機的數據手冊里也提到)但你的程序設置是T0定時溢出后在中斷里執(zhí)行AD采集。這時候問題來了,你的TO的option_org寄存器等于0B11001111,也就是說設置T0定時器使用內部指令周期時鐘(就是用單片機晶振所輸入的頻率定時)但PSA=0,預分頻器不用于T0,所以當你的晶振是4M的時候,定時器0從計數到溢出只需要256uS。也就是說程序從WHILE開始到采集AD信號這段時間才比256us大不了多少,這根本不符合PIC單片機規(guī)定的采集時間。所以采集到的數據很小,根本不足進入while循環(huán)內部的哪兩個if語句(一個IF語句是判斷[50,600]這個區(qū)間,另一個是判斷大于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;
}
當然,你把括號中加上你的函數就好了。
本人建議不要在中斷中處理函數,最好在中斷中返回個標志位,然后在主函數中執(zhí)行函數。
如果一定要在中斷中執(zhí)行函數,這個函數最好在其他地方不使用,否則容易出錯哦。
你說的RXIF我不知道,我只知道RCIF。