MagicBude 发表于 2025-2-6 23:09:58

<h1>十、虚拟键盘LED和数码管</h1>
<h2>1.虚拟显示——LED</h2>
<h3>1.1 硬件准备</h3>
<p><img src="data/attachment/forum/202502/06/230744hc2wbkgqgk6wf2wm.png" alt="image-20250206222841278" /></p>
<p><img src="data/attachment/forum/202502/06/230745dnnrp9jr8gelmzng.png" alt="image-20250206223016705" /></p>
<h3>1.2 软件准备(最新的ISP软件)</h3>
<p><img src="data/attachment/forum/202502/06/230743vknnldz66jr584mm.png" alt="image-20250206223403199" /></p>
<h3>1.3 参数设置</h3>
<p><img src="data/attachment/forum/202502/06/230744dc80edrtafccaa2n.png" alt="image-20250206223621175" /></p>
<p><img src="data/attachment/forum/202502/06/230743yrdmxzo7dkqyggtq.png" alt="image-20250206223518787" /></p>
<h3>1.4 选择指定的接口和协议匹配</h3>
<p><img src="data/attachment/forum/202502/06/230743yua1e11yuyne221v.png" alt="image-20250206223748098" /></p>
<p><img src="data/attachment/forum/202502/06/230747p7e7cgmkmjqnc050.png" alt="image-20250206223803097" /></p>
<h3><strong>DIP40封装LED接口</strong></h3>
<p><img src="data/attachment/forum/202502/06/230747a64d22taycyrq56x.png" alt="image-20250206224620088" /></p>
<p><img src="data/attachment/forum/202502/06/230747j065q0yjw0u0555b.png" alt="image-20250206224459256" /></p>
<p><img src="data/attachment/forum/202502/06/230747dzhgddncnczppnhr.png" alt="image-20250206224510483" /></p>
<p><img src="data/attachment/forum/202502/06/230825b6262cjzizjmc606.png" alt="image.png" title="image.png" /></p>
<h3>任务1:P2口流水灯,P10闪烁</h3>
<pre><code class="language-c">u8 P2_STATE = 0X01;

u8 P10_STATE = 0;

// 任务1:P2口流水灯,P10闪烁
void TASK_1( void )
{

// ----------------------- p2端口流水灯-----------------------
    LED40_SetPort(2,~P2_STATE);         //点亮P20端口

    P2_STATE = (P2_STATE&lt;&lt;1);         //1000 0000 -&gt; 1 0000 0000
    if( P2_STATE == 0 )
      P2_STATE = 1;

// ----------------------- p10端口闪烁-----------------------
    if( P10_STATE == 0 )
      LED40_SetBit(1,0);
    else
      LED40_ClrBit(1,0);

    P10_STATE = !P10_STATE;
}
</code></pre>
<h2>2.虚拟显示——数码管</h2>
<p><img src="data/attachment/forum/202502/06/230839e4lrcyn2ix7ch4h2.png" alt="image.png" title="image.png" /></p>
<h3><strong>7段数码管接口</strong></h3>
<p><img src="data/attachment/forum/202502/06/230857it1arj3wri9z191s.png" alt="image-20250206224735476" /></p>
<p><img src="data/attachment/forum/202502/06/230857nya55ovs9h0jvj77.png" alt="image-20250206224821711" /></p>
<p><img src="data/attachment/forum/202502/06/230857mexbw6xz2y6q6wi8.png" alt="image-20250206224832690" /></p>
<p><img src="data/attachment/forum/202502/06/230912q3jennxzn5bfnjoe.png" alt="image.png" title="image.png" /></p>
<h3>任务2:左边数码管显示P32按下次数             右边数码管显示P33按下次数</h3>
<pre><code class="language-c">u16 Key_Vol ;               //按键按下持续时间
u16 Key_Vol_2 ;             //按键按下持续时间
u16 KEY1_COUNT = 0;         //P32按钮计数
u16 KEY2_COUNT = 0;         //P33按钮计数

void KEY_Task(void)
{
// ------------P32按钮计数------------
    if( P32 == 0 )
    {
      Key_Vol++;
      if( Key_Vol==5 )
      {
            KEY1_COUNT++;
      }
    }
    else
    {
      Key_Vol = 0;
    }

// ------------P33按钮计数------------
    if( P33 == 0 )
    {
      Key_Vol_2++;
      if( Key_Vol_2==5 )
      {
            KEY2_COUNT++;
      }
    }
    else
    {
      Key_Vol_2 = 0;
    }   

}
u32 KEY_Count = 0;

