assass123 发表于 2024-12-22 16:48:00

<h1>打卡第八集:蜂鸣器的应用</h1>
<p><img src="data/attachment/forum/202412/22/164732pcwy1tn6iqdetxnn.png" alt="image.png" title="image.png" /></p>

assass123 发表于 2024-12-22 16:52:32

<p><img src="data/attachment/forum/202412/22/164828fd7qdq2qacq37hhh.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/164911stmpt1h3s9cp1yq9.png" alt="image.png" title="image.png" /></p>
<p>#ifndef __TEST_H<br />
#define __TEST_H</p>
<p>#include &quot;COMM/stc.h&quot;                //调用头文件<br />
#include &quot;COMM/usb.h&quot;</p>
<p>#define KEY1 P32                //定义一个按键 引脚选择P32<br />
#define KEY2 P33                //定义一个按键 引脚选择P33</p>
<p><strong>#define BEEP P54                //定义一个按键 引脚选择P33</strong></p>
<p>#define MAIN_Fosc 24000000UL        //定义主时钟</p>
<p>void delay_ms(u16 ms);<br />
void Test(void);</p>
<p>#endif</p>

assass123 发表于 2024-12-22 16:54:02

<p>#include &quot;test.h&quot;</p>
<p>bit Run_Flag = 0;                //0-1 开关机变量<br />
u8Run_Mode = 0;                //0-8 模式几 0:没有模式</p>
<p>void Test(void)                //电磁炉的功能<br />
{<br />
if( KEY1 == 0)                //开关机键<br />
{<br />
delay_ms(10);<br />
if(KEY1 == 0 )<br />
{<br />
while(KEY1 == 0 );                //按钮按下,并等待按钮松开</p>
<p>//----------------------还没有开机的时候,执行这个开机功能---------------------                <br />
if( Run_Flag==0 )                        //还没有开机<br />
{<br />
Run_Flag = 1;                        //开机变量改为1,表示已经开机了<br />
BEEP = 0;                                //打开蜂鸣<br />
delay_ms(10);                        //延时10ms<br />
BEEP = 1;                                //关闭蜂鸣<br />
P40 = 0;                                //打开led的总电源<br />
P6 = 0X00;                                //点亮全部LED<br />
delay_ms(200);                        //延时200ms<br />
P6 = 0XFF;                                //熄灭全部LED<br />
}<br />
//----------------------已经开机的时候,执行这个关机功能---------------------                        <br />
else<br />
{<br />
Run_Flag = 0;<br />
BEEP = 0;                                //打开蜂鸣<br />
delay_ms(10);                        //延时10ms<br />
BEEP = 1;                                //关闭蜂鸣<br />
P6 = 0XFF;                                //熄灭全部LED<br />
Run_Mode = 0;                        //模式清0                        <br />
}<br />
}<br />
}</p>
<pre><code>if( KEY2 == 0 )
{
        delay_ms( 10 );
        if( KEY2 == 0 )
        {
                while( KEY2 == 0);                //等待松开执行了
                BEEP = 0;                                //打开蜂鸣
                delay_ms(10);                        //延时10ms
                BEEP = 1;                                //关闭蜂鸣               
                Run_Mode ++;                        //模式选择
                if( Run_Mode&gt;8 )                //如果模式&gt;8
                        Run_Mode = 1;                //回到模式1

                //P6 =        0XFE;   P6&lt;&lt;1+1
       
       
                P6 = ~(1&lt;&lt; (Run_Mode-1));                //1&lt;&lt;1      0000 0001 -&gt; 1111 1110
       
        }
}
</code></pre>
<p>}</p>
<p>void delay_ms(u16 ms)        //unsigned int<br />
{<br />
u16 i;<br />
do<br />
{<br />
i = MAIN_Fosc/6000;<br />
while(--i);<br />
}while(--ms);<br />
}</p>

assass123 发表于 2024-12-22 17:52:13

