jianjun 发表于 2023-12-26 15:33:12

请教STC8A8K64D4单片机ADC_DMA 串口1返回程序

#include "stc8a8k64d4.h"
#include "STOUT.H"

/*************        本地常量声明        **************/

#define MAIN_Fosc 24000000L        //定义主时钟

#define        ADC_SPEED        15                        /* 0~15, ADC转换时间(CPU时钟数) = (n+1)*32ADCCFG */
#define        RES_FMT                (1<<5)        /* ADC结果格式 0: 左对齐, ADC_RES: D11 D10 D9 D8 D7 D6 D5 D4, ADC_RESL: D3 D2 D1 D0 0 0 0 0 */
                        /* ADCCFG   1: 右对齐, ADC_RES: 0 0 0 0 D11 D10 D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */

#define        ADC_CH                16                        /* 1~16, ADC转换通道数, 需同步修改 BMM_ADC_CHSW 转换通道 */
#define        ADC_DATA        12                        /* 6~n, 每个通道ADC转换数据总数, 2*转换次数+4, 需同步修改 BMM_ADC_CFG2 转换次数 */
#define        BMM_ADDR        0x800                /* BMM数据存放地址 */

/*************        本地变量声明        **************/

bit        BmmFlag;

u8 xdata BmmBuffer _at_ BMM_ADDR;

/*************        本地函数声明        **************/
u16                Get_ADC12bitResult(u8 channel);
void        delay_ms(u8 ms);
void        ADC_convert(u8 chn);        //chn=0~7对应P1.0~P1.7, chn=8~14对应P0.0~P0.6, chn=15对应BandGap电压
void        BMM_Config(void);

/**********************************************/
void main(void)
{
        u8        i,n;

        P0M1 = 0x7f;   P0M0 = 0x00;   //设置要做ADC的IO做高阻输入
        P1M1 = 0xff;   P1M0 = 0x00;   //设置要做ADC的IO做高阻输入

       
        ADC_CONTR = 0x80 + 0;        //ADC on + channel
        ADCCFG = RES_FMT + ADC_SPEED;

        UartStdOutInit();
        BMM_Config();
        EA = 1;

//        while (1)
//        {
                delay_ms(200);
                if(BmmFlag)
                {
                        BmmFlag = 0;
                        for(i=0; i<ADC_CH; i++)
                        {
                                for(n=0; n<ADC_DATA; n++)
                                {
                                        printf("0x%02bx ",BmmBuffer);
                                }
                                printf("\r\n");
                        }
                        printf("\r\n");
                        BMM_ADC_CR = 0xc0;                //bit7 1:Enable ADC_BMM, bit6 1:Start ADC_BMM
                }
                while (1);
//        }
}


jianjun 发表于 2023-12-26 15:34:13

本帖最后由 jianjun 于 2023-12-26 15:37 编辑

这个范例程序有点看不明白:
打印的数据是这样的,是怎么排的?采集的是4次平均值吗?
printf("0x%02bx ",BmmBuffer);这句话是怎么输出数据的?

0x02 0xff 0x03 0xa9 0x03 0xa9 0x03 0xaf 0x00 0x00 0x03 0x80
                  0x03 0xa0 0x03 0x9f 0x03 0xa0 0x03 0x9f 0x01 0x02 0x03 0x9f
                  0x02 0x66 0x02 0x66 0x02 0x66 0x02 0x65 0x02 0x03 0x02 0x65
                  0x00 0xd7 0x00 0xd7 0x00 0xd7 0x00 0xd7 0x03 0x00 0x00 0xd7
                  0x02 0x69 0x02 0x68 0x02 0x68 0x02 0x69 0x04 0x02 0x02 0x68
                  0x00 0x0a 0x00 0x0f 0x00 0x14 0x00 0x1a 0x05 0x03 0x00 0x11
                  0x01 0x1c 0x01 0x1e 0x01 0x1d 0x01 0x1d 0x06 0x00 0x01 0x1d
                  0x01 0x31 0x01 0x31 0x01 0x31 0x01 0x31 0x07 0x00 0x01 0x31
                  0x01 0xa4 0x01 0x6b 0x01 0x9c 0x02 0x6e 0x08 0x01 0x01 0xc6
                  0x02 0x6d 0x02 0x68 0x02 0x18 0x02 0x8a 0x09 0x03 0x02 0x5d
                  0x00 0x0a 0x00 0x0e 0x00 0x12 0x00 0x18 0x0a 0x02 0x00 0x10
                  0x00 0x09 0x00 0x0c 0x00 0x11 0x00 0x17 0x0b 0x01 0x00 0x0f
                  0x01 0x36 0x01 0xeb 0x02 0x00 0x01 0x6c 0x0c 0x01 0x01 0xa3
                  0x01 0x9e 0x02 0x91 0x02 0xa4 0x02 0x22 0x0d 0x01 0x02 0x3d
                  0x01 0xb4 0x02 0x2b 0x02 0x23 0x01 0xbd 0x0e 0x03 0x01 0xef
                  0x03 0xc1 0x03 0xc2 0x03 0xc1 0x03 0xc4 0x0f 0x00 0x03 0xc2



乘风飞扬 发表于 2023-12-26 17:06:43

printf("0x%02bx ",BmmBuffer);
其中的"0x"是直接打印的内容;
%后面的"02"指这个数据长度为2,如果数据长度小于2的话用0填充。例如数据"3"会输出"03";
b表示数据为8位数据(c51编译器需要,c251编译器8位数据不需要写b),默认16位数据用h或不填,32位数据用l;
x表示输出类型为无符号十六进制整数。
后面的BmmBuffer就是按照以上格式输出的内容。

jianjun 发表于 2023-12-26 18:08:01

乘风飞扬 发表于 2023-12-26 17:06
printf("0x%02bx ",BmmBuffer);
其中的"0x"是直接打印的内容;
%后面的"02"指这个数据长度为2,如果数据 ...

受教{:4_196:}
页: [1]
查看完整版本: 请教STC8A8K64D4单片机ADC_DMA 串口1返回程序