找回密码
 立即注册
查看: 3035|回复: 25

学习冲哥视频 《32位8051单片机原理及应用》打卡

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-14 08:16:08 | 显示全部楼层 |阅读模式
      前段时间忙于其他事,也断断续续看了几集冲哥的视频。现在有比较充裕的时间了,静下心来 认真的、从头到尾地学习一下冲哥的这个视频课,同时在这里记录下学习的过程。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-14 08:47:23 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-14 10:02 编辑

学习冲哥的《STC32G单片机视频教程》      第一课   认识单片机

1、什么是单片机
2、它能做什么?------ 功能与用途
3、新手常见问题解答
在这一节中,冲哥讲解的很全面,比如 年龄问题、新手如何开始学单片机,以及单片机用库函数还是寄存器等等一些常见问题,都一一做了解答。
4、学习建议
这一节是讲对学习单片机的建议,我感觉很有启发作用,特记录下来,作为这次学习的座右铭。
一定要静得下心,沉得住气;
多跟着冲哥动手操作,千万别一看就会,一写就废;
举一反三,发散思维,时常思考为什么;
多看看官网,多看看手册,有问题多交流;
逛逛论坛,吸收一些别人好的东西;
尝试着自己做一些项目,竞赛题。

第一课比较容易理解,主要是讲基础知识。接下来继续学习。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-14 10:38:42 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-15 09:15 编辑

学习冲哥的《STC32G单片机视频教程》      第二课  上      了解硬件


目前我还没有冲哥教学使用的STC32试验箱,先从冲哥的图上了解一下单片机的硬件:

     主要包括:红外发射与接收、电压比较、8位数码管、LED灯、NTC测温、18B20测温、ADC按键、PWM模拟DAC24C02存储、独立按键、LCD接口、USB接口、232接口、FLASH扩展、RS232电路、蜂鸣器电路、测试接口、模拟示波器接口 等硬件设施。

     从图中可以看到:STC32单片机的功能还是相当丰富,作为一般开发用已经很不错了,继续努力学习下去。加油!
2硬件介绍图.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-15 09:14:36 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-15 09:22 编辑

学习冲哥的《STC32G单片机视频教程》      第二课   下      单片机资源介绍
         

        从官方手册上了解STC32系列单片机的内部资源,使用及选型时需要注意:flash大小  RAM大小  工作电压 等。

         
2-单片机资源介绍.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-16 08:57:14 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-16 09:19 编辑

学习冲哥的《STC32G单片机视频教程》      第三课        开发环境搭建和程序的下载

主要讲述以下几个方面:

1、STC-ISP软件的下载:ISP软件是开发STC单片机的必备工具,它不仅能下载全系列STC单片机的程序,甚至集成了虚拟显示功能和范例程序以及在线生成工具、驱动安装等功能。

2、STC32手册的下载:手册的下载有二种方法,可以从ISP软件内下载或者从STC官网下载。

3、FPD阅读器下载:我的笔记本已经装有WPS,可以直接打开PDF文档。

4、学会PDF阅读器查阅手册:

    ① 如何使用阅读器打开手册
    ② 如何查阅目录和详情
    ③ 如何快速查阅章节
    ④ 如何使用搜索功能

5、跟着手册搭建C251开发环境:我认真看了手册第5----编译、仿真 开发环境的建立与ISP下载,并在笔记本上试着安装成功。

    ① 程序包的下载:下载方法有二种,在ISP软件内下载比较省事。

    ② 第一个工程的编译和下载:找到程序包里的01.1-P6口做跑马灯-入门版”例程,打开C语言中的sample.uvproj 应用程序,再双击编译按钮,开始编译,信息框内显示无错误无警告,说明编译成功,再将板子通过USB线连接电脑,先按下P3.2按钮,后按下并松开OFF按钮,再松开P3.2按钮 (此时观察到 扫描串口项已出现“(HIDI)STC-USB Writer)”进入USB下载模式。观察到板子上对应的LED灯做流动亮灭,实现流水灯效果。

3下载程序.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-17 08:36:03 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-19 09:49 编辑

学习冲哥的《STC32G单片机视频教程》      第四课       建立工程 点亮第一颗LED灯

1、LED点亮原理:LED发光管的正极通过PNP三极管接到VCC正极,并通过PNP三极管控制通断,当三极管基极(MPU的P4.0)低电压时导通,使得LED正极得到高电位;LED的负极通过降压电阻接到P6.0,这样可以通过控制P6.0输出低电平使得LED发光,P6.0输出高电平熄灭LED。

