51单片机
型号:STC89C52RC/LE52RC这个型号
Keil上选型号:Atmel-AT89C52
Lecture 2 LED
2.1 点亮一个LED
贴片二极管:绿色为负极
电阻读数:

单片机里CPU通过程序控制寄存器,寄存器再通过驱动器实现对应功能

进制转换

LED 0xFE 11111110(末位D1亮)
2.2 可控时长流水灯
延时操作:stc-isp中软件延时计算器

可控延时函数 延时1ms
1 | |
Lecture 3 独立按键
3 独立按键控制LED移位
消抖操作:
1 | |
其中的Delay(20)用于消抖延时
while(P3_1==0);按下状态时始终执行空语句,用于等待按键释放的操作
否则按键按下时LED会一直闪
if语句和P2–构成了按键控制LED亮灭
1 | |
两个对于lednum的操作是用于处理二进制溢出的问题,实现满8归0
取反是因为P2为低电平(0)时才亮
Lecture 4 数码管
4.1 静态数码管显示

上面为共阴极接地,下面为共阳极接VCC
原理图分析:

P22 P23 P24均为输入端 8个LED端口为输出端

C端为高端 通过CBA的十进制数保证Yx为低电平
现在目标让第三个输出6
得先让LED6为0 也就是上面74LS138 LED6为输出 也就是Y5 也就是CBA二进制输入为5

4.2 动态数码管显示
核心思想:利用极短暂延时 人眼无法察觉使得同时显示多个数字
要注意消影问题
利用清零操作
位选 段选 **清零 ** 位选 段选

上面在Nixie函数中的延时+归零 避免重影
下面直接的调用
Lecture 5 调试
Lecture 5.1 模块化编程
模块化编程:记得放.c和.h

根目录下加两个文件:Delay.c Delay.h
小心不要写成Dealy了!!!!
Delay.c
1 | |
Delay.h文件里面的调用
1 | |
main函数里面记得引用回来 #include "Delay.h"
Lecture 5.2 LCD1602调试工具

Lecture 6 矩阵键盘
6.1矩阵键盘的读取
6.1.1扫描
数码管扫描(输出扫描) 原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果矩阵键盘扫描(输入扫描) 原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果以上两种扫描方式的共性:节省I/O口

矩阵扫描利用按列扫描方式
错误调用
1 | |
- 每微秒调用一次 Matrixkey()(非常频繁)
- 即使没有按键,也会在屏幕上显示”000”
- 屏幕疯狂闪烁,根本看不清内容
- 当真的有按键时,可能因为刷新太快而错过显示
正确调用
1 | |
要有一个 if(key)的判断 避免速度过快 疯狂调用 显示00 if的目的是锁住显示函数
不加判断的话 他会迅速变成00
6.2 矩阵键盘密码锁
贴一下源码 注意一下几个条件判断以及结果的复位清零操作
1 | |
Lecture 7 定时
7.1 定时器原理
一、作用:
1、计时系统c2、替代长时间的delay
二、工作模式
T1: 16位定时器/计数器
三、中断系统


四、定时器相关寄存器
定时器功能的关键是控制寄存器的状态

1、TCON寄存器的每一位

2、TMOD寄存器


一开始配置M1=0 M0=1使得定时器按照模式1工作
GATE 门控端给0 由TR0单独控制是否计数(结合与非门)
3、中断寄存器



EA:enable all
4、定时器功能

Ti是外部引脚 外部给的脉冲实现计数器功能
OSC为系统时钟,晶振周期为12Mhz

7.2 定时器的应用(代码:按键控制LED流水灯)
一、编程步骤:
1、初始化
(1)配置M1=0 M0=1使得定时器按照模式1工作
1 | |
Lecture 8 串口
8.1 串口通信
1、串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
2、51自带UART 进行单品机的串口通信
3、
简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
TXD与RXD要交叉连接
当只需单向的数据传输时,可以直接一根通信线
当电平标准不一致时,需要加电平转换芯片

若设备2无法自我供电 利用VCC来供电

通信接口

串行通信分类
(1)按传输方向
全双工:打电话
半双工:对讲机
单工:遥控器与电脑
(2)按同步时钟信号区分
同步通信:有CLK引脚 时钟同步 格式为信息帧
异步通信:无 格式为固定的数据帧 要求有相同的波特率(码元的传输速率) 比特率:每秒传输了多少二进制位数

三、51单片机的串口:异步全双工的UART串口


串口模式

3、串口控制寄存器SCON
1、SMO、SM1:控制工作方式
SM2:多机通信 若只有两个设备 设置为0即可
REN:允许接受位
为1时表示允许该设备接收数据
0:禁止
TB8:发送校验位
RB8:接受校验位
模式1暂时不需要校验 设置为0 用到串口校验再说
TI: 发送中断
RI:接受中断


4、串口数据缓冲寄存器SBUF
用于接收串口收发的数据
自动处理起始位和停止位
5、初值寄存器TH1 TL1
T1 波特率发生器 串口中使用模式2双八位自动重装

所以此时要注意定时器中选择的01(模式1)波特率发生器时10(模式2)

不用给T1开中断 因为定时器可以自己赋初值
6、T1初值设置(波特率相应的计算)

代码
1 | |
不过初始化可以考v了 stc-isp中的波特率计算器
注意这里的每一步配置

7、单片机通过串口发送数据
main函数里面 无需用中断

8、单片机通过串口接收数据
串口接收数据是需要打开REN(接收)并且打开串口中断的

控制ES EA即可
1 | |
1 | |
9、数据显示模式
跟ASCII码值有关
HEX模式:底层传输的二进制/十六进制数据
文本模式:ASCII码值编码后的实际数据
Lecture 9 LED点阵屏
9.1 LED点阵屏理论知识


扫描方式:可逐行或逐列

行控制阳极(看74HC595的三个输入端):DP 列控制阴极:P0


右边列为输出缓存
QH’会被接到其他74HC595 不断套娃
不过要先推前面的再推后面的
每次传输SER SERCLK上升沿时向下移位 只到满8后RCLK上升沿时锁存
9.2 制作图片显示以及动画
1、符号说明
1 | |
这里取位很妙
SER=Byte&0x80;这一步取最高位的位 要么是1000 0000=256 (非0即1)或0000 0000(0即0)
实现取位的目的
取位操作
1 | |
记得消影
段选 位选 延时 位清0 段选 位选…
Lecture 10 DS1302
10.1 DS1302实时时钟
单片机时钟芯片:计时精度高 会占用芯片 无法断电
时钟芯片会带有备用电池 休眠状态下依然工作显示时间
RTC:实时时钟,是一种集成电路,通常称为时钟芯片
数据手册内容


**VCC2是主电源 VCC1是备用电源!!!**需要注意
命令字用于负责操作在哪里读出或者写入

实际上只需要看时钟相关的寄存器地址定义即可

时序定义
读写操作要先传输命令字再传输数据
每次先传最低位

10.2 代码篇:DS1302时钟&可调时钟
1、对DS1302时钟模块的输入进行控制: SCLK I/O CE


要注意内部寄存器利用BCD码来记数
也就是将低四位表示个位 高四位表示十位..以此类推
所以最低位1010是10 个位不可能是10
所以写入数据时 要加十进制转化位bcd码 而读取时要把BCD码转化为十进制