欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC8G1K08A單片機模數轉換問題
[打印本頁]
作者:
51beginner
時間:
2021-7-4 01:46
標題:
STC8G1K08A單片機模數轉換問題
四個電阻串聯,用STC8G1K08A單片機的P3^0口做模數轉換ADC,用萬用表測 2 3 4 點的電壓,分別為 1.25V,2.50V,3.75V 按照理論,這三個點的模數變換數值應該為 256, 512, 768 ,實際顯示的是250,377,440,除去變換的誤差,這和理論值差的也太多了,程序是按照廠家提供的例程編寫的,電路上的5V電壓直接取自單片機的VCC和GND.測量時就是直接用杜邦線連P3^0口和 2 3 4 點,沒有串限流電阻,也沒有并分流電阻,這是程序出了問題還是電路出了問題?求論壇里的大神給指點一二。
1.png
(13.31 KB, 下載次數: 81)
下載附件
2021-7-4 05:28 上傳
作者:
wulin
時間:
2021-7-4 07:31
給你一個應用實例參考,因電池供電,P3.2既作ADC輸入,也作中斷喚醒。ADC檢測壓力傳感器信號,當無壓力達到一定時間,進入休眠。一旦有壓力MCU喚醒正常工作。你的問題可能是ADC轉換結果寄存器設置不當。
//STC8G1K08A工作電壓范圍1.9~5.5V
//#include "reg51.h"
#include <STC8.H>
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
#define ADCTIM (*(unsigned char volatile xdata *)0xfea8)
//#define ceiling 636 //上限
//#define floor 923 //下限
sbit LED_R=P5^4;
sbit LED_G=P5^5;
//sbit AVDD =P3^3;
uint code table[36]={
923 ,// 0
915 ,// 1
907 ,// 2
898 ,// 3
890 ,// 4
882 ,// 5
874 ,// 6
866 ,// 7
858 ,// 8
850 ,// 9
841 ,// 10
833 ,// 11
825 ,// 12
817 ,// 13
809 ,// 14
800 ,// 15
792 ,// 16
784 ,// 17
776 ,// 18
768 ,// 19
760 ,// 20
751 ,// 21
743 ,// 22
735 ,// 23
727 ,// 24
719 ,// 25
710 ,// 26
702 ,// 27
694 ,// 28
686 ,// 29
677 ,// 30
669 ,// 31
661 ,// 32
653 ,// 33
645 ,// 34
636 };//35
bit flag=0;//完成標志
//uchar i;
uint CY_ADC;//采樣值
uint time;
void Timer0Init() //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD &= 0xF0; //設置定時器自動重裝模式
TL0 = 0x9A; //設置定時初值
TH0 = 0xA9; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
/*----------------------------
讀取ADC結果
----------------------------*/
void GetADCResult()
{ //ADC 控制器 電源 啟動 完成 -- 15通道模擬選擇位
//ADC_CONTR B7 B6 B5 B4 B3 B2 B1 B0
static uint count=0;
static uint PJZ_ADC=0; //累加10次采樣的變量1
count++;
if(count==1)ADC_CONTR = 0x80; //使能ADC模塊
if(count>=2&&count<=11)
{
ADC_CONTR|= 0x42; //啟動AD轉換,P3.2 ADC輸入
_nop_();_nop_();
while (!(ADC_CONTR & 0x20)); //查詢ADC完成標志
ADC_CONTR &= ~0x20; //清完成標志
PJZ_ADC+=(ADC_RES<<8|ADC_RESL); //累計10次讀取10位ADC結果
}
if(count==11)
{
CY_ADC=PJZ_ADC/10;
PJZ_ADC=0;
ADC_CONTR = 0x00; //關閉ADC
flag=1;
}
if(count>=10)//200ms
count=0;
}
void main()
{
P3M0 = 0x00; //設置P3.2為ADC口
P3M1 = 0x04; //設置P3.2為ADC口
P5M0 = 0x00;
P5M1 = 0x00;
P_SW2 |= 0x80; //打開
ADCTIM = 0x3f; //設置 ADC 內部時序
P_SW2 &= 0x7f; //關閉
ADCCFG = 0x27; //設置ADC結果右對齊,速度為512系統(tǒng)時鐘 ADCCFG = 0x0f; // 設置 ADC 時鐘為系統(tǒng)時鐘 /2/16/16
// ADC_CONTR = 0x80; // 使能 ADC 模塊
Timer0Init();
//ADC配置寄存器 -- -- 格式控制 -- 速度控制位
// ADCCFG B7 B6 B5 B4 B3 B2 B1 B0
while (1)
{
if(TF0)
{
TF0=0;
GetADCResult();
if(flag==1)
{
flag=0;
if(CY_ADC>table[0])
{
time++;
LED_R=1;
LED_G=1;
}
else if(CY_ADC>table[0] && CY_ADC<table[36])
{
time=0;
LED_R=1;
LED_G=0;
}
else if(CY_ADC<table[36])
{
time=0;
LED_R=0;
LED_G=0;
}
if(time>=15000)
{
time=0;
P3M1 = 0x00;//設置P3.2為準雙向
// AVDD = 0;
TR0 = 0;//關閉定時器
EX0 = 1; // 使能 INT0 中斷 , 用于喚醒 MCU
EA = 1;
_nop_();_nop_();_nop_();_nop_();
PCON = IDL; //MCU 進入空閑(省電)模式
_nop_();_nop_();_nop_();_nop_();
}
}
}
}
}
void INT0_Isr() interrupt 0
{
EX0 = 0; // 關閉 INT0 中斷
EA = 0; // 關閉總中斷
// AVDD = 1;
P3M1=0x04; //設置P3.2為ADC口
TR0 = 1; //啟動定時器
}
復制代碼
作者:
Y_G_G
時間:
2021-7-4 19:02
代碼呢?
STC8G1K08A這個IC容易受干擾,特別是電路中有高頻信號的情況下
在ADC的采樣輸入一定要有一個104以上的電容,而且得是靠近端口的
單片機的VCC一定在做好濾波,104電容一定要靠近VCC
GND不能到處亂跑
作者:
yzwzfyz
時間:
2021-7-5 11:32
這個問題許多人會遇到,其它很多人不知道原因。
多路AD采樣系統(tǒng)中有一個采樣電容。系統(tǒng)會對電容上的電壓進行對分試探轉換,系統(tǒng)希望電容上的電壓不要跳動,否則影響AD對分計算。于是系統(tǒng)在轉換時會斷開采樣電容與外界的聯系(本處AD是不是這樣處理就不清楚了),這就需要切換采樣通道后,稍等一下,待采樣電容上的電充、分完全后,再下令開始采樣。!
樓主試試看:切換采樣通道后,等50ms,再下令轉換電壓。改變等待時間,看看AD值有何變化?
作者:
51beginner
時間:
2021-7-5 23:38
謝謝各位大俠的指點。
我想做個小對講機,限于體積,選用STC8G1K08A做控制芯片,它的IO口只有六個,去掉兩個串口,再去掉三個用于功能選擇按鍵的IO口,就剩一個IO口,只能用LED的閃爍頻率來顯示功能選擇項,顯得很LOW,后來發(fā)現了一個例子,按照他的思路,精簡了一下,就三個選擇項,裝上后就是這個樣,電壓和ADC數值不成比例。我自己總結的原因是 ADC有內阻,接上后相當于并聯,可能影響讀數,也有可能是我的十位ADC結果轉換成十進制數的計算方法有問題,也有可能是設置ADC各個寄存器的時候沒有仔細看說明書,直接按照例程搬過來的,可能某個寄存器的高位或低位沒設置,造成讀數不準。
但是,按照這個電路,每個按鍵的讀數都比較穩(wěn)定,目的已經達到了,先不探究具體原因了,節(jié)省下來的IO口,我弄了個IIC的OLED顯示屏,用來顯示頻率,音量,亞音,話筒靈敏度等等,就顯得很高大上了。想想還有一大堆的字模 bmp要自己畫,腦袋都大了。
再次感謝各位大神的指導,受益匪淺。希望以后能繼續(xù)得到大家的幫助。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1