32位8051-AI 发表于 2026-7-1 11:20:19

问www.STCAIMCU.com【AI助手】:

STC32G12K128支持远程升级吗?



芯启元 发表于 2026-7-1 11:33:25

32G144K246 支持TF卡保存数据吗



芯逐光 发表于 2026-7-1 11:40:07

问www.STCAIMCU.com【AI助手】:

内部 ADC 采样精度、温漂误差、通道串扰情况,做电压采集是否需要额外运放调理电路?




芯远航 发表于 2026-7-1 11:42:24

问www.STCAIMCU.com【AI助手】:
STC8H中PWMx_DTR寄存器用来设置死区时间,寄存器数值和实际死区时长怎么换算?





芯光彩 发表于 2026-7-1 11:43:22

问www.STCAIMCU.com【AI助手】:

请问STC的单片机在线升级编程仿真调试平台软件中CAN调试助手,可以和STM32系列单片机的CAN接口通信吗?


芯LYS 发表于 2026-7-1 13:16:54

问www.STCAIMCU.com【AI助手】:




STC12H1K16-36I-SOP20取代 STC12LE5616AD-35I-SOP20注意事项









清风予我 发表于 2026-7-1 13:35:14

<p>好,我已经查阅了手册中ADC和I/O口的相关内容。下面为您写出完整的STC8G2K32S2例程。</p>
<hr />
<h2>STC8G2K32S2 — ADC采样P1.3,驱动P2.0~P2.4 LED 例程</h2>
<h3>功能说明</h3>
<ul>
<li><strong>P1.3</strong> 设置为高阻输入,作为ADC输入通道(ADC通道3)</li>
<li><strong>P2.0 ~ P2.4</strong> 设置为推挽输出,各接一个LED(低电平点亮)</li>
<li>将ADC 10位结果(0~1023)分为 <strong>5个区间</strong>,对应点亮不同的LED</li>
<li>采用 <strong>查询方式</strong> 完成ADC转换</li>
</ul>
<h3>参考数据手册来源</h3>
<ul>
<li>ADC控制/配置/结果寄存器:手册 <strong>第16章 ADC模数转换</strong>(<code>ADC_CONTR</code>、<code>ADCCFG</code>、<code>ADC_RES</code>/<code>ADC_RESL</code>)</li>
<li>I/O口模式寄存器 <strong>PxM0 / PxM1</strong>:手册 <strong>第9章 I/O口</strong></li>
<li>P1.3对应ADC3(<code>ADC_CHS=0011</code>),详见 ADC通道选择表</li>
</ul>
<h3>完整代码</h3>
<pre><code class="language-c">/*************************************************************
功能:STC8G2K32S2 — P1.3做ADC输入,P2.0~P2.4推挽输出驱动LED
      根据P1.3 ADC值大小,点亮对应的LED
硬件连接:
    - P1.3 ← 模拟电压输入(0~VCC)
    - P2.0-LED1, P2.1-LED2, P2.2-LED3, P2.3-LED4, P2.4-LED5
      (LED负极接IO口,正极通过限流电阻接VCC,低电平点亮)
工作频率:建议 11.0592MHz 或 24MHz(内部IRC)
编译环境:Keil C51
*************************************************************/

#include &quot;reg51.h&quot;
#include &quot;intrins.h&quot;

//----------------- 寄存器声明 -----------------
sfr P0M1= 0x93;
sfr P0M0= 0x94;
sfr P1M1= 0x91;
sfr P1M0= 0x92;
sfr P2M1= 0x95;
sfr P2M0= 0x96;

sfr ADC_CONTR = 0xbc;      // ADC控制寄存器
sfr ADC_RES   = 0xbd;      // ADC结果高8位(左对齐)/ 高2位(右对齐)
sfr ADC_RESL= 0xbe;      // ADC结果低2位(左对齐)/ 低8位(右对齐)
sfr ADCCFG    = 0xde;      // ADC配置寄存器
sfr P_SW2   = 0xba;      // 外设端口切换寄存器(用于访问XFR)

// ADC时序寄存器(位于扩展RAM区 0xFEA8)
#define ADCTIM(*(unsigned char volatile xdata *)0xfea8)

