MCUTuTorial01
P2 命名规则

40正极,20接地。P0到3,镜像Z形。左侧上下,右侧外里。9脚复位,P0上拉。31引脚,电平决定,接高访内,接低访外。

P4–点亮一个LED灯
1)通过PCB原理图可以知道控制LED灯亮灭的是P2口的,并且接入+VCC5V即高电平1,LED灯要那个亮的话那个线,P2端要设置为0,不亮就设置为1,有电势差,即有电流流过灯亮;
2)P2=1111 1110,即第一个灯亮其他灯不亮,但是我们读取是从下面的,所有不是(P2=0111 1111)这样写;
3)用到P2口,所有要导入头文件#….鼠标右键点击就可以加进来;
4)不能识别 P2=1111 1110这样的类型,所有将它转为16进制,开头用0x表示16进制的数
P2=0xFE ; //1111 1110 转换可以网上搜索,计算器也可以直接算;
5)一个亮一个灭P2=0x55; //0101 0101

P5—一个LED灯亮灭交替
1)用STC可以生成延迟函数:根据晶振改系统频率,还有其他信息;
2)复制生成代码到主函数上面,如下图代码:(void:无返回值,这里()可以设置参数);while、do…while都表示循环;

3)nop(),表示空语句,什么都不做,这个函数要加头文件如下:

4)要在主函数,及程序入口调用才可以实现延迟:如下

P6–流水灯—->1)-3)即可实现,4)后面为–>优化
1)将P5延迟的代码复制过来;
2)在main函数里面控制P2口灯的亮灭,代码如下,如上图放在while循环里面;

3)下载到板子上测试即可
4)生成延迟1秒函数,复制到main()函数前面


5)修改生成的延迟函数,可设置控制延时时间

6)主函数修改延时加参数就可以了

P7——独立按键———


1)(上图)一端接GND,另一端接IO口,单片机上电,所有io口默认都是高电平,没按下高电平,按下低电平;

2)把上面的头文件加上X就可以单独设置:

3)如下,单独设置:

4)K1接P3_1(看芯片网络标号RXD对应的引脚)上得到对应连接:


5)按下亮松开灭第一个,P3_1是控制开关的,P2_0控制灯;

p8———独立按键控制LED灯状态

1)消除抖动的方法,延时代码生成:

2)粘贴到main函数上方,修改延时代码如下:

3)实现一个LED灯亮灭未用按键:

4)监测按下按键是否松手,一直按着要一直监测,松手了才操作,像鼠标点击关闭浏览器,点到X的位置,不松还没关闭,松手了才关闭:(28行代码取反的意思,原来亮,取反就是不亮)

p9—-延迟函数同P8 独立按键控制LED——
1)通过工具,生成延时函数,复制到mian.c文件

2)修改延时函数,将延时设置为可改变的,带参数函数;

3)主函数调用延时函数,实现LED灯亮灭,P3_1为控制按钮,P2控制灯亮灭,LEDNum控制移动:

P10—-代码—延迟同P9
**1)**把前面的延迟函数复制过来,延迟函数放在main函数前面,也可以放到后面,如果放到后面要把下面选中的蓝色部分复制到到现在的位置加分号“;”:

2)延时函数在后面时,代码如下,要在前面声明:

3)位移的情况,下面是左移<<

4)左移操作实现:

5)板上的操作实现,只控制第一个按钮,按其他没用,灯往箭头方向移动:

6)实现右移操作(看行数,接5)代码):

P11 —-静态数码管显示——
1)常见数码管使用

2)板中数码管,可控制显示各个位置显示不同数字

3)控制数码管显示的原理图


4)管脚定义(对应字母控制对应位置亮):上面的为共阴极、下面的为共阳极(可以理解为3,8管脚处为供电,三角形尖尖有一横的是负极,所有共阴极),两个图中的数字为引脚:

5)用共阴极(因为共阴极所有3、8号公共端要接地,即为0)连接显示数字6的操作,有电势差即有电流流过灯才会亮,所有下面的1为亮,0不亮:(位选:10111110:显示6)

6)共阳极,接VCC为1,下面的为0才亮,有电流流过,有电势差灯才亮:

7)下面为多个数码管,PCB板的4个为一体,同样上面为共阴极、下面为共阳极的原理图:


8)共阴极,那么我们公共端(12、9、8、6)接地给0才会亮,及可以控制第几个亮;显示的数字则通过下面(11、7、4、2、1、10、5、3即对应字母ABCDEFG)控制,给1才亮,给0不亮(电势差);下图显示结果:第三亮,显示数字1:(共引脚,其他亮的话数字也一样)

