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.宏定义的使用
当我们定义引脚的时候就可以用宏定义,一是可读性更高,改个名字便于理解
而是移植程序更加便捷,改引脚就只用修改宏定义即可不用一个个更改
页: 1 2 3 [4] 5
查看完整版本: 杰哥的32G12K128学习记录【已送试验箱】