标题: STC8G1K08单片机adc采集问题 [打印本页]

作者: 暖西夏    时间: 2021-6-1 10:23
标题: STC8G1K08单片机adc采集问题
在AD采集中,ADC_FLAG硬件不能自动置一,但是单片机其他功能都可以用,比如定时器,PWM,都可以用,会是单片机的问题嘛

作者: dzbj    时间: 2021-6-1 11:02
可能不是片子问题 再仔细读一下手册 8G系的ADC和之前的有点不一样 ADC_FLAG的地址是不同的 你看下是不是没写对
作者: 暖西夏    时间: 2021-6-1 11:26
dzbj 发表于 2021-6-1 11:02
可能不是片子问题 再仔细读一下手册 8G系的ADC和之前的有点不一样 ADC_FLAG的地址是不同的 你看下是不是没 ...

这个是我定义的
#define ADC_POWER        (1<<7)        //ADC 电源
#define ADC_START        (1<<6)        //ADC 转换启动控制位。自动清0
#define ADC_FLAG        (1<<5)        //ADC 转换结束标志位。软件清0
#define ADC_EPWMT        (1<<4)        //使能 PWM 同步触发 ADC 功能







作者: 暖西夏    时间: 2021-6-1 11:29
暖西夏 发表于 2021-6-1 11:26
这个是我定义的
#define ADC_POWER        (1

手册上面也是这个样子
作者: wufa1986    时间: 2021-6-1 11:49
应该是没有启动转换
作者: 18701931930    时间: 2021-6-1 13:25
没有遇到你说的情况,参考下我的:

//P3.5电压采集
void ADC_Init()
{
        P3M1|=        1<<5;         //10高阻输入
        P3M0&=~(1<<5);

        ADCTIM=0x3F;    //采样时间
        ADCCFG=0x2F;    //数据右对齐,ADC时钟SYSclk/2/(16+1)  1.0368MHZ
        IE&=~(1<<5);          //禁止ADC中断
        ADC_CONTR&=~(1<<5); //清除转换结束标志位
        ADC_CONTR=0x80; //打开ADC电源
}

u16 ADC_START(u8 ADC_CHx)
{
        if(ADC_CHx>15)
                return 0;
       
        ADC_CONTR&=0xF0;
        ADC_CONTR|=ADC_CHx;
       
        ADC_CONTR|=1<<6; //开始转换
        _nop_();
  _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_(); //ADC启动后,必须要延时 33.1776MHZ 10个nop大约是337.7ns

        while((ADC_CONTR&0x20)==0);
        ADC_CONTR&=~(1<<5); //清除转换结束标志位

        return ((u16)ADC_RES<<8)|ADC_RESL;
}



作者: suqianfu    时间: 2021-6-1 16:41
硬件连线有没有错?有VREF+脚的不能悬空额。还有ADC通道有没有设置错误?数据手册哪里不是有官方例程了吗?还有8G1K08 是20PIN的还是8PIN的?好像8PIN的没有ADC功能吧
作者: cn_zhx    时间: 2021-6-1 18:04
应该有例程
作者: wulin    时间: 2021-6-1 20:26
暖西夏 发表于 2021-6-1 11:26
这个是我定义的
#define ADC_POWER        (1

这是STC8头文件里的相关部分,你重复定义并且是错的。
//ADC 特殊功能寄存器
sfr ADC_CONTR   =   0xbc;
#define ADC_POWER   0x80
#define ADC_START   0x40
#define ADC_FLAG    0x20
sfr ADC_RES     =   0xbd;
sfr ADC_RESL    =   0xbe;
sfr ADCCFG      =   0xde;
#define ADC_RESFMT  0x20
作者: wjw7680    时间: 2021-9-4 16:36
我也遇到了一模一样的问题,读取不到ADC_FLAG标志位,程序一直死在了while(!(ADC_CONTR & 0x20))中。查了好几天都没结果。程序基本上是用的芯片规格书中的范例。我的芯片是STC8G1K08A
作者: wwh2382    时间: 2021-9-4 21:53
STC8G1K08没有adc,有adc的是STC8G1K08a,型号后面带a
作者: 188610329    时间: 2021-9-4 22:01
STC8G1K08 是没有ADC的,请先确认你的单片机,有ADC功能,再测试ADC功能。
作者: Y_G_G    时间: 2021-9-5 00:06
188610329 发表于 2021-9-4 22:01
STC8G1K08 是没有ADC的,请先确认你的单片机,有ADC功能,再测试ADC功能。