9)原理图是共阴极(上面给0、下给1亮)

10)上图完整版:

11)输入3(ABC,读的时候是从下读 C B A )个口,控制输出8个口,输出口连接共阴极的,是0还是1,在这里控制:使能端连接(按下图给1和0就可以用了)

**12)**通过CBA给数字0和1二进制转换10进制(得到数字几)就控制Y几,Y0头上“—”是表示低电平有效(即给0):

13)双向缓冲,高电平往低电平送数据

14)CC2电容作用:滤波电容,稳定电源,确定电路稳定性,提高电路工作性能可靠运行;
RP4:排阻,限流,防止电流过大

15)这里的P01……P07,就是用P0口,后面代码就是通过P0口控制灯的

16)只有Y5为0,其他Y0…Y7都为1;

17)读取顺序都是从下到上

18)代码控制公共端,从下往上写:

19)二进制101转换为1十进制为5,控制Y5,即公共端的LED6;

20)要显示下图的数字6

21)代码实现如下(P2控制共阴极,P0控制显示数字)及结果;


22)要显示的数字对应的值

23)优化操作代码,代码第三行如上表内容,下面//8表示第一个灯Y7即LED8,在最左边那个

24)函数调用(前面参数为显示位置,后面为显示数字),接上面代码:

P12—动态数码管显示—–
1)将P11代码复制粘贴到这里项目;
2)生成延迟函数复制过来,修改一下:


3)动态显示,放循环里面

4)注释掉上面的延时调用,旁边的管会有些影响,需要消影,段选、位选影响造成串位,如下代码消除;

5)了解

P13–模块化编程—-

1)驱动,先会用,后续有详细内容:

2)模块化,功能函数用点C文件写,点H文件声明函数,在main函数文件引入头文件直接调用:

3)注意事项

4)预编译
[5-1] 模块化编程 P13 - 15:49预编译

5)写代码
[5-1] 模块化编程 P13 - 26:42写代码
6)延时函数文件

7)头文件延迟

8)主函数文件程序入口:

9)数码管模块,用到的头文件要引用:

10)数码管模块头文件

11)函数调用

12)显示

P14–LCD1602调试工具——-

1)调试工具原理图

2)模块化代码,可以自己去下(我没有板不下),下完放到自己工程目录下:
[5-2] LCD1602调试工具 P14 - 03:43UP主代码

3)将下好的两个文件添加到工程:

4)文件主要内容如下:

5)main函数调用:

6)显示其他管脚冲突,所有会一起显示:

7)其他函数的调用及功能,可以设置显示位置和范围:
[5-2] LCD1602调试工具 P14 - 14:08

8)需要用到延迟函数:可以直接将前面模块化文件复制到工程目录下,添加进来引用即可;
[5-2] LCD1602调试工具 P14 - 18:18
P15—矩阵按键—–


1)P14-P17给0就代表扫描,其他给1(没选中),一次只能扫描一行;P10-P13给0表示按下,给1表示没按下;(逐行扫描)

2)按列扫描也一样思路
3)写代码:
[6-1] 矩阵键盘 P15 - 26:19
4)将延迟的和LCD1602(液晶显示)的代码复制到工程目录下:
[6-1] 矩阵键盘 P15 - 27:18
移植

5)添加到keil中(选中文件右键,Add filess to Grop—)

**6)**引用头文件使用(前面知识,要先初始化才能用):

7)去掉警告,不显示:

8)快速生成常用格式代码:

9)设置,完成后双击就可以生成了:

10)扫描矩阵按键代码,可以选中图片右键浏览,这样看模糊:(局部变量要赋初始值)

11)第一列判断是否被按下代码

12)那一列检测那一列置0,再检测列的第几个按下(其他的列复制过来改下):

13)头文件声明

14)main函数调用

15)矩阵按键函数其他列如下:




P16–矩阵键盘密码锁—-
1)将P15代码复制过来到工程目录下(复制功能模块点C和点H文件)在主函数引入头文件;

2)乘以10和+=操作理解:
[6-2] 矩阵键盘密码锁 P16 - 08:04

3)显示密码超出范围(大于int类型函数显示值),解决方法Count,计数:
[6-2] 矩阵键盘密码锁 P16 - 10:00
4)11按键确认键:
[6-2] 矩阵键盘密码锁 P16 - 12:1911确认键

5)取消键12
[6-2] 矩阵键盘密码锁 P16 - 18:26

P17—定时器—–有点难前面的搞懂了,这里不是很懂-
1)介绍,Delay前面CPU是一直在等的,用定时器在Delay时可以去检测按键,提高CPU利用率:







