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

看冲哥32位8051视频学STC32单片机,赢STC32实验箱

[复制链接]

该用户从未签到

1

主题

19

回帖

73

积分

注册会员

积分
73
 楼主| 发表于 2023-8-18 14:39:27 | 显示全部楼层
【打卡第九集】数码管的静态使用

    1、认识数码管
1.png

数码管也叫LED数码管,内部是由多个发光二极管封装在一起组成,
他们可以有很多种颜色,很多种外形,很多种样式,
但是本质来说他们都是通过点亮内部的LED来显示的,只要面板做好了,理论可以显示任意的字符或者图案。
数码管其实就是8个灯的组合,包含7个数字灯和一个标点灯。

开发板上带了两个4位数码管。

按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管,尾缀A表示共阳,K表示共阴

2.png
共阴数码管是负极接在一起,共阳数码管是正极接在一起
多位数码管其实是共阳级或共阴级有多个,其他脚全部并联,如果数码管一起点亮,则只能显示同样的数字。

    2、控制原理
       3.png   
实验箱中包含了8个数码管,并联成共阳接法,8个三极管分别有P7.0~P7.7控制。


    3、数码管实现0-9的显示

1.用数组定义0-9的内码

数码管的不同数字,其实就是程序中不同位的组合,
可以控制数码管显示数字以外的图像,使用excel去计算相应的位图。

2.尝试用延时实现0-9的循环显示

已经使用Excel算出了数码管每一个数字的显示数组,编程时直接使用数组

3.用按键控制数字的加或者减

   程序中重复递增的动作,比如控制数码管增加,
   用循环比重复代码清晰,并且不容易出错。

    4、课后练习


1.尝试使用数码管显示-   H  J    L   N   o  P   U  t  r 等字母或符号。
2.通过一个按键设置数码管显示数字0-9循环,在按一下另一个按键的时候,数码管上显示的数字几,蜂鸣器就响几声。

希望获得试验箱以尝试





回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

19

回帖

73

积分

注册会员

积分
73
 楼主| 发表于 2023-8-18 15:21:32 | 显示全部楼层


【打卡第十集】数码管的动态显示



1.数码管动态刷新的原理
1.png
2.png


多位数码管的显示,是由轮流显示数码管的每一位实现的。
在同一时间,只有一个数码管在显示,
以极快的速度循环,就会让眼睛看不出它们的亮灭,而认为是同时显示。
每个数码管的显示时间,一般需要大于1ms,
但又考虑到速度需要快于眼睛的分辨能力,
   因此需要小于20ms。

2.控制原理

具体的控制的流程如图所示,N表示有几个数码管!
3.png

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



3.8位数码管同时点亮


在上一课的基础上,新增一个位码选择的数组
程序中,数码管的位码、和要显示的数字,同样可以通过数组来控制。

通过调用数组选择位码,对于相同的代码,可以使用函数让程序简洁。
新建一个数组选择每个位需要显示的内容!


一般情况下,我们没有必要一直让数码管显示在最高亮度,
   因此循环显示会虽然会降低亮度,但仍然处于眼睛的分辨范围。

人眼不容易分辨出50HZ以上的动态刷新(延迟1ms为准,循环不大于20ms);
一个数组控制位显,一个控制显示字符,利用时间差可以在8个数码管同时显示字符;

4.课后练习:
一、做一个简易时钟,功能如下
1.初始状态显示 00 - 00 - 00,分别作为时,分,秒
2.每隔一秒钟,秒+1,一分钟,分+1,以此类推
3.时间到达00 - 00 - 30的时候,蜂鸣响3秒钟表示闹钟

  可以参考资料中的程序,希望得到试验箱










