找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15551|回复: 52
收起左侧

STC8G1K08单片机adc采集问题

  [复制链接]
ID:807182 发表于 2021-6-1 10:23 | 显示全部楼层 |阅读模式
在AD采集中,ADC_FLAG硬件不能自动置一,但是单片机其他功能都可以用,比如定时器,PWM,都可以用,会是单片机的问题嘛
回复

使用道具 举报

ID:47286 发表于 2021-6-1 11:02 | 显示全部楼层
可能不是片子问题 再仔细读一下手册 8G系的ADC和之前的有点不一样 ADC_FLAG的地址是不同的 你看下是不是没写对
回复

使用道具 举报

ID:807182 发表于 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 功能






回复

使用道具 举报

ID:807182 发表于 2021-6-1 11:29 | 显示全部楼层
暖西夏 发表于 2021-6-1 11:26
这个是我定义的
#define ADC_POWER        (1

手册上面也是这个样子
回复

使用道具 举报

ID:879348 发表于 2021-6-1 11:49 | 显示全部楼层
应该是没有启动转换
回复

使用道具 举报

ID:554500 发表于 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;
}


回复

使用道具 举报

ID:718536 发表于 2021-6-1 16:41 | 显示全部楼层
硬件连线有没有错?有VREF+脚的不能悬空额。还有ADC通道有没有设置错误?数据手册哪里不是有官方例程了吗?还有8G1K08 是20PIN的还是8PIN的?好像8PIN的没有ADC功能吧
回复

使用道具 举报

ID:883031 发表于 2021-6-1 18:04 | 显示全部楼层
应该有例程
回复

使用道具 举报

ID:213173 发表于 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
回复

使用道具 举报

ID:298713 发表于 2021-9-4 16:36 | 显示全部楼层
我也遇到了一模一样的问题,读取不到ADC_FLAG标志位,程序一直死在了while(!(ADC_CONTR & 0x20))中。查了好几天都没结果。程序基本上是用的芯片规格书中的范例。我的芯片是STC8G1K08A
回复

使用道具 举报

ID:748788 发表于 2021-9-4 21:53 | 显示全部楼层
STC8G1K08没有adc,有adc的是STC8G1K08a,型号后面带a
回复

使用道具 举报

ID:624769 发表于 2021-9-4 22:01 | 显示全部楼层
STC8G1K08 是没有ADC的,请先确认你的单片机,有ADC功能,再测试ADC功能。
回复

使用道具 举报

ID:401564 发表于 2021-9-5 00:06 | 显示全部楼层
188610329 发表于 2021-9-4 22:01
STC8G1K08 是没有ADC的,请先确认你的单片机,有ADC功能,再测试ADC功能。

STC8G1K08-8Pin没有ADC
STC8G1K08-20/16Pin的可都是有ADC的
回复

使用道具 举报

ID:624769 发表于 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 是不会置位的。
回复

使用道具 举报

ID:298713 发表于 2021-9-6 09:49 | 显示全部楼层
我用的就是后缀带A的,芯片型号STC8G1K08A。查找芯片手册上说明带有6路ADC。

P`]QK.png



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

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:170318 发表于 2021-9-6 10:37 | 显示全部楼层
wjw7680 发表于 2021-9-6 09:49
我用的就是后缀带A的,芯片型号STC8G1K08A。查找芯片手册上说明带有6路ADC。

将您的程序贴上来,估计是您的程序问题
回复

使用道具 举报

ID:298713 发表于 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;       
        }
       
}




回复

使用道具 举报

ID:298713 发表于 2021-9-6 10:47 | 显示全部楼层
以下的电路图:

2{XUG`R77HXZAU7V04B9T.png
回复

使用道具 举报

ID:298713 发表于 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);          //清除转换标志
         
}

回复

使用道具 举报

ID:170318 发表于 2021-9-6 14:02 | 显示全部楼层
wjw7680 发表于 2021-9-6 13:43
编写了一段中断程序并开放ADC中断,在中断内清除ADC_FLAG,点亮LED。就这样也行不通,真心怀疑这个带“A” ...

带“A”的与不带“A”的不一样,前者有ADC功能
回复