2)模式1最常用:

3)模式:时钟–计数最大65535(计数系统TL0\TH0:每来一个脉冲+1方法计数)-TF0(标志位,到最大了回到0)-中断:

4)非门与门图形为控制部分(TR0是否启动暂定)
5)定时器部分:

6)时钟可以由系统提供(上图,晶振),也可以由外部T0P提供(如下图引脚)

7)C/T,给1连上面为控制器,给0连接下面为定时器(如下图):

8)中断系统:

9)中断资源

10)

11)

P18–按键控制LED流水灯&定时器–
1)TMOD寄存器工作模式、TCON控制寄存器,定时器0配置使用(不可位寻址,只能整体赋值)

2)定时器模式1:门控端给0,就是tr0单独控制:C/T,T这里有一横表示低电平有效,就给0是用T(定时器模式),给1用C(控制器模式),M1,M0工作模式选择

3)如上图4-6给0:

4)控制计数器(可位寻址,可以单独每一位赋值)

**5)**中断溢出标志位:
TF=0(等于1产生中断);
TR0=1(定时器是否开启,给1开始,电机开始工作);
IE0、IT0:控制外部中断引脚,可以不配置
6)

7)TH0=64535存不下这么大的数要分开存,这里是16进制

8)定时器配置TH0\TL0

9)中断配置T0–>ET0=1–EA=1,PT0=0

10)定时器配置完成(TMOD定时器工作模式,TCON定时器控制器(单独赋值TF0中断溢出标志位(TF=0整体赋值)\TR0开始计算))第六行改代码为TF0=0
[7-2] 按键控制LED流水灯模式&定时器时钟 P18 - 12:25

11)中断完成,可验证。(P2_0\TMOD等已经定义了所有可以直接使用,包含头文件进来即可)终于有点懂了

12)检测是否进入中断函数里面

13)代码优化,TMOD问题(不可位寻址)配置两个的时候,后面的会把前面的覆盖;

14)不会改变高4位

15)简写

16)差1毫秒原因
[7-2] 按键控制LED流水灯模式&定时器时钟 P18 - 27:12

17)定时器模块化
[7-2] 按键控制LED流水灯模式&定时器时钟 P18 - 34:02


18)static修饰变量程序结束后,内存还有,不清理

19)独立按键模块化,前面学了(while检测松手)P2改为P3,按键为P3,灯为P2

20)头文件

21)main调用

22)流水灯模式P2=0亮
[7-2] 按键控制LED流水灯模式&定时器时钟 P18 - 46:48
23)循环左右移,移动到最高又回到最低位

24)流水灯代码

25)接上面

26)接上面

27)时钟新项目
[7-2] 按键控制LED流水灯模式&定时器时钟 P18 - 53:17
①把LCD1602液晶显示、延迟、定时器、的代码复制到工程目录下,导入;
②主函数包含其他模块头文件并初始化;

③复制定时器中断函数(过程不要太长,一般简单任务)到main函数下:


④定义变量,秒计数、分、小时并显示:

⑤为了方便验证,给初始值

P19—串口通讯——
1)介绍

2)向单片机发送数据(下面框),返回(上框)

3)DB9串口传输数据(注意使用的电压是否一致)使用RS232或RS485电平

4)知识点









P20—串口代码—-
一、

1)将延迟函数复制过来并导入工程里面;
2)配置串口控制寄存器,配置模式1最常用,REN允许接收给1,不允许接收给0(也可以给1外面不给发就行);



3)发送完置1(硬件只负责),但必须软件复位置0;



4)将寄存器配置:
SCON=0x40(串行寄存器配置上面图红色字体部分);PCON=0(波特率);
下图为定时器配置:

这里定时器1,没有定时器0,所有要把高位修改(不影响高低位配置用“”& |“”这两个方式)

5)自动重装:

6)89C52

7)生成代码复制过来修改一下配置

8)发送数据端

9)调用单项发送完成

10)模块化串口设置(完整代码)

11)串口初始化和单片机向电脑发送一个字节递增数据数据

12)调用

二、
[8-2] 串口向电脑发送数据&电脑通过… P20 - 34:23第二实现
1)复制一份一修改(收:要中断系统,配置寄存器REN置1接收使能);

所有寄存器设置如下配置:

2)配置中断

3)中断配置代码如下:

3)中断寄存器修改后总如下,其他不用修改

4)中断号4:

4)中断验证:

4)接收中断标志RI

