<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<ai8051u.h>
// 定义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 < 200; i++) {
for(j = 0; j < 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("state:%d\r\n", (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]