STC8G1K08-8Pin没有ADC
STC8G1K08-20/16Pin的可都是有ADC的
作者: 188610329    时间: 2021-9-5 17:02
Y_G_G 发表于 2021-9-5 00:06
STC8G1K08-8Pin没有ADC
STC8G1K08-20/16Pin的可都是有ADC的

恩,重新查了一遍手册,确实如你所说,16/20 pin 的 都有ADC,只有 8 Pin的没有ADC。
所以,楼主只要应该 先确认一下 他是多少 PIN 的IC ,再测试ADC.
反正,我 STC8G1K08A-8PIN 上  ADC_FLAG 没有他说的不置位的问题,但是STC8G1K08-8PIN 上 ADC_FLAG 是不会置位的。
作者: wjw7680    时间: 2021-9-6 09:49
我用的就是后缀带A的,芯片型号STC8G1K08A。查找芯片手册上说明带有6路ADC。





但就是这样也读取不到ADC_FLAG标志位,程序一直死在了while(!(ADC_CONTR & 0x20))中。查了好几天都没结果。程序基本上是用的芯片规格书中的范例。

作者: jhczy    时间: 2021-9-6 10:37
wjw7680 发表于 2021-9-6 09:49
我用的就是后缀带A的,芯片型号STC8G1K08A。查找芯片手册上说明带有6路ADC。

将您的程序贴上来,估计是您的程序问题
作者: wjw7680    时间: 2021-9-6 10:43
以下是ADC采集程序:




#include        "config.h"
#include        "timer.h"
#include        "GPIO.h"
#include        "adc.h"


#define        POW_19V_ON   P54 //定义电源控制脚
#define Farad_ON  P55            //定义法拉电容供电控制脚
#define PC_OFF    P31           //定义PC断电后的关断信号输出




/*************        GPIO端口功能说明        **************


本例程基于STC8G1K08A-8PIN 为主控芯片的编写测试
1)P3.3的ADC3端采样超级电容充放电电压状态
2)P3.2的ADC2端口采样外部24V失电后下降速率。
3)P5.4使能DC_DC开关电源对PC供电。条件是P3.2失电低于22.8V使能DC_DC开始供电PC。
4)P5.5使能超级电容向外部供电。条件是P3.2采样外部24V电压下降到22.8V。


******************************************/






/************************ IO口输出推挽配置 ****************************/
void        GPIO_config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义
       
        GPIO_InitStructure.Pin  = GPIO_Pin_0|GPIO_Pin_1;                                //指定要初始化的IO, GPIO_Pin_0  GPIO_Pin_1
        GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO推挽的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
       
        GPIO_InitStructure.Pin  = GPIO_Pin_4|GPIO_Pin_5;                                //指定要初始化的IO, GPIO_Pin_4  GPIO_Pin_5
        GPIO_InitStructure.Mode = GPIO_OUT_PP;                        //指定IO推挽的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
        GPIO_Inilize(GPIO_P5,&GPIO_InitStructure);        //初始化
}




/********************* 配置P3.2与P3.3的ADC端口浮空输入 **************************/


void        GPIO_config_HighZ(void)
{
       
        GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义
       
        GPIO_InitStructure.Pin  = GPIO_Pin_2|GPIO_Pin_3;                                //指定要初始化的IO, GPIO_Pin_2, GPIO_Pin_3
        GPIO_InitStructure.Mode = GPIO_HighZ;                        //指定IO浮空输入方式
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
       
}




