找回密码
 立即注册
楼主: oc***

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

[复制链接]
  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 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. }
    复制代码
    附上部分代码

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 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. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 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. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    4 小时前
  • 签到天数: 70 天

    [LV.6]常住居民II

    2

    主题

    90

    回帖

    544

    积分

    高级会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 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. }
    复制代码


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

    积分
    301
     楼主| 发表于 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来刷新数码管,数码管在闪烁我就能看见。用延时就没有闪烁;



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    7 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    1

    主题

    32

    回帖

    301

    积分

    中级会员

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


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    1 小时前
  • 签到天数: 55 天

    [LV.5]常住居民I

    2

    主题

    517

    回帖

    655

    积分

    高级会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-29 16:32 , Processed in 0.075228 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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