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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8G1K08單片機P1.0ADC測量電壓問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:92556 發表于 2020-9-5 02:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
官方例程改的,vcc的電壓顯示是正常的,P1.0,除了接地,是00,輸入什么電壓都是顯示都是65,,
自己看不出問題在哪,,



int *BGV; //內部 1.19V 參考信號源值存放在 idata 中
//idata 的 EFH 地址存放高字節
//idata 的 F0H 地址存放低字節
//電壓單位為毫伏(mV)
unsigned int   v1; v2; v3; pv1; pv2; pv3;  //voltage;        

int vcc; voltage;         

int res; res2;

/* void DelayMS(xg)

{ unsigned char i, j;

        i = 12;
        j = 169;
        do
        {
                while (--j);
        } while (--i);
}          //延時子程序
*/

void ADCInit()
{
P_SW2 |= 0x80;
ADCTIM = 0x3f; //設置 ADC 內部時序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //設置 ADC 時鐘為系統時鐘/2/16/16
ADC_CONTR = 0x8f; //使能 ADC 模塊,并選擇第 15 通道
DelayMS(20) ;
}
int ADCRead()
{ int res ;

ADC_CONTR |= 0x40; //啟動 AD 轉換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢 ADC 完成標志
ADC_CONTR &= ~0x20; //清完成標志
res = (ADC_RES << 8) | ADC_RESL; //讀取 ADC 結果

return res;
}


void ADCInit2()
{

P_SW2 |= 0x80;
ADCTIM = 0x3f; //設置 ADC 內部時序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //設置 ADC 時鐘為系統時鐘/2/16/16
ADC_CONTR =0x80; //使能 ADC 模塊,并選擇第 0 通道
DelayMS(20);
}
int ADCRead2()
{  int res2        ;

  ADC_RES=0;
  ADC_RESL=0;

    P1M0=0xFE;
        P1M1=0x01;//P1.0高阻態
ADC_CONTR |= 0x40; //啟動 AD 轉換
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查詢 ADC 完成標志
ADC_CONTR &= ~0x20; //清完成標志
res2 = (ADC_RES << 8) | ADC_RESL; //讀取 ADC 結果

return res2;
}


void dy (void)
{


int i;
int m ;
BGV = (int idata *)0xef;
ADCInit(); //ADC 初始化

//ES = 1;
//EA = 1;

// ADCRead();
// ADCRead(); //前兩個數據建議丟棄
res = 0;
for (i=0; i<8; i++)
{
res += ADCRead(); //讀取 8 次數據
}
res >>= 3; //取平均值

        

ADCInit2();

ADCRead2();
ADCRead2(); //前兩個數據建議丟棄

  res2 = 0;
for (m=0; m<8; m++)
{
res2 += ADCRead2(); //讀取 8 次數據
}
res2 >>= 3; //取平均值




vcc = (int)(1024L * *BGV / res); //(10 位 ADC 算法)計算 VREF 管腳電壓,即電池電壓
pv3=vcc+270;
voltage= (int)(vcc*res2/1024L);
v=voltage*10;  //100k/10k分壓

// vcc = (int)(4096L * *BGV / res); //(12 位 ADC 算法)計算 VREF 管腳電壓,即電池電壓
//注意,此電壓的單位為毫伏(mV)
}

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

使用道具 舉報

沙發
ID:337139 發表于 2022-3-26 11:08 | 只看該作者
這里有一個問題,取值平均應用流水串的思想要準確一些。
回復

使用道具 舉報

板凳
ID:115923 發表于 2022-3-26 13:03 | 只看該作者
P1M0=0xFE;
        P1M1=0x01;//P1.0高阻態

沒有設置P1.0為 ADC, 還是IO模式, 所以讀不到ADC數據
回復

使用道具 舉報

地板
ID:950349 發表于 2022-8-15 09:57 | 只看該作者
voltage= (int)(vcc*res2/1024L);
--》 int 是兩個字節,還是有符號的;vcc*res2相乘溢出了符號位,v 是無符號int。
回復

使用道具 舉報

5#
ID:1034262 發表于 2022-8-15 12:04 | 只看該作者
應該監控原始的ADC值,如果ADC只正確,則是你計算的問題,通常要用32位來計算避免溢出。如果ADC值不正常,則是初始化或硬件連接的問題。
回復

使用道具 舉報

