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

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

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

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

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

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


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

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


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

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)



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

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也不错呢

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

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下载模式



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

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遍,终于弄明白了
寄存器也稍微有点了解了
容我消化消化~~

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

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. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

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短
复制代码
这样省的在主函数里打一大段东西(
怠惰
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:21
  • 最近打卡:2024-01-28 16:12:30

1

主题

17

回帖

131

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:59
  • 最近打卡:2025-05-06 09:22:11

718

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-6 22:00 , Processed in 0.153314 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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