/******************* AD配置函数 *******************/
void        ADC_config(void)
{
        ADC_InitTypeDef                ADC_InitStructure;                //结构定义
        ADC_InitStructure.ADC_SMPduty   = 31;                //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
        ADC_InitStructure.ADC_CsSetup   = 0;                //ADC 通道选择时间控制 0(默认),1
        ADC_InitStructure.ADC_CsHold    = 1;                //ADC 通道选择保持时间控制 0,1(默认),2,3
        ADC_InitStructure.ADC_Speed     = ADC_SPEED_2X16T;                //设置 ADC 工作时钟频率        ADC_SPEED_2X1T~ADC_SPEED_2X16T
        ADC_InitStructure.ADC_Power     = ENABLE;                                //ADC功率允许/关闭        ENABLE,DISABLE
        ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;        //ADC结果调整,右对齐        ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
        ADC_InitStructure.ADC_Polity    = Polity_0;                        //指定中断优先级(低到高)  Polity_0,Polity_1,Polity_2,Polity_3
        ADC_InitStructure.ADC_Interrupt = DISABLE;                        //中断允许        ENABLE,DISABLE
        ADC_Inilize(&ADC_InitStructure);                                        //初始化


       
//          ADCCFG = 0x26;    // 转换数据右对齐,设置AD工作时钟频率 SYSclk/2/6
//          P_SW2 |= 0x80;   //打开操作特殊功能寄存器
//          ADCTIM = 0x3f;
//          P_SW2 |= 0x7f;   //关闭操作特殊功能寄存器
}




/******************** 主函数**************************/
void main(void)
{
        u16 DC_Data = 0;                   //AD转换数据缓冲
        u16 DC_Data24V = 0;
               


        GPIO_config();
        Timer_config();
        GPIO_config_HighZ();
        ADC_config();
       
       
       
        EA = 1;          //开放所有中断
        TR1 = 1;         //允许定时器1运行
        PC_OFF = 0;      //不激活触发PC关闭信号
        POW_19V_ON = 1;  //打开19V的DC_DC电源
        Farad_ON = 0;
       


        while(1)
        {
               
                        ADC_CONTR = 0x82;  //打开AD转换电源,选择AD的第二通道
                ADC_CONTR |= 0x40;  //启动AD转换
               
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
       
                while(!(ADC_CONTR & 0x20));  //查询转换结束标志
                ADC_CONTR &= (~0x20);          //清除转换标志
               
                DC_Data = ((u16)ADC_RES << 8) | ADC_RESL;        //ADC_RES强制转换成16位,与低八位转换数据逻辑或后生成最终转换数据
               
                DC_Data24V = DC_Data*6;    //24v分压取样比例为6,,真实值为DC_Data的6倍
                      if(DC_Data24V < 24)
                         PC_OFF = 1;              //点亮一个LED
                      else
                         PC_OFF = 0;       
        }
       
}





作者: wjw7680    时间: 2021-9-6 10:47
以下的电路图:



作者: wjw7680    时间: 2021-9-6 13:43
编写了一段中断程序并开放ADC中断,在中断内清除ADC_FLAG,点亮LED。就这样也行不通,真心怀疑这个带“A”后缀的MCU与不带“A”后缀的是一伙的
void  ADC_VECTOR_int (void) interrupt  ADC_VECTOR
{
                 P31 = 1;                       //点亮LED
                ADC_CONTR &= (~0x20);          //清除转换标志
         
}


作者: jhczy    时间: 2021-9-6 14:02
wjw7680 发表于 2021-9-6 13:43
编写了一段中断程序并开放ADC中断,在中断内清除ADC_FLAG,点亮LED。就这样也行不通,真心怀疑这个带“A” ...

