15614423926 发表于 2023-5-24 22:22:22

冲哥8051实验箱-STC32G12K128

本帖最后由 15614423926 于 2023-6-26 08:59 编辑

第八集作业:

程序不复杂,但是也调了好久,主要还得是仔细,细心,静下心来,切要浮躁!


void Test(void)                //电磁炉的功能
{
/*----------------------------------------------------------------------------*/
      if(KEY1 == 0)      //开关按键
      {
                delay_ms(10);
                if(KEY1 == 0)
                {
                        while(KEY1 == 0);                //按钮按下,并等待按钮松开
                        
/*-------------------------------还没有开机时,执行开机功能--------------------*/
                        if(Run_Flag == 0)                //如果还没开机
                        {
                              Run_Flag = 1;                //开机变量改为1,表示已经开机
                              BEEP = 0;                        //打开蜂鸣器
                              delay_ms(2000);
                              BEEP = 1;                        //关闭蜂鸣器
                              P2 = 0;                              //LED全部点亮
                              delay_ms(500);
                              P2 = 0xFF;                              //LED全部关闭
                        }
                        
/*-------------------------------已经开机时,执行关机功能--------------------*/
                        else
                        {
                              Run_Flag = 0;
                              BEEP = 0;                        //打开蜂鸣器
                              delay_ms(2000);
                              BEEP = 1;                        //关闭蜂鸣器
                              P2 = 0;                              //LED全部点亮
                              delay_ms(500);
                              P2 = 0xFF;                        //LED全部关闭
                              Run_Mode = 0;                //模式清0
                              Run_Now = 0;                //工作状态清0
                        }
                }
      }
/*----------------------------------------------------------------------------*/
      if(KEY2 == 0)      //功能按键
      {
                delay_ms(10);
                if(KEY2 == 0)
                {
                        while(KEY2 == 0);                //按钮按下,并等待按钮松开
                        
/*-------------------------------已经开机时,执行功能跳变--------------------*/
                        if(Run_Now == 0)
                        {
                              BEEP = 0;                        //打开蜂鸣器
                              delay_ms(100);
                              BEEP = 1;                        //关闭蜂鸣器
                              Run_Mode++;                        //模式选择
                              
                              if(Run_Mode > 8)      //如果模式大于8
                              Run_Mode = 1;                //回到模式1
                              
                              P2 =~(1 << (Run_Mode-1));      //1<<10000 0001 -> 1111 1110
                        }
                }
      }
      
/*--------------------------------功能开始停止执行------------------------*/      
      if(KEY3 == 0)      //功能开始暂停按键
      {
                delay_ms(10);
                if(KEY3 == 0)
                {
                        
                        if(Run_Mode > 0)                              //已经选择了模式
                        {
                              BEEP = 0;                              //打开蜂鸣器
                              delay_ms(100);
                              BEEP = 1;                              //关闭蜂鸣器
                              
                              Run_Now = !Run_Now;         //运行停止间切换
                        }
                        while(KEY3 == 0);
                }
                delay_ms(10);
      }
/*
模式                        Run_Mode-1                         1 << (Run_Mode-1)         ~(1 << (Run_Mode-1))
      1                        0                              0000 0001                        1111 1110                        FE
      2                        1                              0000 0010                        1111 1101                        FD
      3                        2                              0000 0100                        1111 1011                        FB
      4                        3                              0000 1000                        1111 0111                        F7
      5                        4                              0001 0000                        1110 1111                        EF
      6                        5                              0010 0000                        1101 1111                        DF
      7                        6                              0100 0000                        1011 1111                        BF
      8                        7                              1000 0000                        0111 1111                        7F
*/

      if(Run_Now == 1)      //正在运行
      {
                P2 = 0xFF;
                delay_ms(300);
                P2 =~(1 << (Run_Mode-1));
                delay_ms(300);
      }
      else                              //停止运行
      {
                P2 =~(1 << (Run_Mode-1));
      }
      
}
第九集数码管的静态使用:
主要掌握数字0-9,“.”的表示方法,以及共阴极和共阳极的区别,一般来说,数码管不会用单片机自己的io口去驱动,驱动能力有限,需要三极管的帮助,共阴极用P型三极管,共阳极用N型三极管来驱动。


