mcu 发表于 2024-12-9 21:13:31

<p>第六集 I/O输入输出</p>
<ul>
<li><strong>高低电平和逻辑状态</strong>:</li>
<li>理解高电平(逻辑1)和低电平(逻辑0)的概念对于掌握数字电路的工作原理至关重要。这是所有后续学习的基础。</li>
<li></li>
<li><strong>GPIO端口配置</strong>:</li>
<li>熟悉如何配置GPIO端口为不同的模式(如推挽输出、开漏输出、高阻输入等),以及了解这些模式的应用场景,是进行外设控制的前提。</li>
<li><strong>按键检测实验</strong>:</li>
<li>通过编写代码实现按键检测,并观察LED灯的响应,这种实际动手操作能帮助巩固对I/O端口工作原理的理解。</li>
<li><strong>消抖处理</strong>:</li>
<li>学习到机械按键在按下和释放时会产生抖动现象,以及如何通过软件延时的方法来消除抖动,这对于提高系统的可靠性非常重要。</li>
<li></li>
<li><strong>代码学习:</strong></li>
<li></li>
<li>任务3增加延迟再次检测消除抖动。</li>
</ul>
<p>while(1)<br />
{</p>
<pre><code>    if (bUsbOutReady)                                                        //如果接收到了数据
    {
      //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
      
      usb_OUT_done();                                                        //
    }

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


}
</code></pre>

mcu 发表于 2024-12-10 18:15:54

<p>第七集 定时器中断</p>
<h3>定时器与中断的重要性</h3>
<ul>
<li>引入了定时器的概念,解释了它如何帮助解决上述问题,并介绍了定时器中断的功能。</li>
<li>强调定时器中断可以打断当前正在执行的任务,使系统能够在特定时间间隔执行其他任务或操作。</li>
</ul>
<h3>任务一:LED灯每三秒翻转一次,按键打印次数</h3>
<ul>
<li>使用ISP软件生成定时器相关的初始化和中断函数代码。</li>
<li>将生成的代码复制到主程序中,并确保正确配置定时器以实现每三秒触发一次中断。</li>
<li>在中断服务程序中实现了LED状态翻转,并通过全局变量统计按键次数,保证按键事件可以在任意时刻被响应。</li>
</ul>
<p><strong>任务二</strong>:实现灯按一下点亮三秒后熄灭的功能。</p>
<p><strong>任务三</strong>:实现红蓝灯交替闪烁的救护车警示灯功能。</p>
<h3>系统时钟配置</h3>
<ul>
<li>解释了TM0 PS寄存器的作用,它决定了系统时钟的分频情况。</li>
<li>讨论了如何选择适当的分频值来满足不同的计时需求,并计算了实际的定时误差。</li>
</ul>
<h3>函数定义、声明与调用</h3>
<ul>
<li>介绍了C语言中的函数定义、声明和调用的基本概念。</li>
<li>举例说明了如何正确地定义和声明一个延时函数,并演示了其调用方式。</li>
</ul>
<h3>代码学习:</h3>
<p>任务三通过P32按键来控制切换定时器0的关闭和工作,当定时器工作时,每三秒交替控制P00,P01的工作。</p>
<p>while(1)<br />
{</p>
<pre><code>    if (bUsbOutReady)                                                        //如果接收到了数据
    {
      //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
      
      usb_OUT_done();                                                        //
    }

</code></pre>
<p>//                //任务1:<br />
//                if( P32 == 0 )                                                                //判断P32按钮是否按下<br />
//                {<br />
//                        Delay20ms();                                                        //延时20ms消抖<br />
//                        if( P32 == 0 )<br />
//                        {<br />
//                                printf(&quot;按键按下次数\xfd:%d 次\r\n&quot;,(int)count);<br />
//                                count++;<br />
//                        <br />
//                                while( P32 == 0 );                                        //等待P32松开<br />
//                        <br />
//                        }<br />
//                }</p>
<p>//                //任务2:灯按一下点亮三秒后熄灭。<br />
//                if( P32 == 0 )                                                                //判断P32按钮是否按下<br />
//                {<br />
//                        Delay20ms();                                                        //延时20ms消抖<br />
//                        if( P32 == 0 )<br />
//                        {<br />
////                                printf(&quot;按键按下次数\xfd:%d 次\r\n&quot;,(int)count);<br />
////                                count++;<br />
//                                P00 = 0;<br />
//                                Timer0_Init();<br />
//                                while( P32 == 0 );                                        //等待P32松开<br />
//                        <br />
//                        }<br />
//                }</p>
<p>//        <br />
//任务3:救护车灯控制器,按下报警按钮,红蓝交替闪烁(LED1和LED2              表示红和蓝灯),再按一下报警按钮,红蓝灯停止。<br />
if( P32 == 0 )                                                                //判断P32按钮是否按下<br />
{<br />
Delay20ms();                                                        //延时20ms消抖<br />
if( P32 == 0 )<br />
{<br />
Run_State = !Run_State;                                //运行状态取反</p>
<pre><code>                        if( Run_State==1 )                                        //运行
                        {
                                Timer0_Init();
                        }
                        else
                        {
                                TR0 = 0;                                                //关闭定时器
                                P00 = 1;
                                P01 = 1;
                        }
</code></pre>
<p>//                                P00 = 0;<br />
//                                Timer0_Init();<br />
while( P32 == 0 );                                        //等待P32松开</p>
<pre><code>                }
        }

}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1                //3秒执行一次<br />
{<br />
state = !state;</p>
<pre><code>P00 = state;
P01 = !state;
</code></pre>
<p>}</p>

