找回密码
 立即注册
楼主: oce4n

【实验箱已收到】STC32位8051单片机_学习打卡心得

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-6 14:46:08 | 显示全部楼层
第七集 下,展现了按键控制灯的用法,寄存器操作,运算符算法的使用,跟着一步一步做还是比较有成就感的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-6 16:03:23 | 显示全部楼层
第八集上,蜂鸣器实战
模仿电磁炉功能项目实战还是比较贴近生活,大家都用过电磁炉都能知道要达到什么效果。冲哥写的非常详细,无论原理功能注释非常细心,学起来很清晰。
  1. unsigned char pw_flag=0;  //开关机标志位 0关 1开
  2. unsigned char Run_Mode=0; // 模式选择标志位 0-8 0为无模式
  3. void delay1ms(unsigned int k)   //延时1ms函数,k等于多少就延时多少ms
  4. {
  5.     unsigned int a,b,c,d;
  6.         for(d=0;d<k;d++)
  7.         for(c=1;c>0;c--)
  8.             for(b=50;b>0;b--)
  9.                 for(a=2;a>0;a--);
  10. }                                                                  
  11. void Test(void)
  12. {
  13.                 if(K2==0)
  14.                 {
  15.                 delay1ms(10);
  16.                 if(K2==0)
  17.                 {
  18.                         while(K2==0);//按键按下,等待松开
  19.                         //***************************************未开机执行的操作**********************
  20.                        
  21.                         if(pw_flag==0)//如果没开机
  22.                         {
  23.                                 pw_flag =1;//开机标志
  24.                         Beep=0;                                //蜂鸣器开
  25.                         delay1ms(10);
  26.                         Beep=1;                                        //蜂鸣器关
  27.                         P1 = 0x00;                                //自检灯全开
  28.                         delay1ms(200);
  29.                         P1 = 0xff;                                //关灯
  30.                 }else//开机时候 执行关机
  31.                         {
  32.                                 pw_flag=0;
  33.                         Beep=0;
  34.                         delay1ms(10);
  35.                         Beep=1;
  36.                         P1 = 0xff;
  37.                                 Run_Mode=0;
  38.                         }
  39.         }
  40. }
  41.                 if(pw_flag==1)
  42.                 {
  43.                 if(K3==0)
  44.                 {
  45.                 delay1ms(10);
  46.                 if(K3==0)
  47.                 {
  48.                         while(K3==0);
  49.                         Beep=0;
  50.                         delay1ms(10);
  51.                         Beep=1;
  52.                         Run_Mode++;
  53.                         if(Run_Mode>8)
  54.                                 Run_Mode=1;
  55.                         P1 = ~(1<<(Run_Mode-1));
  56.                 }
  57.         }
  58. }
  59. }
