久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 828|回復: 1
打印 上一主題 下一主題
收起左側

為什么我這個代碼讀出來的ADC值一直都是0

[復制鏈接]
跳轉到指定樓層
樓主
ID:1041297 發表于 2024-8-28 14:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "H/Function_Init.H"
#include "math.h"
#include "H/TM1637.H"

unsigned char code CODE[10]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,};
unsigned char code number[12] = {0xFD,0x51,0xBB,0xAF,0x67,0xCF,0xDF,0xA5,0xFF,0xEF,0x20,0x76};
                                                                                                                                //0   1    2     3    4    5    6    7    8    9  LED燈  H
unsigned char code time[10] = {0xFD,0x51,0xBB,0xAF,0x67,0xCF,0xDF,0xA5,0xFF,0xEF};
                               //0   1    2     3    4    5    6    7    8    9
uint8_t data ucRunStatus = 0;//0表示待機狀態,1表示進入焦度調整模式
uint8_t data program;        //焦度模式選擇
uint8_t data mode_3s_flag;   //焦度模式3s不操作標志位
uint16_t data mode_3s_time;   //焦度模式3s累計時間
uint8_t data mode_last_value;  //上次焦度模式的值
uint8_t data mode_value;       //焦度模式的值
uint8_t data digital_tube_flash;
uint8_t data digital_tube_flashtime;
uint8_t key_pressdown_total = 0; //按鍵按下總數
uint16_t time_setting;      //時間設定


//float T_c=0.0;   //溫度值
// 定義常量
#define R_FIXED 1000.0 // 固定電阻值1kΩ
#define B_CONST 4537.0 // NTC的B常數
#define T0 373.15 // 100℃轉換為開爾文
#define R0 1000.0 // NTC在25℃時的電阻值1kΩ
#define clk  P20
#define dio  P05
#define key_press P25
#define Time_Max  945
#define Time_Min  0

unsigned int ADCValue = 0x0000;
unsigned int  tmpValue;
bit AdcFlag = 0;
/***********ADC采樣頻率選擇*************/
enum ADCFreq {F32=0,F24,F16,F12,F8,F6,F4,F3};

/***********ADC采樣口選擇*************/
#if (IC_MODEL == SC92F7413)
enum Channel {AIN0=0,AIN1,AIN2,AIN3,AIN4,AIN5,AIN6,AIN7,AIN8,AIN9,VDD4=31};
#endif

#if (IC_MODEL == SC92F7412)
enum Channel {AIN2=2,AIN3,AIN4,AIN5,AIN8=8,AIN9,VDD4=31};
#endif

#if (IC_MODEL == SC92F7411)
enum Channel {AIN2=2,AIN3,AIN4,AIN8=8,AIN9,VDD4=31};
#endif


/********************延時函數,延時nms******************/
void delay_nms(unsigned int n)
{
         unsigned int i;
         while(n--)
         for(i=0;i<550;i++);
}
///=======================================
void Delay_us(unsigned int i) //nus 延時
{
         for(;i>0;i--)
         _nop_();
}


/*
函數功能:IIC開始信號
參數:無
返回值:無
備注:無
*/
void I2CStart(void)
{
         clk = 1;
         dio = 1;
         Delay_us(2);
         dio = 0;
}


/*
函數功能:IIC應答信號
參數:無
返回值:無
備注:無
*/
void I2Cask(void)
{
        clk = 0;
        Delay_us(5); //在第八個時鐘下降沿之后延時 5us,開始判斷 ACK 信號
        while(dio);
        clk = 1;
        Delay_us(2);
        clk=0;
}
///========================================

/*
函數功能:IIC停止信號
參數:無
返回值:無
備注:無
*/
void I2CStop(void)  
{
         clk = 0;
         Delay_us(2);
         dio = 0;
         Delay_us(2);
         clk = 1;
         Delay_us(2);
         dio = 1;
}


/*
函數功能:寫一個字節
參數:無
返回值:無
備注:無
*/
void I2CWrByte(unsigned char oneByte) //
{
         unsigned char i;
         for(i=0;i<8;i++)
         {
                  clk = 0;
            if(oneByte&0x01) //低位在前
           {
             dio = 1;
           }
                 else
                 {
                         dio = 0;
                 }
                 Delay_us(3);
                 oneByte=oneByte>>1;
                 clk=1;
                 Delay_us(3);
        }
}