//----------------- 位定义 -----------------
#define ADC_POWER   0x80    // ADC电源使能
#define ADC_START   0x40    // ADC启动转换
#define ADC_FLAG    0x20    // ADC转换结束标志

//----------------- 延时函数 -----------------
void Delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for(i = 0; i &lt; ms; i++)
      for(j = 0; j &lt; 1200; j++);   // 约1ms @ 11.0592MHz
}

//----------------- 端口初始化 -----------------
void Port_Init(void)
{
    // P1.3 设置为高阻输入(做ADC输入)
    // P1M1=1, P1M0=0→高阻输入
    P1M1 |= 0x08;    // 位3置1
    P1M0 &amp;= ~0x08;   // 位3清零
    // 其余P1口保留默认准双向

    // P2.0 ~ P2.4 设置为推挽输出
    // 推挽输出:PxM1=0, PxM0=1
    P2M1 &amp;= ~0x1F;   // P2.0~P2.4 对应位清零
    P2M0 |= 0x1F;    // P2.0~P2.4 对应位置1

    // 其余未用I/O口保持默认准双向
}

//----------------- ADC初始化 -----------------
void ADC_Init(void)
{
    P_SW2 |= 0x80;                   // 使能访问XFR
    ADCTIM = 0x3F;                   // 设置ADC内部时序(默认安全值)
    P_SW2 &amp;= 0x7F;                   // 关闭XFR访问

    ADCCFG = 0x0F;                   // RESFMT=0(左对齐),SPEED=15 → FADC = SYSclk/2/16
    ADC_CONTR = ADC_POWER;         // 打开ADC电源

    Delay_ms(2);                     // 等待ADC电源稳定(至少1ms)
}

//----------------- 获取ADC转换结果(查询方式)-----------------
unsigned int Get_ADC(unsigned char channel)
{
    unsigned int adc_val;

    ADC_CONTR &amp;= ~0x0F;            // 清通道选择位
    ADC_CONTR |= channel;            // 设置ADC通道

    ADC_START;                     // 启动转换(先不管,下面正式启动)

    ADC_CONTR |= ADC_START;          // 启动ADC转换
    _nop_();
    _nop_();

    while(!(ADC_CONTR &amp; ADC_FLAG));// 等待转换完成
    ADC_CONTR &amp;= ~ADC_FLAG;          // 清除完成标志

    // 左对齐格式(RESFMT=0):ADC_RES高8位,ADC_RESL低2位高6位为零
    adc_val = ((unsigned int)ADC_RES &lt;&lt; 2) | (ADC_RESL &gt;&gt; 6);
    return adc_val;                  // 返回10位结果(0~1023)
}

//----------------- 根据ADC值点亮对应LED -----------------
// 将0~1023分为5个区间,每个区间约204.8
// 区间0:   0 ~ 204→ 点亮 P2.0
// 区间1: 205 ~ 409→ 点亮 P2.1
// 区间2: 410 ~ 614→ 点亮 P2.2
// 区间3: 615 ~ 819→ 点亮 P2.3
// 区间4: 820 ~ 1023 → 点亮 P2.4
void LED_Display(unsigned int adc_val)
{
    unsigned char led_index;
    unsigned char i;

    // 计算区间索引(0~4)
    if(adc_val &lt; 205)      led_index = 0;
    else if(adc_val &lt; 410)   led_index = 1;
    else if(adc_val &lt; 615)   led_index = 2;
    else if(adc_val &lt; 820)   led_index = 3;
    else                     led_index = 4;

    // 先关闭所有LED(高电平熄灭)
    P2 |= 0x1F;   // P2.0~P2.4置1

    // 点亮对应的那个LED(低电平点亮)
    P2 &amp;= ~(1 &lt;&lt; led_index);
}

