標(biāo)題:
STC15f2k60S2單片機(jī)中自帶ADC用串口發(fā)送問(wèn)題
[打印本頁(yè)]
作者:
917106794
時(shí)間:
2020-5-21 09:49
標(biāo)題:
STC15f2k60S2單片機(jī)中自帶ADC用串口發(fā)送問(wèn)題
#include "stc15f2k60s2.h"
#include "delay.h"
#include "def.h"
#include "adc.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80 //ADC電源控制位
#define ADC_FLAG 0x10 //ADC完成標(biāo)志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540個(gè)時(shí)鐘
#define ADC_SPEEDL 0x20 //360個(gè)時(shí)鐘
#define ADC_SPEEDH 0x40 //180個(gè)時(shí)鐘
#define ADC_SPEEDHH 0x60 //90個(gè)時(shí)鐘
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{
P1ASF = 0xff; //設(shè)置P1口為AD口
ADC_RES = 0; //清除結(jié)果寄存器
ADC_RESL=0;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
delay1ms(2); //ADC上電并延時(shí)
}
/*----------------------------
讀取ADC結(jié)果
----------------------------*/
unsigned long GetADCResult(unsigned char ch)
{
unsigned long Vo,ADC;
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4個(gè)NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
// ADC_RES=ADC_RES*4+ADC_RESL;
ADC=(ADC_RES<<2)|ADC_RESL;
//ADC_RES=ADC_RES*256+c;
Vo=ADC*3.3*1000/1023;
//Vo=ADC_RES*3.3*10/255;
return Vo; //返回ADC結(jié)果
}
/*----------------------------
讀取ADC結(jié)果
----------------------------*/
unsigned long Get1ADCResult(void)
{
unsigned long Vo,V1,V2;
Vo= GetADCResult(0);
_nop_(); //等待4個(gè)NOP
_nop_();
_nop_();
_nop_();
V1= GetADCResult(0);
_nop_();
_nop_();
V2=(Vo+V1)/2;
return V2; //返回ADC結(jié)果
}
#include "uart.h"
void UartInit(void)
{
SCON=0x50;
TMOD= 0x00;
AUXR=0X40;
TL1=(65535-(11059200/4/9600));
TH1=(65535-(11059200/4/9600))>>8;
TR1 = 1;
ES = 1;
EA = 1;
}
void UartSendByte(u8 dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void UartSendStr(u8 *str)
{
while(*str)
{
UartSendByte(*str);
str++;
}
}
void UartSend(u8 *str ,u8 len)
{
while(len--)
{
UartSendByte(*str);
str++;
}
}
/*****************************************************************************/
void UART0_Interrupt(void) interrupt 4 using 1
{
u8 SbufTemp;
if(RI)
{
RI = 0;
SbufTemp = SBUF;
}
}
串口監(jiān)測(cè).zip
2020-5-21 09:49 上傳
點(diǎn)擊文件名下載附件
77.33 KB, 下載次數(shù): 17
作者:
917106794
時(shí)間:
2020-5-21 09:54
在ADC轉(zhuǎn)換時(shí)候,ADC_RES這個(gè)是系統(tǒng)自帶的八位寄存器,直接使用是高八位的數(shù)據(jù),如果想用8位的ADC采樣,直接舍棄低2位的就可以了,直接返回這個(gè)值用char 型的就可以了,而用10位的ADC寄存器這個(gè)值就溢出范圍了需要用十位的,用int型直接返回ADC_RES*4+ADC_RESL,這樣采集的數(shù)據(jù)才是正確的,希望學(xué)習(xí)這部分的童鞋注意
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1