找回密码
 立即注册
查看: 81|回复: 6

单通道ADC采集

[复制链接]

该用户从未签到

2

主题

4

回帖

32

积分

新手上路

积分
32
发表于 2024-4-18 10:01:51 | 显示全部楼层 |阅读模式

采用STC8H8K64U做ADC采集,通道四作为ADC口,P1.0 P1.1作为串口输出,用串口助手没有输出是为什么呢?
回复 送花

使用道具 举报

该用户从未签到

551

主题

9297

回帖

1万

积分

管理员

积分
14043
发表于 2024-4-18 10:06:59 | 显示全部楼层
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2932

回帖

6609

积分

超级版主

积分
6609
发表于 2024-4-18 10:10:49 | 显示全部楼层
要先调试好串口程序,初始化串口后先发送一串字符串(做好是10个以上中文字),串口助手能正确收到字符串,然后再添加ADC程序。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

2

主题

4

回帖

32

积分

新手上路

积分
32
 楼主| 发表于 2024-4-18 10:13:20 | 显示全部楼层
以下是代码(用的是例程,改变了通道数和串口)
#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(' ');
}
void  delay_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;
        }
}

点评

有没有一种可能,你串口切换到P1.6 P1.7,而不是P1.0 P1.1(我以为你是用的串口2)。  详情 回复 发表于 2024-4-18 16:03
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    慵懒
    3 天前
  • 签到天数: 134 天

    [LV.7]常住居民III

    20

    主题

    1039

    回帖

    2459

    积分

    金牌会员

    积分
    2459
    发表于 2024-4-18 10:32:15 | 显示全部楼层
    emmm一个问题啊,,P1.0 P1.1 好像是串口2 的引脚吧
    你这光在串口1上下功夫也没用啊
    截图202404181032134558.jpg
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    昨天 09:15
  • 签到天数: 58 天

    [LV.5]常住居民I

    3

    主题

    542

    回帖

    722

    积分

    高级会员

    积分
    722
    发表于 2024-4-18 12:14:34 | 显示全部楼层
    P1.0和P1.1作为UART串口,没办法在读取AD了吧,程序读取0-15口的AD显然不可能实现。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2932

    回帖

    6609

    积分

    超级版主

    积分
    6609
    发表于 2024-4-18 16:03:51 | 显示全部楼层
    lili11 发表于 2024-4-18 10:13
    以下是代码(用的是例程,改变了通道数和串口)
    #define MAIN_Fosc                11059200L       
    #define        UART_BaudRate1        11 ...

    有没有一种可能,你串口切换到P1.6 P1.7,而不是P1.0 P1.1(我以为你是用的串口2)。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 06:25 , Processed in 0.080007 second(s), 56 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表