<h1>打卡第九章:数码管的静态使用</h1>
<p><img src="data/attachment/forum/202412/22/174120a0n5fw1giwnd4mwq.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/174151guuyk1t5tz5x3hrj.png" alt="image.png" title="image.png" /></p>
<p>数码管的结构<br />
<img src="data/attachment/forum/202412/22/174230ol7961l006h137tl.png" alt="image.png" title="image.png" /></p>
<p>如何控制</p>
<p><img src="data/attachment/forum/202412/22/174315dnnzh5jv5e7d25d2.png" alt="image.png" title="image.png" /></p>
<p>对应P6口的驱动</p>
<p><img src="data/attachment/forum/202412/22/175015wjvpp88jva8fja88.png" alt="image.png" title="image.png" /></p>
<p>P6 = SEG_Tab;        //这个数码管输出段码</p>
<pre><code>        if( KEY1 ==0 )
        {
                delay_ms(10);
                if( KEY1 ==0 )
                {
                        BEEP = 0;
                        delay_ms(10);
                        BEEP = 1;
                        while( KEY1 ==0 );
                        if( num&lt;9 )
                        {
                                num++;
                        }
                }
        }
        if( KEY2 ==0 )
        {
                delay_ms(10);
                if( KEY2 ==0 )
                {
                        BEEP = 0;
                        delay_ms(10);
                        BEEP = 1;               
                        while( KEY2 ==0 );
                        if( num&gt;0 )
                                num--;
                }
        }
</code></pre>

assass123 发表于 2024-12-22 17:59:57

<h1>打卡第十章:数码管的动态显示</h1>
<p><img src="data/attachment/forum/202412/22/175317ujjss1j202cwmlgj.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/175339ixdgrygyxnngxgmg.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/175501mgso5clzfxrylggf.png" alt="image.png" title="image.png" /></p>
<p>void SEG_Fre( void )<br />
{<br />
//位码选择第一位,段码选择0<br />
P7 = COM_Tab;                        //位码的选择<br />
P6 = SEG_Tab];//需要显示的数字的内码 赋给 P6   NUM =0 -&gt; Show_Tab] = 1 -&gt; p6 = oxF9<br />
delay_ms(SEG_Delay);</p>
<pre><code>num++;
if( num &gt;7 )
        num = 0;
</code></pre>
<p>}</p>

assass123 发表于 2024-12-22 18:10:36

<h1>打卡第十一章:定时器的使用</h1>
<p><img src="data/attachment/forum/202412/22/180217mjjg9uu9j24uj7uc.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180245bvoe4884ow8vzt39.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180328fhmmhkwy3b8w1bsl.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180412udx9ac8a0aqmmh3y.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180444tt1utmseezn9ritk.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180502zhr2uu2bcybetrrt.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180525k78dudza07u1d6y1.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180607k0t7y0h7hm7u90mk.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180635lsxhpc5p9hklpc95.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/180648j0xsu3v6nj16cocy.png" alt="image.png" title="image.png" /></p>
<p>#include &quot;COMM/stc.h&quot;                //调用头文件<br />
#include &quot;COMM/usb.h&quot;</p>
<p>#define KEY1 P32                //定义一个按键 引脚选择P32<br />
#define KEY2 P33                //定义一个按键 引脚选择P33</p>
<p>#define BEEP P54                //定义一个按键 引脚选择P54</p>
<p>#define SEG_Delay1        //延时多少ms</p>
<p>#define MAIN_Fosc 24000000UL        //定义主时钟</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>u8 SEG_Tab = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};        //0-9段码,0-9带小数点<br />
u8 COM_Tab = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };        //0-7的位码数组<br />
u8 Show_Tab = {3,0,0,0,0,10,0,0};</p>
<p>u32 TimCount = 0;                //计数单位1ms<br />
bit RUN_State = 0;                //开始运行/结束运行<br />
u8 num = 0;</p>
<p>void sys_init();        //函数声明<br />
void delay_ms(u16 ms);        //unsigned int</p>
<p>void SEG_Fre( void )<br />
{<br />
//位码选择第一位,段码选择0<br />
P7 = COM_Tab;                        //位码的选择<br />
P6 = SEG_Tab];//需要显示的数字的内码 赋给 P6   NUM =0 -&gt; Show_Tab] = 1 -&gt; p6 = oxF9<br />
//delay_ms(SEG_Delay);</p>
<pre><code>num++;
if( num &gt;7 )
        num = 0;