// 任务2:左边数码管显示P32按下次数, 右边数码管显示P33按下次数
void TASK_2( void )
{
    KEY_Count = KEY1_COUNT *10000 + KEY2_COUNT;

    SEG7_ShowLong( KEY_Count ,10);

}
</code></pre>
<h2>3.虚拟键盘</h2>
<p><img src="data/attachment/forum/202502/06/230928lb1r6il6l68ddipr.png" alt="image.png" title="image.png" /></p>
<h3><strong>虚拟键盘接口</strong></h3>
<p><img src="data/attachment/forum/202502/06/230936jwt0c6v9wdg9gdd6.png" alt="image.png" title="image.png" /></p>
<h3>任务3:按下数字按键在数码管显示对应的按键数字!</h3>
<p><strong>task.c</strong></p>
<pre><code class="language-c">u32 REC_NUM = 0;

// 任务3:按下数字按键在数码管显示对应的按键数字!
void TASK_3( void )
{
    SEG7_ShowLong( REC_NUM ,10);
}
</code></pre>
<p><strong>main.c</strong></p>
<pre><code class="language-c">extern u32 REC_NUM;
while(1)
{

   if (bUsbOutReady)                           //如果接收到了数据
 {
       REC_NUM = UsbOutBuffer-48;
       //USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)

       usb_OUT_done();                  
 }
   Task_Pro_Handler_Callback();                //执行功能函数

}
</code></pre>

MagicBude 发表于 2025-2-11 22:44:49

<h1>十一、矩阵键盘</h1>
<h2>1. 矩阵按键的原理</h2>
<p><img src="data/attachment/forum/202502/11/224521ffb20byfxybzxvsw.png" alt="image.png" title="image.png" /></p>
<p><strong>在按键数量较多时,为了减少I/O口的占用,将按键排列成矩阵排列的形式的按键阵列我们称为矩阵按键。</strong></p>
<h2>2. 矩阵按键的程序实现</h2>
<p><strong>按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。</strong></p>
<p><strong>①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。</strong></p>
<p><strong>②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。</strong></p>
<p><strong>③第三步:行列组合一下就可以判断出是哪个按键按下了。</strong></p>
<p><strong>任务1:数码管显示当前的按键号</strong></p>
<pre><code class="language-c">//任务1:数码管显示当前的按键号
void Task_1(void)
{
    //①第一步:现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
    COL1 = 0;
    COL2 = 0;
    COL3 = 0;
    COL4 = 0;
    ROW1 = 1;
    ROW2 = 1;

    if(( ROW1 == 0 ) || ( ROW2 == 0 ))      //如果行按键有按下
    {
      if(( ROW1 ==0 ) &amp;&amp; ( ROW2 ==0 ))    //如果两行都有按键按下,不处理
      {
   
      }
      else if((( ROW1 ==1 )&amp;&amp;( ROW2 ==0 )) || (( ROW1 ==0 )&amp;&amp;( ROW2 ==1 )))   //如果有按键按下,而且只有一颗
      {
            if( ROW1 ==0 )            //判断哪一行,输出行开始的序号
                key_num = 0;
            else if( ROW2 ==0 )
                key_num = 4;
      
            //②第二步:现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
            COL1 = 1;
            COL2 = 1;
            COL3 = 1;
            COL4 = 1;
            ROW1 = 0;
            ROW2 = 0;
   
            if( COL1 ==0 )            //判断哪一列,叠加按键的序号
            {
//            key_num = key_num ;
            }
            else if( COL2 ==0 )
            {
                key_num = key_num + 1;
            }
            else if( COL3 ==0 )
            {
                key_num = key_num + 2;
            }
            else if( COL4 ==0 )
            {
                key_num = key_num + 3;
            }
      }
      COL1 = 0;
      COL2 = 0;
      COL3 = 0;
      COL4 = 0;
      ROW1 = 1;
      ROW2 = 1;   
    }
    else
    {
      key_num = 0xff;
    }

    //③第三步:行列组合一下就可以判断出是哪个按键按下了。

}
</code></pre>

MagicBude 发表于 2025-2-13 21:23:34

