udeigkon 发表于 2025-1-25 23:01:10

<h1>第六集-IO输入输出</h1>
<h2>GPIO-通用输入输出端口,就是引脚</h2>
<p>高电平-接近VCC电压-逻辑1<br />
低电平-GND电压-逻辑0<br />
对地电压-VDD-单片机极限值</p>
<p>IO口工作模式有四种:</p>
<table>
<thead>
<tr>
<th>PNM1</th>
<th>PNM0</th>
<th>IO工作模式</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>0</td>
<td>①准双向口(传统8051是弱上拉),灌电流就是从VCC取电,经过1K电阻驱动发光二极管。如果从IO口拉电流,就只有几百微安</td>
</tr>
<tr>
<td>0</td>
<td>1</td>
<td>②推挽输出,强上拉输出可到20MA</td>
</tr>
<tr>
<td>1</td>
<td>0</td>
<td>③高祖输入,相当于断路,电流不能流入也不能流出</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>④开漏模式,对外设置输出1,等同于高祖输入;打开内部上拉电阻或者外部加上拉电阻,等同于准双向口</td>
</tr>
</tbody>
</table>
<p><img src="data/attachment/forum/202501/25/213610iqmcq5piw4pwpdgv.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202501/25/213633e19wvanfckrv4erl.png" alt="image.png" title="image.png" /></p>
<h2>按键输入检测</h2>
<p>IO(默认高电平)--------R-------BOTTOM------GND<br />
按下按钮后,IO直接和GND连通,GND就是大地,所以按下之后IO变成了低电平</p>
<h2>课堂任务(可以很便捷的删除注释,不要再一个个删了哎哟喂</h2>
<pre><code>#include&lt;ai8051u.h&gt;
// 定义P32和P20端口
sbit P32 = P3^2;// 假设P32按钮连接在P3.2
sbit P20 = P2^0;// 假设P20灯连接在P2.0

// 定义状态变量
unsigned char state = 0;

// 延时函数,延时20ms
void Delay20ms() {
unsigned int i, j;
for(i = 0; i &lt; 200; i++) {
for(j = 0; j &lt; 123; j++);
}
}

void main() {
while(1) {
// 任务1:按下P32按钮灯亮,松开P32按钮灯灭
if(P32 == 0) {// 判断P32按钮是否按下
P20 = 0;    // 按下时灯亮
} else {
P20 = 1;    // 松开时灯灭
}
</code></pre>
<pre><code>// 任务2:按下P32按钮灯灭,松开P32按钮灯亮
    if(P32 == 1) {// 判断P32按钮是否按下
      P20 = 0;    // 按下时灯灭
    } else {
      P20 = 1;    // 松开时灯亮
    }
</code></pre>
<pre><code>// 任务3:按一下灯亮,按一下灯灭
    if(P32 == 0) {// 判断P32按钮是否按下
      Delay20ms();// 延时20ms消抖
      if(P32 == 0) {
            state = !state;// 变量取反 0 1 0 1 0 1
            P20 = state;
            printf(&quot;state:%d\r\n&quot;, (int)state);

            while(P32 == 0);// 等待P32松开
      }
    }
</code></pre>
<h3>消除抖动</h3>
<p><img src="data/attachment/forum/202501/25/232912pe5qbwx1hxojxx65.png" alt="image.png" title="image.png" /><br />
系统有判断阈值,抖动一般在20ms以内。<strong>因此这也是调参的一部分</strong><br />
<em><strong>但是贴心的isp也帮我们准备了便捷的延时生成器</strong></em></p>
<p><img src="data/attachment/forum/202501/25/233024khpjrjepej7117dn.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202501/25/233118vv3dtu13h76hfu10.png" alt="image.png" title="image.png" /></p>
<p><em><strong>特别强调的是,void要有延时,后面的注释也要加上delay延时,也要有分号</strong></em><br />
<strong>就是我们C语言课上面的主函数和其他的小函数,函数的调用那一章节</strong></p>
<pre><code>void Delay20ms(void)        //@24.000MHzDelay20ms();
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 119998UL;
        while (i) i--;
}
</code></pre>
<p><em><strong>WTST = 0;//设置程序指令延时参数,</strong></em></p>
<p><em><strong>EAXFR = 1; //扩展寄存器(XFR)访问使能</strong></em></p>
<p><em><strong>CKCON = 0; //提高访问XRAM速度</strong></em></p>
页: 1 [2]
查看完整版本: ai8051u学习贴-Eric_tseng