【实验箱已收到】陈老师《单片机原理及应用-STC8H8K64U》打卡 | 实验箱已收到
本帖最后由 gentleman 于 2023-8-16 16:39 编辑为保证笔记连贯性
何老师的课在另一个帖子https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3326
2023/7/19 第1课时
课程特点
要会c与数电
多实践
背景机型的选择
微机原理历史变革
Z80 单板机体积大,双列直插
8086 现在基本找不到了
8031 无程序存储器,ram小,需要仿真器
8051 集成4kROM 但自己刷不了 需要仿真器
8751 集成4kEPROM 需要擦除器合编程器仿真器
at89c51 4k 可擦写程序存储器
stc89c51 4kflashisp编程 需要仿真器
stc12/15 4kflashisp iap能直接仿真
stc8 1T高速内核 64kflash 256bRAM
8192B 拓展ram 1280bram用于usB
5个定时器 可编程时钟60I/O 4UART
1SPI 1I2C 1USB 15通道12位ADC
8路pwm DMA 等
单片机的学习条件
认识常用元件
电阻 电容 二极管 三极管
晶振 数码管 面包板 单片机
万能版 套件 试验箱仿真软件
isp
isp步骤
按住int0 按下ON/OFF 点击下载/编程按钮
2023/7/19 第二课时
第一个实例
分析电路图得出结论 P4.0 为低, P6口为低 时 led灯会亮
简单步骤
启动项目
新建源文件加入项目
编译 链接 生成hex
下载hex到单片机内部
运行
#include "stc8.h"
void delay(unsigned long delaycnt)
{
while(delaycnt--);
}
void main(void)
{
P4M1 = 0Xff;
P4M0 = 0Xff;
P6M1 = 0Xff;
P6M0 = 0Xff;
P40 = 0;
while(1)
{
P60 = 1;
delay(30000);
P60 = 1;
delay(30000);
}
}
可以看得到运行结果 led灯在闪烁
为了获得更准确的延时,可以在stc-isp 中生成对应的延时函数
有关基础概念
数制
十进制 D
二进制 B 用晶体管截至饱和表示1,0
十六进制 c语言中用0-9 A-F表示
利用接口计数转换
四位二进制数对应一位十六进制
有一个的对应的表
使用pc的计算器可以很容易的转换
单位
位(bit)
字节(byte)
KMGT
计算机系统
显示器 键鼠 打印机 主机
内部主板 电源 hdd ram cpu 等
软件 window macos linux 等
应用软件 word ppt qqIDE 等
微观构成cpu i/o 存储器 i/o设备
微处理器 cpu微型计算机 cpu + io+存储器
基本结构控制器 ALU 组成cpu 外部通过总线链接外设
总线 AB 地址总线输出访问的内存或IO 的地址 决定寻址范围
DB 数据总线 读写外部数据 决定一次数据的位数
CB cpu的命令 进行控制和联络输入输出控制信号
实例 cpu 通过 地址总线 发出0x2000
存储器 通过数据总线 将数据 01000111给cpu
cpu 通过控制总线发送读写控制和片选信号
单片机
集成在一个芯片的微型计算机
单片机厂商及产品
stc8(STC) pic(MICROCHICP) msp(TI)stm8(ST)
at89c(ATMEL ) P89 (NXP)
单片机应用
以单片机为核心 配以输入 输出 显示 控制 等外围电路和软件
2023/7/26 第三课时
数字逻辑与基本数字电路
逻辑电平 TTL/COMS
高于2.2v 高电平 用1表示
低于0.8v 低电平 用0表示
上升沿和下降沿
_
低电平到高电平 0到1 的瞬间脚上升沿 _|
_
高电平到低电平 1到0 的瞬间叫下降沿|_
逻辑运算
逻辑与 Y=A^B 见0则0 相当于串联
真值表 A B A^B
0 0 0
1 0 0
0 1 0
1 1 1
逻辑或 Y=A+B 见1则1 相当于并联
真值表 A B A^B
0 0 0
1 0 1
0 1 1
1 1 1
非门 Y = ~A 相反
真值表 A ~A
0 1
1 0
单片机的应用场景
单片机的特点
集成度高,体积小
功耗低 PC 400W
mcu 2.09ma/0.48ma
可靠性高 不死机,使用工业场景有看门狗
价格低廉 cpu上千元 单片机1~几块
单片机的应用场景
智能仪器仪表
工农业实时监控
计算机网络与通讯领域
家用电器
医用设备领域
其他领域
2023/7/26 第四课时
单片机的内部结构
微型计算机的内部框架结构
控制器 alu 组成cpu
通过ab db cb 总线 链接存储器 io
io 连接 io 设备
传统8051单片机的内部结构
包含中央处理器 程序存储器 4kROM 128K RAM
2个定时器 4给8为io 1个串口
以及io复用总线(ab db cb)
stc8h8k64u的单片机的内部构成
8051内核8位数据总线 与16位地址总线
大量的io口 定时器
还有dma
有硬件i2c spi 等
cpu结构-2
寄存器
D7H D6H D5H D4H D3H D2H D1H D0H
CY AC F0 RS1 RS0 0V F1 P
控制器
cpu的大脑中枢
存储空间
flash0000h~ffffh
ram
低字节 128byte
高字节 128byte
sfr 可直接寻址
数据存储区域
256内部 ram00h- ffh
2023/08/02 第5课时
存储器空间及储存器-6
数据存储器
高128字节RAM 和特殊功能寄存器
80H-FFH SFR
单片机的功能是通过sfr设置的
分SFR 与 XFR
拓展数据存储区域
0000h-1fffh 8192b 的XRAM
xdata 声明
unsigned char xdata i = 0;
单片机的引脚
LQFP64 封装 小圆点处为第一脚
PDIP40
最小系统
低电平复位电路
按键按下断电/上电电路
滤波电容
逻辑符号图
标出io/特殊功能 引脚的逻辑图
画原理图时更容易分析
引脚简介
VCC/AVcc 5v
Gnd/AGnd接电源地
晶振 基本不用 用做普通io
ALE 没啥用
NRST 可做复位脚
IO 的作用
开关量输入输出
复用
IO的工作模式
准双向 推挽 高阻 开漏
可使用工具设置
要先设置模式在使用,多数默认为高祖输入状态
2023/08/02 第六课时
I/O 的复用
P0 地址 数据总线adc uart3 4t3 4时钟 t3 4脉冲 pwm
P1 ADC PWMSPIUART2 3系统时钟输出晶振i2c
P2 地址总线高8位spi i2c pwm
P3 外部中断 计数器 spi i2c 比较器uart1pwm
p4 spi读写控制信号 uart2 地址锁存信号
P5 uart 3 4比较器rst系统时钟输出spi pwm
P6 PWM
P7 PWMI2C
I/O 的使用
上拉的电阻 现在内部集成4.1k
下拉电阻 集成10k
三极管控制 10k上拉vcc 15k 限流连接到基极vt 集电极通过电阻拉到vcc 接OUT发射机接地
I/O 外部状态的输入
记得加延时,速度太快读的不对
单片机应用系统的典型构成
拓展RAM用不上
P0P2 占用当作数据 地址总线
ALE 接地址锁存器
通过的地址总线给锁存器地址
数据总线送数据
汇编
学习原因
有助于理解原理
移植会用
伪指令
ORG addr16
设置起始地址一般出现在开头不加ORG 从0000h 存放目标程序
< 标号:> DB <项或项表>
吧项或项表的值 存入标号的连续单元
DW
用的少基本和DB 相同位数不一样
< 标号:> EQU 数值或表达式
类似#define
符号名 DATA表达式
将内部ram的地址给符号名
XDATA
类似上一条 操作xram
INCLUDE
#INCLUDE (文件名)
包含头文件
ORG 0000H
lJMPMAIN
ORG 0003H
LJMP INT_ISR
ORG00BH
LJMPT0_ISR
ORG0013H
LJMPINT1_ISR
ORG001BH
LJMPT1_ISR
ORG0023H
LJMPUART_ISR
ORG0100H
MAIN: MOV SP #70H
LOOP:
LJMP LOOP
这是汇编程序的基本格式
本帖最后由 gentleman 于 2023-8-9 08:41 编辑
2023/08/07第7课时
$INCLUDE (文件名)
包含8h头文件记得加$NOMOD51
避免重复定义
助记符语言
cpu 只认识 机器语言
例 248B
不好用 引入助记符
例MOV ADD ANL
ADD A #8BH 248B
MOV A #76H74H,76H
操作码
操作数
地址或数据
MOV 2个地址ADD 两个数据 JMP 操作PC
数据只能是整数
加0表式16进制数据 0ABH
后面加B 表示二进制数据00111100B
指令格式及分类
[标号:] 操作码助记符 [第一操作数][,第二操作数][,第三操作数][;注释]
标号指地址 LOOP LOOP1 TABLE
也做子程序的名字
RETI ;中断返回
CPL A ; 累加器按位取反
ADD A,#56H ; 2个操作数
CJNER2,#60H,LOOP
注释可以用 // 或 /*...*/
keil 工具可以批量注释/去掉注释
指令的代码的存储格式
分单字节双字节三字节
占1~3个单元
MOV A, #68H
MOV B,#73H
1004H 73H
1003H F0H
1002H 75H
1001H 68H
1000H 74H
符号约定
寻址方式
8051内核7种寻址方式
立即寻址
MOV A #28H 立即数送入A
0100H 74H 操作码
0101H 28H 立即数
0102H 下一条
A:28H
寄存器寻址
INC R5 R5+1送回R5
直接寻址
SFR
RAM 低128单元
为地址空间
MOV A 45H
0100H E5H 操作码
0101H 45H 立即数
0102H 下一条
45H34H
46H A:34H
寄存器间接寻址
MOV A ,@R0
不用操作数 用地址
操作数不能变 而地址内的数据可变
变址寻址
MOVC A,@A+PC
PC指针不断移动 指向需要执行的机器指令
MOV A #02H
MOV DDPTR #TABLE
MOVC A, @A+DPTR
TABLE: DB 30H
DB 31H
DB 32H
由于DPTR 可以赋值,比PC常用
相对寻址
相对跳转指令
JC 80H 尽量用标号代替80H
只能跳转PC -128~127 ;
跳的太远就多跳几次;
有很多技巧
位寻址
MOV C, P1.0
SETB 20H.6
CLR25H 不同于 MOV 25H #0H 前者位操作后者字节单元
MOV A,60H 把60h给累加器A(8位)
MOV C,60H 吧60h位给C(1位)
023/8/7 第8课时
数据传送类指令
相当于 =
对psw没用
MOV <目的字节>,<源字节>
MOV A, #data8 ;(A) <-- #data8
MOV addr8, #data8 ;(addr8) <-- #data8
MOV @Ri, #data8 ;((RI)) <-- #data8 注意2种寻址方式
MOV Rn, #data8 ;(Rn) <-- #data8
简单的汇编程序
在MAIN 种添加
MOV R0 #50H
MOV @R0#56H
仿真
看内存内容 d:0
F11 单步运行
F10 可以跳过延时等子函数
LJMP MAIN 运行后 SP 变为07
继续F11 R0寄存器 被放入 0x50
F11 56 被放入 50H 内存中
添加MOV A,#98H 重新编译
sys中a 变成98h
添加MOV 20H,#56H
MOV P0 #75H
F11 看到 56H送入到内存20H中
F11 在parllel PORT 0 中看到 P0口变成了75H
测试一下这个仿真图片有没有上传成功
MOV A, addr8 ;(A)<--(addr8)
MOV A, @Ri
MOV A,Rn
MOV addr8,A
MOV@Ri, A
MOVRn, A
注释就不抄了,就是把后面给前面 ,该怎么寻址怎么寻址
MOV R1 #82H
MOV A @R1
手动给82H RAM 赋值0x59
F11 测试失败
修改target 位8052
还是没变
仿真失败,等待硬件仿真测试
MOV addr8,addr8
MOV addr8,@Ri
MOV addr8,Rn
MOV @Ri,addr8
MOV Rn,addr8
RAM之间 不需要寄存器
MOV DPTR,#data16
断点 MOV DPTR #0126H
DPTR 由0000 变为0126
MOVX XRAM 用的
R1/R0 间接寻址
MOVXA,@Ri
MOVX@RI,A
DPTR 间接寻址
MOVXA,@DPTR
MOVX@DPTR,A
仿真 MOVXDPTR,#0100H
MOVXA,@DPTR
RAM X:0100H
赋值45
Sys a 中变为0x45
提到《数字系统设计》课程,后面找本书看看讲的啥
MOVCA,@A+PC
MOVCA,@A+DPTR
两条查表指令
PC 只能256范围DPTR 用的多
查平方表子程序
PUSH 保护DPTRPOP 恢复dptr
MOV 附表
MOVC 查表
调用子程序
LCALL GETSQ
MOV 50H, A
F11 看到a 里面 7
F11a 里面 27
数据交换指令
字节交换指令
XCH A,addr8
XCH A,@Ri
XCH A,Rn
前后两个操作数互换
XCHD A,@Ri
连个操作数低4位交换,高4位不变,不影响标志位
堆栈
PUSH addr8
POP addr8
先进后出 SP指针控制
PUSH ACC
PUSH PSW
POP PSW
POP ACC
逻辑操作类指令
24条
ANL ORL XRL 常用双操作数
ANL (ORL,XRL) A,#data8 等
SWAP ASCII 与BCD 码切换
算数指令
ADD ADDC 加法指令 影响标志位
SUBB 带结尾减法指令先 CLR C
MULAB 乘法指令 >255 溢出
A*B = BA
INC C的++
DAA 二十进制转换
楼主对我们的免费公开课 认可/支持/给力,建议主动联系我们同事
=====提前获得 【免费+包邮送】的 STC32G12K128实验箱 或 STC8H8K64U实验箱
=====现在送的,都可以利用MCU自带的 硬件USB直接仿真,硬件USB直接下载
【免费+包邮】 送/申样/采购 可加 如下 QQ或微信联系
加STC华南区客服刘经理QQ: 3398500488 ;微信:18106296592要求 【免费+包邮】 送, 还免费教仿真
加STC华南区客服曹经理QQ:1933892258 ;微信:18106296595 要求 【免费+包邮】 送, 还免费教仿真
加STC华东区客服聂经理QQ:2593903262;微信:18106296598要求 【免费+包邮】 送, 还免费教仿真
加STC西北区客服孙经理QQ: 1347154513 ;微信:18106296593要求 【免费+包邮】 送, 还免费教仿真
加STC华北区客服石经理QQ: 1638975601 ;微信:19952583876要求 【免费+包邮】 送, 还免费教仿真
加STC华中区客服唐经理QQ:2571301708 ;微信:18106296589 要求 【免费+包邮】 送, 还免费教仿真
加STC东北区客服张经理QQ:3141888640 ;微信:19952583265 要求 【免费+包邮】 送, 还免费教仿真
加STC西南区客服张经理QQ:3141888640 ;微信:19952583265 要求 【免费+包邮】 送, 还免费教仿真
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)
【免费+包邮】 送/申样/采购传统电话热线:0513-55012928、0513-55012929、0513-55012966
工作时间:8:30-12:00,13:00-17:30(周一 到 周五, 法定节假日除外)
本帖最后由 gentleman 于 2023-8-13 11:49 编辑
2023/08/09 第九集
位操作指令
17条指令
位地址 字节地址.位数C字节寄存器(P1.0PSW.4)
c语言不能用.取出位很麻烦 要移位后做逻辑运算
常用位操作指令
rel 不需要算 直接写标号
MOVC, bit
MOVbit , C
清零
CLRbit
CLRC
由图可知 34变30 2AH(25H第2位地址)清0成功
一般用宏定义定义位地址 不用2AH
位求反
CPL bit
CPL C
可以操作IOCPLP1.2吧P12 io脚取反
ALE 输出信号可以测量单片机是否工作
课上让自己测试,测试结果如下图
可以看到RAM 中 0x25 位置的值由 FF 变为F7 (11110111)
位逻辑操作指令
ANLC ,bit
ANLC ,/bit(取反后逻辑与)
ORL C,bit
ORL C,/bit
自己测试结果如下
2
https://www.stcaimcu.com/forum.php?mod=image&aid=17035&size=300x300&key=98a78e6b216671ab&nocache=yes&type=fixnone
将25H 的第8位与第4位相与(1&0),结果(0)放得到25H 的第1位 ,看到 25H 由F1 变成F0
2
为什么有的图片不显示啊,编辑时可以看到 这里还有一张图的
25H的第2位1 与 26H的第2位0逻辑或运算 得到 1 放入26h 第二位中 得到26h 位F2
位条件转移指令
JN/JNC rel
rel 直接写标号
JB/JNB/JBC bit rel
感觉就是c的if
测试结果如下
由图可知 当 26h.1 位为1 跳转到子程序RESTC中,把该位 清0
控制转移类指令
LJMP addr16
addr16 用标号
AJMP addr11 SJMP rel
不用了 不够用偏移太少
JMP @A+DPTR
相当于 switch case
JN rel
JNZ rel
CJNE
相当于if(a!=b)
测试结果
寄存器r0 != 00h所以跳转子函数 寄存器r3 结果为 0F0H
DJNZ
不等于0跳转
很容易实现延时
RETI
中断返回
NOP
空指令