51单片机

Uncategorized
6.1k words

51单片机的学习S

前置条件

普中开发板
芯片类型:STC89C52RC
软件:程序烧录:PZ-ISP/STC-ISP.exe 程序编译:Keil_v5 vs2022

第一课 点亮一个LED

具体步骤:(略)

名词解释1

电平是电子学中的一个术语,指的是电子信号的电压大小。在电子电路中,电平的高低通常用来表示数字信息,比如逻辑”1”和”0”。在模拟电路中,电平则对应着声音、图像等模拟信号的强度。
在数字电路中,电平通常分为两种:高电平和低电平。
在常见的逻辑电路中,比如CMOS逻辑门,高电平通常被定义为比地电平(GND)高的电压,而低电平则被定义为比地电平低的电压。
电平的测量单位通常是伏特(V),但在数字电路中,也会用逻辑电平(如5V、3.3V)或者音量单位(如分贝,dB)来表示。
正确理解和使用电平是电子工程和计算机科学中的基础知识点。

程序编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
普中

实验名称:点亮第一个LED
接线说明:
实验现象:下载程序后“LED模块”的D1指示灯点亮
注意事项:
***************************************************************************************/
#include "reg52.h"
#include "stdio.h"//这句我自己加的hhh
sbit LED1=P2^0; //将P2.0管脚定义为LED1
sbit LED2 = P2 ^ 1; //将P2.1管脚定义为LED2
sbit LED3 = P2 ^ 2; //将P2.2管脚定义为LED3
sbit LED4 = P2 ^ 3; //将P2.3管脚定义为LED4
sbit LED5 = P2 ^ 4; //将P2.4管脚定义为LED5
sbit LED6 = P2 ^ 5; //将P2.5管脚定义为LED6
sbit LED7 = P2 ^ 6; //将P2.6管脚定义为LED7
sbit LED8 = P2 ^ 7; //将P2.7管脚定义为LED8

/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
/*void main()//这串是原实现
{
LED1=0; //LED1端口设置为低电平
while(1)
{

}
}*/
void __delay_ms(unsigned int ms);
void __delay_ms(unsigned int ms) {
//作用:延时函数,延时时间为ms毫秒
// 1ms延时
unsigned int i, j;
for (i = ms; i > 0; i--)//延时时间为ms毫秒
for (j = 120; j > 0; j--);
}

void main() {
LED1 = 0; //将LED1设为低电平
LED2 = 0; //将LED2设为低电平
LED3 = 0; //将LED3设为低电平
LED4 = 0; //将LED4设为低电平
LED5 = 0; //将LED5设为低电平
LED6 = 0; //将LED6设为低电平
LED7 = 0; //将LED7设为低电平
LED8 = 0; //将LED8设为低电平

while(1) {
int i = 0;//注意,i需要在循环外定义,否则会报错
for (i = 0; i < 8; i++) {
P2 = 0x01 << i;//将P2的第i位设置为高电平
__delay_ms(1000);//延时1s
}
//LED1 = ~LED1; //LED1取反
//__delay_ms(1000); //延时1s
}
}

延时函数的实现原理
举例:

1
2
3
4
5
void __delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--)
for (j = 120; j > 0; j--);
}
  1. 函数接受一个无符号整数 ms 作为参数,表示延迟的毫秒数。
  2. 外层循环会执行 ms 次迭代。在每次迭代中,它会通过递减计数器 i 来减少其值。
  3. 内层循环会执行 120 次迭代。在每次迭代中,它会通过递减计数器 j 来减少其值。这个循环作为一个占位符,并不执行任何实质性操作。
  4. 延迟时间取决于微控制器的时钟速度和编译器的优化设置。更高的时钟速度和优化设置可能会导致更短的延迟时间。