<h1>十二、复位系统</h1>
<p><strong>由于设备比较复杂,可能会出现某些不确定因素,当出现某种未知的错误的时候,我们可以通过复位操作来确保设备工作在已知的状态,使其能够正确运行。(当然前提是这个设备的软硬件没有损坏!)</strong></p>
<p><strong>确保系统处于确定状态:复位操作可以确保单片机在开始工作时处于已知的状态,使其能够正确初始化各个寄存器和外设。避免不确定行为:没有进行复位时,内部控制寄存器的内容可能是随机的,这可能导致定时器溢出、中断异常、外设误操作等不确定行为。初始化系统:复位操作可以进行系统的初始化,包括清除寄存器、设置默认值、配置时钟等,为系统正常运行做好准备。保证程序正常开始执行:复位确保程序从正确的地址开始执行,避免跳转到未知的地址或执行错误的指令。</strong></p>
<p><img src="data/attachment/forum/202502/13/212200djwhmh7gbgibw6hg.png" alt="image-20250213210007984" /></p>
<h2>1.硬件复位</h2>
<h3>1.上电复位(复位电压为1.7-1.9V):</h3>
<p><img src="data/attachment/forum/202502/13/212200y1npwu2nfwvt1opu.png" alt="image-20250213210302176" /></p>
<p><strong>①上电复位时间的影响因素1</strong></p>
<p><strong>PS:如对开机时间没有严格要求,建议勾选这个!</strong></p>
<p><strong>②上电复位时间的影响因素2</strong></p>
<p><strong>PS:如果需要快速开机,建议将P3.2、P3.3至少一个上拉一个5.1K电阻到VCC</strong></p>
<h3>2.低压复位:</h3>
<p><img src="data/attachment/forum/202502/13/212159pv0h65goz28opm1v.png" alt="image-20250213210444199" /><img src="data/attachment/forum/202502/13/212159fs676m22c4s4sszs.png" alt="image-20250213210707962" /></p>
<ul>
<li><strong>勾选后,当VCC电压低于设置的低压检测电压时,MCU会产生低压复位。</strong></li>
<li><strong>如果不勾选允许低压复位选项,当VCC电压低于设置的低压检测电压时,MCU会产生低压中断标志。如果使能了低压中断的话,就会产生低压中断。</strong></li>
</ul>
<h3>3.复位脚复位:</h3>
<p><img src="data/attachment/forum/202502/13/212200pax3ik3ahsukcejd.png" alt="image-20250213211239728" /></p>
<p><img src="data/attachment/forum/202502/13/212227tb0g4zwvrrvsrvbz.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202502/13/212159vukyuiowlllolquo.png" alt="image-20250213211333459" /></p>
<ul>
<li><strong>将下载软件的“复位脚用在I/O口”勾勾去掉,并外接上图的电阻和按键,即可实现硬件复位!</strong></li>
</ul>
<h3>4.看门狗复位:</h3>
<p><strong>在系统运行以后也就启动了看门狗的计数器,看门狗就开始自动计数,如果到了一定的时间还不去清理看门狗(也叫喂狗),那么看门狗计数器就会溢出从而引起看门狗中断,造成系统复位。所以,在使用有看门狗的芯片时要注意清理看门狗。</strong></p>
<p><img src="data/attachment/forum/202502/13/212204m57xefu4uxjtt1tt.png" alt="image-20250213211658194" /></p>
<p><strong>任务1:编写看门狗程序</strong></p>
<p><strong>参考手册9.7.1范例程序(程序有USB功能记得先加USB复位)</strong></p>
<pre><code>P3M0 = 0x00;
P3M1 = 0x00;

P3M0 &amp;= ~0x03;
P3M1 |= 0x03;

USBCON = 0X00;
USBCLK = 0X00;
IRC48MCR = 0X00;
Delay10ms();
</code></pre>
<h2>2.软件复位</h2>
<p><img src="data/attachment/forum/202502/13/212327tay68jm33ym3ptjo.png" alt="image.png" title="image.png" /></p>

MagicBude 发表于 2025-2-13 21:54:01