P67P66P65P64P63P62P61P60十进制16进制
dpgfedcba
011000000192C0
111111001249F9
210100100164A4
310110000176B0
41001100115399
51001001014692
61000001013082
711111000248F8
81000000012880
91001000014490


第十集数码管的动态显示:




需要注意每个延时不能太短,我们这边程序就以1ms为准,且需要保证总共一个循环结束的时间不能大于20ms,因为人眼的视觉不容易分辨出50HZ以上的动态刷新

第十一集定时器的使用:
辅助寄存器:

默认是/12,12分频:




定时器所对应的模式关系:



定时器0定时器1定时器2定时器3定时器4
模式016位自动重载16位自动重载16位自动重载16位自动重载16位自动重载
模式116位不可重载16位不可重载无无无
模式28位自动重载8位自动重载无无无
模式316位自动重载(不可屏蔽)无无无无
波特率发生器
可可可可
模式选择:





开启中断:


允许T0中断:

定时器的计算公式:
其中Sysclk为系统时钟,TMOPS默认为0,为写入的数值,T为分频值,默认为12。



其中,TM0PS,定时器0时钟预分频寄存器默认值为0


经计算,14.5.1的定时器0是0.001s,即1ms


定时器和延时没有关系,在初始化定时器后,会在设定好的时间进入中断函数;
中断频率越低越好;
也可以用STC软件直接生成相关代码。
定时器0中断初始化函数:


中断执行函数:

第十二集计数器的使用:
设置中断为计数模式:

定时器1中断初始化:

做外部计数试验,需要打开内部上拉电阻


若要显示4位十进制,可定义u16类型

M法测速:


M法测速:又叫做频率测量法。
这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。
设编码器单圈总脉冲数为C, 时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为:


T法测速:又叫做周期测量法。
这种方法是建立一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间TE决定, 计数值为M1。
设编码器单圈总脉冲数为C,高频脉冲的频率为F0,则转速n的计算公式为:



现存问题,外部中断,如何配置IO参数信息!
其中,外部中断引脚已经指定好,不可指定和随意配置
P3.4为T0中断引脚
P3.5为T1中断引脚



第十三集简易多任务处理:
keil5添加预设函数头
templates右键进行添加,增加完成后,需要重新打开程序才会生效
static :
即静态变量。static指修饰符,可以用来修饰变量,也可以用来修饰函数。
如果是在函数外面定义的,那么static说明的变量可以在当前c程序文件中使用。
如果是在函数内部定义的,那么这个变量只初始化一次,即使再次调用这个函数,这个static变量也不会再次被初始化。
bdata:
c51中"bdata"是片内RAM,位寻址方式;存储器类型说明的意思

c51中"bdata"的用法:

C51中的两种位变量,除了特殊功能寄存器中的可位寻址的位外,还有位于单片机内部RAM字节。

地址0x20~0x2F的16个字节的128个可寻址位,位地址从0x00~0x7F。

比如我有一个变量:uchar(unsigned char) BData;

这是一个字节,我可以用:bdata BData=0x00;

然后用:sbit BData_0=BData^0;

sbit BData_1=BData^1;

sbit BData_2=BData^2;

……

就是把字节拆成8个位







清风予我 发表于 2023-5-26 09:33:19

楼主,后续学习经验可在此贴跟帖,加油,争取提前送您实验箱

15614423926 发表于 2023-5-27 17:25:49

STC爱好者 发表于 2023-5-26 09:33
楼主,后续学习经验可在此贴跟帖,加油,争取提前送您实验箱

ok
页: [1]
查看完整版本: 冲哥8051实验箱-STC32G12K128