mcu 发表于 2024-12-10 21:31:33

<p>第八集 定时器周期性调度任务</p>
<ol>
<li><strong>任务定义与初始化</strong>
<ul>
<li>每个任务都有一个状态变量(<code>run</code>),用于指示该任务是否应该被执行。</li>
<li>为每个任务设置了计数器(<code>time_count</code>)和重载值(如300毫秒、600毫秒、900毫秒),用以控制任务的执行周期。</li>
</ul>
</li>
<li><strong>代码组织</strong>
<ul>
<li>将不同功能模块分离到各自的 <code>.c</code>和 <code>.h</code>文件中,例如 <code>IO.c</code>/<code>IO.h</code>用于输入输出操作,<code>test.c</code>/<code>test.h</code>用于测试或特定任务逻辑等。</li>
<li>在新增任务时,在相应的结构体数组中添加新的条目,并确保正确配置其初始参数(如周期、函数指针等)。</li>
</ul>
</li>
<li><strong>错误处理</strong>
<ul>
<li>遇到编译错误时,仔细检查错误信息,特别是关注可能由文件名冲突或字符编码问题引起的乱码现象,避免使用可能导致问题的中文字符,尽量使用英文命名。</li>
<li>确保所有必要的选项被正确选择,比如时钟频率、单片机型号等。同时确认“当目标文件变化时自动装载下载命令”选项已勾选,以保证程序能顺利下载到单片机。</li>
</ul>
</li>
<li><strong>功能验证</strong>
<ul>
<li>通过观察LED按照预定的时间间隔闪烁来验证多任务调度系统的正确性。</li>
<li>实现了非阻塞式的按键检测机制,并结合串口通信打印出按键按下的消息,进一步测试了系统的响应能力。</li>
</ul>
</li>
<li><strong>优化建议</strong>
<ul>
<li>移除不再需要的代码段,使主程序更加简洁明了。</li>
<li>为关键部分添加详细的注释,帮助理解和维护代码。</li>
<li>始终使用最新版本的开发工具和库,以获得更好的兼容性和性能。</li>
</ul>
</li>
</ol>
<h5>代码学习:</h5>
<p>多任务调度处理LED和按键。</p>
<p>static TASK_COMPONENTS Task_Comps[]=<br />
{<br />
//状态计数周期函数</p>
<p>{0, 300,   300,   LED0_Blink},      /* task 1 Period: 300ms <em>/<br />
{0, 600,   600,   LED1_Blink},      /</em> task 1 Period: 600ms <em>/<br />
{0, 900,   900,   LED2_Blink},      /</em> task 1 Period: 600ms <em>/<br />
{0, 10,    10,    KEY_Task},      /</em> task 1 Period: 600ms */<br />
};</p>
<p>void main(void)<br />
{<br />
Sys_init();                                                                                //系统初始化<br />
usb_init();                                     //USB CDC 接口配置</p>
<pre><code>IE2 |= 0x80;                                    //使能USB中断
Timer0_Init();                                                                        //定时器初始化
EA = 1;                                                                                        //IE |= 0X80;

P40 = 0;

while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置

while(1)
{

    if (bUsbOutReady)                                                        //如果接收到了数据
    {
      //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
       
      usb_OUT_done();                                                        //
    }
        Task_Pro_Handler_Callback();                                //执行功能函数

}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1                //1MS执行一次<br />
{</p>
<pre><code>Task_Marks_Handler_Callback();                                        //系统计时
</code></pre>
<p>}</p>
<p>//========================================================================<br />
// 函数: Task_Handler_Callback<br />
// 描述: 任务标记回调函数.<br />
// 参数: None.<br />
// 返回: None.<br />
// 版本: V1.0, 2012-10-22<br />
//========================================================================<br />
void Task_Marks_Handler_Callback(void)<br />
{<br />
u8 i;<br />
for(i=0; i&lt;Tasks_Max; i++)<br />
{<br />
if(Task_Comps.TIMCount)      /* If the time is not 0 <em>/<br />
{<br />
Task_Comps.TIMCount--;   /</em> Time counter decrement <em>/<br />
if(Task_Comps.TIMCount == 0) /</em> If time arrives */<br />
{<br />
/*Resume the timer value and try again <em>/<br />
Task_Comps.TIMCount = Task_Comps.TRITime;<br />
Task_Comps.Run = 1;      /</em> The task can be run */<br />
}<br />
}<br />
}<br />
}</p>
<p>//========================================================================<br />
// 函数: Task_Pro_Handler_Callback<br />
// 描述: 任务处理回调函数.<br />
// 参数: None.<br />
// 返回: None.<br />
// 版本: V1.0, 2012-10-22<br />
//========================================================================<br />
void Task_Pro_Handler_Callback(void)<br />
{<br />
u8 i;<br />
for(i=0; i&lt;Tasks_Max; i++)<br />
{<br />
if(Task_Comps.Run) /* If task can be run <em>/<br />
{<br />
Task_Comps.Run = 0;      /</em> Flag clear 0 <em>/<br />
Task_Comps.TaskHook();   /</em> Run task */<br />
}<br />
}<br />
}</p>