[8-2] 串口向电脑发送数据&电脑通过… P20 - 42:17
5)函数不能在主函数又在中断函数里面,调用,向单片机发送数据代码:第二功能实现:

6)波特率计算
[8-2] 串口向电脑发送数据&电脑通过… P20 - 47:45

P21 –LED点阵屏—-




SER串行输入,往下一位一位移动(SERCLK),够8位复制到右边(RCLK)

—–P23实时时钟——-(上面两个视频有点蒙到时候可以再看)
1)RTC:实时时钟

2)DIP直插封装、so贴片封装、接时钟的晶振(脉冲)固定的,CE、I/O、SCLK通讯引脚,设置写入时间及读取时钟

3)原理图

4)内部结果框图,RAM(寄存器)

5)寄存器、WP:读写写保护;地址:0s80

6)要操作RTC最高位给1,第6位操作时钟给0,操作秒地址位给0,第0位读写操作:WR:0写;即10000000-》80h:写秒,读81h

7)时序定义要操CE:使能开始给0,要使用给1,最后结束给0;在SCLK时钟上升沿,IO口被写入,下降沿输出:R/W(控制读写,给1输出数据,给0,写完一个字节继续写)D0-D7:1302操控,其他的单片机操控。

P24-DS1302时钟&可调时钟——————-
1)把LCD1602液晶屏显示配置代码复制过来,导入项目中
2)键时钟的文件独立出来定义P34-36:

3)从新定义三个引脚

4)初始化写操作,默认给0:


5)时钟写字节

6)时钟读操作,先给下降沿,再上升沿,控制下面红色部分,上下区分开来:(&清零,|置1)

7)看上图框前8位先置0再置1的原因(加上后面一句):


8)头文件声明:

9)调用


10)调用测试后问题解决

11)存在方式(最后两行,取高4位和低4位)

12)调用显示十进制方法:

13)定义数组优化模块
[10-2] DS1302时钟&可调时钟 P24 - 39:45

14)设置时间和读取时间(WP:写保护关闭,置0):写的地址或上0x01就是读地址

15)函数名为头文件的10行:

16)函数头文件

17)主函数

17)主函数

第一个功能结束—————————
第二个功能——————————–
[10-2] DS1302时钟&可调时钟 P24 - 54:11
1)将定时器和按键模块化代码拿过来使用;
2)在主函数包含头文件,其他的模块化代码不用动,写好直接用:

2)显示时间(最后的2是显示宽度)

3)后面不写了代码太多,都是判断年月日的
[10-2] DS1302时钟&可调时钟 P24 - 01:10:18减
P25——————蜂鸣器——————-
1)介绍



1)介绍C1-C2升高8度。往右升高,往左降低:相邻半音黑白,1对应中央C1,i表示升即C2部分,降低8度下面加一个点,降低2个8度,下面加两个点(白键);黑升音#,降音b

2)-表示时长,665-表示5占2个时长;

3)音符

4)音符i. 表示500+250s,符弧,按下去不放

5)C调全白键,D有黑键

6)频率,12频分,周期=1/频率*1000000


P26—蜂鸣器波播发提示音&音乐代码–
1)延迟、数码管(8字灯)、按键模块拿过来
2)实现

3)蜂鸣器模块化代码





第一个功能结束——————
第二个功能—播放音乐–后面有总代码
1)
[11-2] 蜂鸣器播放提示音&音乐 P26 - 15:02
2)定时器模块、延迟模块拿进来

3)中断

4)中断TL0\TH0计数来一个脉冲就计数,时钟,一个为结束标志位,决定中断时间的,时间一到就中断了:20行代码,半个周期翻转一次:

5)64580重装值,到时间从新中断计数,上面一个例子的钢琴键图下面的图中有计算

6)显示第一个低音

7)上图显示的为如下:



8)修改,以1/4音符为基准

9)125以1/16为基准

10)索引数组

小星星音乐播放总代码:

音符索引与时长




小星星代码结束
天空之城代码开始-不想写:
[11-2] 蜂鸣器播放提示音&音乐 P26 - 41:46
P27——-AT24C02—–
1)介绍SRAM速度比DRAM快:






2)单片机IO口弱上拉模式、

3)I2C起始和终止位置

4)发送

5)接收


地址7位+1位标志位:

6)开始位+接收地址+读+数据+应答+数据+应答+停止




P28—-AT24C02数据存储&秒表——-
1)按键、延迟、LCD1602液晶屏模块拿进来;
2)I2C模块:开始、结束、发送一个字节、接收一个字节
3)AT模块:在某个地址写/读

