Bootstrap

51单片机入门学习笔记(上)

笔记整理自B站UP主江科大自化协教程《51单片机入门教程-2020版 程序全程纯手打 从零开始入门》

所用单片机为普中51 STC89C52单片机2022新款,文中所提到的调试现象及结果也都基于此款单片机。

如何控制单片机的某个引脚输出高低电平?

图解分析如下:

总结:CPU通过配置寄存器来控制硬件电路

51单片机下载时一直显示正在检测目标单片机?

解决办法如下图所示:

C51数据类型

按键的抖动

数码管消影

单片机速度很快,在上一次的段选和下一次的位选之间会出现问题,会出现串位的现象。

解决办法如下图所示:

数码管驱动方式

模块化编程框图

扫描的概念

很多显示器都会采用矩阵的方式进行扫描

I/O口结构

简单理解:

弱上拉,即输出的1驱动能力是有限的

弱上拉内部简单模型:

这也解释了为什么驱动LED低电平点亮,高电平熄灭,是因为输出1驱动能力很弱,允许外部装置将其拉低(输入),按键也是采用这种方式。

有源蜂鸣器和无源蜂鸣器的区别

有无振荡源,有源蜂鸣器内部带振荡源,所以只要一通电就会叫;而无源蜂鸣器内部不带振荡源,所以如果用直流信号无法令其鸣叫。

定时器

用定时器前首先要确定此型号的单片机有没有这个定时器!

寄存器是连接软硬件的媒介

在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式

寄存器相当于一个复杂机器的“操作按钮”

循环左移和循环右移函数

包含#include <INTRINS.H>头文件

循环左移函数——_crol_

eg:a = 0x01; a = _crol_(a, 1); a = 0x02;

循环右移函数——_cror_

串口通信(Serial)

奇校验:保证1的个数是奇数,如果发的数据是0000 0011,后面再补一位1,保证1的个数是奇数

偶校验:保证1的个数是偶数,如果发的数据是0000 0011,后面再补一位0,保证1的个数是偶数

波特率如何计算

  • 对于12MHz的晶振

0xF3 = 243

每隔256溢出一次,计数值256 - 243 = 13

12MHz晶振,在12T的模式下,每1us计一次数

溢出率 1 / 13 = 0.0769230769230769

模式1/模式3的波特率 = 2 / 32 * 0.0769230769230769 = 0.0048076923076923MHz ≈ 4807Hz(有误差)

  • 对于11.0592MHz的晶振

0xF4 = 244

每隔256溢出一次,计数值256 - 244 = 12

11.0592MHz晶振,在12T的模式下,每0.9216us计一次数

溢出率 0.9216us / 12 = 0.0768

模式1/模式3的波特率 = 2 / 32 * 0.0768 = 0.0048MHz = 4800Hz

74HC595模块

OE:OutPut Enable输出使能,低电平有效,所以要有输出,OE要接GND(跳线帽)

RCLK:Register clock寄存器时钟

SRCLR:Serial Clear串行清空,接VCC,代表它不清空

QH':用于多片级联

74HC595这里是恒压输出,相对于单片机的IO口(弱上拉),它输出1的驱动能力较大,所以LED点阵屏阳极是接74HC595的。

LED点阵屏

同数码管一样,也需要消影

段选 位选 延时 位清零 段选 位选 延时 位清零

RAM和ROM

ROM:程序存储器(相当于计算机硬盘)FLASH

RAM:随机存储器,数据存储器(相当于计算机内存)

例如对数组的定义:

unsigned char Animation[]——定义在RAM中

unsigned char code Animation[]——定义在FLASH中,FLASH空间更大,但是数组就不能更改了unmodifiable lvalue

DS1302

使用LCD1602显示DS1302时钟时,屏幕总是会乱闪,出现一些乱码

解决方法:J24跳线帽接OE和VCC

关于WP(写入保护):

如果开了写入保护,控制写入保护的0x8E寄存器也被保护了,你也无法靠写入0x8E来关闭保护,所以你一旦开了写入保护,你就无法关闭了 ——摘自B站弹幕

BCD码

感谢抽出宝贵时间阅读的各位小读者们,创作不易,如果感觉有帮助的话,帮忙点个赞再走吧!你的支持是我创作的动力,希望能带给大家更多优质的文章。

;