单通道ADC采集
采用STC8H8K64U做ADC采集,通道四作为ADC口,P1.0 P1.1作为串口输出,用串口助手没有输出是为什么呢?
用仿真来分析
51 如何仿真,STC8H8K64U自带硬件USB直接仿真,视频讲解回放 - 仿真/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
要先调试好串口程序,初始化串口后先发送一串字符串(做好是10个以上中文字),串口助手能正确收到字符串,然后再添加ADC程序。 以下是代码(用的是例程,改变了通道数和串口)
#define MAIN_Fosc 11059200L
#define UART_BaudRate1 115200UL
#include "STC8H.h"
#include "intrins.h"
#define ADC_START (1<<6)
#define ADC_FLAG (1<<5)
define ADC_SPEED 1
#define RES_FMT (1<<5)
#define CSSETUP (0<<7)
#define CSHOLD (1<<5)
#define SMPDUTY 20
#define P1n_standard
bit B_TX1_Busy;
#define u16 unsigned char
#define u8 unsigned int
u16 Get_ADC10bitResult(u8 channel);
void delay_ms(u8 ms);
void UART1_config(void);
void Uart1_TxByte(u8 dat);
void PrintString1(u8 *puts);
void ADC_convert(u8 chn);
void main(void)
{
u8 i;
UART1_config();
EA = 1;
B_TX1_Busy= 0;
P1M0 = 0x00;
P1M1 = 0x10;
ADC_CONTR = 0x80 + 4; //ADC on + channel
ADCCFG = RES_FMT + ADC_SPEED;
P_SW2 |=0x80;
ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
while (1)
{
for(i=0; i<16; i++)
{
delay_ms(120);
ADC_convert(i);
if(i == 7)
{
Uart1_TxByte(0x0d);
Uart1_TxByte(0x0a);
}
}
Uart1_TxByte(0x0d);
Uart1_TxByte(0x0a);
}
}
u16 Get_ADC10bitResult(u8 channel) //channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = 0x80 | ADC_START | channel;
NOP(5);
while((ADC_CONTR & ADC_FLAG) == 0) ;
ADC_CONTR &= ~ADC_FLAG;
return ((u16)ADC_RES * 256 + (u16)ADC_RESL);
}
#define SUM_LENGTH 16
void ADC_convert(u8 chn)
{
u16 j;
u8 k;
for(k=0, j=0; k<SUM_LENGTH; k++) j += Get_ADC10bitResult(chn);
j = j / SUM_LENGTH;
Uart1_TxByte('A');
Uart1_TxByte('D');
Uart1_TxByte('C');
Uart1_TxByte(chn/10+'4');
Uart1_TxByte(chn%10+'4');
Uart1_TxByte('=');
Uart1_TxByte(j/1000 + '0');
Uart1_TxByte(j%1000/100 + '0');
Uart1_TxByte(j%100/10 + '0');
Uart1_TxByte(j%10 + '0');
Uart1_TxByte(' ');
Uart1_TxByte(' ');
}
voiddelay_ms(u8 ms)
{
u16 i;
do
{
i = MAIN_Fosc / 10000;
while(--i) ;
}while(--ms);
}
void UART1_config(void)
{
TR1 = 0;
AUXR &= ~0x01;
AUXR |=(1<<6);
TMOD &= ~(1<<6);
TMOD &= ~0x30;
TH1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) / 256;
TL1 = (65536UL - (MAIN_Fosc / 4) / UART_BaudRate1) % 256;
ET1 = 0;
TR1= 1;
SCON = (SCON & 0x3f) | (1<<6);
REN = 1;
ES= 1;
P_SW1 = (P_SW1 & 0x3f) | (2<<6);
P1n_standard(0x03);
B_TX1_Busy= 0;
}
void Uart1_TxByte(u8 dat)
{
B_TX1_Busy = 1;
SBUF = dat;
while(B_TX1_Busy);
}
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
}
if(TI)
{
TI = 0;
B_TX1_Busy = 0;
}
} emmm一个问题啊,,P1.0 P1.1 好像是串口2 的引脚吧
你这光在串口1上下功夫也没用啊{:4_194:}
P1.0和P1.1作为UART串口,没办法在读取AD了吧,程序读取0-15口的AD显然不可能实现。 lili11 发表于 2024-4-18 10:13
以下是代码(用的是例程,改变了通道数和串口)
#define MAIN_Fosc 11059200L
#define UART_BaudRate1 11 ...
有没有一种可能,你串口切换到P1.6 P1.7,而不是P1.0 P1.1(我以为你是用的串口2)。
页:
[1]