當前位置:編程學習大全網 - 編程語言 - PIC的C語言編程,主函數裏的while語句只執行壹遍,是為什麽?

PIC的C語言編程,主函數裏的while語句只執行壹遍,是為什麽?

妳怎麽判斷它只執行了壹次呢?

補充:首先不清楚妳的芯片具體是什麽型號的,從程序上看應該是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位的,那就丟失了兩個位了。

如果還有問題,給我留言。

  • 上一篇:端銑刀、球頭刀、圓頭刀如何選擇?
  • 下一篇:試駕吉利商用多功能家用車遠程FX,比SUV更實用,比皮卡更舒適
  • copyright 2024編程學習大全網