带“A”的与不带“A”的不一样,前者有ADC功能
作者: jhczy    时间: 2021-9-6 14:27
wjw7680 发表于 2021-9-6 10:43
以下是ADC采集程序:

P3.3和P3.2端口要设置成“高阻”,转换通道也没有开
给个参考一下,结果取多少位自己去弄
void P33_ADC()                                                    //P3.3检测
{
        P3M1=0x08;                           //P3.3高阻输入模式,P3.0-3.2为推挽
        P3M0=0x00;
        P_SW2|=0x80;
        ADCTIM=0x3f;
        P_SW2&=0x7f;
        ADCCFG=0x0f;                   //设置ADC时钟为系统频率的/2/16
        ADC_CONTR=0x80;                //使能ADC模块
        _nop_();
        _nop_();
        ADC_RES=0;                           //清除结果
        ADC_CONTR|=0x03;               // 设定转换的通道,P3.3是0011
        ADC_CONTR|=0x40;                     // 开始AD转换,即ADC_START=1
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));    //  等待转换完成 ,即ADC_FLAG=1
        ADC_CONTR&=~0x20;              //  清零 即D3位start清零,D4位转换结束标志位ADC_flag清零
        V_C=ADC_RES;                         //  取高八位
        P3M1=0x00;
        P3M0=0x00;
}

void P32_ADC()                                                    //P3.2检测
{
        P3M1=0x04;                           //P3.2高阻输入模式,P3.0-3.2为推挽
        P3M0=0x00;
        P_SW2|=0x80;
        ADCTIM=0x3f;
        P_SW2&=0x7f;
        ADCCFG=0x0f;                   //设置ADC时钟为系统频率的/2/16
        ADC_CONTR=0x80;                //使能ADC模块
        _nop_();
        _nop_();
        ADC_RES=0;                           //清除结果
        ADC_CONTR|=0x02;               // 设定转换的通道,P3.2是0010
        ADC_CONTR|=0x40;                     // 开始AD转换,即ADC_START=1
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));    //  等待转换完成 ,即ADC_FLAG=1
        ADC_CONTR&=~0x20;              //  清零 即D3位start清零,D4位转换结束标志位ADC_flag清零
        V_A=ADC_RES;                         //  取高八位
        P3M1=0x00;
        P3M0=0x00;
}
作者: 188610329    时间: 2021-9-6 15:08
wjw7680 发表于 2021-9-6 10:43
以下是ADC采集程序:

ADC_CONTR = 0x82;  //打开AD转换电源,选择AD的第二通道
ADC_CONTR |= 0x40;  //启动AD转换

