问www.STCAIMCU.com【AI助手】:
STC32G12K128支持远程升级吗?
32G144K246 支持TF卡保存数据吗
问www.STCAIMCU.com【AI助手】:
内部 ADC 采样精度、温漂误差、通道串扰情况,做电压采集是否需要额外运放调理电路?
问www.STCAIMCU.com【AI助手】:
STC8H中PWMx_DTR寄存器用来设置死区时间,寄存器数值和实际死区时长怎么换算?
问www.STCAIMCU.com【AI助手】:
请问STC的单片机在线升级编程仿真调试平台软件中CAN调试助手,可以和STM32系列单片机的CAN接口通信吗?
问www.STCAIMCU.com【AI助手】:
STC12H1K16-36I-SOP20取代 STC12LE5616AD-35I-SOP20注意事项
<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 "reg51.h"
#include "intrins.h"
//----------------- 寄存器声明 -----------------
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 < ms; i++)
for(j = 0; j < 1200; j++); // 约1ms @ 11.0592MHz
}
//----------------- 端口初始化 -----------------
void Port_Init(void)
{
// P1.3 设置为高阻输入(做ADC输入)
// P1M1=1, P1M0=0→高阻输入
P1M1 |= 0x08; // 位3置1
P1M0 &= ~0x08; // 位3清零
// 其余P1口保留默认准双向
// P2.0 ~ P2.4 设置为推挽输出
// 推挽输出:PxM1=0, PxM0=1
P2M1 &= ~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 &= 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 &= ~0x0F; // 清通道选择位
ADC_CONTR |= channel; // 设置ADC通道
ADC_START; // 启动转换(先不管,下面正式启动)
ADC_CONTR |= ADC_START; // 启动ADC转换
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG));// 等待转换完成
ADC_CONTR &= ~ADC_FLAG; // 清除完成标志
// 左对齐格式(RESFMT=0):ADC_RES高8位,ADC_RESL低2位高6位为零
adc_val = ((unsigned int)ADC_RES << 2) | (ADC_RESL >> 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 < 205) led_index = 0;
else if(adc_val < 410) led_index = 1;
else if(adc_val < 615) led_index = 2;
else if(adc_val < 820) led_index = 3;
else led_index = 4;
// 先关闭所有LED(高电平熄灭)
P2 |= 0x1F; // P2.0~P2.4置1
// 点亮对应的那个LED(低电平点亮)
P2 &= ~(1 << 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&=~0x08</td>
<td><strong>高阻输入</strong>(ADC输入必须)</td>
</tr>
<tr>
<td><strong>P2.0~P2.4 模式</strong></td>
<td>P2M1&=~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<<2)| (ADC_RESL>>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>:手册明确要求"被选择为ADC输入通道的I/O口,必须设置PxM0/PxM1为高阻输入模式"</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>如果需要调整区间划分方式(如改为"超过阈值逐级点亮多个LED"),只需修改 <code>LED_Display()</code> 函数中的判断逻辑即可。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&mod=forum&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&f=_all&m=yes&syn=yes&s=relevance&fid=0">🔍 搜索 "STC8G2K32S2 P1.3脚做ADC输入 P2.0-P2.4推挽输出 驱动对应的LED<br />
实现的功能是:根据P1.3脚ADC值的大小"</a></p>
<p><strong>📌 相关论坛讨论</strong></p>
<ol>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&tid=23004&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&page=1&extra=#pid211804">STC8G2K32S2, ADC读取问题</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&tid=22832&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&page=1&extra=#pid210500">STC8G1K08 ADC读取问题</a></li>
<li><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&tid=20473&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&page=1&extra=#pid189542">STC8H2K12U如何将 7 / 8引脚,配置为P1.0 P1.1</a></li>
</ol>
问www.STCAIMCU.com【AI助手】:
如何USB下载?
问www.STCAIMCU.com【AI助手】:
STC32G144K246,uart4,代码从STC32G12K128移植过来,可以正常工作吗
问 www.STCAIMCU.com【AI助手】:
STC-USB Link1D6可以设置给板子的供电电压吗?若可以,怎么操作?