</code></pre>
<p>}</p>
<p><strong>void Timer0_Init(void)                //1毫秒@24.000MHz</strong><br />
{<br />
AUXR &amp;= 0x7F;                        //定时器时钟12T模式<br />
TMOD &amp;= 0xF0;                        //设置定时器模式<br />
TL0 = 0x30;                                //设置定时初始值<br />
TH0 = 0xF8;                                //设置定时初始值<br />
TF0 = 0;                                //清除TF0标志<br />
TR0 = 1;                                //定时器0开始计时<br />
ET0 = 1;                                //使能定时器0中断<br />
}</p>
<p>void main()                                        //程序开始运行的入口<br />
{</p>
<pre><code>sys_init();                                //USB功能+IO口初始化
usb_init();                                //usb库初始化

Timer0_Init();

EA = 1;                                        //CPU开放中断,打开总中断。

while(1)                //死循环
{
        if( DeviceState != DEVSTATE_CONFIGURED )         //
                continue;
        if( bUsbOutReady )                                                       
        {
                usb_OUT_done();

        }
</code></pre>
<p>//------------------------------------------------P32按下一次,灯往右边边移动一个单位        -----------------------------------------------        <br />
Show_Tab= 1;                //选择 1<br />
Show_Tab= 10;                //选择 0.<br />
Show_Tab= 0;                //选择 0<br />
Show_Tab= 0;                //选择 0</p>
<pre><code>        if( KEY1 ==0 )
        {
                delay_ms(10);
                if( KEY1 ==0 )
                {
                        BEEP = 0;
                        delay_ms(10);
                        BEEP = 1;
                        while( KEY1 ==0 );

                        if( RUN_State==0 )
                                TimCount = 0;
               
                        RUN_State = !RUN_State;
                }
        }       

}
</code></pre>
<p>}</p>
<p><strong>void Timer0_Isr(void) interrupt 1</strong><br />
{<br />
SEG_Fre();                //数码管刷新的</p>
<pre><code>if( RUN_State==1 )                //如果开始运行
{
        TimCount++;                        //每隔1ms+1
        Show_Tab = TimCount/10000%10;
        Show_Tab = TimCount/1000%10+10;
        Show_Tab = TimCount/100%10;       
        Show_Tab = TimCount/10%10;                //取10位
}
</code></pre>
<p>}</p>

assass123 发表于 2024-12-22 18:23:21

<h1>打卡第十二章:计数器的使用</h1>
<p><img src="data/attachment/forum/202412/22/181151o25ydxc4rwyc6r9x.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/181221lzj1gog1gp9jz355.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/181330izn1nj16a6z116d3.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/181415f4gk4kmkdmezucdg.png" alt="image.png" title="image.png" /></p>

assass123 发表于 2024-12-22 18:30:33