6#
ID:213173 發表于 2022-8-15 13:46 | 只看該作者
給你一個示例參考,根據你的硬件電路修改端口定義。
  1. //4位數碼管電壓表示例
  2. //適用STC8G1K08-20
  3. #include <STC8G.H>
  4. #include "intrins.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. //宏定義ADC的操作命令
  8. #define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)
  9. #define ADC_POWER   0x80                        //ADC power control dit (宏定義ADC電源控制位)1000 0000
  10. #define ADC_START   0x40                        //ADC start control dit (宏定義ADC啟動控制位)0100 0000
  11. #define ADC_FLAG    0x20                        //ADC complete flag (宏定義ADC完成標志位)    0010 0000
  12. #define ADC_EPWMT   0x10                        //使能 PWM  實時觸發 ADC                     0001 0000
  13. #define VCC_mV      5000                        //VCC

  14. uchar code table[]={//共陰數碼管段碼"0~f-."
  15.                 0x3f,0x06,0x5b,0x4f,
  16.                 0x66,0x6d,0x7d,0x07,
  17.                 0x7f,0x6f,0x77,0x7c,
  18.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  19. uchar data dis_buf[4];                //緩存數組
  20. uchar num=0;
  21. uint ADC_mV;                                                //測量結果
  22. uint ADC_data;                                                //ADC轉換結果

  23. /*-------------------------------
  24.   1ms延時子程序(11.0592MHz 1T)
  25. -------------------------------*/
  26. void delayms(uint k)
  27. {
  28.         uint i,j;
  29.         for(i=k;i>0;i--)
  30.                 for(j=1110;j>0;j--);
  31. }
  32. /*-------------------------------------------------------
  33.   InitADC 初始化ADC
  34. -------------------------------------------------------*/
  35. void Init_ADC()
  36. {        //ADC 控制器  電源  啟動  完成  --   15通道模擬選擇位
  37.         //ADC_CONTR    B7    B6    B5   B4   B3   B2   B1   B0
  38.         P_SW2 |= 0x80;                                        //打開
  39.         ADCTIM = 0x3f;                                        //設置 ADC 內部時序
  40.         P_SW2 &= 0x7f;                                        //關閉
  41.         ADCCFG = 0x27;                                        //設置ADC結果右對齊,速度為512系統時鐘
  42.         ADC_RES=0;                                                //清除ADC_RES存儲器以前的結果
  43.         ADC_RESL=0;
  44.         ADC_CONTR=ADC_POWER;                         //ADC 開啟電源
  45.         delayms(1);                                                //上電延時1ms
  46. }
  47. /*---------------------------------------------------
  48.         讀取ADC結果
  49. ----------------------------------------------------*/
  50. uint GetADCResult(uchar CH)
  51. {
  52.         ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動轉換1100 1000
  53.         _nop_();_nop_();                                //小延時
  54.         while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成標志置位 1010 0000
  55.         ADC_CONTR &=~ADC_FLAG;                        //清完成標志
  56.         return ADC_RES<<8|ADC_RESL;                //返回十位ADC結果
  57. }

  58. /*----------------------
  59.   main主程序
  60. ----------------------*/
  61. void main()                                                       
  62. {
  63.         P1M1 = 0x01;                                         //設置P1.0高阻其余雙向
  64.         P1M0 = 0x00;                                         //設置P1.0高阻其余雙向
  65.         P3M1 = 0x00;                                         //設置P3雙向
  66.         P3M0 = 0x00;                                         //設置P3雙向
  67.         P5M0 = 0x00;                                         //設置P5雙向
  68.         P5M1 = 0x00;                                         //設置P5雙向
  69.         Init_ADC();
  70.         while(1)
  71.         {
  72.                 ADC_data = GetADCResult(0);
  73.                 ADC_mV=VCC_mV*(long)ADC_data/1024;//強制轉換數據類型(32位)運算,得到結果mV
  74.                 dis_buf[0]=table[ADC_mV/1000%10];
  75.                 dis_buf[1]=table[ADC_mV/100%10];
  76.                 dis_buf[2]=table[ADC_mV/10%10];
  77.                 dis_buf[3]=table[ADC_mV%10];
  78.                 P3=0x00;                                //消隱
  79.                 P1&=0x0f;                        //清位碼
  80.                 P1|=~(0x10<<num); //送位碼
  81.                 if(num==0)P3=dis_buf[num]|0x80;//送段碼+小數點
  82.                 else P3=dis_buf[num];  //送段碼
  83.                 num=++num%4;
  84.         }
  85. }
復制代碼

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜资源 | 中文字幕中文字幕 | 美女久久视频 | 久久手机在线视频 | 亚洲一区二区三区久久 | 日韩中文在线观看 | 亚洲国产一区二区三区在线观看 | 91精品国产综合久久香蕉922 | 成人欧美一区二区三区在线观看 | 欧美一区二区三区久久精品 | 亚洲国产精品久久久久久 | 欧美日韩综合一区 | 最新91在线 | 亚洲一区二区三区免费在线观看 | 国产成人免费网站 | 久久高清国产视频 | 久久av一区 | 久久国产精品一区二区三区 | 精品国产一区二区三区性色av | 四虎国产 | 人人鲁人人莫人人爱精品 | 97精品国产97久久久久久免费 | 手机看黄av免费网址 | 91精品国产乱码麻豆白嫩 | 久久久精品网 | 97av在线| 久久国产精品一区二区 | www一级片 | 国产成人免费视频网站视频社区 | 亚洲视频在线观看一区二区三区 | 免费成人毛片 | 四虎影视免费观看 | 日韩视频在线观看中文字幕 | www.婷婷| 国产成人精品免高潮在线观看 | 九九精品视频在线 | 亚洲成人高清 | 国产欧美日韩一区二区三区在线 | 蜜桃传媒一区二区 | 亚洲视频中文字幕 | 精品三级在线观看 |