复制代码
附上部分代码

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-7 09:18:50 | 显示全部楼层
跟写了一节课,虽然项目比较简单,但是编写的逻辑没有冲哥那么清晰,好多东西考虑的不全面,加油多向冲哥学习;


  1. void Test(void)
  2. {
  3.                         if(K2==0)
  4.                         {
  5.                         delay1ms(10);
  6.                         if(K2==0)
  7.                         {
  8.                                 //***************************************未开机执行的操作**********************
  9.                                
  10.                                 if(pw_flag==0)//如果没开机
  11.                                 {
  12.                                         pw_flag =1;//开机标志
  13.                                 Beep=0;                                //蜂鸣器开
  14.                                 delay1ms(10);
  15.                                 Beep=1;                                        //蜂鸣器关
  16.                                 P1 = 0x00;                                //自检灯全开
  17.                                 delay1ms(200);
  18.                                 P1 = 0xff;                                //关灯
  19.                                
  20.                         }else//开机时候 执行关机
  21.                                 {
  22.                                        
  23.                                 Beep=0;
  24.                                 delay1ms(10);
  25.                                 Beep=1;
  26.                                 P1 = 0xff;
  27.                                         pw_flag=0;
  28.                                         Run_Mode=0;
  29.                                         led_b=0;//运行模式改成停止
  30.                                 }
  31.                                 while(K2==0);//按键按下,等待松开
  32.                 }
  33.         }
  34.         if(pw_flag==1)//在开机状态下
  35.         {
  36.                 if(K3==0)//按键3模式选择
  37.                 {
  38.                         delay1ms(10);
  39.                         if(K3==0)
  40.                         {
  41.                                 if(led_b==0)
  42.                                 {
  43.                                         Beep=0;
  44.                                         delay1ms(10);
  45.                                         Beep=1;
  46.                                         Run_Mode++;
  47.                                                 if(Run_Mode>8)//模式大于8
  48.                                                 Run_Mode=1; //回到模式一
  49.                                         P1 = ~(1<<(Run_Mode-1));
  50.                                 }while(K3==0);//按键3按下并等待松开
  51.                         }
  52.                 }
  53.                
  54.                 if(K4==0)//确认,启动
  55.                 {
  56.                         delay1ms(10);
  57.                         if(K4==0)
  58.                         {
  59.                                
  60.                                 if(Run_Mode>0)
  61.                                 {
  62.                                         Beep=0;
  63.                                         delay1ms(10);
  64.                                         Beep=1;
  65.                                         led_b=!led_b;
  66.                                 }while(K4==0);
  67.                         }
  68.                 }
  69.                
  70.                 if(led_b==1)
  71.                 {
  72.                         P1=0xff;
  73.                         delay1ms(200);
  74.                         P1 = ~(1<<(Run_Mode-1));
  75.                         delay1ms(200);
  76.                 }
  77.                 else
  78.                 {
  79.                         P1 = ~(1<<(Run_Mode-1));
  80.                 }
  81.         }
  82. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-7 10:17:20 | 显示全部楼层
第九集 ,认识数码管 有共阴极数码管和共阳极数码管

  1. void main()
  2. {
  3. unsigned char num=0;
  4.         while(1)
  5.         {
  6.                 L1=0;
  7.                 L2=0;
  8.                 L4=0;
  9.                 P0=NixieTable[num];
  10.                 if(K2==0)
  11.                 {
  12.                         Delay1ms(10);
  13.                         if(K2==0)
  14.                         {
  15.                                 Beep=0;
  16.                                 Delay1ms(10);
  17.                                 Beep=1;
  18.                                 while(K2==0);//按下等待松开
  19.                                 if(num<9)
  20.                                 {num++;}//数字加
  21.                         }
  22.                 }
  23.                                 if(K3==0)
  24.                 {
  25.                         Delay1ms(10);
  26.                         if(K3==0)
  27.                         {
  28.                                 Beep=0;
  29.                                 Delay1ms(10);
  30.                                 Beep=1;
  31.                                 while(K3==0);
  32.                                 if(num>0)
  33.                                 {num--;}//数字减
  34.                         }
  35.                 }
  36.         }
  37. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:292
  • 最近打卡:2025-05-07 00:45:08
已绑定手机

2

主题

183

回帖

1254

积分

金牌会员

积分
1254
发表于 2024-3-7 11:12:57 | 显示全部楼层
小伙子,加油
不抛弃,不放弃
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-7 14:41:14 | 显示全部楼层
本帖最后由 oce4n 于 2024-3-7 14:52 编辑

第十集 数码管动态控制和原理,
这集逻辑没跟上,看了两遍才跟上,这集不懂的地方是这段算法取个位十位百位
  1. Show_Tab[0]=TimCNT/10000%10;
  2. Show_Tab[1]=TimCNT/1000%10+10;
  3. Show_Tab[2]=TimCNT/100%10;
  4. Show_Tab[3]=TimCNT/10%10;
复制代码
[K`{@7(T1JN$]$ZUDD)30KG.png
附上数码管动态显示计时器的代码,好让自己温故而知新
因为我这个小开发板只有四位数码管,所以根据冲哥的思路改动了一下,也是可以实现的。
  1. #include <REGX52.H>
  2. //数码管段码表
  3. unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
  4. unsigned char Show_Tab[5]={0,0,0,0};
  5. unsigned long TimCNT = 0;//变量计次
  6. unsigned char num=0;
  7. bit Run_Sta = 0;//开始运行标志
  8. sbit L1=P2^4;
  9. sbit L2=P2^5;
  10. sbit L3=P2^6;
  11. sbit L4=P2^7;
  12. sbit K2=P3^4;
  13. sbit K3=P3^5;
  14. sbit Beep=P2^3;
  15. void Delay1ms(unsigned char xms)        //@11.0592MHz
  16. {
  17.         unsigned char data i, j;
  18. while(xms--)
  19. {
  20.         i = 2;
  21.         j = 199;
  22.         do
  23.         {
  24.                 while (--j);
  25.         } while (--i);
  26. }
  27. }
  28. void NiXie(unsigned char i)
  29. {
  30.         switch(i){
  31.                 case 0:
  32.                                                 L1=1;L2=0;L3=0;L4=0;break;
  33.                 case 1:
  34.                                                 L1=0;L2=1;L3=0;L4=0;break;
  35.                 case 2:
  36.                                                 L1=0;L2=0;L3=1;L4=0;break;
  37.                 case 3:
  38.                                                 L1=0;L2=0;L3=0;L4=1;break;                        
  39.                 }
  40.                
  41. }
  42. void Show_Fre(void)
  43. {
  44.                                                 NiXie(num);
  45.                                         P0=NixieTable[Show_Tab[num]];
  46.                                         Delay1ms(1);
  47.                                         num++;
  48.                                         if(num>3)
  49.                                         num=0;
  50. }
  51. void main()
  52. {
  53.         while(1)
  54.         {
  55.         
  56.                 if(Run_Sta==1)
  57.                 {        TimCNT++;
  58.                         Show_Tab[0]=TimCNT/10000%10;
  59.                         Show_Tab[1]=TimCNT/1000%10+10;
  60.                         Show_Tab[2]=TimCNT/100%10;
  61.                         Show_Tab[3]=TimCNT/10%10;
  62.                 }
  63. Show_Fre();
  64.                 if(K2==0)
  65.                 {
  66.                         Delay1ms(10);
  67.                         if(K2==0)
  68.                         {
  69.                                 Beep=0;
  70.                                 Delay1ms(10);
  71.                                 Beep=1;
  72.                                 while(K2==0){
  73. Show_Fre();
  74.                                         }
  75.                                 if(Run_Sta==0)
  76.                                         TimCNT=0;
  77.                                 Run_Sta = !Run_Sta;
  78.                         }
  79.                 }
  80.         }
  81. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-7 15:27:54 | 显示全部楼层

谢谢,我会继续努力的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-8 14:50:13 | 显示全部楼层
第十一集,定时器的作用和意义
定时器是定时器和计数器的统称。
冲哥通过变速车讲解了12分频和不分频原理,举的例子非常贴近生活。冲哥先带我们通过查手册来配置定时器 ,优化了上节课计时器程序。后面用通过我们STC-ISP这个软件来配置自动生成定时器的代码,非常方便,节省了查手册的时间;STC-ISP软件集成的功能太多了,点赞
  1. void Timer0_Init(void)                //1毫秒@11.0592MHz
  2. {
  3. //        AUXR &= 0x7F;                        //定时器时钟12T模式
  4.         TMOD &= 0xF0;                        //设置定时器模式
  5.         TL0 = 0x66;                                //设置定时初始值
  6.         TH0 = 0xFC;                                //设置定时初始值
  7.         TF0 = 0;                                //清除TF0标志
  8.         TR0 = 1;                                //定时器0开始计时
  9.         ET0 = 1;                                //使能定时器0中断
  10.         EA=1;
  11. }
  12. void Timer0_Isr(void) interrupt 1
  13. {
  14.         Show_Fre();
  15.                         if(Run_Sta==1)
  16.                 {        TimCNT++;
  17.                         Show_Tab[0]=TimCNT/10000%10;
  18.                         Show_Tab[1]=TimCNT/1000%10+10;
  19.                         Show_Tab[2]=TimCNT/100%10;
  20.                         Show_Tab[3]=TimCNT/10%10;
  21.                 }
  22. }
复制代码


最后附上定时器定时1ms的代码,不知道为啥我的stc89c52定时1ms来刷新数码管,数码管在闪烁我就能看见。用延时就没有闪烁;



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:115
  • 最近打卡:2025-04-30 15:18:16
已绑定手机

1

主题

36

回帖

86

积分

注册会员

积分
86
发表于 2024-3-12 10:40:02 | 显示全部楼层
第十二集,计数器的作用和定义
通过手册配置计数器1。2017电子设计大赛的题目
涉及M法测速,又叫频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。设编码器单圈总脉冲数为C,时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为 n=M0/CT0
主要是配置计数器的过程


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:428
  • 最近打卡:2025-05-07 00:13:45
已绑定手机

19

主题

3195

回帖

4950

积分

论坛元老

积分
4950
发表于 2024-3-12 11:35:51 来自手机 | 显示全部楼层
进来学习下
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-7 19:31 , Processed in 0.129054 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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