2、新建工程跟着手册《STC32G12K128实验箱-使用说明书》

     ①  首先打开Keil 软件,并打开“Project”菜单中的“New uVersion Project …”项

     ②  在打开的对话框中输入新建的项目名称,然后保存

     ③  接下来需要选择芯片,在对话框内选择芯片型号(STC MCU Database 里如果找不到对应的芯片型号,可选用同系列的芯片)

     ④  在新建的文件中输入相应的源代码,然后选择File”菜单中的“Save”项对文件进行保存

     ⑤  文件保存完成后需要将源代码文件添加到项目中来,具体的操作方法是: 使用鼠标右键单击Project”列表中的“Source Group 1”项,在出现的右键菜单中选择 “Add Existing Files to Group Source Group 1’”项目

     ⑥  在打开的对话框中选择我们刚才保存的文件,并点击 Add”按钮即可将文件添加到项目中,完成后按下“Close”按钮关闭对话框

     ⑦  此时我们可以看到在项目中已经多了我们刚才添加的代码文件

     ⑧  按下快捷键 “Alt+F7”或者选择菜单“Project”中的“Option for Target Target1’”

     ⑨  在 “Output”属性页中,将“Create HEX File”选项打上勾,即可在项目编译完成后自动生成HEX 格式的目标文件,按“OK”保存。

     ⑩  按下快捷键 “F7”或者选择菜单“Project”中的“Build Target”项对当前项目进行编译。

    若代码中没有错误,编译完成后则会在“Build Output”的信息输出框中显示“0 Error(s), 0 Warning(s)”,同时也会生成HEX 的执行文件。到此创建项目完成。

3、点亮第一个LED

   ① 思考LED为什么不会亮?  注意检查程序中设置的引脚是否正确。

   ② 怎么控制单独的一个引脚?  sbit P00 = P0^0;  //选择P0.0引脚

   ③ 怎么控制这个引脚输出电平?  P00 = 1;  //输出低电平

   ④ 书写规范  一行一句,大括号缩进(需要设置),缩进4格,注释完整

   ⑤ 注释符号  // 单行注释    /*  */ 多行注释

   ⑥ 学会搜索  CTRL+F

4、GPIO 是通用输入输出端口的简称,可以通过软件来读取其输入电平,或者控制其输出高低电平。  例如:P0 是一组GPIO口,P0.0是一组的其中一个GPIO口;我们一次可以操作一个GPIO口,也可以同时操作一组。

新建工程

新建工程

点亮第一个LED

点亮第一个LED
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-19 09:39:50 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-19 09:47 编辑

学习冲哥的《STC32G单片机视频教程》     第五课  C语言运算符和进制数入门

1.C语言 printf函数的实现:跟着冲哥的视频,再结合看手册第16章的讲解,反复思考后终于成功实现了C语言printf 函数的实现,结果见下面的截图。

2.数的进制:2进制、10进制、16进制。

3.C语言常用运算符:
       ① 、算术运算符:加(+)、减(-)、乘(*)、除(/);
                    模(余)运算符(%):不允许出现浮点型,余数正负取决于被除数正负;
                    自增自减(++i、-i;i++、i-)

       ②、位运算符:
                    右移(>>) 左移(<<)
                    按位与(&)
                    按位或(|)
                    按位异或(^)
                    取反(~)

4.数据的基本类型:
      ① 整型:包括`int`、`short`、`long`、`long long`等,用于存储整数。其中,`int`是基本整型,其大小依赖于具体的编译器和平台,通常是32位或64位。`short`通常比  `int`小,`long`通常比`int`大,而`long long`则是更大的整数类型。
      ② 浮点型:包括`float`、`double`、`long double`等,用于存储小数。其中,`float`是单精度浮点数,`double`是双精度浮点数,`long double`则是扩展双精度浮点数,精度依次提高。
      ③ 字符型:`char`类型,用于存储字符。在C语言中,字符本质上也是整数,因此`char`类型也可以参与整数运算。
      ④ 空类型:`void`类型表示“无类型”,通常用于函数返回类型、指针类型或作为函数参数,表示不返回任何值或不接受任何参数。
      ⑤ 派生类型:派生类型是基于基本数据类型或构造数据类型通过类型修饰符派生出来的类型,例如`unsigned int`、`signed char`等。

5-1.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-20 08:29:45 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-20 09:28 编辑

学习冲哥的《STC32G单片机视频教程》    第六课   LED闪烁和花式点灯:


一、基于Delay实现的LED闪烁
       1秒 = 1000毫秒 = 1000 000微秒

        在工程中添加如下语句:
        #define MAIN_Fosc        24000000UL

      //在C语言中,#define是一个预处理指令,用于创建宏常量。在这个例子中,MAIN_Fosc被定义为24000000UL,其中UL表示24000000是一个无符号长整型常量。
      //例如在以下代码中使用这个常数,你可以直接使用MAIN_Fosc。

    void  delay_ms(u16 ms)
    {
         u16 i;
         do{
             i = MAIN_Fosc / 6000;
             while(--i);
             }while(--ms);
    }

  二、语法分析:
        ① while: While循环的基本语法是while (条件) { 循环体 }。 其中,条件是一个布尔表达式,如果为真(非零),则执行循环体中的代码;如果为假(零),则跳出循环。

        ② do
           {
           //循环体
           }while(条件表达式);    其中:循环体:需要重复执行的代码块。

   条件表达式:决定是否继续执行循环的条件,如果为真(非零),则继续执行循环体;如果为假(零),则结束循环。
       do while循环的特点是至少会执行一次循环体,然后根据条件表达式的值决定是否继续执行循环。这与while循环不同,后者先检查条件,如果条件不满足则不执行循环体。
       ③ --ms 的用法:    ‌--ms是一个自减操作,‌每次循环迭代时,‌ms的值会减少1。‌这种操作通常用于模拟延时,‌因为循环的次数可以代表一定的时间长度。‌
       ④ #define    宏定义的一般形式为 #define 名字值,名字是宏名,值可以是数字、表达式或代码语句。‌


三、函数的使用
       在模块化编程里,函数使用分为如下三步:
       函数定义
      函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收。接收用户数据的函数在定义时要指明参数,不接收用户数据的不需 要指明,根据这一点可以将函数分为有参函数和无参函数。
      返回值 函数名称( 入口参数 )
      {
      函数要执行的功能
      }

  @返回值:没有返回值就是void
  @函数名称:避开关键词,不重复,非特殊字符随便取
  @入口参数:类型+名称,多个参数用 “,”分开,空就写void

        函数声明
   返回值 函数名称 ( 入口参数 );  函数头以“;”结尾,就构成了函数的原型

       函数调用
   函数名称 ( 入口参数 );   函数原型最好放在前面。也可以在前面放一个函数声明,在后面放上函数主体

四、新建文件,使用模块化编程

模块化编程是一种有效的编程方法,‌它通过将程序的不同部分(‌模块)‌分离成独立的文件,‌以提高代码的可读性、‌可维护性和可重用性。‌
       在不同的编程语言中,‌模块化编程的实现方式略有不同,‌但基本原理相似。‌以下是在不同编程语言中实现模块化编程的步骤:‌
       将相关的函数和变量定义在不同的.c文件中,‌每个文件实现特定的功能,‌
       为每个模块创建一个对应的头文件,‌后缀为.h,‌用于声明模块中的函数和变量,‌以便其他文件可以使用。
       在主文件(‌如main.c)‌中,‌通过#include指令包含所需的头文件,‌并调用相应模块中的函数。‌

新建xxx.c和xxx.h文件,代表一个功能块。
   xxx.h格式:
      #ifndef __XXX_H
      #define __XXX_H
      调用头文件
      函数声明...
      #endif
   xxx.c格式
      #include “xxx.h”
      函数定义

   添加文件一定要记得引用路径和添加到工程里。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-21 13:56:41 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-21 14:19 编辑

学习冲哥的《STC32G单片机视频教程》    第七课   按键点灯  

一、按键的原理:按键的本质就是两个引脚之间的通或者断。
      如果将按键的一个引脚接地,另一个引脚通过电阻接高电平,同时接到单片机的P3.2引脚。这时按键松开,P3.2呈现高电平,按键按下,P3.2呈现低电平。
      对于机械开关,触点在断开、闭合时,由于机械触点的弹性作用,会产生一连串的抖动。
      可以通过软件编程处理这个抖动过程,即在按键按下时,加上一个10ms的延时,再判断按键是否真的按下,然后再执行后面的功能。

二、按键的代码实现过程:

    if( KEY == 0 )
    {
          Delay_ms(10);
          if( KEY == 0 )
          {
          while(KEY == 0);
          执行功能
          }
    }

三、按键的应用:

    1、按键按下LED灯亮,松开熄灭;

    2、按键按下KED灯熄灭,松开点亮;

    3、按键按下一次,LED状态改变一次;

    4、按键按下一次,LED往左边移动一位。


//-------------------------按下点亮,松开熄灭-----------------------------------------

