oce4n 发表于 2024-3-6 14:46:08

第七集 下,展现了按键控制灯的用法,寄存器操作,运算符算法的使用,跟着一步一步做还是比较有成就感的。

oce4n 发表于 2024-3-6 16:03:23

第八集上,蜂鸣器实战
模仿电磁炉功能项目实战还是比较贴近生活,大家都用过电磁炉都能知道要达到什么效果。冲哥写的非常详细,无论原理功能注释非常细心,学起来很清晰。
unsigned char pw_flag=0;//开关机标志位 0关 1开
unsigned char Run_Mode=0; // 模式选择标志位 0-8 0为无模式
void delay1ms(unsigned int k)   //延时1ms函数,k等于多少就延时多少ms
{
    unsigned int a,b,c,d;
        for(d=0;d<k;d++)
      for(c=1;c>0;c--)
            for(b=50;b>0;b--)
                for(a=2;a>0;a--);
}                                                                  

void Test(void)
{
                if(K2==0)
                {
                delay1ms(10);
                if(K2==0)
                {
                        while(K2==0);//按键按下,等待松开
                        //***************************************未开机执行的操作**********************
                       
                        if(pw_flag==0)//如果没开机
                        {
                                pw_flag =1;//开机标志
                        Beep=0;                                //蜂鸣器开
                        delay1ms(10);
                        Beep=1;                                        //蜂鸣器关
                        P1 = 0x00;                                //自检灯全开
                        delay1ms(200);
                        P1 = 0xff;                                //关灯
                }else//开机时候 执行关机
                        {
                                pw_flag=0;
                        Beep=0;
                        delay1ms(10);
                        Beep=1;
                        P1 = 0xff;
                                Run_Mode=0;
                        }
        }
}
                if(pw_flag==1)
                {
                if(K3==0)
                {
                delay1ms(10);
                if(K3==0)
                {
                        while(K3==0);
                        Beep=0;
                        delay1ms(10);
                        Beep=1;
                        Run_Mode++;
                        if(Run_Mode>8)
                                Run_Mode=1;
                        P1 = ~(1<<(Run_Mode-1));
                }
        }
}

}附上部分代码

oce4n 发表于 2024-3-7 09:18:50

跟写了一节课,虽然项目比较简单,但是编写的逻辑没有冲哥那么清晰,好多东西考虑的不全面,加油多向冲哥学习;


void Test(void)
{
                        if(K2==0)
                        {
                        delay1ms(10);
                        if(K2==0)
                        {
                                //***************************************未开机执行的操作**********************
                               
                                if(pw_flag==0)//如果没开机
                                {
                                        pw_flag =1;//开机标志
                                Beep=0;                                //蜂鸣器开
                                delay1ms(10);
                                Beep=1;                                        //蜂鸣器关
                                P1 = 0x00;                                //自检灯全开
                                delay1ms(200);
                                P1 = 0xff;                                //关灯
                               
                        }else//开机时候 执行关机
                                {
                                       
                                Beep=0;
                                delay1ms(10);
                                Beep=1;
                                P1 = 0xff;
                                        pw_flag=0;
                                        Run_Mode=0;
                                        led_b=0;//运行模式改成停止
                                }
                                while(K2==0);//按键按下,等待松开
                }
        }
        if(pw_flag==1)//在开机状态下
        {
                if(K3==0)//按键3模式选择
                {
                        delay1ms(10);
                        if(K3==0)
                        {
                                if(led_b==0)
                                {
                                        Beep=0;
                                        delay1ms(10);
                                        Beep=1;
                                        Run_Mode++;
                                                if(Run_Mode>8)//模式大于8
                                                Run_Mode=1; //回到模式一
                                        P1 = ~(1<<(Run_Mode-1));
                                }while(K3==0);//按键3按下并等待松开
                        }
                }
               
                if(K4==0)//确认,启动
                {
                        delay1ms(10);
                        if(K4==0)
                        {
                               
                                if(Run_Mode>0)
                                {
                                        Beep=0;
                                        delay1ms(10);
                                        Beep=1;
                                        led_b=!led_b;
                                }while(K4==0);
                        }
                }
               
                if(led_b==1)
                {
                        P1=0xff;
                        delay1ms(200);
                        P1 = ~(1<<(Run_Mode-1));
                        delay1ms(200);
                }
                else
                {
                        P1 = ~(1<<(Run_Mode-1));
                }
        }
}

oce4n 发表于 2024-3-7 10:17:20

第九集 ,认识数码管 有共阴极数码管和共阳极数码管