原理:
这种延时实现的原理是基于计算机程序中的循环结构。通过循环重复执行某些操作,可以消耗时间,从而达到延时的效果。具体来说,__delay_ms 函数的原理如下:

  1. 循环计数:函数使用两个无符号整数变量 ij 作为循环计数器。i 用于外层循环,j 用于内层循环。
  2. 外层循环:外层循环会根据传入的 ms 参数执行。每次循环开始时,i 的值减一,当 i 减少到 0 时,外层循环结束。
  3. 内层循环:内层循环会执行 120 次。这个循环实际上是一个空循环,即它不执行任何有意义的操作,只是简单地递减 j 的值。这个循环的作用是消耗时间,从而实现延时。
  4. 时间消耗:内层循环的执行次数(120次)是固定的,因此,延时时间的长短取决于微控制器的时钟频率。假设微控制器的时钟频率是 f(单位为赫兹),那么每次循环消耗的时间大约是 1/f 秒。因此,整个内层循环消耗的时间大约是 120/f 秒。
  5. 总延时:外层循环执行的次数与 ms 参数相等,因此,总的延时时间是内层循环消耗的时间乘以外层循环的次数,即 120/f * ms 秒。
    这种延时方法的准确性受限于循环的执行次数和微控制器的时钟频率。如果时钟频率非常高,那么每次循环的时间将非常短,延时函数的精度就会受到影响。此外,编译器和微控制器的优化设置也会影响循环的实际执行时间。因此,这种基于循环的延时函数通常适用于不需要非常精确延时的场合。对于需要精确控制延时的应用,通常会使用定时器/计数器(如硬件定时器)来实现。

实验现象

LED1~8依次变暗闪烁

电子实习实践题目

(记得好像是实现几个LED灯效果,1是LED1-8从左到右再反过来依次点亮,2是中间两个常亮,两边向中间点亮再返回去,3/4是从左到右依次点亮并保持,然后反过来依次熄灭,之后一个是1-8类似呼吸灯的渐亮和渐灭效果)

名词解释2

