silas3082 发表于 2025-1-25 15:03:45

<h3>第十四集 IO中断(所有普通IO都支持的“外部中断”)</h3>
<pre><code>void IO_ISR_Init(void){P4IM0=0X00;       //下降沿触发,想让P几作为io中断就配置P几
P4IM1=0X00;P4INTE=0X02;   //打开总中断0010,配置p41作为io中断}void P4_IO_ISR(void) interrupt 41
{
u8 intf;
intf=P4INTF;if(intf)
{
P4INTF=0;
        if(intf&amp;0x02){

                P20=!P20;
        }

}
if(intf)
{
P4INTF=0;
        if(intf&amp;0x02){

                P20=!P20;
        }

}
}
</code></pre>
<p>2.设置中断优先级</p>
<p>配置:PINIPL和PINIPH寄存器可设置中断优先级</p>
<p><img src="data/attachment/forum/202501/25/150839g991q11gq0hyw9hz.png" alt="微信截图_20250125150820.png" title="微信截图_20250125150820.png" /></p>
<p>在中断初始化中增加:</p>
<pre><code>PINIPL |= (1&lt;&lt;4);
PINIPH |= (1&lt;&lt;4);
</code></pre>
<p><a href="forum.php?mod=attachment&amp;aid=82845" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo.rar</a></p>

silas3082 发表于 2025-1-25 15:12:45

<h3>第十四集 IO中断 课后小练习多路抢答器</h3>
<p><img src="data/attachment/forum/202501/25/151242qfviri0l0i5nuakz.png" alt="微信截图_20250125151148.png" title="微信截图_20250125151148.png" /></p>
<p>由于手头上暂时只有擎天柱,就用擎天柱上的P41-P43模拟三个抢答按键,序号为1,2,3,用虚拟数码管最左边一位显示抢答的序号,用外部中断1重置</p>
<p>代码如下:</p>
<pre><code>u8 nu;void INT1_Init (void){
IT1=1;    //下降沿中断
EX1=1;   //打开中断允许
EA =1;   //打开总中断}void INT_ISR(void) interrupt 2
{
nu=0;
P4INTE=0X0E;   //打开总中断1110,P41,p42,p43}void IO_ISR_Init(void){P4IM0=0X00;       //下降沿触发
P4IM1=0X00;P4INTE=0X0E;   //打开总中断1110,P41,p42,p43}void P4_IO_ISR(void) interrupt 41
{
u8 intf;
intf=P4INTF;if(intf)
{
P4INTF=0;
        if(intf&amp;0x02){

                nu=1;
                P4INTE=0X00;
        }
        if(intf&amp;0x04){

                nu=2;
                P4INTE=0X00;
        }
        if(intf&amp;0x08){

                nu=3;
                P4INTE=0X00;
        }
}
if(intf)
{
P4INTF=0;
        if(intf&amp;0x02){

                nu=1;
                P4INTE=0X00;
        }
        if(intf&amp;0x04){

                nu=2;
                P4INTE=0X00;
        }
        if(intf&amp;0x08){

                nu=3;
                P4INTE=0X00;
        }
}
}void SEG_PC(void){u8 cod;
cod = SEG_NUM;   //小时的十位
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
cod = SEG_NUM;
SEG7_ShowCode(cod);
}
</code></pre>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=82847"></video>
<p><a href="forum.php?mod=attachment&amp;aid=82848" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo.rar</a></p>

silas3082 发表于 2025-1-25 17:24:43

<h2>第十五集 定时器做计数器</h2>
<p>任务1:编写定时器1计数的的程序<br />
(为了方便计数,10个脉冲中断一次)</p>
<pre><code>
void TIM1_Count_Init(void){

T1_CT =1;
T1_M1=0;
T1_M0=0;
T1_GATE=0;

        TH1=(65536-Count_num)&gt;&gt;8;
        TL1=(65536-Count_num);

        P3PU |= 0x20;//P35为time1计数的输入端口,设置为上拉



        TR1=1;
        ET1=1;
}


void Timer1_Isr(void) interrupt 3       
{

        Count_T1++;    ///T1引脚检测到10个脉冲就溢出一次
   
}



void T1_RunTask(void){

        u32 count_th_tl=0;
        count_th_tl=(u16)(TH1&lt;&lt;8)+(u16)(TL1);
        count_th_tl=count_th_tl-65526;
SEG7_ShowLong(Count_T1*Count_num+count_th_tl, 10);


}
</code></pre>
<p><a href="forum.php?mod=attachment&amp;aid=82849" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo.rar</a></p>

silas3082 发表于 2025-1-26 00:47:12

<h2>第十五集 定时器做计数器——课后小练</h2>
<p><img src="data/attachment/forum/202501/26/005115k770miem59kxm7s2.png" alt="微信截图_20250126002003.png" title="微信截图_20250126002003.png" /></p>
<p>1.使用定时器0每1ms对计时变量加1</p>
<p>extern u32 current_time;</p>
<p>void Timer0_Isr(void) interrupt 1                //1MS执行一次<br />
{</p>
<p>current_time++;<br />
Task_Marks_Handler_Callback();                                        //系统计时</p>
<p>}</p>
<p>2.判断P33按下,并计算两个按键之间的间隔</p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=82936"></video>
<p><a href="forum.php?mod=attachment&amp;aid=82934" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo.rar</a></p>

silas3082 发表于 2025-2-1 11:23:42

<h2>第十六集 DS18B20测温</h2>
<p>本集讲了ds18b20的c文件和.h文件,最终获取ds18b20的温度值。</p>
<p><a href="forum.php?mod=attachment&amp;aid=83186" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:18b20.h</a><a href="forum.php?mod=attachment&amp;aid=83187" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:18b20.h</a></p>
<p>代码就在上边。</p>
<p><img src="data/attachment/forum/202502/01/112302s4n4kuewtifnvc3a.png" alt="image.png" title="image.png" /></p>
<p>步骤如上</p>
<p><a href="forum.php?mod=attachment&amp;aid=83189" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:DS18B20.rar</a></p>

silas3082 发表于 2025-2-1 11:38:58

<h2>第十六集 DS18B20测温课后小练</h2>
<p><img src="data/attachment/forum/202502/01/113852a677906a6cq0kcw2.png" alt="微信截图_20250201113839.png" title="微信截图_20250201113839.png" /></p>
<p>虽然课后小练用的是之前学过的知识,但是还是踩了不少坑才完成。</p>
<p>注意事项:</p>
<p>1.main函数中需要把USB相关的中断关掉,不然会一直唤醒。</p>
<p>2.用普通io中断可以唤醒睡眠模式,睡眠模式用PD=1实现;用矩阵键盘的按键作为普通按键,需要将P06或P07设置额为低电平,然后检测P00-P04的按键,我用P01作为开机,P02作为温度切换按键。</p>
<video controls="controls" src="forum.php?mod=attachment&amp;aid=83429"></video>
<pre><code>

void P0_IO_Init(void)
{
P0IM0 = 0X00;                //IO中断模式设置为了下降沿
P0IM1 = 0X00;P0INTE= 0Xff;                //打开中断
//P0INTE = 0x02;
                                                          //使能P01中断功能

P0WKUE = 0x02;
P0INTE= 0Xff;                //打开中断
//P0INTE = 0x02;
                                                          //使能P01中断功能

P0WKUE = 0x02;
//PINIPH|= (1&lt;&lt;1);        //写入最高优先级
//        PINIPL|= (1&lt;&lt;1);
}void P0_IO_ISR(void)        interrupt 37
{
u8 intf;intf = P0INTF;

if( intf )                        //判断也没有IO触发了中断
{
        P0INTF = 0;

        if( intf &amp; 0x02 )//判断是否是P01按钮按下
        {
                run_state=!run_state;
                ms1_flag2=0;
                ms1_flag=0;
        }
        if( intf &amp; 0x04 )//判断是否是P02按钮按下
        {
                stat_C=!stat_C;
                ms1_flag2=0;
        }
}
intf = P0INTF;

if( intf )                        //判断也没有IO触发了中断
{
        P0INTF = 0;

        if( intf &amp; 0x02 )//判断是否是P01按钮按下
        {
                run_state=!run_state;
                ms1_flag2=0;
                ms1_flag=0;
        }
        if( intf &amp; 0x04 )//判断是否是P02按钮按下
        {
                stat_C=!stat_C;
                ms1_flag2=0;
        }
}
}
</code></pre>
<p><a href="forum.php?mod=attachment&amp;aid=83428" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:demo.rar</a></p>
页: 1 2 3 [4]
查看完整版本: Ai8051U 实验箱 学习开始打卡