void main()
{
unsigned char num=0;
        while(1)
        {
                L1=0;
                L2=0;
                L4=0;
                P0=NixieTable;
                if(K2==0)
                {
                        Delay1ms(10);
                        if(K2==0)
                        {
                                Beep=0;
                                Delay1ms(10);
                                Beep=1;
                                while(K2==0);//按下等待松开
                                if(num<9)
                                {num++;}//数字加
                        }
                }
                                if(K3==0)
                {
                        Delay1ms(10);
                        if(K3==0)
                        {
                                Beep=0;
                                Delay1ms(10);
                                Beep=1;
                                while(K3==0);
                                if(num>0)
                                {num--;}//数字减
                        }
                }
        }
}

李鑫发 发表于 2024-3-7 11:12:57

小伙子,加油

oce4n 发表于 2024-3-7 14:41:14

本帖最后由 oce4n 于 2024-3-7 14:52 编辑

第十集 数码管动态控制和原理,
这集逻辑没跟上,看了两遍才跟上,这集不懂的地方是这段算法取个位十位百位
Show_Tab=TimCNT/10000%10;
Show_Tab=TimCNT/1000%10+10;
Show_Tab=TimCNT/100%10;
Show_Tab=TimCNT/10%10;
附上数码管动态显示计时器的代码,好让自己温故而知新
因为我这个小开发板只有四位数码管,所以根据冲哥的思路改动了一下,也是可以实现的。
#include <REGX52.H>

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
unsigned char Show_Tab={0,0,0,0};
unsigned long TimCNT = 0;//变量计次
unsigned char num=0;
bit Run_Sta = 0;//开始运行标志
sbit L1=P2^4;
sbit L2=P2^5;
sbit L3=P2^6;
sbit L4=P2^7;
sbit K2=P3^4;
sbit K3=P3^5;
sbit Beep=P2^3;
void Delay1ms(unsigned char xms)      //@11.0592MHz
{
      unsigned char data i, j;
while(xms--)
{

      i = 2;
      j = 199;
      do
      {
                while (--j);
      } while (--i);
}
}

void NiXie(unsigned char i)
{
      switch(i){
                case 0:
                                                L1=1;L2=0;L3=0;L4=0;break;
                case 1:
                                                L1=0;L2=1;L3=0;L4=0;break;
                case 2:
                                                L1=0;L2=0;L3=1;L4=0;break;
                case 3:
                                                L1=0;L2=0;L3=0;L4=1;break;                        
                }

               
}
void Show_Fre(void)
{
                                                NiXie(num);
                                        P0=NixieTable];
                                        Delay1ms(1);
                                        num++;
                                        if(num>3)
                                        num=0;
}
void main()
{

      while(1)
      {
      

                if(Run_Sta==1)
                {      TimCNT++;
                        Show_Tab=TimCNT/10000%10;
                        Show_Tab=TimCNT/1000%10+10;
                        Show_Tab=TimCNT/100%10;
                        Show_Tab=TimCNT/10%10;
                }
Show_Fre();
                if(K2==0)
                {
                        Delay1ms(10);
                        if(K2==0)
                        {
                              Beep=0;
                              Delay1ms(10);
                              Beep=1;
                              while(K2==0){
Show_Fre();
                                        }
                              if(Run_Sta==0)
                                        TimCNT=0;
                              Run_Sta = !Run_Sta;
                        }
                }
      }
}


oce4n 发表于 2024-3-7 15:27:54

李鑫发 发表于 2024-3-7 11:12
小伙子,加油

谢谢,我会继续努力的

oce4n 发表于 2024-3-8 14:50:13

第十一集,定时器的作用和意义
定时器是定时器和计数器的统称。
冲哥通过变速车讲解了12分频和不分频原理,举的例子非常贴近生活。冲哥先带我们通过查手册来配置定时器 ,优化了上节课计时器程序。后面用通过我们STC-ISP这个软件来配置自动生成定时器的代码,非常方便,节省了查手册的时间;STC-ISP软件集成的功能太多了,点赞
void Timer0_Init(void)                //1毫秒@11.0592MHz
{
//        AUXR &= 0x7F;                        //定时器时钟12T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x66;                                //设置定时初始值
        TH0 = 0xFC;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
        EA=1;
}
void Timer0_Isr(void) interrupt 1
{
        Show_Fre();
                        if(Run_Sta==1)
                {        TimCNT++;
                        Show_Tab=TimCNT/10000%10;
                        Show_Tab=TimCNT/1000%10+10;
                        Show_Tab=TimCNT/100%10;
                        Show_Tab=TimCNT/10%10;
                }
}


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



oce4n 发表于 2024-3-12 10:40:02

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


soma 发表于 2024-3-12 11:35:51

进来学习下
页: 1 [2] 3 4
查看完整版本: 【实验箱已收到】STC32位8051单片机_学习打卡心得