找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 638|回复: 12
打印 上一主题 下一主题
收起左侧

STC8G1K08单片机的AD结果转换是16位还是10位

[复制链接]
跳转到指定楼层
楼主
我测试,只有16位才是正确结果,也就是(寄存器的值/65535*VCC),但是官网写的是10位应该用1024???是我撞对了还是手册错了?


#include <STC8.H>

unsigned int ADCReadBt;
unsigned char ADCReadBtH,ADCReadBtL;
unsigned int VREF;
unsigned char VREFnow;
unsigned char flag = 0;
void Delay1000ms(void)        //@11.0592MHz
{
        unsigned char data i, j, k;

        
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}



void STC8UartInit(){
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //设置定时器模式
        TL1 = 0xE0;                        //设置定时初始值
        TH1 = 0xFE;                        //设置定时初始值
        ET1 = 0;                        //禁止定时器中断
        TR1 = 1;                        //定时器1开始计时
        
}


void STC8UartSend(unsigned int ADCRead){
        SBUF = ADCRead;
        while(TI==0);
        TI=0;
}

void ADCInit(){
        ADC_CONTR = 0xCF;
        ADCCFG = 0x0F;
        ADCTIM = 0x2A;//2a
        EA = 1;
        EADC = 1;
}


void ADCIRT()interrupt 5{
        ADC_CONTR = 0x8F;
        flag = 1;
        ADCReadBt = ADC_RES<<8 | ADC_RESL;
        
        
        
        ADCReadBtH = ADCReadBt/256;
        ADCReadBtL = ADCReadBt%256;
}

void main(){
        P1M0 = 0x00;
        P1M1 = 0x04;
        
        ADCReadBt = 0;
        ADCReadBtH = 0;
        ADCReadBtL = 0;
        ADCInit();
        STC8UartInit();
        while(1){
                if(flag){
                        flag = 0;
                        STC8UartSend(ADC_RES);
                        STC8UartSend(ADC_RESL);
        //                STC8UartSend('\r');
        //                STC8UartSend('\n');
                        ADC_CONTR = 0xCF;
                }
        
        Delay1000ms();
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1125912 发表于 2024-6-18 20:28 | 只看该作者

回复

使用道具 举报

板凳
ID:344848 发表于 2024-6-18 22:27 | 只看该作者

请相信官网所说的AD结果是10位,不是12位,更不是16位;目前单片机欧洲的ST公司AD转换是12位,Ti公司AD转换是16位。他们的价格都比国产单片机的价格贵。
回复

使用道具 举报

地板
ID:1034262 发表于 2024-6-18 23:55 | 只看该作者
STC8G1K08是10位的ADC
回复

使用道具 举报

5#
ID:1034262 发表于 2024-6-18 23:55 | 只看该作者
donglw 发表于 2024-6-18 22:27
请相信官网所说的AD结果是10位,不是12位,更不是16位;目前单片机欧洲的ST公司AD转换是12位,Ti公司AD转 ...

STC8H系列、STC32G系列的12位ADC非常精准的。
回复

使用道具 举报

6#
ID:344848 发表于 2024-6-19 02:28 | 只看该作者
coody_sz 发表于 2024-6-18 23:55
STC8H系列、STC32G系列的12位ADC非常精准的。

如你所言,本人认为可能某些环境精度达不到呀,从南京到北京买的没有卖的精,若比较完善达到12位为何说成10位,匪夷所思,
回复

使用道具 举报

7#
ID:1125957 发表于 2024-6-19 08:51 | 只看该作者
官网发布的一般都是正确的,你这个16位应该是撞对了 10位是对的
回复

使用道具 举报

8#
ID:401564 发表于 2024-6-19 11:53 | 只看该作者
那是你没有认真看数据手册,STC的8G系列目前都是10位,你要是用16位计算对了,那就是你代码错了
回复

使用道具 举报

9#
ID:857072 发表于 2024-6-19 12:03 来自手机 | 只看该作者
有效值是十位,但是寄存器是高八位和低八位 两个八位的寄存器合起来你读寄存器的时候它是16位的值
回复

使用道具 举报

10#
ID:123289 发表于 2024-6-20 20:20 | 只看该作者
为何不求助于手册呢?
回复

使用道具 举报

11#
ID:675287 发表于 2024-6-21 08:31 | 只看该作者
10位的,但是数据可以舍弃后两位变成8位,如果不需要那么高的精度的话,也可以16位,高六位为0
回复

使用道具 举报

12#
ID:624769 发表于 2024-6-22 20:21 | 只看该作者
你没发现你以为的16位 最低的 6 位 始终始终是 0 么?
要按你这样就算 16位 的话,你再 左移个16位,就成32位ADC了, STC能吹上天了。
回复

使用道具 举报

13#
ID:69038 发表于 2024-6-23 21:54 | 只看该作者
STC的ADC是10位或12位。比如8H1K08、8H1K28系列为10位,而8H1K08T、8H3K、8H4K、8H8K系列为12位。
但你是要用16位(ADC_RES、ADC_RESL从高到低bit15:bit0)去读取。
你要是设成左对齐(ADCCFG^RESFMT=0),低6位(ADC_RESL的bit5:bit0)或低4位(ADC_RESL的bit3:bit0)全是0,
你要是设成右对齐(ADCCFG^RESFMT=1),则高6位(ADC_RES的bit15:bit10)或高4位(ADC_RES的bit15:bit12)全是0,
如果要求不高,也可以设为左对齐,只读取高8位即ADC_RES
强烈建议你认真读一下手册中的ADC相关章节。。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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