<h1>十三、外部中断</h1>
<h2>1.中断系统介绍</h2>
<p><img src="data/attachment/forum/202502/13/215216gnjhieejnz70b0ie.png" alt="image-20250213212513831" /></p>
<p><strong>当中央处理机 CPU 正在处理某件事的时候外界发生了紧急事件请求,CPU 暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统。</strong></p>
<ul>
<li><strong>●CPU 总是先响应优先级别最高的中断请求</strong></li>
<li><strong>●CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序</strong></li>
<li><strong>●每一个中断源可以用软件独立地控制为开中断或关中断</strong></li>
<li><strong>●部分中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断</strong><br />
<img src="data/attachment/forum/202502/13/215216ixuq69xa4taq9y2q.png" alt="image-20250213212831745" /></li>
</ul>
<p><img src="data/attachment/forum/202502/13/215320b3ohoqfhj6zzsss2.png" alt="image.png" title="image.png" /></p>
<ul>
<li><strong>●CPU 总是先响应优先级别最高的中断请求</strong></li>
<li><strong>●CPU 能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序</strong></li>
<li><strong>●每一个中断源可以用软件独立地控制为开中断或关中断</strong></li>
<li><strong>●部分中断的优先级别均可用软件设置,高优先级的中断请求可以打断低优先级的中断</strong></li>
</ul>
<h2>2.外部中断介绍</h2>
<p><strong>外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),而通过捕获这个变化,单片机内部自主运行的程序就会被暂时打断,转而去执行相应的中断处理程序,执行完后又回到原来中断的地方继续执行原来的程序。</strong></p>
<p><img src="data/attachment/forum/202502/13/215216mppz81p620fpopfv.png" alt="image-20250213214053654" /></p>
<p><strong>问:什么引脚能作为外部中断口?</strong></p>
<ul>
<li><strong>引脚带INTx标识的</strong></li>
</ul>
<p><strong>问:分别能支持什么类型的中断?</strong></p>
<p><img src="data/attachment/forum/202502/13/215214wrmyuo2o33wb1g43.png" alt="image-20250213214919895" /></p>
<p><img src="data/attachment/forum/202502/13/215215rjhh6cfx3h9j6ale.png" alt="image-20250213215121931" /></p>

MagicBude 发表于 2025-2-13 23:04:10

<h1>十四、IO中断</h1>
<h2>1.IO中断介绍</h2>
<p><img src="data/attachment/forum/202502/13/230309m1k5dc5ldek6du11.png" alt="image.png" title="image.png" /></p>
<p><strong>相比于外部中断,IO中断有以下优点:</strong></p>
<p><strong>1.支持所有的IO口(外部中断只有特定的外部中断的引脚)</strong></p>
<p><strong>2.可以任意配置上升沿/下降沿/高电平/低电平(外部中断只有上升/下降沿中断)</strong></p>
<p><strong>缺点:</strong></p>
<p><strong>IO中断同时只能支持一种中断模式,外部中断0和1可以同时支持上升/下降沿中断(可以用两个IO端口实现双边沿检测!</strong>)。</p>
<h2>2.IO中断用法</h2>
<h3>1.选择合适的中断模式</h3>
<p><img src="data/attachment/forum/202502/13/230323or4k4rjd8r2n9ipx.png" alt="image.png" title="image.png" /></p>
<h3>2.打开端口的中断功能</h3>
<p><img src="data/attachment/forum/202502/13/230338upuro8p1op14v1r5.png" alt="image.png" title="image.png" /></p>
<h3>3.配置IO口的中断</h3>
<p><img src="data/attachment/forum/202502/13/230347cbl7cvcknlkz8e83.png" alt="image.png" title="image.png" /></p>
<h3>4.中断号处理</h3>
<p><img src="data/attachment/forum/202502/13/230355tfw2sssfzs824284.png" alt="image.png" title="image.png" /></p>
<h2>3.中断优先级的设置</h2>
<p><img src="data/attachment/forum/202502/13/230405kwwwljr28r3wv3p3.png" alt="image.png" title="image.png" /></p>
<p><strong>相同优先级,靠前的中断源先执行,执行完 之后在执行低中断源,且一个中断源在执行的时候不能被打断。</strong></p>

MagicBude 发表于 2025-2-17 20:58:41

<h1>十五、定时器做计数器</h1>
<h2>1.计数器的作用</h2>
<p><img src="data/attachment/forum/202502/17/205833cth2suz8c1fevv8p.png" alt="image-20250217205201408" /></p>
<p><img src="data/attachment/forum/202502/17/205834hqz7j1mdmk2zm7hh.png" alt="image-20250217205242165" /></p>
<h2>2.定时器做为计数器的用法</h2>
<p><img src="data/attachment/forum/202502/17/205834zjnzwfexqeiz8zjj.png" alt="image-20250217205504118" /></p>
<p><img src="data/attachment/forum/202502/17/205834bzdrh5v866lfdkkz.png" alt="image-20250217205637706" /></p>
<p><img src="data/attachment/forum/202502/17/205833zmqqnhoq9ro2390o.png" alt="image-20250217205731517" /></p>
页: 1 [2]
查看完整版本: 8051U学习打卡+笔记