<p>void main()                                        //程序开始运行的入口<br />
{</p>
<pre><code>sys_init();                                //USB功能+IO口初始化
usb_init();                                //usb库初始化

TMOD = 0x40;                        //设置计数器模式
TL1 = 0xFF;                                //设置计数初始值
TH1 = 0xFF;                                //设置计数初始值
TF1 = 0;                                //清除TF1标志
TR1 = 1;                                //定时器1开始计时
ET1 = 1;                                //使能定时器1中断

P3PU = 0x20;                         //打开内部上拉4.1K

P40 = 0;                                //led的电源控制三极管打开

EA = 1;                                        //CPU开放中断,打开总中断。

while(1)                //死循环
{
        if( DeviceState != DEVSTATE_CONFIGURED )         //
                continue;
        if( bUsbOutReady )                                                       
        {
                usb_OUT_done();

        }



}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 3<br />
{<br />
P60 = !P60;                                //led取反<br />
}</p>

assass123 发表于 2024-12-22 18:43:23

<h1>打卡第十三章:简易多任务处理</h1>
<p>模块化梳理了LED灯、按键、嗡鸣器、定时器使用的细节</p>
<p>#include &quot;COMM/stc.h&quot;                //调用头文件<br />
#include &quot;COMM/usb.h&quot;<br />
#include &quot;seg_led.h&quot;<br />
#include &quot;key.h&quot;<br />
#include &quot;beep.h&quot;<br />
#include &quot;tim0.h&quot;</p>
<p>#define MAIN_Fosc 24000000UL        //定义主时钟</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>bitTIM_10MS_Flag;                        //10ms的标志位</p>
<p>void sys_init();        //函数声明<br />
void delay_ms(u16 ms);        //unsigned int</p>
<p>void main()                                        //程序开始运行的入口<br />
{<br />
sys_init();                                //USB功能+IO口初始化<br />
usb_init();                                //usb库初始化</p>
<pre><code>Timer0_Init();
EA = 1;                                        //CPU开放中断,打开总中断。

SEG0 = 0;
SEG1 = 1;
SEG2 = 2;
SEG3 = 3;
SEG4 = 4;
SEG5 = 5;
SEG6 = 6;
SEG7 = 7;

LED = 0xff;

while(1)                //死循环
{
        if( DeviceState != DEVSTATE_CONFIGURED )         //
                continue;
        if( bUsbOutReady )                                       
        {
                usb_OUT_done();
        }

        if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
        {
                TIM_10MS_Flag = 0;                                                                        //清空标志位
                KEY_Deal();                                                                                        //按键处理
                BEEP_RUN();                                                                                        //蜂鸣运行

                if( KEY_ReadState( KEY1 ) == KEY_PRESS )                        //判断K1按钮是否单击
                {
                        BEEP_ON(2);                                                                                //蜂鸣50ms
                        LED0 = 0;                                                                                //点亮LED0
                }
                else if( KEY_ReadState( KEY1 ) == KEY_LONGPRESS )        //判断K1按钮是否长按
                {
                        LED1 = 0;                                                                                //点亮LED1
                }
                else if( KEY_ReadState( KEY1 ) == KEY_RELAX )                //判断K1按钮是否松开
                {
                        BEEP_ON(2);                                                                                //蜂鸣50ms
                        LED = 0xff;                                                                                //led全部熄灭
                }

                if( KEY_ReadState( KEY2 ) == KEY_PRESS )                        //判断K2按钮是否单击
                {

                }
        }
}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1<br />
{<br />
static timcount = 0;</p>
<pre><code>SEG_LED_Show();                        //数码管刷新的

timcount++;                                //1ms+1
if( timcount&gt;=10 )                //如果这个变量大于等于10,10ms计数到达
{
        timcount = 0;
        TIM_10MS_Flag = 1;        //10ms时间到了
}
</code></pre>
<p>}</p>

assass123 发表于 2024-12-22 18:57:57

<h1>打卡第十四章:矩阵按键</h1>
<p><img src="data/attachment/forum/202412/22/185505kopggoo40po3o0zz.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/185533tftfxxtggfc3jfzs.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/190943b5ixrfhyx141g84i.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/191350cjtwwjx2azsox1do.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/191545ndhgum7gzuobzhud.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202412/22/185739c9pn18prd89i0xz0.png" alt="image.png" title="image.png" /></p>
<p>#include &quot;COMM/stc.h&quot;                //调用头文件<br />
#include &quot;COMM/usb.h&quot;<br />
#include &quot;seg_led.h&quot;<br />
#include &quot;key.h&quot;<br />
#include &quot;beep.h&quot;<br />
#include &quot;tim0.h&quot;</p>
<p>#define MAIN_Fosc 24000000UL        //定义主时钟</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;</p>
<p>bitTIM_10MS_Flag;                        //10ms的标志位</p>
<p>void sys_init();        //函数声明<br />
void delay_ms(u16 ms);        //unsigned int</p>
<p>void main()                                        //程序开始运行的入口<br />
{<br />
u8 KEY_NUM = 0;                        //保存矩阵按键的键码<br />
u8 KEY_Str = 0;                        //表示当前输入了几个密码位</p>
<pre><code>sys_init();                                //USB功能+IO口初始化
usb_init();                                //usb库初始化

Timer0_Init();
EA = 1;                                        //CPU开放中断,打开总中断。


LED = 0xff;                                //初始状态熄灭所有LED

while(1)                //死循环
{
        if( DeviceState != DEVSTATE_CONFIGURED )         //
                continue;
        if( bUsbOutReady )                       
        {
                usb_OUT_done();
        }

        if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
        {
                TIM_10MS_Flag = 0;                                                                        //清空标志位

                KEY_NUM = MateixKEY_Read();                                                        //当前矩阵按键的键值
                if( KEY_NUM&gt;0 )                                                                                //如果有按键拿下
                {
                        BEEP_ON(2);                                                                                //蜂鸣20ms
                        Show_Tab = KEY_NUM;                                        //将当前的按键的键值保存到数码管显示变量里
                        KEY_Str ++;                                                                                //s输入的密码位数+1

                        if( KEY_Str == 8 )                                                                //如果密码已经输到了8位
                        {
                                KEY_Str = 0;                                                                //清空当前密码的位数
                                //for
                                if((Show_Tab==1)&amp;&amp;(Show_Tab==1)&amp;&amp;(Show_Tab==1)&amp;&amp;(Show_Tab==1)&amp;&amp;(Show_Tab==1)&amp;&amp;(Show_Tab==1)&amp;&amp;(Show_Tab==1)&amp;&amp;(Show_Tab==1))        //如果密码正确
                                {
                                        LED0= 0;                                                                //点亮LED0
                                }
                                else
                                {
                                        BEEP_ON(200);                                                        //密码错误,蜂鸣2秒
                                }
                                SEG0 = SEG1 = SEG2 = SEG3 = SEG4 = SEG5 =SEG6 = SEG7 = 21;         //将所有的数码管显示位 -
                        }
                        KEY_NUM = 0;                                                                        //清空按键键值
                }

        }
}
</code></pre>
<p>}</p>
<p>void Timer0_Isr(void) interrupt 1<br />
{<br />
static timcount = 0;</p>
<pre><code>SEG_LED_Show();                        //数码管刷新的

timcount++;                                //1ms+1
if( timcount&gt;=10 )                //如果这个变量大于等于10,10ms计数到达
{
        timcount = 0;
        TIM_10MS_Flag = 1;        //10ms时间到了
}
</code></pre>
<p>}</p>
<p>void sys_init()                //函数定义<br />
{<br />
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快<br />
EAXFR = 1; //扩展寄存器(XFR)访问使能<br />
CKCON = 0; //提高访问XRAM速度</p>
<pre><code>P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

P3M0 = 0x00;
P3M1 = 0x00;

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

//设置USB使用的时钟源
IRC48MCR = 0x80;    //使能内部48M高速IRC
while (!(IRC48MCR &amp; 0x01));//等待时钟稳定

USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
USBCON = 0x90;
</code></pre>
<p>}</p>
<p>void delay_ms(u16 ms)        //unsigned int<br />
{<br />
u16 i;<br />
do<br />
{<br />
i = MAIN_Fosc/6000;<br />
while(--i);<br />
}while(--ms);<br />
}</p>
页: 1 2 [3] 4
查看完整版本: 学习《32位8051单片机原理及应用》课程——32G12K128-实验箱-V9.6