冲哥32位51单片机学习笔记 | 实验箱已收到,感谢STC!!!
本帖最后由 yupoi 于 2023-12-28 15:57 编辑我从小热爱电子技术,但是高考报了非理工科的专业。
与其大学浑浑噩噩浑水摸鱼,不如杀出一条属于自己的路!
这个帖子作为我学习冲哥32位51单片机的学习笔记,冲冲冲!
每一次打卡和笔记我都会回复在这个贴子里,不占用过多资源。
如果路过的大佬发现我的内容有什么错误的地方,欢迎指正!!!
顺便礼貌提问:艺术类考研可以跨到工科吗?
本帖最后由 yupoi 于 2023-12-24 15:57 编辑
第一章 认识单片机(第一集)
1.什么是单片机
单片机(Single-Chip Microcomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
个人的理解:单片机可以理解为一种微型的电脑,虽然不像我们手头的电脑一般可以运行一些生产力应用,但是却存在于我们生活的方方面面。尤其是各种需要低功耗的场景。我们总不可能给洗衣机空调电冰箱装个线程撕裂者吧?因此这些活儿就交给单片机干了。
2.他能做什么
人类是大哥的话,单片机就是人类的小老弟,让它干啥它就干啥。能写入用户程序;能读取在输入引脚上的电压信号,能在引脚上输出特定的电平信号,能在特定引脚上输出电压信号,能计算时间,能计数,能做数学运算,能做逻辑运算,能顺序动作,能通信等功能。
最概括的来说就是他能做有规律可循的控制应用。
一些重复的、或者是根据传感器返回的信息自动控制的活儿,人不一定能干好,但是单片机可以。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴:
●智能仪器:电压、电流、功率、频率、湿度、温度、流量等的仪器仪表
●工业控制:工厂流水线的智能化,电梯智能化控制、各种报警系统等
●家用电器:电饭煲、洗衣机、电冰箱、空调机、彩电等
●网络和通信:手机,电话机、楼宇自动通信呼叫系统、列车无线通信等
●医用设备领域:医用呼吸机,监护仪,超声诊断设备及病床呼叫系统等
●模块化系统:电子音乐贺卡,PLC工控板等
●汽车电子:发动机控制器,基于CAN总线的汽车发动机智能电子控制器、GPS导航系统、abs防抱死系统、制动系统、胎压检测等。
3.常见问题解答部分
至少我还没到退休了才打算好好学{:4_165:}
51单片机不可能淘汰。51单片机有别的单片机做不到的特性(比如ADC精度)(模数转换,不是游戏那个ADC)
怎么才算入门:
知道单片机可以完成什么需求。知道自己的需求可以怎么实现。通过自己的所见所学,拓展自己的能力。
单片机用寄存器还是库函数好?
看起来是库函数简单,但是简单的东西往往埋藏着大坑。
所以好好学寄存器吧。
汇编有没有必要
C看起来更加简洁明了。c至少比汇编简单。
4.学习建议
1.一定要静得下心,沉得住气;
2.多跟着动手,千万别一看就会,一写就废;
3.举一反三,发散思维,时常思考为什么;
4.多看看官网,多看看手册,有问题多交流;
5.逛逛论坛,吸收一些别人好的东西;
6.尝试着自己做一些项目,竞赛题。
我的打算:
每天保证至少60分钟的时间学习单片机。
在我的开发板到了之后,进行按照视频的跟练。
完成一个案例之后,思考这个案例可以实现哪些功能。
养成读手册读文档的习惯。
争取每天都在论坛上学习大佬们的先进经验。
未来争取冲一冲蓝桥杯、做一些项目、做一些案例
(感觉立了好多Flag)
本帖最后由 yupoi 于 2023-12-21 22:21 编辑
今天没什么事情,又看了第二集视频,笔记如下:
第二集:了解硬件
一.硬件介绍
用到的开发板:STC32实验箱
冲哥按照左上角开始,顺时针的顺序介绍了各模块的作用。
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接口:用于安装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:运行生成时的数据,数据实时存储。(内存条,数据断电丢失)
课后作业:
可以做一个自动控制空调的工具。当天气过于炎热时,自动启动空调,并且设定一个合适的制冷温度、风速等
这样我就不用到处找遥控器啦~
有屏幕的话,播放BAD APPLE也不错呢
{:4_166:}
今天学习第三章·开发环境搭建
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下载模式
本帖最后由 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...,可以看到代码在目录里面。
代码部分:
第一段代码无法点亮灯
sfr P0 = 0x80;
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
void main()
{
P0M0=0X00;
P0M1=0X00;
while(1)
{
P0++;
}
}修改代码:
sfr P0 = 0x80;//改成P4
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;//P0端口操作完成
//选择寄存器
sfr P4 = 0XC0;//P4端口操作完成
sfr P4M1 = 0XB3;
sfr P4M0 = 0XB4;
sfr P6 = 0XE8;//P6端口操作完成
sfr P6M1 = 0XCB;//这里冲哥打错了(打成了C8
sfr P6M0 = 0XCC;
sbit P40 = P4^0; //三极管控制引脚
sbit P60 = P6^0;//led控制引脚
void main()
{
P0M0=0X00;
P0M1=0X00;//配置P0为准双向口
P4M0=0X00;
P4M1=0X00;//配置P4为准双向口
P6M0=0X00;
P6M1=0X00;//配置P6为准双向口
while(1) //死循环
{
//P0++;
P40 = 0;//三极管引脚输出电平
P60 = 0;//LED4引脚输出低电平
}
}
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遍,终于弄明白了
寄存器也稍微有点了解了
容我消化消化~~
本帖最后由 yupoi 于 2023-12-24 15:33 编辑
第四章·建立工程点亮第一颗LED 补充笔记
PART1 点亮LED的原理
SYS-VCC代表着是电源的正极,下方是一个PNP三极管。
在这个电路中,要想LED点亮,就需要三极管导通、P6.X低电平
PNP三极管的基极连接在P4.0上,因此,当P4.0低电平时,电路导通。
所以实验箱点亮LED,需要P40和P60低电平。
PART2 不断电刷固件的方法
核心代码如下:
#include "stc.h"
#include "usb.h"
void sys_init();
char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令主函数:
void main()
{
sys_init();
usb_init();
EA = 1;
while(1){}
}sys_init函数
void sys_init()
{
P3M0 = 0x00;
P3M1 = 0x00;
WTST = 0x00;
EAXFR = 1;
P3M0 &= ~0x03;
P3M1 |= 0x03;
IRC48MCR = 0x80;
while (!(IRC48MCR & 0x01));
}
本帖最后由 yupoi 于 2023-12-24 15:58 编辑
第五章·C语言运算符和进制数入门 笔记(视频第6、7)
主函数添加程序:
if(DeviceState != DEVSTATE_CONFIGURED)
continue;
if (bUsbOutReady)
{
usb_OUT_done(); //接收应答(固定格式)
}printf格式化:
USB-CDC自适应波特率串口。
在stc_isp中记得选择文本模式,一堆字符串为ASCII文本
一个汉字对应两个字符,hex下,30这个数字为0x30,十进制对应为48,48对应ASCII码为数字0
如何转换?打开计算器,程序员模式,点击hex输入16进制数字。
若ASCII码显示85,则显示一个U
转义字符:
在Windows系统中我们输入回车时,输入的字符是\r\n,
unix系统中回车为\n,而mac系统中回车的字符为\r.
ASCII:
数的进制:2进制、10进制、16进制
C语言常用运算符:
数据的基本类型:
本帖最后由 yupoi 于 2023-12-24 17:52 编辑
第六章:LED闪烁和花式点灯(第8、9集视频)学习笔记
摘要:
1.基于Delay实现的LED闪烁
2.函数的使用
3.新建文件,使用模块化编程
1.基于Delay实现的LED闪烁
1秒 = 1000毫秒 = 1000 000微秒
例子:闹钟中间的两个点闪烁——一亮一灭的过程为闪烁。
在代码中添加以下内容(延时控制函数):
#define MAIN_Fosc 24000000UL//定义一个IRC主时钟
void delay_ms(u16 ms) //u16 的定义在stc.h中,unsigned int u16
{
u16 i ;
do
{
i=MAIN_Fosc/6000;
while(--i);
}
while(--ms);
}主函数(点灯):
void main()
{
while(1)
{
P40 = 0 ; //三极管低导通
P60 = 0 ; //led4引脚低电平
delay_ms(500) ;
P60 = 1 ;
delay_ms(500);
}
}
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。
代码实现(云一个)
定义一个闪三下灯,自定义延时的函数:
void led_blinking (unsigned int xms )
{
P40=0;
P60=0;//1
delay_ms(xms);
P60=1;
delay_ms(xms);
P60=0;//2
delay_ms(xms);
P60=1;
delay_ms(xms);
P60=0;//3
delay_ms(xms);
P60=1;
}主函数:
void main()
{
while(1)
{
led_blinking(300);//3短
led_blinking(900);//3长
led_blinking(300);//3短这样省的在主函数里打一大段东西(
怠惰{:4_164:}
怎么代码会消失的{:4_167:} 建议提前送实验箱,提高学习效率
页:
[1]
2