找回密码
 立即注册

杰哥的32G12K128学习记录【已送试验箱】

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:204
  • 最近打卡:2025-04-30 11:23:45

2

主题

65

回帖

168

积分

注册会员

积分
168
发表于 2024-8-27 10:57:21 | 显示全部楼层
阿杰爱*** 发表于 2024-8-24 22:10
这个单片机最高不是48MHZ吗为啥选24

安全
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 2024-8-27 13:27:02 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 2024-8-27 19:33:01 | 显示全部楼层
第八集 学习记录

这集讲到了蜂鸣器的应用,以及实战电磁炉

蜂鸣器分为有源和无源
区别就是内部是否带了振荡器,有源的内部置有振荡器,无源没有

下面是我写的代码对比与冲哥的有点不同,具体也调试了一些时间
这次没有太多的想法,具体就是有很多逻辑
比如开关机模式状态清零,模式次数清零
就是要理清楚逻辑,慢慢调试
  1. #define Key1 P35
  2. #define Key2 P34
  3. #define Key3 P33
  4. #define Buzzer P50
  5. bit ON_OFF=1;
  6. bit ModeON_OFF=1;
  7. u8 Count;
  8. void Test1(void)
  9. {
  10.         if(Key1 == 0)                                //如果按键1按下
  11.         {
  12.                 delay_ms(10);                        //延时消抖
  13.                 while(Key1 ==  0);//如果按键1按下死循环,等待松手
  14.                 delay_ms(10);                        //延时消抖
  15.                 //-----------------------------------
  16.                 if(ON_OFF==1)
  17.                 {
  18.                         Buzzer = 0;  
  19.                         printf("蜂鸣器响了%\r\n");   
  20.                         delay_ms(10);        //蜂鸣器响10毫秒
  21.                         Buzzer = 1;
  22.                        
  23.                         P2=0x00;
  24.                         delay_ms(200);//所有LED点亮200毫秒
  25.                         P2=0xff;
  26.                        
  27.                         ON_OFF=!ON_OFF;//开关机状态取反
  28.                        
  29.                         Count=0;             //Key2按下次数清零
  30.                         ModeON_OFF=1;  //模式启动停止
  31.                         printf("按键1按下 开机%\r\n");//打印开关机状态
  32.                 }
  33.                 else if(ON_OFF==0)
  34.                 {
  35.                         Buzzer = 0;  
  36.                         printf("蜂鸣器响了%\r\n");   
  37.                         delay_ms(10);        //蜂鸣器响10毫秒
  38.                         Buzzer = 1;
  39.                        
  40.                         P2=0xff;//熄灭所有LED
  41.                        
  42.                         ON_OFF=!ON_OFF;//开关机状态取反
  43.                         printf("按键1按下 关机%\r\n");
  44.                 }
  45.         }
  46.         //--------------如果开机执行以下代码---------------------
  47.         if(ON_OFF==0)
  48.         {
  49.                 if(ModeON_OFF==1)//如果没有启动模式,才可以切换模式
  50.                 {
  51.                         if(Key2 == 0)                                //如果按键2按下
  52.                         {
  53.                                 delay_ms(10);                        //延时消抖
  54.                                 while(Key2 ==  0);//如果按键2按下死循环,等待松手
  55.                                 delay_ms(10);                        //延时消抖
  56.                                
  57.                                 Buzzer = 0;  
  58.                                 printf("蜂鸣器响了%\r\n");   
  59.                                 delay_ms(10);        //蜂鸣器响10毫秒
  60.                                 Buzzer = 1;
  61.                                
  62.                                 P2=~(0x01<<Count++);//LED左移
  63.                                 if(Count==9)Count=1;//按下次数模式加一模式等于八模式等于1
  64.                                 printf("按键2按下 模式:%u\r\n",Count);//打印选择的模式
  65.                         }
  66.                 }
  67.                 if(Key3 == 0)                                //如果按键3按下
  68.                 {
  69.                         delay_ms(10);                        //延时消抖
  70.                         while(Key3 ==  0);//如果按键3按下死循环,等待松手
  71.                         delay_ms(10);                        //延时消抖
  72.                         printf("按键3按下 执行模式:%u\r\n",Count);//打印选择的模式
  73.                         ModeON_OFF=!ModeON_OFF;//按键按下模式状态取反
  74.                 }
  75.                 if(ModeON_OFF==0)//模式启动LED闪烁
  76.                 {
  77.                         P2=~(0x01<<Count-1);
  78.                         delay_ms(200);
  79.                         P2=0xff;
  80.                         delay_ms(200);
  81.                 }
  82.                 else//没有模式启动对应的灯点亮
  83.                 {
  84.                         P2=~(0x01<<Count-1);
  85.                 }
  86.         }
  87.         //--------------------------
  88. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 2024-8-27 22:19:14 | 显示全部楼层
本帖最后由 阿杰爱学单片机 于 2024-8-27 22:23 编辑

第九集 数码管学习记录(上)

数码管介绍
数码管本质就是由LED组成的,每一段笔画一个LED,有一位和多位数码管
数码管又分为共阳极和共阴极,共阳极顾名思义,将数码管中的8个LED阳极接在一起,共阴极道理也一样。
QQ图片991.jpg
数码管的应用
选中数码管的COM端,输出高或低电平选中对应数码管(高低电平由共阳极共阴极决定)
然后在对应端口输出断码即可显示


下面是我自己焊的数码管,不知道为啥显示有点小瑕疵
没有选中的端口也会亮一点点



QQ图片992.jpg QQ图片994.jpg





QQ图993.jpg

5-1数码管静态显示 - 副本.zip

110.23 KB, 下载次数: 62

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-09 00:28:12
已绑定手机

35

主题

2111

回帖

2263

积分

荣誉版主

积分
2263
发表于 2024-8-27 22:51:05 | 显示全部楼层
阿杰爱*** 发表于 2024-8-24 22:10
这个单片机最高不是48MHZ吗为啥选24

单片机的速度本着够用就好为原则,除了性能还要兼顾芯片功耗和外设的配合,不一定是越快越好。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 2024-8-28 05:56:50 | 显示全部楼层
晓*** 发表于 2024-8-27 22:51
单片机的速度本着够用就好为原则,除了性能还要兼顾芯片功耗和外设的配合,不一定是越快越好。 ...

我之前以为,越快越好,越快就越强
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 2024-8-28 07:08:03 | 显示全部楼层
本帖最后由 阿杰爱学单片机 于 2024-8-28 07:13 编辑

第十集 数码管的动态显示

动态显示原理
取数码管公共端COM输出高电平,其余COM端输出低电平
再在断码端口输出断码,
依次循环,并延时1ms,利用人眼视觉暂留,就可以看到显示多位数了
为啥一定是一ms,不太了解2ms,或者500微秒不行吗
QQ图片12312.jpg
前几节的没有弄明白补一下数组
数组格式
变量类型 XX数组名[数组大小]={数组内容};
应用数组的方法,数组名[索引];索引就是数组内每位数的序号,数组从0开始

冲哥教的数组嵌套 数组名[数组名[索引]];感觉像套娃

下面是我写的代码,应该没问题,昨天那个数码管,不知道咋了用不了,就没用了

  1. u8 Num;
  2. SEG_Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  3. COM_Tab[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  4. SEG_BUFF[]={1,2,3,4,5,6,7,8};
  5. void main(void)      //主函数(程序从这里执行)
  6. {
  7.         SYS_Init();                                        // STC32初始化
  8.         MyUSB_Init();                                //USB初始化
  9.         GPIO_Init();                                //IO口初始化
  10.         while(1)
  11.         {
  12.                 if( DeviceState != DEVSTATE_CONFIGURED )         //
  13.                         continue;
  14.                 if( bUsbOutReady )                                                               
  15.                 {
  16.                         usb_OUT_done();
  17.                 }
  18.                
  19.                 P0=COM_Tab[Num];
  20.                 P2=SEG_Tab[SEG_BUFF[Num]];
  21.                 delay_ms(5);
  22.                 Num++;
  23.                 if(Num==8)
  24.                 {
  25.                         Num=0;
  26.                 }
  27.         }
  28. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 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单独决定开启如下图
QQ图片11集2.jpg
第2位C/T选择位,C为计数器,T为定时器,置1选择定时器,置0选择计数器
第3位和第4位一起的如下图
QQ图片11集.jpg
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是中断号具体如下
QQ图片11集3.jpg
当然,最简单的方法就是STC—ISP自动生成!




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 2024-8-28 19:58:25 | 显示全部楼层
本帖最后由 阿杰爱学单片机 于 2024-8-28 20:00 编辑

第十二集 计数器

计数器的应用,在需要计数的场合,比如测速
结合上集学到的定时器的代码做一些小改动,就能改成计数器了

学的有点晕了,为啥要开启内部上拉电阻
还有就是计数器引脚能改吗

QQ图片aadd.jpg

我才知道还有这种问题,不能用这些字
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:130
  • 最近打卡:2025-05-07 18:17:53

13

主题

164

回帖

375

积分

中级会员

积分
375
发表于 2024-8-28 20:50:02 | 显示全部楼层
第十三集 简易多任务上

这节时间不长但是有很多知识点,学累了给点鼓励兄弟萌

1.代码快捷方式
KEIll左下角第四个TEMP,点击设置想要的代码,即可快捷使用

2.规范模块化编程
让思路更清晰,代码简洁明了,别人更容易读懂

3.enxtrn修饰符的应用
当你需要在别的文件调用另一个文件的变量的时候就可以enxtrnXX变量名,就可以调用了

4.if.elseif的应用
多个条件需要判断且可多个条件成立就可以用if..if..if
多个条件但只有一个条件成立就行就用 if..else if....else if

5.static修饰符的应用
static静态的变量,相当于全局变量
我们都知道一个函数执行的时候里面的变量叫做局部变量,每次执行都会赋初值
若你不想每次进函数给变量赋初值就用static  XX类型名 XX变量名

6.宏定义的使用
当我们定义引脚的时候就可以用宏定义,一是可读性更高,改个名字便于理解
而是移植程序更加便捷,改引脚就只用修改宏定义即可不用一个个更改
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-9 09:38 , Processed in 0.131023 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表