/*
函數功能:自動地址加一模式
參數:無
返回值:無
備注:無
*/
void SmgDisplay(void) //寫顯示寄存器
{
         unsigned char i;
         I2CStart();
         I2CWrByte(0x40); // 40H 地址自動加 1 模式,44H 固定地址模式,本程序采
         I2Cask();
         I2CStop();
         I2CStart();
         I2CWrByte(0xc0); //設置首地址,
         I2Cask();
         for(i=0;i<4;i++) //地址自加,不必每次都寫地址
         {
                        I2CWrByte(0x00); //送數據
                        I2Cask();
         }
         I2CStop();
         I2CStart();
         I2CWrByte(0x8f); //開顯示 ,最大亮度
         I2Cask();
         I2CStop();
}


/*
函數功能:顯示函數,固定地址寫數據
參數:無
返回值:無
備注:無
*/
void disp(unsigned char add, unsigned char value)
{
         I2CStart();
         I2CWrByte(0x44);                                 //數據命令設置:固定地址,寫數據到顯示寄存器
         I2Cask();
         I2CStop();

         I2CStart();
         I2CWrByte(add);                                //地址命令設置:寫入add對應地址
         I2Cask();

       
                 I2CWrByte(number[value]);                        //給add地址寫數據
                 I2Cask();
                 I2CStop();
               
         
         I2CStart();
         I2CWrByte(0x8C);                                //顯示控制命令:開顯示,脈沖寬度為11/16.
         I2Cask();
         I2CStop();

}




/*****************************************************
*函數名稱:void ADC_Init(uint Channel,uchar ADCFreq)
*函數功能:ADC初始化
*入口參數:void
*出口參數:void
*****************************************************/
void ADC_Init(uint Channel)
{
        ADCCON = 0X80|Channel;                //開啟ADC,ADC采樣頻率為3M ,選擇Channel位ADC采樣口
        if(Channel<8)
        {
                ADCCFG0 = 1<<Channel;   //設置Channel作為采樣口
        }
        else
        {
                ADCCFG1 = 1<<(Channel-8);   //設置Channel作為采樣口
        }
        //ADCCFG2 = F8;
        IE |= 0X40;        //開啟ADC中斷
        //EA = 1;
}

/*****************************************************
*函數名稱:uint ADC_GetAverageValue(uint Channel,ADC_SamplesNum_TypeDef ADC_SamplesNum)
*函數功能:ADC采樣取平均值
*入口參數:
ADC_SamplesNum_TypeDef ADC_SamplesNum:采樣次數
*出口參數:
uint:多次采樣平均值
*****************************************************/
uint ADC_GetAverageValue(ADC_SamplesNum_TypeDef ADC_SamplesNum)
{
        uchar tmpCnt;
        uint tmpValueSum = 0, tmpValue;
  uint tmpValue_Max = 0, tmpValue_Min = 0xFFFF;

        for(tmpCnt = 0; tmpCnt < ADC_SamplesNum; tmpCnt ++)
  {
                EA = 0;
                OPINX = 0xC1;
          OPREG |= 0x10;      //切換至二分頻               
                EA = 1;               
                ADCCON |= 0X40;             //開始一次ADC轉換
          while(!AdcFlag);          //等待ADC轉換完成       
                EA = 0;
                OPINX = 0xC1;
          OPREG &= 0xCF;      //返回至一分頻
                EA = 1;       
               
                AdcFlag = 0;            
          tmpValue=(ADCVH<<4)+(ADCVL>>4);     //獲取單次轉換值
                  
    if(tmpValue > tmpValue_Max)   //獲取多次轉換值中的最大值
      tmpValue_Max = tmpValue;   
    if(tmpValue < tmpValue_Min)   //獲取多次轉換值中的最小值
      tmpValue_Min = tmpValue;               
    tmpValueSum += tmpValue;   //累加多次轉換值的和
  }

        /* 通過硬件乘除法器來計算平均值 */
  {
    OPERCON |= 0X40;
    /* 被除數為16位數據 */
    tmpValueSum -= (tmpValue_Max + tmpValue_Min);
    EXA0 = tmpValueSum;
    EXA1 = tmpValueSum >> 8;
    EXBL = ADC_SamplesNum - 2;                        //除數為8位數據

    OPERCON |= 0x80;                                //開始除法計算
    while(OPERCON & 0x80);                        //等待計算完畢

    //獲取商
    tmpValue = (uint)EXA0;
    tmpValue |= EXA1 << 8;
        }
    return tmpValue;                        //返回平均值
}


///*
//函數功能:LED燈全滅
//參數:無
//返回值:無
//備注:無
//*/
void Display_OFF(void)
{
        I2CStart();
        I2CWrByte(0x80);
        I2CStop();   
}

