欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC8G1K08單片機P1.0ADC測量電壓問題
[打印本頁]
作者:
qwa1234
時間:
2020-9-5 02:47
標題:
STC8G1K08單片機P1.0ADC測量電壓問題
官方例程改的,vcc的電壓顯示是正常的,P1.0,除了接地,是00,輸入什么電壓都是顯示都是65,,
自己看不出問題在哪,,
int *BGV; //內(nèi)部 1.19V 參考信號源值存放在 idata 中
//idata 的 EFH 地址存放高字節(jié)
//idata 的 F0H 地址存放低字節(jié)
//電壓單位為毫伏(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 內(nèi)部時序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //設置 ADC 時鐘為系統(tǒng)時鐘/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 內(nèi)部時序
P_SW2 &= 0x7f;
ADCCFG = 0x2f; //設置 ADC 時鐘為系統(tǒng)時鐘/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高阻態(tài)
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(); //前兩個數(shù)據(jù)建議丟棄
res = 0;
for (i=0; i<8; i++)
{
res += ADCRead(); //讀取 8 次數(shù)據(jù)
}
res >>= 3; //取平均值
ADCInit2();
ADCRead2();
ADCRead2(); //前兩個數(shù)據(jù)建議丟棄
res2 = 0;
for (m=0; m<8; m++)
{
res2 += ADCRead2(); //讀取 8 次數(shù)據(jù)
}
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)
}
作者:
長風007
時間:
2022-3-26 11:08
這里有一個問題,取值平均應用流水串的思想要準確一些。
作者:
zhaobolove
時間:
2022-3-26 13:03
P1M0=0xFE;
P1M1=0x01;//P1.0高阻態(tài)
沒有設置P1.0為 ADC, 還是IO模式, 所以讀不到ADC數(shù)據(jù)
作者:
sunfeedy
時間:
2022-8-15 09:57
voltage= (int)(vcc*res2/1024L);
--》 int 是兩個字節(jié),還是有符號的;vcc*res2相乘溢出了符號位,v 是無符號int。
作者:
coody_sz
時間:
2022-8-15 12:04
應該監(jiān)控原始的ADC值,如果ADC只正確,則是你計算的問題,通常要用32位來計算避免溢出。如果ADC值不正常,則是初始化或硬件連接的問題。
作者:
wulin
時間:
2022-8-15 13:46
給你一個示例參考,根據(jù)你的硬件電路修改端口定義。
//4位數(shù)碼管電壓表示例
//適用STC8G1K08-20
#include <STC8G.H>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
//宏定義ADC的操作命令
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
#define ADC_POWER 0x80 //ADC power control dit (宏定義ADC電源控制位)1000 0000
#define ADC_START 0x40 //ADC start control dit (宏定義ADC啟動控制位)0100 0000
#define ADC_FLAG 0x20 //ADC complete flag (宏定義ADC完成標志位) 0010 0000
#define ADC_EPWMT 0x10 //使能 PWM 實時觸發(fā) ADC 0001 0000
#define VCC_mV 5000 //VCC
uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x80};
uchar data dis_buf[4]; //緩存數(shù)組
uchar num=0;
uint ADC_mV; //測量結果
uint ADC_data; //ADC轉換結果
/*-------------------------------
1ms延時子程序(11.0592MHz 1T)
-------------------------------*/
void delayms(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=1110;j>0;j--);
}
/*-------------------------------------------------------
InitADC 初始化ADC
-------------------------------------------------------*/
void Init_ADC()
{ //ADC 控制器 電源 啟動 完成 -- 15通道模擬選擇位
//ADC_CONTR B7 B6 B5 B4 B3 B2 B1 B0
P_SW2 |= 0x80; //打開
ADCTIM = 0x3f; //設置 ADC 內(nèi)部時序
P_SW2 &= 0x7f; //關閉
ADCCFG = 0x27; //設置ADC結果右對齊,速度為512系統(tǒng)時鐘
ADC_RES=0; //清除ADC_RES存儲器以前的結果
ADC_RESL=0;
ADC_CONTR=ADC_POWER; //ADC 開啟電源
delayms(1); //上電延時1ms
}
/*---------------------------------------------------
讀取ADC結果
----------------------------------------------------*/
uint GetADCResult(uchar CH)
{
ADC_CONTR=ADC_POWER|ADC_START|CH;//啟動轉換1100 1000
_nop_();_nop_(); //小延時
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉換完成標志置位 1010 0000
ADC_CONTR &=~ADC_FLAG; //清完成標志
return ADC_RES<<8|ADC_RESL; //返回十位ADC結果
}
/*----------------------
main主程序
----------------------*/
void main()
{
P1M1 = 0x01; //設置P1.0高阻其余雙向
P1M0 = 0x00; //設置P1.0高阻其余雙向
P3M1 = 0x00; //設置P3雙向
P3M0 = 0x00; //設置P3雙向
P5M0 = 0x00; //設置P5雙向
P5M1 = 0x00; //設置P5雙向
Init_ADC();
while(1)
{
ADC_data = GetADCResult(0);
ADC_mV=VCC_mV*(long)ADC_data/1024;//強制轉換數(shù)據(jù)類型(32位)運算,得到結果mV
dis_buf[0]=table[ADC_mV/1000%10];
dis_buf[1]=table[ADC_mV/100%10];
dis_buf[2]=table[ADC_mV/10%10];
dis_buf[3]=table[ADC_mV%10];
P3=0x00; //消隱
P1&=0x0f; //清位碼
P1|=~(0x10<<num); //送位碼
if(num==0)P3=dis_buf[num]|0x80;//送段碼+小數(shù)點
else P3=dis_buf[num]; //送段碼
num=++num%4;
}
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1