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