找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1002|回复: 12
收起左侧

最近使用STC8G1K08A-36I-SOP8单片机,测试ADC,就是不出数据

[复制链接]
ID:1121700 发表于 2024-5-21 15:06 | 显示全部楼层 |阅读模式
uint16_t AD_Value;

void ADC_Init(void)
{
        P3M0 = 0x00;                        
        P3M1 = 0x04;                        //P3^2 设置为高阻输入
        
        ADCCFG = 0x2F;                 
        ADC_CONTR = 0x8A;
        EADC = 1;
        EA = 1;
        ADC_CONTR |= 0x40; //启动 ADC 转换
}

void ADC_Isr() interrupt 5
{
        ADC_CONTR &= ~0x20;                        // 清中断标志
        
        AD_Value = (ADC_RES << 8) | ADC_RESL; // 读取 ADC 结果

        ADC_CONTR |= 0x40;                        // 继续 AD 转换
}



回复

使用道具 举报

ID:69038 发表于 2024-5-21 17:40 | 显示全部楼层
完整的代码发上来看看~~
STCISP中的例程就可以用的,除非你用错了io口或型号,STC8G1K08,不带A的是没有ADC功能虽然也是SOP8的
回复

使用道具 举报

ID:1121700 发表于 2024-5-22 21:44 | 显示全部楼层
zhuls 发表于 2024-5-21 17:40
完整的代码发上来看看~~
STCISP中的例程就可以用的,除非你用错了io口或型号,STC8G1K08,不带A的是没有AD ...

问题已解决,之前看的数据手册是里面给的ADC通道不对。通过查看新的数据手册,更改ADC_CONTR = 0x82,解决问题。
回复

使用道具 举报

ID:123289 发表于 2024-5-24 16:47 | 显示全部楼层
祝贺楼主,知道查手册解决问题!
回复

使用道具 举报

ID:874002 发表于 2024-5-27 14:53 | 显示全部楼层
问一下: AD_Value = (ADC_RES << 8) | ADC_RESL;这一句不用对ADC_RES 类型转换为16位吗
回复

使用道具 举报

ID:161164 发表于 2024-5-27 15:08 | 显示全部楼层
lsylsyyyy 发表于 2024-5-27 14:53
问一下: AD_Value = (ADC_RES

keil预设用16位uint计算
回复

使用道具 举报

ID:69038 发表于 2024-5-27 15:12 | 显示全部楼层
lsylsyyyy 发表于 2024-5-27 14:53
问一下: AD_Value = (ADC_RES

不是的。
STC的AD是10bit或12bit,分别存为高2bit、低8bit(10bit右对齐),或高8bit、低2bit(10bit左对齐)
又或高4bit、低8bit(12bit右对齐),或高8bit、低4bit(12bit左对齐)
这行“AD_Value = (ADC_RES << 8) | ADC_RESL”本质是把2个8bit合成一个16bit,并不能转换AD的位深。
回复

使用道具 举报

ID:1109793 发表于 2024-5-27 15:34 | 显示全部楼层
zhuls 发表于 2024-5-21 17:40
完整的代码发上来看看~~
STCISP中的例程就可以用的,除非你用错了io口或型号,STC8G1K08,不带A的是没有AD ...

我用不带A的SOP16的就有ADC
回复

使用道具 举报

ID:874002 发表于 2024-5-27 15:38 | 显示全部楼层
zhuls 发表于 2024-5-27 15:12
不是的。
STC的AD是10bit或12bit,分别存为高2bit、低8bit(10bit右对齐),或高8bit、低2bit(10bit左 ...

不转换的话,他这行其实读出来的数据是有问题的吧,前面左移八位溢出了,那这行相当于:AD_Value=0x00| ADC_RESL;?
回复

使用道具 举报

ID:874002 发表于 2024-5-27 15:39 | 显示全部楼层
lkc8210 发表于 2024-5-27 15:08
keil预设用16位uint计算

官方例程好像没有省略(u16);
回复

使用道具 举报

ID:69038 发表于 2024-5-28 06:55 | 显示全部楼层
xiaobendan001 发表于 2024-5-27 15:34
我用不带A的SOP16的就有ADC

我说的是sop8的!
回复

使用道具 举报

ID:69038 发表于 2024-5-28 06:59 | 显示全部楼层
lsylsyyyy 发表于 2024-5-27 15:38
不转换的话,他这行其实读出来的数据是有问题的吧,前面左移八位溢出了,那这行相当于:AD_Value=0x00| A ...

因为AD_Value是16位的。前面左移八位做为AD_Value的高8位,移位前移位后,ADC_RES和ADC_RESL的值不会变,变的只有AD_Value的值,明白不?
回复

使用道具 举报

ID:874002 发表于 2024-5-28 15:28 | 显示全部楼层
zhuls 发表于 2024-5-28 06:59
因为AD_Value是16位的。前面左移八位做为AD_Value的高8位,移位前移位后,ADC_RES和ADC_RESL的值不会变, ...

有道理谢谢大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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