(参考链接:【工具使用】Keil5软件使用-基础使用篇

IDE:Integrated Development Environment,是开发集成环境的意思,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。因为做嵌入式开发的,首先需要有可以编写代码的编辑器,然后需要有把代码转换成机器可执行代码的编译器,有时候可能需要在对应硬件芯片上调试,那就需要有个调试器,为了操作方便,一般会把这些都图形化。这么下来的一整套工具集成在一个应用程序里,就是所谓的IDE,这篇文章介绍的Keil uVision就是IDE的一种。

Keil:其实Keil是个公司名,其旗下开发的软件都以Keil开头命名。目前有Keil MDK-ARM、Keil C51、KeilC166和KeilC251等版本。

uVision:uVision是由keil公司开发的集成开发环境(IDE),可以进行代码编辑,文件管理,程序的编译调试等。

MDK、C51:如果想要开发ARM内核的芯片,需要安装MDK-ARM,如果想要开发51内核的芯片,那就需要安装c51。也就是说,MDK、c51只是Keil针对不同芯片内核开发的不同开发集成环境。

CMSIS:ARM Cortex™ 微控制器软件接口标准(CMSIS:Cortex Microcontroller Software Interface Standard) 是 Cortex-M 处理器系列的与供应商无关的硬件抽象层。

烧录:烧软件只是一种叫法,来源于最早刻录光盘,因为是用激光讲数据烧在光盘上,所以后来人们把这种不可逆的记录方式称之为烧录。

bin文件:二进制文件,其用途依系统或应用而定。一种文件格式binary的缩写。一个后缀名为”.bin”的文件,只是表明它是binary格式。一般来讲是机器代码,汇编语言编译后的结果。

axf文件:axf文件是ARM芯片使用的文件格式,它除了包含bin代码外,还包括了输出给调试器的调试信息,例如每行C语言所对应的源文件行号等。

Hex文件:Intel HEX文件是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。在Intel HEX文件中,每一行包含一个HEX记录。这些记录由对应机器语言码和/或常量数据的十六进制编码数字组成。Intel HEX文件通常用于传输将被存于ROM或者EPROM中的程序和数据。

创建项目文件

上述步骤中,我采用直接套用实验模板,仅仅只进行了修改代码方面的操作,没有对项目文件有具体的了解,在这里自行探索补充。

新建项目并配置

芯片选择
没有对应芯片型号,选择相近的AT89C52即可(教程说的)。

  1. 添加模板
  2. 添加.c文件
  3. 在配置选项中勾选生成HEX文件
  4. 头文件#include "reg52.h" #include <reg52.h> 这两种的区别在于,<>会在编译器安装路径"D:\Keil_v5\C51\INC\REG52.H"下搜索有无对应头文件,没有则报错,""是先在当前工程目录下搜索文件,如果没有再去软件安装路径下搜索,如果还没有,才会报错。
  5. 头文件reg52.h将常用模块的地址进行了定义,方便我们的引用。(不用汇编了,好耶!)

芯片介绍和原理学习

1

参考文章:STC89C52RC单片机原理图详解
(还是得自己写一遍,不进脑啊hhh)

单片机上电时,所有I/O口默认为高电平。

单片机I/O口连接的模块(重复I/O口在同一时间只能实现一个功能):
(1)P0.0-P0.7:数码管、外接显示屏LCD1602
(笔记:P0口可以作为I/O,也可以作为扩展(数据地址总线 多路开关)?new words8031单片机 还涉及了D触发器(当初没好好学hhh在这补上了))
(2)P1.0-P1.7:矩阵键盘

(3)P2.0-P2.7:LED模块的8个LED灯

P2.2-P2.4:138译码器选择位;

P2.5-P2.7:外接显示屏LCD1602

(4)P3.0-P3.3:四个独立按键K1~K4

STC89C52RC单片机

2

P0作为输出情况下:
P0只能输出低电平,这是由他的物理结构决定的(一端通一端截止),输出高电平(除非外部上拉电阻)
作为输入:
(涉及读引脚,读锁存器)

P1口P1口
类比P0只能作为I/O使用了
(双向口,拥有上拉电阻,可输出高/低电平)

P2口 P2
(地址总线(控制多路开关)是高八位,P0是低八位)

P3口 P3

碎片化知识

  1. 可能您指的是“rom”,它是“read-only memory”的缩写,中文意思是只读存储器。在单片机中,ROM用来存储程序代码,这些代码在单片机运行时可以被读取但不能被修改。8031是一款老式的单片机,它确实有ROM部分,用来存储固件程序。
    如果您的老师提到8031没有“room”,可能是指8031没有额外的ROM或者其他类型的存储器。在8031的早期版本中,其内置的ROM容量可能比较有限,随着技术的发展,后来的单片机产品如8051等,在ROM和RAM的容量上都有所增加。(AI真好用)

  2. P0口的作用

  3. 两个MOSFET(金属氧化物半导体场效应晶体管)组成的推拉结构通常被称为推拉式MOSFET驱动器或推拉式放大器。这种结构使用两个MOSFET晶体管,一个作为推挽(Push-Pull)配置的驱动器,来提供电流的高效开关和放大功能。
    在这种配置中,一个MOSFET晶体管负责“推”(Push)电流,而另一个负责“拉”(Pull)电流。当需要电流流过负载时,一个MOSFET导通(on),而另一个截止(off);当需要停止电流流过负载时,导通的MOSFET被切换为截止,而另一个MOSFET则导通。这样,电流就可以在两个MOSFET之间切换,从而实现对负载的控制。
    推拉式MOSFET驱动器在模拟电路和开关电路中非常常见,因为它们可以提供较高的电源至地之间的电压摆幅,同时减少电源电流的峰值。这种结构通常用于驱动继电器、电动机、LED和其他需要较高电流驱动的负载。
    在推拉式配置中,MOSFET晶体管可以工作在互补模式,即当一个晶体管导通时,另一个晶体管截止,这样可以有效地控制电流的流动,并减少开关过程中的能量损耗。此外,通过适当的电路设计,可以实现晶体管之间的无缝切换,从而减少开关时间,提高整体电路的性能。(AI)

  4. 在MOSFET(金属氧化物半导体场效应晶体管)的术语中,”漏极”(Drain)和”OC门”(Overlap Gate)是两个不同的部分,但它们在某些情况下可能有关联。

    1. 漏极(Drain):
      漏极是MOSFET的一个端口,电流从该端口流出。在N沟道MOSFET中,电子从源极流向漏极;在P沟道MOSFET中,空穴从源极流向漏极。漏极与源极之间的路径称为漏极路径,它是电流的主要通道。
    2. OC门(Overlap Gate):
      OC门通常指的是场效应晶体管的栅极和源极/漏极之间的一种结构特征。在这种结构中,栅极与源极或漏极的一部分是重叠的,这种重叠设计有助于减少栅极到源极或漏极之间的电阻,从而提高开关速度和减少电源电流。
    3. 在某些推拉式MOSFET驱动器或放大器电路中,OC门可能指的是用于控制MOSFET导通和截止的信号输入端。在这种情况下,OC门可能与源极或漏极的重叠结构无关,而是指一个用于开启或关闭MOSFET的信号输入。
  5. STC89Cxx系列芯片命名规则

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    stc表示stc公司生产的芯片

    8表示芯片8051内核芯片,跟传统51单片机兼容

    9表示内部含有flash的一种pelome存储器

    如80C51中的0内部含有ROM存储器

    87C51,7表示含有EPROM(紫外线可插足)存储器

    c表示是CMOS的产品

    2表示内部存储空间是8kb

    1是4kb

    以1为基数,乘4即为flash容量

    rc是stc内部RAM的大小,512b

    rc+是1280b

之后的学习(可能?)

Cortex-A(嵌入式Linux)

Comments