找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc8单片机ADC 不起作用

[复制链接]
跳转到指定楼层
楼主
ID:837933 发表于 2020-11-2 19:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void main()
{
        P3M0 = 0x00;
        P3M1 = 0X04;                   //设置P3^2为高阻输入
        ADCCFG = 0x0F;                   //转换结果左对齐,时钟16分频给ADC
        ADC_CONTR = 0x8A;      //使能并启动ADC模块,选择P3^2口为ADC输入口
        ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40|0X0A ;    //启动 AD 转换
        _nop_();
        _nop_();
        _nop_()
        _nop_();
        _nop_();
        P11 = 0;
        while(!(ADC_CONTR & 0X20));
        ADC_CONTR &= ~0X20;
        while(1)
        {
                P11 = !P11;
                delay();
        }
}

上面程序有啥错,P3.2作ADC输入口,程序一直运行不到最后while(1)循环里面

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

使用道具 举报

沙发
ID:235200 发表于 2020-11-3 00:32 | 只看该作者
说明 while(!(ADC_CONTR & 0X20));这一循环无法结束
回复

使用道具 举报

板凳
ID:213173 发表于 2020-11-3 08:18 | 只看该作者
如果是用Keil调试, 这里while(!(ADC_CONTR & 0X20));会过不去,可人为操作转换完成标志1,烧程序时再改回来。
        while(!(ADC_CONTR & 0X20))
        {
                ADC_CONTR|=0X20;
        }
        ADC_CONTR &= ~0X20;
回复

使用道具 举报

地板
ID:401564 发表于 2020-11-3 08:18 | 只看该作者
如果你对于STC单片机操作已经差不多了,那以后编程就直接到下载器那复制代码就可以了,对于一些常用操作,比如:ADC,定时器,PWM,都是有的
回复

使用道具 举报

5#
ID:382454 发表于 2020-11-3 10:17 | 只看该作者
火龙电子有,人家写的非常好,自已摸,太费时间了。
回复

使用道具 举报

6#
ID:608872 发表于 2020-12-7 20:26 | 只看该作者
univers 发表于 2020-11-3 10:17
火龙电子有,人家写的非常好,自已摸,太费时间了。

红龙电子怎么找呢
回复

使用道具 举报

7#
ID:975054 发表于 2022-3-5 23:26 | 只看该作者
本帖最后由 ax6808 于 2022-3-5 23:48 编辑

刚好近日用到STC8G1K08(3.3V)的ADC:     测3.7V锂电池电压,代码今天已最优化,并有最为详细的说明(两通道中之一的代码),供参考:
//   ADC设置(查询方式):  
    ADCCFG = 0x2f;  //设置ADC时钟为系统时钟/2/16 ,右对齐;
  //P_SW2 |= 0x80;  //访问扩展RAM寄存器(ADCTIM)需先将P_SW2的BIT7置1才可正常读写; 后面P_SW2 &= 0x7f释放非必要!
  //ADCTIM = 0x30;  //用复位默认值0X2A(0010,1010)可去掉这2句;设置ADC时序控制2A~3F,采样时间0A~1F; 低5位不能小于默认值A;
                              //P32ADC10:测BAT1一半分压值);                              
    ADC_CONTR = 0xCA;          //3句合并ok!;复位000x,0000;开ADC电源(B7:1)、启动AD转换(B6:1)、选通道A(P32);
    _nop_(),_nop_();                 //参考手册这里空操作2次;
    while (!(ADC_CONTR & 0x20));          //查询ADC完成标志;  手册:检测工作约耗时1mS;
    ADC_CONTR &= ~0x20;                   //清完成标志;
    //ADC_CONTR &= 0x7F;                   //可选ADC转换完即断电更省电;        20220305;ok
    res = (ADC_RES << 8) | ADC_RESL;  //读取ADC结果(右对齐:高2位低8位,前面自动补0);
    BAT1 = (int)(3300L*res/1024L);        //计算监测电压mV;特别注意数据类型后面带L(因I易混淆)!及VDD3.3V参考电压稳定性;

回复

使用道具 举报

8#
ID:975054 发表于 2022-3-6 00:20 | 只看该作者
我又仔细看了一下你的代码:
经过试验验证,运行没任何问题(前提:头文件等都完备、I/O口设置正确);
你前面ADC没有错,转换完了也给了个标志!
但是:1.你最后死循环并没有用到ADC转换结果数据呀!
          2.除 P3.0 和 P3.1 外,其余所有 I/O 口上电后的状态均为高阻输入状态,用户在使用 I/O 口时必须先设置 I/O 口模式;你只设了P3口,P1口未重新设置就是高阻输入,所以不能输出驱动P11 LED!
         应加上:P1M0=0x00;P1M1=0x00;就对了

#include "STC8G_H.h"              //主要头文件;
#include "intrins.h"                 //_nop_() 等要;
#include "stdio.h"                    //pringf()等要;
回复

使用道具 举报

9#
ID:942056 发表于 2022-3-7 19:10 来自触屏版 | 只看该作者
p3口不能用于adc输入,p0和p1才是吧
回复

使用道具 举报

10#
ID:975054 发表于 2022-3-19 00:38 | 只看该作者
Dxiaofeng 发表于 2022-3-7 19:10
p3口不能用于adc输入,p0和p1才是吧

看手册吧, 20Pin的STC8G就有十5路ADC呢!!!8H少4路换为PWM稍有不同.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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