//----------------- 主函数 -----------------
void main(void)
{
    unsigned int adc_value;

    // 关闭看门狗(如果使能了需在ISP下载时设置)
    Port_Init();                // I/O口初始化
    ADC_Init();               // ADC初始化

    while(1)
    {
      // 读取P1.3(ADC通道3)
      adc_value = Get_ADC(0x03);

      // 根据ADC值点亮对应LED
      LED_Display(adc_value);

      // 适当延时,避免显示闪烁太快(如需实时性可减小或去掉)
      Delay_ms(100);
    }
}
</code></pre>
<h3>关键要点说明</h3>
<table>
<thead>
<tr>
<th>项目</th>
<th>设置</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>P1.3 模式</strong></td>
<td>P1M1|=0x08, P1M0&amp;=~0x08</td>
<td><strong>高阻输入</strong>(ADC输入必须)</td>
</tr>
<tr>
<td><strong>P2.0~P2.4 模式</strong></td>
<td>P2M1&amp;=~0x1F, P2M0|=0x1F</td>
<td><strong>推挽输出</strong>(驱动LED)</td>
</tr>
<tr>
<td><strong>ADC通道</strong></td>
<td>ADC_CHS =<strong>0011</strong></td>
<td>选择P1.3/ADC3</td>
</tr>
<tr>
<td><strong>ADC对齐方式</strong></td>
<td>RESFMT=0(左对齐)</td>
<td>结果 = (ADC_RES&lt;&lt;2)| (ADC_RESL&gt;&gt;6)</td>
</tr>
<tr>
<td><strong>ADC时钟</strong></td>
<td>SPEED=15,FADC = SYSclk/2/16</td>
<td>推荐**≤ 1.5MHz**</td>
</tr>
<tr>
<td><strong>LED驱动</strong></td>
<td>低电平点亮,高电平熄灭</td>
<td>对应5个区间</td>
</tr>
</tbody>
</table>
<h3>区间映射表(ADC值 → LED)</h3>
<table>
<thead>
<tr>
<th>ADC值范围</th>
<th>点亮LED</th>
<th>P2引脚</th>
</tr>
</thead>
<tbody>
<tr>
<td>0 ~ 204</td>
<td>LED1</td>
<td>P2.0</td>
</tr>
<tr>
<td>205 ~ 409</td>
<td>LED2</td>
<td>P2.1</td>
</tr>
<tr>
<td>410 ~ 614</td>
<td>LED3</td>
<td>P2.2</td>
</tr>
<tr>
<td>615 ~ 819</td>
<td>LED4</td>
<td>P2.3</td>
</tr>
<tr>
<td>820 ~ 1023</td>
<td>LED5</td>
<td>P2.4</td>
</tr>
</tbody>
</table>
<h3>注意事项</h3>
<ol>
<li><strong>ADC电源稳定时间</strong>:打开 <code>ADC_POWER</code>后需等待 <strong>约1ms</strong> 再启动转换,代码中用了2ms</li>
<li><strong>P1.3必须设为高阻输入</strong>:手册明确要求&quot;被选择为ADC输入通道的I/O口,必须设置PxM0/PxM1为高阻输入模式&quot;</li>
<li><strong>LED限流电阻</strong>:P2.0<del>P2.4推挽输出时,每个LED建议串接 **330Ω</del>1kΩ** 限流电阻</li>
<li><strong>如需更高精度</strong>:可将 <code>ADCCFG</code>中的 <code>SPEED</code>调低,延长采样时间;也可开启ADC多次采样取平均值</li>
<li><strong>如需中断方式</strong>:可开启ADC中断(<code>ADC_CONTR</code>中的 <code>ADC_EPWMT</code>和对应的中断使能),但本例程使用查询方式更为简洁</li>
</ol>
<p>如果需要调整区间划分方式(如改为&quot;超过阈值逐级点亮多个LED&quot;),只需修改 <code>LED_Display()</code> 函数中的判断逻辑即可。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&amp;mod=forum&amp;q=STC8G2K32S2%20P1.3%E8%84%9A%E5%81%9AADC%E8%BE%93%E5%85%A5%20P2.0-P2.4%E6%8E%A8%E6%8C%BD%E8%BE%93%E5%87%BA%20%E9%A9%B1%E5%8A%A8%E5%AF%B9%E5%BA%94%E7%9A%84LED%0A%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8A%9F%E8%83%BD%E6%98%AF%EF%BC%9A%E6%A0%B9%E6%8D%AEP1.3%E8%84%9AADC%E5%80%BC%E7%9A%84%E5%A4%A7%E5%B0%8F&amp;f=_all&amp;m=yes&amp;syn=yes&amp;s=relevance&amp;fid=0">🔍 搜索 &quot;STC8G2K32S2 P1.3脚做ADC输入 P2.0-P2.4推挽输出 驱动对应的LED<br />
实现的功能是:根据P1.3脚ADC值的大小&quot;</a></p>
<p><strong>📌 相关论坛讨论</strong></p>
<ol>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=23004&amp;highlight=STC8G2K32S2%20P1.3%E8%84%9A%E5%81%9AADC%E8%BE%93%E5%85%A5%EF%BC%8CP2.0-P2.4%E6%8E%A8%E6%8C%BD%E8%BE%93%E5%87%BA%EF%BC%8C%E9%A9%B1%E5%8A%A8%E5%AF%B9%E5%BA%94%E7%9A%84LED%0A%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8A%9F%E8%83%BD%E6%98%AF%EF%BC%9A%E6%A0%B9%E6%8D%AEP1.3%E8%84%9AADC%E5%80%BC%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%8C%E7%82%B9%E4%BA%AE%E5%AF%B9%E5%BA%94%E7%9A%84LED%0A%E5%86%99%E5%87%BA%E4%BE%8B%E7%A8%8B&amp;page=1&amp;extra=#pid211804">STC8G2K32S2, ADC读取问题</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=22832&amp;highlight=STC8G2K32S2%20P1.3%E8%84%9A%E5%81%9AADC%E8%BE%93%E5%85%A5%EF%BC%8CP2.0-P2.4%E6%8E%A8%E6%8C%BD%E8%BE%93%E5%87%BA%EF%BC%8C%E9%A9%B1%E5%8A%A8%E5%AF%B9%E5%BA%94%E7%9A%84LED%0A%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8A%9F%E8%83%BD%E6%98%AF%EF%BC%9A%E6%A0%B9%E6%8D%AEP1.3%E8%84%9AADC%E5%80%BC%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%8C%E7%82%B9%E4%BA%AE%E5%AF%B9%E5%BA%94%E7%9A%84LED%0A%E5%86%99%E5%87%BA%E4%BE%8B%E7%A8%8B&amp;page=1&amp;extra=#pid210500">STC8G1K08 ADC读取问题</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=20473&amp;highlight=STC8G2K32S2%20P1.3%E8%84%9A%E5%81%9AADC%E8%BE%93%E5%85%A5%EF%BC%8CP2.0-P2.4%E6%8E%A8%E6%8C%BD%E8%BE%93%E5%87%BA%EF%BC%8C%E9%A9%B1%E5%8A%A8%E5%AF%B9%E5%BA%94%E7%9A%84LED%0A%E5%AE%9E%E7%8E%B0%E7%9A%84%E5%8A%9F%E8%83%BD%E6%98%AF%EF%BC%9A%E6%A0%B9%E6%8D%AEP1.3%E8%84%9AADC%E5%80%BC%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%8C%E7%82%B9%E4%BA%AE%E5%AF%B9%E5%BA%94%E7%9A%84LED%0A%E5%86%99%E5%87%BA%E4%BE%8B%E7%A8%8B&amp;page=1&amp;extra=#pid189542">STC8H2K12U如何将 7 / 8引脚,配置为P1.0 P1.1</a></li>
</ol>

大刀阔斧 发表于 2026-7-1 13:48:45

问www.STCAIMCU.com【AI助手】:
如何USB下载?




麦丽素 发表于 2026-7-1 13:54:55

问www.STCAIMCU.com【AI助手】:

STC32G144K246,uart4,代码从STC32G12K128移植过来,可以正常工作吗





芯启程 发表于 2026-7-1 14:00:40

问 www.STCAIMCU.com【AI助手】:
STC-USB Link1D6可以设置给板子的供电电压吗?若可以,怎么操作?
页: 48 49 50 51 52 53 54 55 56 57 [58] 59 60 61 62 63 64 65 66 67
查看完整版本: 【AI助手】@AiCube-ISP-V6.96Z中,【自动生成程序】+【查错高手】