看了半天,選D。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的日照網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
第一次遇到pic函數(shù)調(diào)用時(shí),輸出圖形為一行10個(gè)*,至此排除A和C。
主函數(shù)往下走,遇到for循環(huán)函數(shù)。其循環(huán)次數(shù)通過(guò)計(jì)算為三次。先看第一次循環(huán),可得輸出結(jié)果是9個(gè)*,至此排除B。后面都不要看了。
另外此被調(diào)函數(shù)pic()為無(wú)返回值的函數(shù),所以調(diào)用前必須先聲明,或者放置在主函數(shù)上端。
另外D答案的圖形在百度上表示不出準(zhǔn)確,在第二行之后每行起始一定有空格。
你怎么判斷它只執(zhí)行了一次呢???
補(bǔ)充:首先不清楚你的芯片具體是什么型號(hào)的,從程序上看應(yīng)該是PIC16或者pic18系列的。也不清楚晶振頻率是多少。
我提出我的懷疑及其推論:首先我懷疑while不是沒(méi)有循環(huán),而是一直循環(huán)了,但是Vsrb_average[0]并沒(méi)有被賦值超過(guò)50以上的數(shù)值。(你可以加一條語(yǔ)句,在wihile大括號(hào)里,但不在任何if語(yǔ)句內(nèi)的:loop++;讓一個(gè)自定義變量自加,運(yùn)行一兩秒后看loop的數(shù)數(shù)值肯定很大)
因此懷疑AD采集過(guò)程并不準(zhǔn)確。而為什么AD采集不準(zhǔn)確呢,一般設(shè)置好并開啟AD后采樣和保持需要時(shí)間的(PIC單片機(jī)的數(shù)據(jù)手冊(cè)里也提到)但你的程序設(shè)置是T0定時(shí)溢出后在中斷里執(zhí)行AD采集。這時(shí)候問(wèn)題來(lái)了,你的TO的option_org寄存器等于0B11001111,也就是說(shuō)設(shè)置T0定時(shí)器使用內(nèi)部指令周期時(shí)鐘(就是用單片機(jī)晶振所輸入的頻率定時(shí))但PSA=0,預(yù)分頻器不用于T0,所以當(dāng)你的晶振是4M的時(shí)候,定時(shí)器0從計(jì)數(shù)到溢出只需要256uS。也就是說(shuō)程序從WHILE開始到采集AD信號(hào)這段時(shí)間才比256us大不了多少,這根本不符合PIC單片機(jī)規(guī)定的采集時(shí)間。所以采集到的數(shù)據(jù)很小,根本不足進(jìn)入while循環(huán)內(nèi)部的哪兩個(gè)if語(yǔ)句(一個(gè)IF語(yǔ)句是判斷[50,600]這個(gè)區(qū)間,另一個(gè)是判斷大于680這個(gè)范圍)。
但當(dāng)你屏蔽掉T0的初始化程序后,注意,這時(shí)候0PTION_REG寄存器等于0B11111111,如果TRCKI這個(gè)引腳是有脈沖充輸入的話,T0定時(shí)器是會(huì)自動(dòng)計(jì)數(shù)的,當(dāng)溢出之后是會(huì)自動(dòng)置位T0IF的(雖然沒(méi)有設(shè)置T0IE,但T0IF滿足條件后是會(huì)置位的),而你的總中斷開關(guān)在主函數(shù)里INTCON|=0XC0;所以當(dāng)T1定時(shí)器溢出之后,程序會(huì)在中斷子函數(shù)里進(jìn)行對(duì)T0的操作。
還有你的程序有些邏輯錯(cuò)誤,AD結(jié)果應(yīng)該是10位的,但你接收AD結(jié)果的數(shù)組a[2]卻是8位的,那就丟失了兩個(gè)位了。
如果還有問(wèn)題,給我留言。
定時(shí)器的初始化要在中斷函數(shù)外部做,作為一個(gè)功能函數(shù),定時(shí)器的初始值一定不要在中斷函數(shù)中給出啊,而是要在外部初始化函數(shù)中,這里給出的是定時(shí)器1的設(shè)置,可以做個(gè)參考
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 定義的宏,與時(shí)鐘設(shè)置大小有關(guān)*/
IPC0bits.T1IP = 1;
IFS0bits.T1IF = 0; /* Reset interrupt flag */
IEC0bits.T1IE = 1; /* Enable interrupt */
T1CONbits.TON = 1; /* Start timer */
}
中斷函數(shù)中處理定時(shí)處理的事件。
void __attribute__((interrupt))_T1Interrupt(void)
{
/* 1mS gone */
/* Handle all auxiliary timers based on 1mS clock */
Adc_1ms_Timer(); //AD采樣處理函數(shù)
PwmCmd_1msTimer(); //pwm 處理函數(shù)
IFS0bits.T1IF = 0; /* Reset interrupt flag */
}
首先,在初始化中設(shè)置好I/O口功能。開中斷,初始化串口。
然后寫個(gè)串口中斷函數(shù),例如:
void interrupt isr(void)
if(RCIERCIF) //串口接收中斷
{
while(!RCIF);
NOP();NOP();NOP();
recive_dat[1]=RCREG; //接收1位數(shù)據(jù)
NOP();NOP();NOP();
CREN=0;
NOP();NOP();NOP();
CREN=1;
}
當(dāng)然,你把括號(hào)中加上你的函數(shù)就好了。
本人建議不要在中斷中處理函數(shù),最好在中斷中返回個(gè)標(biāo)志位,然后在主函數(shù)中執(zhí)行函數(shù)。
如果一定要在中斷中執(zhí)行函數(shù),這個(gè)函數(shù)最好在其他地方不使用,否則容易出錯(cuò)哦。
你說(shuō)的RXIF我不知道,我只知道RCIF。
當(dāng)前標(biāo)題:c語(yǔ)言pic函數(shù),pic函數(shù)調(diào)用
地址分享:http://chinadenli.net/article45/dsisihi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、做網(wǎng)站、企業(yè)建站、定制網(wǎng)站、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)