uint32_t code ntc_r[100]=
{
        //180°~ 189°
        1548,1514,1480,1447,1414,1383,1353,1323,1294,1266,
       
        //190°~199°
        1239,1212,1186,1160,1136,1112,1088,1065,1043,1021,
       
        //200°~209°
        1000,978,957,937,917,897,878,860,841,824,
       
        //210~219°
        807,790,773,758,742,727,712,698,683,670,
       
        //220°~229°
        656,643,630,618,606,594,582,571,560,549,
};






float calculate_temperature(float voltage) {
    float R_ntc, T;
    float V_supply = 5; // 電源電壓3.3V

    // 計算NTC電阻值
    R_ntc = R_FIXED * (V_supply / voltage - 1);

    // 計算溫度(開爾文)
    T = 1 / (1 / T0 + log(R_ntc / R0) / B_CONST);

    // 轉換為攝氏度
    T = T - 273.15;

    return T;
}



uint8_t b;

//void digital(uint8_t c)
//{
//               
//                disp(0xc0,c/100);
//                disp(0xc1,c/10%10);
//                disp(0xc2,c%10);
//}




///==============================================
void main(void)
{
        uint8_t a;

ADC_Init(AIN2);
IO_Init(); //初始化
Timer_Init();
SmgDisplay(); //開機時先全滅,不加這條會亂顯示

while(1)
{
         if(ubTime100mS)
         {
                 ubTime100mS =0;
                        a = ADC_GetAverageValue();
                        //b = calculate_temperature(a);
                        disp(0xc0,a/100);
                disp(0xc1,a/10%10);
                disp(0xc2,a%10);

                }
                        
        }
}
請大伙幫我看看,這個是賽元微的芯片,SC92F7411

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:404160 發表于 2024-8-28 16:09 | 只看該作者
初始化問題:確保 ADC_Init 函數正確初始化了 ADC。注意,你的代碼中使用了 ADC_Init(AIN2),這意味著你選擇 AIN2 作為采樣通道,確保這個通道連接到了合適的模擬信號。

中斷問題:在 ADC_GetAverageValue 函數中,你使用 while(!AdcFlag); 等待 ADC 轉換完成。確保沒有中斷沖突,并且 AdcFlag 被正確設置。

硬件連接問題:確保 AIN2 引腳與需要測量的模擬信號正確連接,并且沒有任何短路或開路的問題。

電源和參考電壓:檢查電源是否穩定,確保 ADC 的參考電壓正確設置,因為如果參考電壓過低,可能會導致讀數為 0。

濾波和去噪:如果信號有噪聲或不穩定,可能會影響 ADC 的讀數。考慮在硬件或軟件(通過軟件濾波)上加入濾波。

ADC 配置問題:檢查 ADCCON、ADCCFG0 和 ADCCFG1 的配置是否符合芯片手冊的推薦設置。

軟件邏輯問題:檢查 ADC_GetAverageValue 函數的邏輯是否正確,特別是取平均值的邏輯部分。

顯示問題:注意,你有一個注釋掉的 digital 函數,如果你打算使用它來顯示數值,需要取消注釋,并確保它的邏輯是正確的。

調試:在 ADC_GetAverageValue 函數中,打印 tmpValue 或 tmpValueSum 來檢查在取平均值之前和之后的值,以幫助診斷問題。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产专区免费 | 91在线一区二区 | 国产日韩欧美中文字幕 | 岛国av一区二区 | 国产一区二区三区在线观看免费 | 欧美精选一区二区 | 日本精品一区二区三区在线观看视频 | 91亚洲精品在线 | 一区二区三区国产好 | 国产精品色婷婷久久58 | 日韩欧美国产一区二区三区 | 日韩中文在线观看 | 国产成人午夜精品影院游乐网 | 久久成| 韩国精品在线 | 久久久久亚洲视频 | 天天拍天天操 | 国产精品精品久久久 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 黄a在线观看| 亚洲国产精品一区二区三区 | 成人精品免费视频 | 国产日韩精品一区 | 久久综合九九 | 日韩免费 | 久久精品国产精品青草 | 日韩欧美精品 | 国产精品久久久久久久久久 | 日韩久久久久 | 国产欧美精品一区二区三区 | 在线视频一区二区三区 | 精品国产乱码久久久久久影片 | 中国大陆高清aⅴ毛片 | 中文字幕二区 | 亚洲在线中文字幕 | 久久大| 亚洲精品中文字幕中文字幕 | 欧美偷偷操 | 久久一区二区三区四区 | 96国产精品久久久久aⅴ四区 | 99爱在线免费观看 |