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 "COMM/stc.h" //调用头文件<br />
#include "COMM/usb.h"</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 "test.h"</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>8 ) //如果模式>8
Run_Mode = 1; //回到模式1
//P6 = 0XFE; P6<<1+1
P6 = ~(1<< (Run_Mode-1)); //1<<1 0000 0001 -> 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<9 )
{
num++;
}
}
}
if( KEY2 ==0 )
{
delay_ms(10);
if( KEY2 ==0 )
{
BEEP = 0;
delay_ms(10);
BEEP = 1;
while( KEY2 ==0 );
if( num>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 -> Show_Tab] = 1 -> p6 = oxF9<br />
delay_ms(SEG_Delay);</p>
<pre><code>num++;
if( num >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 "COMM/stc.h" //调用头文件<br />
#include "COMM/usb.h"</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 = "@STCISP#";</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 -> Show_Tab] = 1 -> p6 = oxF9<br />
//delay_ms(SEG_Delay);</p>
<pre><code>num++;
if( num >7 )
num = 0;
</code></pre>
<p>}</p>
<p><strong>void Timer0_Init(void) //1毫秒@24.000MHz</strong><br />
{<br />
AUXR &= 0x7F; //定时器时钟12T模式<br />
TMOD &= 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 "COMM/stc.h" //调用头文件<br />
#include "COMM/usb.h"<br />
#include "seg_led.h"<br />
#include "key.h"<br />
#include "beep.h"<br />
#include "tim0.h"</p>
<p>#define MAIN_Fosc 24000000UL //定义主时钟</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = "@STCISP#";</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>=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 "COMM/stc.h" //调用头文件<br />
#include "COMM/usb.h"<br />
#include "seg_led.h"<br />
#include "key.h"<br />
#include "beep.h"<br />
#include "tim0.h"</p>
<p>#define MAIN_Fosc 24000000UL //定义主时钟</p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = "@STCISP#";</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>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)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(Show_Tab==1)&&(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>=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 &= ~0x03;
P3M1 |= 0x03;
//设置USB使用的时钟源
IRC48MCR = 0x80; //使能内部48M高速IRC
while (!(IRC48MCR & 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>