4)-2)I2C位声明(SCL\SDA开始为高电平):读取时要先释放SDA=1;0为应答,1非应答






5)I2C发送一个字节看P27的4)图,要考虑要不要延时,数据信号线和时钟信号线切换时:


5)AT模块SLAVE ADDRESS+W :从机地址;WordAddress 要写入字节的地址





6)写字节:上面代码根据下图写,从机地址最后一个框里面:(255溢出)

[12-2] AT24C02数据存储&秒表(定… P28 - 41:28
–二—另一个功能—偷懒不想弄了-
[12-2] AT24C02数据存储&秒表(定… P28 - 46:40
**1)**数码管Nixie、延时Delay、按键、定时器。。。拿过来;
**2)**数码管、按键都要用到定时器;。。
P29–DS18B20温度传感器——-













1)MS BYTE前5位是符号位,1为负数,0为正数(在前);
2)LS BYT后5位是小数位,如果BIT为0.5,后面依次减少一半; 其他为实际数据的补码存储;
P30—DS18B20读取温度——
1)把延时、LCD液晶屏拿过来;
2)定义端口、再初始化(要拉低,所有先拉高):

3)初始化


4)发送一位看下面字,i要定义一下


5)发送接收一位


6)发送一个字节和接收一个字节及声明



7)转换温度

8)根据上图只有三个函数转换温度,发送一个指令0xcc


9)读取温度,用补码表示正负,所有用int接收,26行除以16.0右移的是4位:






10)主函数调用:转换后加个延时头引用,转换完成再读:



**二—温度报警器—**第二个代码不写了,摆烂
[13-2] DS18B20温度读取&温度报警器 P30 - 44:53
P31—LCD1602—————–














P32—LCD1602功能函数—–

1)引脚定义:P0为数据端口引脚


2)写指令(看上节引脚指令图,可以知道1和0代表什么):

3)写数据,跟面一样改33行为1就可以了

4)初始化


5)显示数据,光标地址


6)显示字符串(写到显示屏里面显示出来)

7)无符号整数显示(光标位置可以独立出来)




8)显示有符号的数


9)显示16进制数,取每一位除16,不想整理

[14-2] LCD1602功能函数代码 P32 - 46:08
10)显示二进制,对2取余

11)
[14-2] LCD1602功能函数代码 P32 - 55:35字符超出-移动
P33–直流电机驱动PWM—
1)直流电机、电机匀速控制,转1毫秒停1毫秒或其他的设置;频率快就不会出现抖动,比较平缓,频率慢会出现抖动;Ton打开时间、Toff关闭时间、Ts总时间;占空比高:高电平长低电平端、占空比低:高电平短,低电平长(周期一样);



P34LED呼吸灯&直流电机调速–代码
1)LED呼吸灯:P2口为控制LED,0亮,1灭;亮延时时间长,灯就亮;亮时间段,灭时间长灯就暗(循环),延时总时间固定,周期就固定:



2)PWM通常用硬件来实现(定时器有些有这个功能)如下用定时器实现
[15-2] LED呼吸灯&直流电机调速 P34 - 10:47

3)数码管、定时器、按键、延时模块的代码拿过来;**计数<比较值,输出0,计数>比较值,输出1(自己设置的,这里以这个为例)**控制占空比可以用比较值控制;

4)定时器初始化,频率:10K-20K就不会产生鸣叫声,运行稳定。这里只能设置低的,100us

5)中断

6)定时器Counter:计数器;
Counter%=100;自动刷新,超过100后又从0开始;
Compare:比较值;如下实现:3)图功能,设置占空比直接设置:compare;比较值越大低电平越长;



6)电机(1转)调速,改一下灯的端口即可

7)电机速度可以调一下才能动


8)效果


P35— AD/DA—–
1)介绍








2)可调节电阻、热敏电阻、光敏电阻(AD);

3)DA

4)数字量(0-255)、模拟量(0-5V);ADC触摸屏芯片


[16-1] AD/DA P35 - 23:49运算放大器
5)DA与AD原理
[16-1] AD/DA P35 - 46:39DA原理分析
占空比:开始时间/总时间(开始时间+结束时间)





[16-1] AD/DA P35 - 01:21:59时序
CS:片选、共用线:DCLK时钟、DIN输入、DOUT输出

AIN0\AIN1\AIN2:光敏、热敏、可调节

P36AD—-模数转换&DA数模转换——
1) 把延时、液晶屏LCD拿过来;
2)键XPT2046源文件和头文件;
3)接口引脚定义:CS\DCLK\DIN\DOUT





3)根据上面时序写代码:





4)后面写了