ofela
发表于 2024-8-27 10:57:21
阿杰爱学单片机 发表于 2024-8-24 22:10
这个单片机最高不是48MHZ吗为啥选24
安全
阿杰爱学单片机
发表于 2024-8-27 13:27:02
ofela 发表于 2024-8-27 10:57
安全
这样啊
阿杰爱学单片机
发表于 2024-8-27 19:33:01
第八集 学习记录
这集讲到了蜂鸣器的应用,以及实战电磁炉
蜂鸣器分为有源和无源
区别就是内部是否带了振荡器,有源的内部置有振荡器,无源没有
下面是我写的代码对比与冲哥的有点不同,具体也调试了一些时间
这次没有太多的想法,具体就是有很多逻辑
比如开关机模式状态清零,模式次数清零
就是要理清楚逻辑,慢慢调试
#define Key1 P35
#define Key2 P34
#define Key3 P33
#define Buzzer P50
bit ON_OFF=1;
bit ModeON_OFF=1;
u8 Count;
void Test1(void)
{
if(Key1 == 0) //如果按键1按下
{
delay_ms(10); //延时消抖
while(Key1 ==0);//如果按键1按下死循环,等待松手
delay_ms(10); //延时消抖
//-----------------------------------
if(ON_OFF==1)
{
Buzzer = 0;
printf("蜂鸣器响了%\r\n");
delay_ms(10); //蜂鸣器响10毫秒
Buzzer = 1;
P2=0x00;
delay_ms(200);//所有LED点亮200毫秒
P2=0xff;
ON_OFF=!ON_OFF;//开关机状态取反
Count=0; //Key2按下次数清零
ModeON_OFF=1;//模式启动停止
printf("按键1按下 开机%\r\n");//打印开关机状态
}
else if(ON_OFF==0)
{
Buzzer = 0;
printf("蜂鸣器响了%\r\n");
delay_ms(10); //蜂鸣器响10毫秒
Buzzer = 1;
P2=0xff;//熄灭所有LED
ON_OFF=!ON_OFF;//开关机状态取反
printf("按键1按下 关机%\r\n");
}
}
//--------------如果开机执行以下代码---------------------
if(ON_OFF==0)
{
if(ModeON_OFF==1)//如果没有启动模式,才可以切换模式
{
if(Key2 == 0) //如果按键2按下
{
delay_ms(10); //延时消抖
while(Key2 ==0);//如果按键2按下死循环,等待松手
delay_ms(10); //延时消抖
Buzzer = 0;
printf("蜂鸣器响了%\r\n");
delay_ms(10); //蜂鸣器响10毫秒
Buzzer = 1;
P2=~(0x01<<Count++);//LED左移
if(Count==9)Count=1;//按下次数模式加一模式等于八模式等于1
printf("按键2按下 模式:%u\r\n",Count);//打印选择的模式
}
}
if(Key3 == 0) //如果按键3按下
{
delay_ms(10); //延时消抖
while(Key3 ==0);//如果按键3按下死循环,等待松手
delay_ms(10); //延时消抖
printf("按键3按下 执行模式:%u\r\n",Count);//打印选择的模式
ModeON_OFF=!ModeON_OFF;//按键按下模式状态取反
}
if(ModeON_OFF==0)//模式启动LED闪烁
{
P2=~(0x01<<Count-1);
delay_ms(200);
P2=0xff;
delay_ms(200);
}
else//没有模式启动对应的灯点亮
{
P2=~(0x01<<Count-1);
}
}
//--------------------------
}
阿杰爱学单片机
发表于 2024-8-27 22:19:14
本帖最后由 阿杰爱学单片机 于 2024-8-27 22:23 编辑
第九集 数码管学习记录(上)
数码管介绍
数码管本质就是由LED组成的,每一段笔画一个LED,有一位和多位数码管
数码管又分为共阳极和共阴极,共阳极顾名思义,将数码管中的8个LED阳极接在一起,共阴极道理也一样。
数码管的应用
选中数码管的COM端,输出高或低电平选中对应数码管(高低电平由共阳极共阴极决定)
然后在对应端口输出断码即可显示
下面是我自己焊的数码管,不知道为啥显示有点小瑕疵
没有选中的端口也会亮一点点
晓飛飛
发表于 2024-8-27 22:51:05
阿杰爱学单片机 发表于 2024-8-24 22:10
这个单片机最高不是48MHZ吗为啥选24
单片机的速度本着够用就好为原则,除了性能还要兼顾芯片功耗和外设的配合,不一定是越快越好。
阿杰爱学单片机
发表于 2024-8-28 05:56:50
晓飛飛 发表于 2024-8-27 22:51
单片机的速度本着够用就好为原则,除了性能还要兼顾芯片功耗和外设的配合,不一定是越快越好。 ...
我之前以为,越快越好,越快就越强
阿杰爱学单片机
发表于 2024-8-28 07:08:03
本帖最后由 阿杰爱学单片机 于 2024-8-28 07:13 编辑
第十集 数码管的动态显示
动态显示原理
取数码管公共端COM输出高电平,其余COM端输出低电平
再在断码端口输出断码,
依次循环,并延时1ms,利用人眼视觉暂留,就可以看到显示多位数了
为啥一定是一ms,不太了解2ms,或者500微秒不行吗
前几节的没有弄明白补一下数组
数组格式
变量类型 XX数组名[数组大小]={数组内容};
应用数组的方法,数组名[索引];索引就是数组内每位数的序号,数组从0开始
冲哥教的数组嵌套 数组名[数组名[索引]];感觉像套娃
下面是我写的代码,应该没问题,昨天那个数码管,不知道咋了用不了,就没用了
u8 Num;
SEG_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
COM_Tab[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
SEG_BUFF[]={1,2,3,4,5,6,7,8};
void main(void) //主函数(程序从这里执行)
{
SYS_Init(); // STC32初始化
MyUSB_Init(); //USB初始化
GPIO_Init(); //IO口初始化
while(1)
{
if( DeviceState != DEVSTATE_CONFIGURED ) //
continue;
if( bUsbOutReady )
{
usb_OUT_done();
}
P0=COM_Tab;
P2=SEG_Tab];
delay_ms(5);
Num++;
if(Num==8)
{
Num=0;
}
}
}
阿杰爱学单片机
发表于 2024-8-28 16:52:16
本帖最后由 阿杰爱学单片机 于 2024-8-28 17:00 编辑
第十一集 定时器学习记录
定时器的作用与意义
能提高CPU执行效率,精确定时。
当程序中有长时间delay的时候,程序就会卡在delay哪里,影响程序的执行,而如果有了定时器,可以用定时器定时替换掉,长时间的delay,比如按键检测。
定时器的工作原理及配置
1.选择要配置的定时器如T0、T1配置TMOD对应的定时器
2.TMOD的配置,就拿T0比喻,
第1位GETE位,置1开启定时或计数由外部加TR0决定为零TR0单独决定开启如下图
第2位C/T选择位,C为计数器,T为定时器,置1选择定时器,置0选择计数器
第3位和第4位一起的如下图
3.AUXR的配置,可以设置定时器分频或者不分频,默认为12分频(12个脉冲加一)
也可以设置成不分频,将AUXR中的对应定时器置一可以写成AUXR|=0x80;(定时器0)
4.TCON配置,设置定时器0开启TR0=1;设置定时器0中断开启ET0=1;TCON中还有个中断标志位寄存器中断溢出自动置1,硬件自动清零。
5.中断使能寄存器,配置EA=1,开启总中断
6.配置TL0,TH0,就是一堆计算然后赋值给这两个寄存器,具体就不多说了(还是建议直接生成,知道这两个寄存器就好,自动生成又快又准确)
6.中断服务函数的书写,void XXX( )interrupt 1
后面这个interrupt 1 是中断服务函数的固定格式,这个1是中断号具体如下
当然,最简单的方法就是STC—ISP自动生成!
阿杰爱学单片机
发表于 2024-8-28 19:58:25
本帖最后由 阿杰爱学单片机 于 2024-8-28 20:00 编辑
第十二集 计数器
计数器的应用,在需要计数的场合,比如测速
结合上集学到的定时器的代码做一些小改动,就能改成计数器了
学的有点晕了,为啥要开启内部上拉电阻
还有就是计数器引脚能改吗
我才知道还有这种问题,不能用这些字
阿杰爱学单片机
发表于 2024-8-28 20:50:02
第十三集 简易多任务上
这节时间不长但是有很多知识点,学累了给点鼓励兄弟萌{:4_164:}
1.代码快捷方式
KEIll左下角第四个TEMP,点击设置想要的代码,即可快捷使用
2.规范模块化编程
让思路更清晰,代码简洁明了,别人更容易读懂
3.enxtrn修饰符的应用
当你需要在别的文件调用另一个文件的变量的时候就可以enxtrnXX变量名,就可以调用了
4.if.elseif的应用
多个条件需要判断且可多个条件成立就可以用if..if..if
多个条件但只有一个条件成立就行就用 if..else if....else if
5.static修饰符的应用
static静态的变量,相当于全局变量
我们都知道一个函数执行的时候里面的变量叫做局部变量,每次执行都会赋初值
若你不想每次进函数给变量赋初值就用staticXX类型名 XX变量名
6.宏定义的使用
当我们定义引脚的时候就可以用宏定义,一是可读性更高,改个名字便于理解
而是移植程序更加便捷,改引脚就只用修改宏定义即可不用一个个更改