fei2568 发表于 2024-12-14 08:53:03

STC企鹅 发表于 2024-12-9 07:48
吃不到葡萄,说葡萄

我早拿到了,

STC企鹅 发表于 2024-12-14 09:01:09

fei2568 发表于 2024-12-14 08:53
我早拿到了,

早拿到了,在别人帖子下写那个内容,是展示优越还是优秀呀

fei2568 发表于 2024-12-14 13:08:18

STC企鹅 发表于 2024-12-14 09:01
早拿到了,在别人帖子下写那个内容,是展示优越还是优秀呀

就是问问,没有别的意思

fei2568 发表于 2024-12-14 13:10:27

STC企鹅 发表于 2024-12-14 09:01
早拿到了,在别人帖子下写那个内容,是展示优越还是优秀呀

随口说了一下,影响到你了吗,还是怎么样,具体写的时候我那没拿到我也记不清了

fei2568 发表于 2024-12-14 13:23:27

STC企鹅 发表于 2024-12-14 09:01
早拿到了,在别人帖子下写那个内容,是展示优越还是优秀呀

刚刚看了下,我的实验箱是12月8号拿到的,问楼主的实验箱拿到没那时候我还没有拿到
我第一句说写的挺好和第二句实验箱拿到没是两句没有关联的话,你可能有点误解吧

STC企鹅 发表于 2024-12-14 19:48:10

fei2568 发表于 2024-12-14 13:23
刚刚看了下,我的实验箱是12月8号拿到的,问楼主的实验箱拿到没那时候我还没有拿到
我第一句说写的挺好和 ...

哈哈

STC企鹅 发表于 2024-12-14 19:48:44

fei2568 发表于 2024-12-14 13:08
就是问问,没有别的意思

ok
页: 1 [2] 3
查看完整版本: 《8051U深度入门到32位51大型实战视频》 写学习心得,送强大的 Ai8051U实验箱