回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-13 11:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    339

    回帖

    1669

    积分

    版主

    积分
    1669
    发表于 2023-8-18 15:23:35 | 显示全部楼层
    冲哥视频学习到第十五集
    =====提前获得 【免费+包邮送】的 STC32G12K128实验箱
    =====现在送的,都可以利用MCU自带的 硬件USB直接仿真,硬件USB直接下载

    【免费+包邮】 送/申样/采购 可加 如下 QQ或微信联系
    加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592  要求 【免费+包邮】 送, 还免费教仿真  
    加STC华南区客服曹经理QQ:1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
    加STC华东区客服聂经理QQ:2593903262;微信:18106296598  要求 【免费+包邮】 送, 还免费教仿真
    加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593  要求 【免费+包邮】 送, 还免费教仿真
    加STC华北区客服石经理QQ: 1638975601 ;微信:19952583876  要求 【免费+包邮】 送, 还免费教仿真
    加STC华中区客服唐经理QQ:2571301708 ;微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
    加STC东北区客服张经理QQ:3141888640 ;微信:19952583265   要求 【免费+包邮】 送, 还免费教仿真
    加STC西南区客服张经理QQ:3141888640 ;微信:19952583265   要求 【免费+包邮】 送, 还免费教仿真
    工作时间:  8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)

    【免费+包邮】 送/申样/采购传统电话热线:0513-55012928、0513-55012929、0513-55012966
    工作时间:  8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)


    QQ:2269694595     微信:18106296594
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    19

    回帖

    73

    积分

    注册会员

    积分
    73
     楼主| 发表于 2023-8-18 15:56:45 | 显示全部楼层
    本帖最后由 zjczssdbybyd 于 2023-8-18 16:01 编辑

    【打卡第十一集】定时器的使用



    1.定时器的作用和意义


    定时器是定时器和计数器的统称。
    1)设置为定时器时,可实现硬件计时,或者使程序每隔一固定时间完成一项操作
    2)设置为计数器时候能够对脉冲进行计数
    3)替代长时间的delay,提高CPU的运行效率和处理速度,能及时的响应某个事件1: 定时器是硬件实现的,可以实现硬件计时,
       也可以让程序每隔一定时间完成一个任务

    while(1)
    {
    TimeCount++;
    delay_ms(1);
    }

    可以计时间
    但是while里面有程序
    while函数在不断循环执行的时候,能不能有办法让这个变量每隔1ms能自动加一,并且不受while循环的影响?
    可以 定时一定时间之后产生的中断,也就是定时器中断
    1.png

    中断指的是在主程序运行时,如果发生中断,则会执行中断代码,
       执行完会跳回主程序,定时器与中断结合,可以实现定时一段时间产生一个中断的效果。



    2.STC32G单片机定时器使用原理

    STC32G内部包含5个定时器/计数器T0-T4。

    STC32G系列单片机内部设置了5个24位定时器/计数器(8位预分频+16位计数)。5个16位定时To、T1、T2、T3和T4都具有计数方式和定时方式两种工作方式。
    对定时器/计数器TO和Tl,用它们在特殊功能寄存器TMOD中相对应的控制位CT来选择TO或T1为定时器还是计数器。对定时器/计数器T2,
    用特殊功能寄存器AUXR中的控制位T2_C/T来选择T2为定时器还是计数器。对定时器/计数器T3,用特殊功能寄存器T4T3M中的控制位T3_C/T来选择T3为定时器还是计数器。
    对定时器/计数器T4,用特殊功能寄存器T4T3M中的控制位T4_C/T来选择T4为定时器还是计数器。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。
    只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1;
    如果计数脉冲来自单片机外部引脚,则为计数方式,每来一个脉冲加1。

    1.png



    有不分频和12分频:
    当定时器/计数器TO、T1及T2工作在定时模式时,特殊功能寄存器AUXR 中的TOx12、T1xl2和T2x12分别决定是系统时钟/12还是系统时钟/1(不分频)后让TO、T1和T2进行计数。
    当定时器/计数器T3和T4工作在定时模式时,特殊功能寄存器T4T3M中的T3x12和T4x12分别决定是系统时钟/12还是系统时钟/1(不分频)后让T3和T4进行计数。
    当定时器/计数器工作在计数模式时,对外部脉冲计数不分频。


    定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1;


    工作模式;
             16位自动重载(常用);波特率发生器(串口会用到),后面再解;
             其他看手册用到再解;系统中5个定时器,对模式的支持不同,T0支持的模式最多。


    定时器0
    定时器1
    定时器2
    定时器3
    定时器4
    模式0
    16位自动重载
    16位自动重载
    16位自动重载
    16位自动重载
    16位自动重载
    模式1
    16位不可重载
    16位不可重载



    模式2
    8位自动重载
    8位自动重载



    模式3
    16位自动重载
    (不可屏蔽)




    波特率发生器







    要操作定时器,需要初始化定时器状态,牵涉到分频、自动重载、允许计数等一系列寄存器。
    TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置“1”TF0,
    向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0(也可由查询软件清0)。
    TR0:定时器T0的运行控制位。该位由软件置位和清零。当GATE (TMOD.3)=0,TR0=1时就允许T0开
    始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR0=1且INTO输入高电平时,才允许T0计数,TR0=0时禁止T0计数。

    中断
    EA:总中断;   ET0定时器中断,都写1
    中断函数必须使用interrupt关键字





    3.定时器的简单应用
    2.png

    计算TMOD、TL0、TH0(可以通过工具生成);

    4.png


    将数码管刷新函数写入定时器,则数码管刷新会执行,
        不再受到主程序的循环影响。

    4.定时器的快速使用方法


    定时器计算可以使用STC ISP中的工具进行,设置相应参数,生成代码
        使用方便
    5.png


    课后练习:
    一、第十课的课后作业做一个简易时钟,在此基础上将时钟改成定时器驱动。
    二、在上述基础上是增加一个按钮,按下一次就可以让时间暂停,在按一下时间又能继续走,在按一下再暂停!

    希望获得试验箱以练习
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    19

    回帖

    73

    积分

    注册会员

    积分
    73
     楼主| 发表于 2023-8-18 16:16:40 | 显示全部楼层
    【打卡第十二集】计数器的使用
    1.计数器的用途
    只要输出信号带这种高低电平变化的,想要计算个数的就可以用计数器的功能

    马达后面可以接码盘 计数转换的数字脉冲信号

    2.计数器的配置
    1.png


    T1_C/T:控制定时器1用作定时器或计数器,清0则用作定时器(对内部系统时钟进行计数),置1用作
    计数器(对引脚T1/P3.5外部脉冲进行计数)。
    T0_GATE:控制定时器0,置1时只有在INT0脚为高及TR0控制位置1时才可打开定时器/计数器0。


    当定时器/计数器1工作在16位模式(模式0、模式1)时,TL1和THI组合成为一个16位寄存器,TL1为低
    字节,TH1为高字节。若为8位模式(模式2)时,TL1和TH1为两个独立的8位寄存器。
    可以使用TxC/T控制定时器是作为定时器还是计数器使用,
    定时器/计数器的启停,受到TR的影响,如果GATE为1,还受到INTx的影响。
    作为计数器使用时,不一定必须触发中断,
       也可以直接读取寄存器中的计数值。

    手册14.5.11 定时器1的实例;   
    通过IO口配置     
    2.png

    3.计数器的应用
    2017年全国大学生电子设计竞赛试题-直流电动机测速装置;
    可以通过M法测速又叫做频率测量法
    。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。
    设编码器单圈总脉冲数为C, 时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为:

    3.png


        4、课后练习;


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


    4.png




    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    19

    回帖

    73

    积分

    注册会员

    积分
    73
     楼主| 发表于 2023-8-18 17:01:00 | 显示全部楼层
    本帖最后由 zjczssdbybyd 于 2023-8-18 17:29 编辑

    【打卡第十三集】简易多任务处理

    1.回顾

    一、认识单片机
    二、了解单片机硬件(介绍开发板)
    三、开发环境搭建和下载,新工程建立资料下载
    四、点亮点一个LED(CDC和HID下载)                        
    五、C语言运算符和进制数入门        
    六、LED闪烁和花式点灯                              
    七、按键点亮灯                                       
    八、蜂鸣器                                       
    九、数码管的静态使用                        
    十、数码管动态点亮                                 
    十一、定时器                                       
    十二、计数器的使用

    重点理清程序的逻辑思路。重点理清程序的逻辑思路。重点理清程序的逻辑思路。
    什么时候打开LED?LED打开多久?什么时候切换数码管显示?什么时候按键按下触发什么功能?
    之前的课主要是带大家熟悉写程序的方法,分析逻辑,实现我们要的功能。
    这一节课要规范程序,模块化编程可以时程序结构更清晰
    可以把上述的每部分放入单独的模块里完成,每个模块由C文件和H文件组成。


    2.应用模块化的编程(.c + .h)

    一个功能对应一个.c和.h

    在函数前添加函数头是好习惯,函数头里面可以包含:

       名称、功能、参数、版本、作者、修改日期等。         
    led_seg、key、beep、tim;
    修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”;

    //========================================================================
    // 函数名称:
    // 函数功能:
    // 入口参数: @
    // 函数返回:
    // 当前版本: VER1.0
    // 修改日期: 2023
    //当前作者:
    // 其他备注:
    //========================================================================
    Keil的模板功能可以自动添加函数头。
    可以使用Keil的批量重命名功能,同时修改多个文件中的函数名。   


    创建程序文件三步
    新建文件并保存        
    添加到工程
    添加引用路径



    引脚定义都在.h文件
    sbit 名称 = P10;        
    #define 名称 P10



    函数定义三步
    定义        
    声明
    调用



    修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。  

    举例1:如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。
    举例2:如果文件a.c需要引用b.c中变量int v,就可以在b.h中声明extern int v,然后a.c调用b.h就可以引用变量v。

    注意extern修饰的变量不能赋初值。

    函数中的static指的是静态变量,该变量的值在函数退出后也会保留。

    引脚定义一般使用define定义,这样在改变电路设计时,
       只要改变define的值,而不用改变程序。



    bdata位寻址变量的使用
    a.c                                       a.h               
    u8 bdata LED = 0x00;                extern u8 bdata LED;
    sbit LED0 = LED^0;                extern bit  LED0;
    sbit LED1 = LED^1;                extern bit  LED1;




    3.工程文件编写


    LED的8个灯,其实可以看作一个数码管,因此在程序刷新中,
       可以使用统一的方法控制。
    之前的程序是在定时器中通过一个函数刷新数码管,现在就要给他增加刷新LED的功能。这里刷新显示,在别的地方赋值。

    按键按下后可能发生的状态变化依次为:
       <30ms 消抖
       =30ms 单击
       <3000ms 单击结束
       =3000ms 长按结束
       >3000ms 长按结束
    上述整个过程可以使用一个函数封装,
       便于多个位置调用。
             KEY_Deal(void);                    //10ms检测一次按键状态:按键扫描
             KEY_ReadState(u8 keynum);  //读取指定按钮的状态
    用按键状态变量取反后与一个数字相与,可以取得该变量的第几个按键的状态
    设计按键检测函数时,按功能可以分为单个所有按键的状态刷新
    单个按键的状态检查中,如果按键松开, 还可以区分是按键按下过,还是按键从来没有被按

    有多个按键状态监测时,使用状态机比较好

    对蜂鸣器等产生动作的元件,可以封装成类似:
       BEEP_ON
       BEEP_RUN
       BEEP_OFF
       的形式,简化蜂鸣器的控制
    全局变量在退出函数时值不会消失,可以用于控制蜂鸣器的工作时间,


    定时器的初始化极其复杂,但可以函数封装,
       就可以在今后使用定时器时,避免再去重新写初始化的细节程序。




    课后练习:
    1.LED0给他200ms取反一次,LED1给他400ms取反一次,LED2给他800ms取反一次      
    2.将之前的电磁炉程序用今天的框架重新改写一遍,并且加入数码管定时的功能。

    希望获得试验箱
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    19

    回帖

    73

    积分

    注册会员

    积分
    73
     楼主| 发表于 2023-8-18 17:14:01 | 显示全部楼层
    【打卡第十四集】矩阵按键

    1.矩阵按键是什么
    在按键数量较多时,为了减少I/O口的占用,将按键排列成矩阵排列的形式的按键阵列我们称位矩阵按键。

    实验箱的按键分布,使用6个IO控制8个按键

    1.png


    2.矩阵按键的控制原理

    按键识别原理:端口默认为高电平,实时读取到引脚为低电平是表示按下。

    第一步:扫描列输入,现将P0.0-P0.3输出低电平,P0.6-P0.7输出高电平,如果有按键按下,按下的那一列的IO就会变成低电平,就可以判断出哪一列按下了。
    第二步:扫描行输入,现将P0.0-P0.3输出高电平,P0.6-P0.7输出低电平,如果有按键按下,按下的那一行的IO就会变成低电平,就可以判断出哪一行按下了。
    第三步:根据行列确定按键位,行列组合一下就可以判断出是哪个按键按下了。



    3.矩阵按键程序的编写

    密码锁需求:
    1.通过LED0模拟门锁状态,LED点亮表示门锁打开,熄灭表示门锁锁上;
    2.增加8位数码管,可以动态显示8位的密码,无密码时显示 “- - - - - - - -”;
    3.通过矩阵按键可以输入1-8的数字表示密码,并依次显示在数码管上;
    4.每输入一个数字,蜂鸣器响20ms表示有数字按下;
    5.密码正确打开LED0,密码错误蜂鸣响2秒;

    注意:
    GPIO加上高电平到读取反馈时要加一个延时给电路的反应时间
    读取矩阵按键的按钮,需要重复两次为GPIO设置高电平,并读取结果电平
    建议使用case返回矩阵按键的值
    可以通过索引数组实现移位显示


    课后练习:
    给今天的门锁增加如下功能:
    1.LED0(门锁)打开后,5秒后自动关闭;
    2.增加门内的手动开门按钮,按下按钮门锁打开;
    3.10秒内没有输入密码自动数码管熄灭省电;有按键按下时再显示。  
    4.用for去改写一下密码判断的地方
    希望获得实验箱试一试




    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    19

    回帖

    73

    积分

    注册会员

    积分
    73
     楼主| 发表于 2023-8-18 17:28:26 | 显示全部楼层


    【打卡第十五集】外部中断

    1.中断和中断系统

    中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
    当中央处理机 CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,
    转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。
    实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,
    当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。
    通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。
    CPU总是先响应优先级别最高的中断请求。



    当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。
    如果CPU_能够暂停对原来中断源的服务程序|转而去处理优先级更高的中断请求源,处理完以后,
    再回到原低级中断服务程序这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。


    每个类型中断对应的引脚不同,可以通过STC的单片机手册去查询,手册可以看各个中断参数





    2.什么是外部中断
    外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),
    而通过捕获这个变化,单片机内部自主运行的程序就会被暂时打断,转而去执行相应的中断处理程序,
    执行完后又回到原来中断的地方继续执行原来的程序。
    有复用中断功能的引脚才能当作外部中断检测;


    3.外部中断的用法

         要设置一个中断,牵涉ITx、IEx、EXx、EA、PXx寄存器,优先级(0-3)
       只有部分中断支持IT设置,表示上升下降沿都能触发,还是只有下降沿才能触发
    使用中断检测按键,具有一个优点,就是即使程序正在执行其他动作,
    按键按下时也会被检测出来,并完成相应的动作,按键检测反应快。


    危险机器上的急停按钮必须使用中断的方式,而不是程序检测的方式。

    //中断初始化函数-一外部中断INT0为例
    void INT0_Init(void)   // 外部中断 0 的初给化
    {
           IT0=1;                   //1:下降沿中断 0:上升下降沿中断
           EX0=1;                    // 允许中断
           IE0=0;                    // 清除中断标志位
    }
    //主程序中
    EA=1;                         //开总中断
    //中断响应程序
    void INT0_Isr(void) interrupt 0
    {
       
    }




    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    19

    回帖

    73

    积分

    注册会员

    积分
    73
     楼主| 发表于 2023-8-18 17:30:51 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    19

    回帖

    73

    积分

    注册会员

    积分
    73
     楼主| 发表于 2023-8-18 20:17:50 | 显示全部楼层
    上上上↑↑
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-21 18:44 , Processed in 0.117374 second(s), 65 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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