{
     {

if( KEY1 == 0  )                                  //判断按键有没有按下
    {
    delay_ms(10);
    if( KEY1 == 0 )
         {
          printf("按键P32已经按下\r\n");
          P60 = 0;                                  //LED0点亮
         }
    }
     else                                              //如果没有按下
    {
          P60 = 1;        //LED0点亮
     }

               
//--------------------------按下熄灭,松开点亮----------------------------------------               

if( KEY2 == 0  )                                //判断按键有没有按下
{
      delay_ms(10);
      if( KEY2 == 0 )
      {
           printf("按键P33已经按下\r\n");
           P67 = 1;                                 //LED熄灭
      }
}
else
    {
    P67 = 0;                                       //LED熄灭
    }               
//---------------------------按下一次,状态取反-------------------------------------------               

if( KEY2 == 0  )                                //判断按键有没有按下
{
    delay_ms(10);
    if( KEY2 == 0 )                             //按键确实按下了
    {
         while(KEY2 == 0)                    //如果按键一直是按下的,一直执行while
         {

         }
         printf("按键P33已经按下,led取反一次\r\n");
         P67 = !P67;                            //LED熄灭                                
    }
}

               
//------------------------按下一次,灯往左边移动一个单位---------------------------------------               

                if( KEY2 == 0  )                //判断按键有没有按下
                {
    delay_ms(10);
    if( KEY2 == 0 )                             //按键确实按下了
    {
     printf("按键P33已经按下,led左移一个\r\n");
                                
     LED_Data = ( (LED_Data<<1) +1 );          //本来是直接输出P6,先计算,后输出
                                
     if( LED_Data == 0XFF )
     LED_Data = 0xFE;
                                
     P6 = LED_Data;
     while(KEY2 == 0);                                  //如果按键一直是按下的,一直执行while
         {

         }
                                                        
    }
                }               

//------------------P32按下一次,灯往右边边移动一个单位---------------------------------               

P6 = LED_DataTab[num];        delay_ms(500);
num++;
if( num>7 )
    num = 0:
   }
}
四、数组的使用:
数组使用分为如下两部:
1、定义 ------ 类型 名称 [长度] = {数值} ;
例如:int[] array1 = new int[10];                  //创建一个可以容纳10个int类型元素的数组
          double[] array2 = new double[5];       //创建一个可以容纳5个double类型元素的数组
          String[] array3 = new double[3];        //创建 一个可以容纳3个字符串元素的数组
2、使用   赋值:名称 [索引] = 数值
数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任何位置的元素。比如:
         int[]array = new int[]{10 , 20 , 30 , 40 , 50};
   System.out.println(array[0]);
    System.out.println(array[1]);
    System.out.println(array[2]);
    System.out.println(array[3]);
    System.out.println(array[4]);




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-05-09 07:54:40

3

主题

34

回帖

717

积分

高级会员

积分
717
发表于 2024-7-23 15:47:09 | 显示全部楼层
本帖最后由 chun1234 于 2024-7-23 16:14 编辑

学习冲哥的《STC32G单片机视频教程》        第八课   蜂鸣器的应用

一、认识蜂鸣器:

        1、无源蜂鸣器工作原理
        无源蜂鸣器是一种只具有振动功能而不具备驱动功能的声响装置。
        当交流信号作用于无源蜂鸣器时,通过振动膜片产生声音。
        需要外部电路来提供频率,所以无源蜂鸣器无法直接发声。

        2、有源蜂鸣器工作原理
        有源蜂鸣器内置振荡电路,可以自身发声。
        通过给有源蜂鸣器提供直流电信号即可使其发声。

        3、控制原理
        STC32G开发板使用的是有源蜂鸣器,从原理图看,P54引脚给低电平 打开;P54引脚给高电平 关闭。
        自己动手写一段程序,结合上一课的按钮点灯,在这里需要实现:按钮按一下打开蜂鸣器,按钮再按一下关闭蜂鸣器。

      #include "COMM/stc.h"                                            //调用头文件
       #include "COMM/usb.h"
      #include "test.h"
      char *USER_DEVICEDESC = NULL;
      char *USER_PRODUCTDESC = NULL;
      char *USER_STCISPCMD = "@STCISP#";
        
void sys_init();                                                        //函数声明
void delay_ms(u16 ms);                                           //unsigned int
void main()                                                            //程序开始运行的入口
{
        u8 LED_Data = 0XFE;
        
        u8 num=0;
        u8 LED_DataTab[8] = { 0XFE,0XFD, 0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
        
        sys_init();                                                          //USB功能+IO口初始化
        usb_init();                                                         //usb库初始化
        EA = 1;                                                             //CPU开放中断,打开总中断。
        
        P6 = LED_Data;
        while(1)                                                            //死循环
        {
                if( DeviceState != DEVSTATE_CONFIGURED )         
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                }
                if( KEY1 == 0  )
                {
                        delay_ms(10);
                        if(  KEY1 == 0 )
                        {
                                while(  KEY1 == 0 );
                                BEEP = !BEEP;
                        }
                }
        }
}

      4、蜂鸣器实战应用:
                  课后练习:增加按键3,按下后表示启动,选择的对应的功能的LED持续闪烁,表示正在工作,且在工作的时候无法切换功能。


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-9 09:18 , Processed in 0.215844 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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