使用道具 举报

ID:170318 发表于 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;
}
回复

使用道具 举报

ID:624769 发表于 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 + 汇编 混合编写的,就不发上来了,
不过,你要是有兴趣的话,可以跟我说一下。
回复

使用道具 举报

ID:298713 发表于 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,没什么区别,刚开始就是这么写的,烧写后还是原样。
回复

使用道具 举报

ID:624769 发表于 2021-9-6 16:40 | 显示全部楼层
wjw7680 发表于 2021-9-6 15:58
void        GPIO_config_HighZ(void)
{
        

STC8G1K08A 自带仿真功能,建议你仿真一下看看,具体问题出在哪里。看你的电路图,3.0,3.1也没有占用,完全可以仿真查原因。
回复

使用道具 举报

ID:298713 发表于 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
                         
     }
回复

使用道具 举报

ID:298713 发表于 2021-9-6 19:16 | 显示全部楼层
188610329 发表于 2021-9-6 16:40
STC8G1K08A 自带仿真功能,建议你仿真一下看看,具体问题出在哪里。看你的电路图,3.0,3.1也没有占用, ...

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

回复

使用道具 举报

ID:624769 发表于 2021-9-6 19:30 | 显示全部楼层
wjw7680 发表于 2021-9-6 19:16
STC8G1K08A仿真不支持,STC官方的ISP下载器“仿真器使用说明”中表述:

仿真.png

如上图, 可以的
回复

使用道具 举报

ID:401564 发表于 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的,运气好的会亮,运气不好就不亮,除非你有上拉电阻
回复

使用道具 举报

ID:624769 发表于 2021-9-6 23:15 | 显示全部楼层
Y_G_G 发表于 2021-9-6 22:45
P_SW2|=0x7f;??这是干嘛使的?
不应该是P_SW2&=0x7f;的吗?
P3M1=0x00;

你可以看他前面的电路图, 他接了 NPN的三级管,2uA的 电流够了。
回复

使用道具 举报

ID:298713 发表于 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,但最后还是死在这个对话框上。

B7LM_%[Z1.png

回复

使用道具 举报

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

仿真.png

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


回复

使用道具 举报

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

仿真?我现在都还不会用那个软件,倒是Multisim用得多,也就这玩意仿真是最接近实际结果的
就单片机而言,没有什么比开发板加万用表更好用的了,只可惜没有钱买示波器
回复

使用道具 举报

ID:298713 发表于 2021-9-8 09:29 | 显示全部楼层
188610329 发表于 2021-9-7 21:28
仿真里你选错了, 要选 STC,如上图。

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

回复

使用道具 举报

ID:624769 发表于 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系列好很多, 你可以再试试。
回复

使用道具 举报

ID:298713 发表于 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(编程/仿真器)进行仿真并设置直通模式才可以。



TO0]`KLLSRW}JA4L92UO`H0.png


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


回复

使用道具 举报

ID:298713 发表于 2021-9-11 13:29 | 显示全部楼层
郑重道歉,由于建立STC工程的时失误没有添加启动文件“STARTUP.A51”文件,导致硬件仿真时候出现如下问题。

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

使用道具 举报

ID:298713 发表于 2021-9-11 13:31 | 显示全部楼层
STC工具使用说明书-20210701.pdf (7.39 MB, 下载次数: 132)
回复

使用道具 举报

ID:624769 发表于 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寄存器不对,还是说硬件电路不对,可以省心很多。
回复

使用道具 举报

ID:695275 发表于 2021-10-27 15:41 | 显示全部楼层
用的USB_TTL仿真,总是出现这个错误,一个下午没有解决,显示出现错误,然后KEIL直接出错关闭
回复

使用道具 举报

ID:998702 发表于 2021-12-30 20:18 来自手机 | 显示全部楼层
wjw7680 发表于 2021-9-11 13:29
郑重道歉,由于建立STC工程的时失误没有添加启动文件“STARTUP.A51”文件,导致硬件仿真时候出现如下问题。 ...

我也遇到了和楼主一样的无法连接的问题,没去注意这个a51,回家试试。真是,白天仿真得好好的,晚上忽然就不行了,差点没气死
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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