你尝试合并成  ADC_CONTR  = 0xC2;  试试看,
我用  STC8G1K08A  作了好几个东西,都没有这个问题。
不过我的代码是  C + 汇编 混合编写的,就不发上来了,
不过,你要是有兴趣的话,可以跟我说一下。
作者: wjw7680    时间: 2021-9-6 15:58
void        GPIO_config_HighZ(void)
{
        
        GPIO_InitTypeDef        GPIO_InitStructure;                                //结构定义
        
        GPIO_InitStructure.Pin  = GPIO_Pin_2|GPIO_Pin_3;                                //指定要初始化的IO, GPIO_Pin_2, GPIO_Pin_3
        GPIO_InitStructure.Mode = GPIO_HighZ;                        //指定IO浮空输入方式
        GPIO_Inilize(GPIO_P3,&GPIO_InitStructure);        //初始化
        
}
以上代码就是配置GPIO的AD输入模式的。
至于ADC_CONTR = 0x82;  ADC_CONTR |= 0x40; 合并写成ADC_CONTR = 0xc2,没什么区别,刚开始就是这么写的,烧写后还是原样。
作者: 188610329    时间: 2021-9-6 16:40
wjw7680 发表于 2021-9-6 15:58
void        GPIO_config_HighZ(void)
{
        

STC8G1K08A 自带仿真功能,建议你仿真一下看看,具体问题出在哪里。看你的电路图,3.0,3.1也没有占用,完全可以仿真查原因。
作者: wjw7680    时间: 2021-9-6 18:57
wjw7680 发表于 2021-9-6 15:58
void        GPIO_config_HighZ(void)
{
        

我把你的程序稍微改了下AD采样通道,成以下形式。如果采样成功则点亮一个LED,很遗憾没看到led亮起来,问题还是老问题,程序死在了 while(!(ADC_CONTR & 0x20));这条语句上。

void main(void)
{
        u16 DC_Data = 0;                   //AD转换数据缓冲       
        EA = 1;          //开放所有中断       
        P31 = 0;      //led熄灭

        while(1)
        {
       
        P3M1=0x0C;                      //P3.3高阻输入模式,P3.0-3.2为推挽
        P3M0=0x00;
        P_SW2|=0x80;
        ADCTIM=0x3f;
        P_SW2|=0x7f;
        ADCCFG=0x2f;                   //设置ADC时钟为系统频率的/2/16
        ADC_CONTR=0x80;                //使能ADC模块
        NOP(100);
      
        ADC_RES=0;                           //清除结果
        ADC_CONTR|=0x02;               // 设定转换的通道,P3.3是0011
        ADC_CONTR|=0x40;                     // 开始AD转换,即ADC_START=1
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x20));    //  等待转换完成 ,即ADC_FLAG=1
        ADC_CONTR&=~0x20;              //  清零 即D3位start清零,D4位转换结束标志位ADC_flag清零
        DC_Data=ADC_RES;                         //  取高八位
        P3M1=0x00;
        P3M0=0x00;
        P31 = 1;          //点亮一个LED
                         
     }
作者: wjw7680    时间: 2021-9-6 19:16
188610329 发表于 2021-9-6 16:40
STC8G1K08A 自带仿真功能,建议你仿真一下看看,具体问题出在哪里。看你的电路图,3.0,3.1也没有占用, ...

STC8G1K08A仿真不支持,STC官方的ISP下载器“仿真器使用说明”中表述:



作者: 188610329    时间: 2021-9-6 19:30
wjw7680 发表于 2021-9-6 19:16
STC8G1K08A仿真不支持,STC官方的ISP下载器“仿真器使用说明”中表述:



如上图, 可以的

作者: Y_G_G    时间: 2021-9-6 22:45
wjw7680 发表于 2021-9-6 18:57
我把你的程序稍微改了下AD采样通道,成以下形式。如果采样成功则点亮一个LED,很遗憾没看到led亮起来,问 ...

P_SW2|=0x7f;??这是干嘛使的?
不应该是P_SW2&=0x7f;的吗?
P3M1=0x00;
P3M0=0x00;??这又是干嘛?传统端口不一定能点亮LED的,运气好的会亮,运气不好就不亮,除非你有上拉电阻
作者: 188610329    时间: 2021-9-6 23:15
Y_G_G 发表于 2021-9-6 22:45
P_SW2|=0x7f;??这是干嘛使的?
不应该是P_SW2&=0x7f;的吗?
P3M1=0x00;

你可以看他前面的电路图, 他接了 NPN的三级管,2uA的 电流够了。
作者: wjw7680    时间: 2021-9-7 16:56
问题已经解决,感谢各位的相助。由于对AD转换后的数值计算错误,导致后面的判断出错。以为点不亮LED是程序死在了while判断转换标志内。下面是修改后的主函数:
void main(void)
{
        u16 DC_Data = 0;         //AD转换数据缓冲
        float  REF = (5.0/1024.0);   //10位AD的最小量化值
        float  DC_Data24V = 0;

        while(1)
        {       
                DC_Data = Get_ADCResult(2);
                               
                DC_Data24V = DC_Data*REF*6;  //AD转换数值*最小量化值再*分压比。   24v分压取样比例为6,,真实值为DC_Data的6倍
                if(DC_Data24V < 24)
                        PC_OFF = 1;              //点亮一个LED
                else
                        PC_OFF = 0;               
        }
       
}


问题虽然解决了,但是疑问还存在。

while(!(ADC_CONTR & 0x20));                        //查询转换结束标志
if((ADC_CONTR & 0x20) == 1)PC_OFF = 1;        //点亮一个LED
ADC_CONTR &= (~0x20);          //清除转换标志
以上三条语句中,中间一条if语句始终执行不到,也看不到LED被点亮证明AD转换ADC_FLAG标志已经被置1。个人猜测这标志极可能AD转换结束置1后,如果被查询就自动清零了。

另外,STC仿真问题。如果能仿真,这个问题早就解决了,纯粹盲人摸象。按照STC官方ISP烧写器中“仿真器使用说明”,只有个别MCU能仿真。后来不死心,在列表中找到自己的MCU型号添加,设置好USB端口号与波特率,在Keil根目录的INC文件夹中也看到了STC的头文件列表。Keil5的Debug选项中配置Use:Keil Monitor-51 Driver。点开仿真烧写入目标MCU,但最后还是死在这个对话框上。




作者: 188610329    时间: 2021-9-7 21:28
wjw7680 发表于 2021-9-7 16:56
问题已经解决,感谢各位的相助。由于对AD转换后的数值计算错误,导致后面的判断出错。以为点不亮LED是程序 ...



仿真里你选错了, 要选 STC,如上图。



作者: Y_G_G    时间: 2021-9-8 09:07
wjw7680 发表于 2021-9-7 16:56
问题已经解决,感谢各位的相助。由于对AD转换后的数值计算错误,导致后面的判断出错。以为点不亮LED是程序 ...

仿真?我现在都还不会用那个软件,倒是Multisim用得多,也就这玩意仿真是最接近实际结果的
就单片机而言,没有什么比开发板加万用表更好用的了,只可惜没有钱买示波器
作者: wjw7680    时间: 2021-9-8 09:29
188610329 发表于 2021-9-7 21:28
仿真里你选错了, 要选 STC,如上图。

选了STC Monitor-51 Driver这选项也不能仿真



作者: 188610329    时间: 2021-9-8 14:01
wjw7680 发表于 2021-9-8 09:29
选了STC Monitor-51 Driver这选项也不能仿真

仿真时,你的代码里不能用到 3.0 3.1, 不然仿真会失败, 因为整个仿真的通信,是通过3.0 3.1 建立的. 目标单片机也要烧好仿真系统,  在Keil 里面 芯片设置也要设置为 STC8G1K08A。 STC8G系列 我基本都仿真过,都是可以的,稳定性也很好, 比STC8F系列好很多, 你可以再试试。
作者: wjw7680    时间: 2021-9-10 13:31
使用一般外购的下载器(CH340或者PL2303)在KEIL中按下“CTRL+F5”后都会出现如下提示"Connection to target system lost! Please reset your target systemp and try again"。出现仿真失败,链接不上目标单元。
打STC官方技术支持后客服反馈,要使用STC官方的U8W(编程/仿真器)进行仿真并设置直通模式才可以。






后来向STC官方技术支持免费申请快递了一个U8W,这才算解决芯片仿真问题
keil_v5.14.2
U8W固件版本:7.3.12U



作者: wjw7680    时间: 2021-9-11 13:29
郑重道歉,由于建立STC工程的时失误没有添加启动文件“STARTUP.A51”文件,导致硬件仿真时候出现如下问题。

实际上使用CH340与PL2303的USB转串口工具都是可以进行硬件仿真的(亲测)。

作者: wjw7680    时间: 2021-9-11 13:31
STC工具使用说明书-20210701.pdf (7.39 MB, 下载次数: 132)
作者: 188610329    时间: 2021-9-13 01:09
Y_G_G 发表于 2021-9-8 09:07
仿真?我现在都还不会用那个软件,倒是Multisim用得多,也就这玩意仿真是最接近实际结果的
就单片机而言,没 ...

STC的 硬件仿真, 严格来讲已经不算"仿真"了, 他是直接在单片机里面Debug你的程序,可以单步执行,实时验证走到每一步的时候内存值,寄存器值,以及IO口的状态。对于不确定程序哪部分出问题时候,这种硬件仿真真的很直观。毕竟当你 MOV P1,@R1   的时候,直接能看到  R1 是 多少  @R1 是多少, P1 是多少,而且都是在单片机里面的真实值。 那么最后点亮了几个LED, 你都能 直接明白是地址取错了,还是值算错了,还是P1寄存器不对,还是说硬件电路不对,可以省心很多。
作者: hony2020    时间: 2021-10-27 15:41
用的USB_TTL仿真,总是出现这个错误,一个下午没有解决,显示出现错误,然后KEIL直接出错关闭
作者: xmsj    时间: 2021-12-30 20:18
wjw7680 发表于 2021-9-11 13:29
郑重道歉,由于建立STC工程的时失误没有添加启动文件“STARTUP.A51”文件,导致硬件仿真时候出现如下问题。 ...

我也遇到了和楼主一样的无法连接的问题,没去注意这个a51,回家试试。真是,白天仿真得好好的,晚上忽然就不行了,差点没气死
作者: xmsj    时间: 2021-12-30 20:41
wjw7680 发表于 2021-9-11 13:29
郑重道歉,由于建立STC工程的时失误没有添加启动文件“STARTUP.A51”文件,导致硬件仿真时候出现如下问题。 ...

还是不行啊,我这有这个starup.a51的文件啊。还是提示连接不到设备
作者: fitttj    时间: 2022-3-18 21:07
xmsj 发表于 2021-12-30 20:41
还是不行啊,我这有这个starup.a51的文件啊。还是提示连接不到设备

请问解决了吗,我的也是加了startup.a51文件也还是不行,本来是可以了的,结果发现是软件仿真,到后面切换成硬件仿真还是不行

作者: ax6808    时间: 2022-3-27 23:48
近期用到了二路ADC电压检测,很正常稳定,没有什么问题的,设置要正确.
精简代码如下:
ADCCFG = 0x2f;                    //设置ADC时钟为系统时钟/2/16 ,右对齐;
    P_SW2 |= 0x80;                          //访问扩展RAM区域寄存器(ADCTIM),需先将P_SW2的BIT7设置为1,才可正常读写; 手册后面P_SW2 &= 0x7f释放P_SW2非必要已删除没问题!
    ADCTIM = 0x30;                    //设置ADC时序控制2A~3F,采样时间:0A~1F,ok; 用复位默认值0X2A(0010,1010)可省2句(已验证可以但暂未采用),注意低5位SMPDUTY一定不能设置小于A(01010B);
                                              //2、P32ADC10:测VTP1(BAT1一半分压值);  3句合并ok!20220305;                             
    ADC_CONTR = 0xCA;                 //BAT1:复位值000x,0000;打开ADC电源(B7:1)、启动AD转换(B6:1)、选通道A(P32);
    delay_ms(1);                                  //ADC模块电源打开后需等待约1ms等ADC电源稳定后再让ADC工作?? 20220327增加;
    _nop_(),_nop_();                          //参考手册空操作2次; ADC模块电源打开后需等待约1ms等ADC电源稳定后再让ADC工作??
    while (!(ADC_CONTR & 0x20));      //查询ADC完成标志;  手册:检测工作约耗时1mS;
    ADC_CONTR &= ~0x20;               //清完成标志;
    ADC_CONTR &= 0x7F;                          //ADC转换完即断电更省电;            之前放PD改放这里测完即关省时即省电20220305;ok
    res = (ADC_RES << 8) | ADC_RESL;  //读取ADC结果(右对齐:高2位低8位,前面自动补0);
    BAT1 = (int)(3300L*res/1024L+17L);//计算监测电压mV;特别注意数据类型后面带L(因I易混淆)!及VDD3.3V参考电压稳定性;修正值:+29L;OK20220309;+17L;OK20220327;
作者: ax6808    时间: 2022-4-22 23:50
wulin 发表于 2021-6-1 20:26
这是STC8头文件里的相关部分,你重复定义并且是错的。
//ADC 特殊功能寄存器
sfr ADC_CONTR   =   0xbc ...

就是就是!重复定义!搞复杂了还不行的。
作者: cnos    时间: 2022-4-23 00:26
if((ADC_CONTR & 0x20) == 1)PC_OFF = 1;        //点亮一个LED
作者: cnos    时间: 2022-4-23 00:28
显然是被编译器优化掉了。一个8位的寄存器,跟常数0x20运算,结果还是8位,而且结果不可能等于1,坏就坏在这个等于1了,你写不等于0就好了。if((ADC_CONTR & 0x20) == 1)PC_OFF = 1;        //点亮一个LED
作者: onlylgb    时间: 2022-5-31 01:18
帖子很有用,正好遇到8G1K的ADC问题了,标记一下
作者: 名字不是重点    时间: 2022-5-31 09:25
Y_G_G 发表于 2021-9-8 09:07
仿真?我现在都还不会用那个软件,倒是Multisim用得多,也就这玩意仿真是最接近实际结果的
就单片机而言,没 ...

某原子的那款迷你型的可以考虑一下,日常的开发DIY是够用了。不贵,也一次烧烤5人份的费用。
作者: ZHSHF    时间: 2023-5-17 23:02
wwh2382 发表于 2021-9-4 21:53
STC8G1K08没有adc,有adc的是STC8G1K08a,型号后面带a

STC8G1K08  20脚的亲测有ADC,不过目前读取到的只有8位ADC数据
作者: ax6808    时间: 2023-5-24 18:43
18701931930 发表于 2021-6-1 13:25
没有遇到你说的情况,参考下我的:

//P3.5电压采集

nop_();
  _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_(); //ADC启动后,必须要延时 33.1776MHZ 10个nop大约是337.7ns

究竟几个nop()? 我一个都没有也基本正常,手册范例是2个,又说整个转换过程约1ms......我醉了,呵呵一起喝醉
作者: ax6808    时间: 2023-5-24 18:47
188610329 发表于 2021-9-6 15:08
ADC_CONTR = 0x82;  //打开AD转换电源,选择AD的第二通道
ADC_CONTR |= 0x40;  //启动AD转换

我一直STC8G1K08(20脚或带A8脚)也是打开电源,选择通道,启动转换三合一了:  ADC_CONTR  = 0xC2;  
作者: ax6808    时间: 2023-5-24 19:10
Y_G_G 发表于 2021-9-6 22:45
P_SW2|=0x7f;??这是干嘛使的?
不应该是P_SW2&=0x7f;的吗?
P3M1=0x00;

P_SW2 &=0x7f;??这是干嘛使的?  不应该是P_SW2&=0x7f;的吗?
禁止访问XSRF用的:一般无需禁止! BIT7=0禁止,所以确实应该用&=;
P_SW2 |= 0x80;   //XSRF!访问XSRF先BIT7=1; 统一放前无需归零(有外扩64K扩展RAM时才需要); 目标设置PDATA,新手册建议全用XDATA快!待研究?

   
P3M1=0x00;
P3M0=0x00;??这又是干嘛?传统端口不一定能点亮LED的,运气好的会亮,运气不好就不亮,除非你有上拉电阻
现在的超亮小LED串大电阻一般用于小东西指示一下也够了,不过一般都上拉用灌电流大.

作者: ejn521    时间: 2024-8-12 14:55
wjw7680 发表于 2021-9-10 13:31
使用一般外购的下载器(CH340或者PL2303)在KEIL中按下“CTRL+F5”后都会出现如下提示"Connection to targe ...

感谢感谢





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1