请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 1895|回复: 19

冲哥32位51单片机学习笔记 | 实验箱已收到,感谢STC!!!

[复制链接]
  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
    发表于 2023-12-21 20:15:14 | 显示全部楼层 |阅读模式
    本帖最后由 yupoi 于 2023-12-28 15:57 编辑

    我从小热爱电子技术,但是高考报了非理工科的专业。
    与其大学浑浑噩噩浑水摸鱼,不如杀出一条属于自己的路!

    这个帖子作为我学习冲哥32位51单片机的学习笔记,冲冲冲!
    每一次打卡和笔记我都会回复在这个贴子里,不占用过多资源。


    如果路过的大佬发现我的内容有什么错误的地方,欢迎指正!!!

    顺便礼貌提问:艺术类考研可以跨到工科吗?


    回复

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-21 20:44:08 | 显示全部楼层
    本帖最后由 yupoi 于 2023-12-24 15:57 编辑

    第一章 认识单片机(第一集)
    1.什么是单片机
    截图202312212020225632.jpg
    单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。

    个人的理解:单片机可以理解为一种微型的电脑,虽然不像我们手头的电脑一般可以运行一些生产力应用,但是却存在于我们生活的方方面面。尤其是各种需要低功耗的场景。我们总不可能给洗衣机空调电冰箱装个线程撕裂者吧?因此这些活儿就交给单片机干了。

    2.他能做什么

    人类是大哥的话,单片机就是人类的小老弟,让它干啥它就干啥。能写入用户程序;能读取在输入引脚上的电压信号,能在引脚上输出特定的电平信号,能在特定引脚上输出电压信号,能计算时间,能计数,能做数学运算,能做逻辑运算,能顺序动作,能通信等功能。
    最概括的来说就是他能做有规律可循的控制应用。
    一些重复的、或者是根据传感器返回的信息自动控制的活儿,人不一定能干好,但是单片机可以。


    单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
    ●智能仪器:电压、电流、功率、频率、湿度、温度、流量等的仪器仪表
    ●工业控制:工厂流水线的智能化,电梯智能化控制、各种报警系统等
    ●家用电器:电饭煲、洗衣机、电冰箱、空调机、彩电等
    ●网络和通信:手机,电话机、楼宇自动通信呼叫系统、列车无线通信等
    ●医用设备领域:医用呼吸机,监护仪,超声诊断设备及病床呼叫系统等
    ●模块化系统:电子音乐贺卡,PLC工控板等
    ●汽车电子:发动机控制器,基于CAN总线的汽车发动机智能电子控制器、GPS导航系统、abs防抱死系统、制动系统、胎压检测等。



    3.常见问题解答部分
    至少我还没到退休了才打算好好学

    51单片机不可能淘汰。51单片机有别的单片机做不到的特性(比如ADC精度)(模数转换,不是游戏那个ADC)

    怎么才算入门:
    知道单片机可以完成什么需求。知道自己的需求可以怎么实现。通过自己的所见所学,拓展自己的能力。

    单片机用寄存器还是库函数好?
    看起来是库函数简单,但是简单的东西往往埋藏着大坑。
    所以好好学寄存器吧。

    汇编有没有必要
    C看起来更加简洁明了。c至少比汇编简单。


    4.学习建议

    1.一定要静得下心,沉得住气;
    2.多跟着动手,千万别一看就会,一写就废;
    3.举一反三,发散思维,时常思考为什么;
    4.多看看官网,多看看手册,有问题多交流;
    5.逛逛论坛,吸收一些别人好的东西;
    6.尝试着自己做一些项目,竞赛题。


    我的打算:
    每天保证至少60分钟的时间学习单片机。
    在我的开发板到了之后,进行按照视频的跟练。
    完成一个案例之后,思考这个案例可以实现哪些功能。
    养成读手册读文档的习惯。
    争取每天都在论坛上学习大佬们的先进经验。
    未来争取冲一冲蓝桥杯、做一些项目、做一些案例
    (感觉立了好多Flag)



    回复 支持 反对

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-21 21:40:26 | 显示全部楼层
    本帖最后由 yupoi 于 2023-12-21 22:21 编辑

    今天没什么事情,又看了第二集视频,笔记如下:

    第二集:了解硬件

    一.硬件介绍
    用到的开发板:STC32实验箱

    截图202312212108451881.jpg

    冲哥按照左上角开始,顺时针的顺序介绍了各模块的作用。
    1. 红外发射:遥控器,头部透明灯珠为红外发射二极管
    2. 红外接收:红外接收二极管(空调)
    3. 电压比较:和基准电压源比较,执行后续动作
    4. 数码管:显示各种内容,数字、字母、符号等
    5. 一排LED灯:流水灯
    6. 万能板:根据个人需求自己补充元器件自己焊接,满足自己的拓展需求
    7. NTC测温:上方是一个贴片元器件。(电子体温计)
    8. 18B20:常见的温度传感器
          两个测温区别
            - NTC:连续电压信号(模拟测温)
            - 18B20:精度越高速度越慢,难以采集变化较快的温度(数字测温)

    9. ADC按键:一个单片机引脚可以读取16个按键——采集模拟电压数值判定是哪个按键按下 (STC32G:0~4095)数值可以反推电压
    10. 基准电压:假如0V:0 5V:4095,每一伏电压都可以对应一个值。基准电压用于校准。
    11. PWM模拟DAC:数字量转换成模拟量
    12. 24C02: 电脑硬盘一样的存在,用于保存数据。即使单片机损坏也不会丢失数据。
    13. 矩阵键盘:减少IO口使用。
    14. 独立按键:每一个单独连接到引脚。效果:谍战片的定时炸弹
    15. LCD12864接口: 截图202312212127162317.jpg 用于安装128*64屏幕。集成了汉字字库。如果不想买屏幕,stc-isp有模拟。
    16. led通电指示灯:两个电源指示灯。一颗通电就会亮,一个是供电指示灯(有OFF功能)。使用需要保证2灯常亮
    17. 232接口:通过usb转232线连接电脑。(老式打印机)
    18. flash扩展:使内存更大,存图片,汉字等大文件(实时存储)
    19. 测试接口:配合STC LINK1D(课程不涉及)
    20. 蜂鸣电路:发出声音,播放一个勉强能听的音乐。

    二.单片机资源介绍
    1. 型号:STC32G12K128 工作电压1.9v-5.5v
    2. FLASH:存储,写程序只能写进128k
    3. RAM:运行生成时的数据,数据实时存储。(内存条,数据断电丢失)

    截图202312212134556895.jpg


    课后作业:
    可以做一个自动控制空调的工具。当天气过于炎热时,自动启动空调,并且设定一个合适的制冷温度、风速等
    这样我就不用到处找遥控器啦~
    有屏幕的话,播放BAD APPLE也不错呢

    回复 支持 反对

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-22 19:52:58 | 显示全部楼层
    今天学习第三章·开发环境搭建


    1.STC-ISP软件的下载


    下载方法:打开https://stcai.com/gjrj,找到最新版本的STC-ISP软件的压缩包,直接下载运行即可。(需要装驱动)


    2.手册下载

    下载方法1:ISP软件内下载



    下载方法2:官网下载


    打开https://stcai.com/xpsc,在左边找到STC32系列,点击“STC32规格书下载”即可。

    3.PDF阅读器下载


    方法1:WPS直接打开PDF


    方法2:下载福昕阅读器

    其实adobe那个阅读器也不错

    4.学会PDF阅读器查阅手册


    1.如何使用PDF阅读器打开手册
    2.如何查阅目录和详情
    3.如何快速查阅章节
    4.如何使用搜索功能

    5.跟着手册搭建C251开发环境


    6.程序包的下载


    下载方法1:ISP软件内下载


    下载方法2:官网下载


    打开https://stcai.com/yyfa,在左边找到试验箱,找到“STC32G实验箱9.4”,点击代码下载即可。


    7.第一个工程的编译

    打开下载的工程文件,点击编译按钮开始编译
    等待编译完成

    7.第一个工程的编译和下载


    将板子通过USB线链接电脑
    按下P3.2按钮,此时按下并松开OFF按钮,在松开P3.2进入USB下载模式



    回复 支持 反对

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-22 21:13:28 | 显示全部楼层
    本帖最后由 yupoi 于 2023-12-22 21:15 编辑

    第四章·建立工程点亮第一颗LED(视频第4、5)



    点亮LED的原理:输出电压=VCC就是高电平,输出电压=GND(一般是0V)就是低电平,分别用1和0来表示,这个是理想值。GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来读取其输入电平,或者控制他输出高低电平。



    如何点亮LED4?



    P4.0输出低电平


    P6.0输出低电平


    2.具体工程

    1)打开keli,选择project新建,桌面新建文件夹保存工程。


    2)选择stc mcu,选择stc32g12k128,关闭提示窗。
    3)新建里面插入源代码。选择file→save,保存文件名.c(.c建议小写)
    4)右键,add existing...,可以看到代码在目录里面。
    代码部分:

    第一段代码无法点亮灯
    1. sfr P0 = 0x80;
    2. sfr P0M1 = 0X93;
    3. sfr P0M0 = 0X94;
    4. void main()
    5. {
    6.         P0M0=0X00;
    7.         P0M1=0X00;
    8.         while(1)
    9.         {
    10.                 P0++;
    11.         }
    12. }  
    复制代码
    修改代码:
    1. sfr P0 = 0x80;//改成P4
    2. sfr P0M1 = 0X93;
    3. sfr P0M0 = 0X94;//P0端口操作完成
    4. //选择寄存器
    5. sfr P4 = 0XC0;//P4端口操作完成
    6. sfr P4M1 = 0XB3;
    7. sfr P4M0 = 0XB4;
    8. sfr P6 = 0XE8;//P6端口操作完成
    9. sfr P6M1 = 0XCB;//这里冲哥打错了(打成了C8
    10. sfr P6M0 = 0XCC;
    复制代码
    1. sbit P40 = P4^0; //三极管控制引脚
    2. sbit P60 = P6^0;//led控制引脚
    3. void main()
    4. {
    5.         P0M0=0X00;
    6.         P0M1=0X00;//配置P0为准双向口
    7.         P4M0=0X00;
    8.         P4M1=0X00;//配置P4为准双向口
    9.         P6M0=0X00;
    10.         P6M1=0X00;//配置P6为准双向口
    11.         while(1)      //死循环
    12.        {
    13.                 //P0++;
    14.                 P40 = 0;//三极管引脚输出电平
    15.                 P60 = 0;//LED4引脚输出低电平
    16.        }
    17. }
    复制代码


    1.思考LED为什么不会亮?
    引脚不对。
    2.怎么控制单独的一个引脚?
    sbit P00 = P0^0;        //选择P0.0引脚
    3.怎么控制这个引脚输出电平?
    P00 = 0;         //输出低电平
    P00 = 1; //输出高电平
    4.书写规范
    一行一句,大括号缩进(需要设置),缩进四格,注释完整
    5.注释符号
    //  单行注释
    /*   */  多行注释
    6.学会搜索
    CTRL+F


    #include定义在文件夹里写法:
    #include"COMM/stc.h"

    #include"COMM/usb.h"

    抄代码注意大小写和中英文符号

    函数声明:
    void sys_init();
    函数定义:
    void sys_init(){
        函数内容
    }


    冲哥总结:

    1.了解新工程的一个基本流程
    2.了解IO口的高低电平的含义
    3.务必牢记端口的几个寄存器 PxM0,PxM1,Px
    4.务必牢记 sbit 的 作用,牢记#include的作用
    5.了解USB_CDC不停电下载的用法
    USB_HID不停电下载


    本节课我翻着手册前前后后看了3遍,终于弄明白了
    寄存器也稍微有点了解了
    容我消化消化~~

    回复 支持 反对

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-24 15:31:51 | 显示全部楼层
    本帖最后由 yupoi 于 2023-12-24 15:33 编辑

    第四章·建立工程点亮第一颗LED 补充笔记


    PART1 点亮LED的原理

    截图202312241523161303.jpg

    SYS-VCC代表着是电源的正极,下方是一个PNP三极管。
    在这个电路中,要想LED点亮,就需要三极管导通、P6.X低电平
    PNP三极管的基极连接在P4.0上,因此,当P4.0低电平时,电路导通。
    所以实验箱点亮LED,需要P40和P60低电平。

    PART2 不断电刷固件的方法
    核心代码如下:
    1. #include "stc.h"
    2. #include "usb.h"
    3. void sys_init();
    4. char *USER_DEVICEDESC = NULL;
    5. char *USER_PRODUCTDESC = NULL;
    6. char *USER_STCISPCMD = "@STCISP#";                      //设置自动复位到ISP区的用户接口命令
    复制代码
    主函数:
    1. void main()
    2. {
    3.     sys_init();
    4.     usb_init();
    5.     EA = 1;
    6.     while(1){}
    7. }
    复制代码
    sys_init函数
    1. void sys_init()
    2. {
    3.     P3M0 = 0x00;
    4.     P3M1 = 0x00;
    5.     WTST = 0x00;
    6.     EAXFR = 1;
    7.     P3M0 &= ~0x03;
    8.     P3M1 |= 0x03;
    9.     IRC48MCR = 0x80;
    10.     while (!(IRC48MCR & 0x01));
    11. }
    复制代码


    回复 支持 反对

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-24 15:53:26 | 显示全部楼层
    本帖最后由 yupoi 于 2023-12-24 15:58 编辑

    第五章·C语言运算符和进制数入门 笔记(视频第6、7)

    主函数添加程序:

    1. if(DeviceState != DEVSTATE_CONFIGURED)
    2.     continue;
    3. if (bUsbOutReady)
    4. {
    5.     usb_OUT_done();    //接收应答(固定格式)   
    6. }
    复制代码
    printf格式化:

    截图202312241547374838.jpg

    截图202312241547221389.jpg

    USB-CDC自适应波特率串口。
    在stc_isp中记得选择文本模式,一堆字符串为ASCII文本

    一个汉字对应两个字符,hex下,30这个数字为0x30,十进制对应为48,48对应ASCII码为数字0
    如何转换?打开计算器,程序员模式,点击hex输入16进制数字。
    若ASCII码显示85,则显示一个U


    转义字符:
    截图202312241549434036.jpg


    在Windows系统中我们输入回车时,输入的字符是\r\n,
    unix系统中回车为\n,而mac系统中回车的字符为\r.


    ASCII:
    截图202312241550296697.jpg


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

    截图202312241551066422.jpg 截图202312241551215098.jpg

    C语言常用运算符:

    截图202312241552462389.jpg

    数据的基本类型:
    截图202312241553158601.jpg

    回复 支持 反对

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-24 16:37:18 | 显示全部楼层
    本帖最后由 yupoi 于 2023-12-24 17:52 编辑

    第六章:LED闪烁和花式点灯(第8、9集视频)学习笔记

    摘要:


    1.基于Delay实现的LED闪烁
    2.函数的使用
    3.新建文件,使用模块化编程



    1.基于Delay实现的LED闪烁


    1秒 = 1000毫秒 = 1000 000微秒

    例子:闹钟中间的两个点闪烁——一亮一灭的过程为闪烁。

    在代码中添加以下内容(延时控制函数):
    1. #define MAIN_Fosc 24000000UL  //定义一个IRC主时钟
    2. void delay_ms(u16 ms) //u16 的定义在stc.h中,unsigned int u16
    3. {
    4. u16 i ;
    5. do
    6. {
    7. i=MAIN_Fosc/6000;
    8. while(--i);
    9. }
    10. while(--ms);
    11. }
    复制代码
    主函数(点灯):
    1. void main()
    2. {
    3.     while(1)
    4.     {
    5.         P40 = 0 ;         //三极管低导通
    6.         P60 = 0 ;   //led4引脚低电平
    7.         delay_ms(500) ;
    8.         P60 = 1 ;
    9.         delay_ms(500);
    10.     }
    11. }
    复制代码
    截图202312241618085523.jpg

    2.函数的使用

    在模块化编程里,函数使用分为如下三步:
    1.函数定义
    返回值 函数名称( 入口参数 )
    {
    函数要执行的功能
    }
    @返回值:没有返回值就是void
    @函数名称:避开关键词,不重复,非特殊字符随便取
    @入口参数:类型+名称,多个参数“,”分开,空就写void


    2.函数声明
    返回值 函数名称( 入口参数 );


    3.函数调用
    函数名称( 入口参数 );



    3.新建文件,使用模块化编程


    新建xxx.c和xxx.h文件,代表一个功能块。

    xxx.h格式:
    #ifndef __XXX_H
    #define __XXX_H
    调用头文件
    函数声明...
    #endif

    xxx.c格式
    #include “xxx.h”
    函数定义

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


    4.课后练习:
    目前没有实验箱,申请的人和我说要写完15个视频的打卡和总结。目前进度:9/15。
    代码实现(云一个)
    定义一个闪三下灯,自定义延时的函数:
    1. void led_blinking (unsigned int xms )
    2. {
    3.     P40=0;
    4.     P60=0;//1
    5.     delay_ms(xms);
    6.     P60=1;
    7.     delay_ms(xms);
    8.     P60=0;//2
    9.     delay_ms(xms);
    10.     P60=1;
    11.     delay_ms(xms);
    12.     P60=0;//3
    13.     delay_ms(xms);
    14.     P60=1;
    15. }
    复制代码
    主函数:
    1. void main()
    2. {
    3.     while(1)
    4.     {
    5.     led_blinking(300);//3短
    6.     led_blinking(900);//3长
    7.     led_blinking(300);//3短
    复制代码
    这样省的在主函数里打一大段东西(
    怠惰
    回复 支持 反对

    使用道具 举报 送花

  • TA的每日心情

    2024-1-28 16:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    131

    积分

    注册会员

    积分
    131
     楼主| 发表于 2023-12-24 18:10:58 | 显示全部楼层
    怎么代码会消失的
    回复 支持 反对

    使用道具 举报 送花

    该用户从未签到

    655

    主题

    1万

    回帖

    1万

    积分

    管理员

    积分
    15291
    发表于 2023-12-24 18:34:19 | 显示全部楼层
    建议提前送实验箱,提高学习效率
    回复 支持 反对

    使用道具 举报 送花

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

    本版积分规则

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

    GMT+8, 2024-12-3 16:03 , Processed in 0.100874 second(s), 72 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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