找回密码
 立即注册
查看: 4423|回复: 19

【实验箱已收到】跟陈教授系统学习单片机

[复制链接]

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-11 19:36:42 | 显示全部楼层 |阅读模式
本帖最后由 arison 于 2023-11-4 08:45 编辑

之前一直要学习单片机,但是一直没有坚持下来。两个月前重新捡起开始学习,跟着bilibil坚持把8051开发板学习了2-3遍,算是入门了。但是好多东西讲解的不够系统、具体。
今天无意中在论坛中发现陈教授的课,听了之后,感觉好多东西能串起来了!
前几节课一下午时间重新浏览温故了一下,晚上在细细品味!
回复

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-11 20:42:29 | 显示全部楼层
本帖最后由 arison 于 2023-10-11 20:44 编辑

第五课讲到数据存储的时候,讲解了xdata声明,这种讲解加举例的方式让我明白了前两天出现的疑问:代码正好出现:ERROR L107: ADDRESS SPACE OVERFLOW!百度后只告诉修改Memory Model中的Small改成Large就可以了!完全不理怎么回事。
截图202310112022115903.jpg
截图202310112024235225.jpg

通过陈教授的课,对这个参数才真正了解。我重新改回small模式,把其中一个数组用xdata声明了一下,确实也能解决了这个问题,虽然warning还很多。
截图202310112040522166.jpg

还有通过调试功能,加深了印象,调试功能听说过一直没有深入的了解!后面会进行这方面的补充。


回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-12 12:58:53 | 显示全部楼层
第七课笔记
A.操作码
操作码.png

B.操作数:
(1)数据只能是整数,不能是小数。
(2)当汇编指令中的数据是十六进制且是以字母开头时,该数据加个前导0,以表示后面的字母不是变量而是数字。
(3)在8051内核单片机中,一个数据的前面有前缀#号则表示后面的数据是立即数,如果数据的前面没有#号,则说明该数据表示的是直接地址。立即数可以写成十进制的格式,也可以写成十六进制数的格式,还可以写成进制数的格式。

C.汇编语言中的操作码助记符表示了指令的功能,操作数表示指令操作的对象。
汇编语言注释可以用分号";"也可以用和C语言一样的。

D.指令代码的存储格式
7种寻址方式
1.立即寻址,是数据不是地址
MOV A,#28H        ;把十六进制的立即数28H送入累加器
2.寄存器寻址
INC R5                ;把寄存器的内容加1后再送回R5
3.直接寻址
1)特殊功能寄存器SFR:直接寻址是唯一访问形式
2)内部数据RAM中的00H~7FH的128个字节单元
3)位地址空间
例 MOV A, 45H        ;把45H单元的内容送入累加器A中:是地址不是数据
4.寄存器间接寻址
例 MOV A, @R0        ;把R0中表示的地址单元中的内容送给A
  MOVX @DPTR,A        ;将A的内容送到DPTR指向的外部RAM单元中
004.png

5.变址寻址
例 MOVC A,@A+PC        ;读取A+PC指向的程序存储器单元的值送给A
  MOVC A,@02H         MOVC DPTR,#TABLE        ;把TABLE指向的地址赋给DPTR,DPTR地址再+2后的内容赋给A
005.png

6.相对寻址:主要用于相对跳转指令
7.位寻址,相当于C语言的位寻址
例 MOC C,P1.0        ;将P1.0的状态传送到进位标志CY

回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-13 00:04:06 | 显示全部楼层
本帖最后由 arison 于 2023-10-13 00:07 编辑

1.传送指令 MOV。第一个小实验就报错。明天再来吧!
截图202310130003479554.jpg
哎!发现问题了,Main写错了
回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-13 13:46:19 | 显示全部楼层
本帖最后由 arison 于 2023-10-13 22:31 编辑

用到了程序关机保存数据,先学习了第12课。

IAP_DATA C2H 数据寄存器
读操作执行命令后,先把要读到的数据存到IAP_DATA 寄存器中
写操作前,先把要写的数据存到IAP_DATA 寄存器中,再发送写命令

IAP_ADDR (IAP_ADDRH C3H / IAP_ADDRL C4H) 16位地址寄存器
每次数据操作完成之后,需要手动更新寄存器中的值

IAP_CMD C5H 命令寄存器
B1 | B0                :   00空操作
                                01读操作
                                10写操作                写操作,只能将1写成0
                                11擦除操作        擦除操作一次擦除1个扇区(512字节),整个变成FFH
IAP_TRIG C6H 触发寄存器
配置好后,依次写入5AH、A5H(顺序不能交换),触发相应的读、写、擦除操作

IAP_CONTR C7H 控制寄存器
B7     |B6     |B5       |B4           |B3|B2|B1|B0|
IAPEN|SWBS|SWRST|CMD_FAIL| -  | -  | -  | - |
IAPEN:使能操作控制位 1使能
SWBS: 软件复位选择位 0:复位后从用户代码开始执行
                                                                                        1:复位后从ISP监控代码区开始执行
SWRST:软件复位控制位 0:无动作/ 1:产生软件复位
CMD_FAIL:1操作失败状态,需要软件清零,0操作正确

IAP_TPS F5H 等待时间控制寄存器
IAPTPS[5:0]
如工作频率为12MHz,则将IAP_TPS设置为12


截图202310131347329720.jpg
仿真功能真的很不错,可以我的8051芯片不支持在线仿真。无法从仿真中看出来是否擦除成功
截图202310132231518931.jpg


回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-13 20:42:05 | 显示全部楼层
ari*** 发表于 2023-10-13 00:04
1.传送指令 MOV。第一个小实验就报错。明天再来吧!

哎!发现问题了,Main写错了

先学习C语言吧,贪多嚼不烂。暂时跳过汇编,开始学习第11课。

学习笔记:

1.C51的扩展了19个关键字:

_at_ idata sfr16 alien interrupt small bdata large _task_ code bit pdata using reentrant xdata compact sbit data sfr

通过视频和网络进行了整理


关键字

用 途

说 明

bit

位标量声明(1/0)

声明一个位标量或位类型的函数/可用于返回值

sbit

位标量声明,从字节中定义位变量(1/0)

声明一个可位寻址变量,可位寻址对象的位

Sfr

特殊功能寄存器声明,字节寻址

声明一个特殊功能寄存器

Sfr16

特殊功能寄存器声明,字寻址

声明一个16位的特殊功能寄存器

data

存储器类型说明

直接寻址的内部数据存储器,内部RAM的低128字节

bdata

存储器类型说明

可位寻址的内部数据存储器,地址范围20H~2FH

idata

存储器类型说明

间接寻址的内部数据存储器,整个内部RAM256字节

pdata

存储器类型说明

分页寻址的外部数据存储器;以后不用

xdata

存储器类型说明

变量保存到外部数据存储器,多达64KB的外部直接寻址区

code

存储器类型说明

变量保存到程序存储器

interrupt

中断函数说明

定义一个中断函数

reentrant

再入函数说明

定义一个再入函数

using

寄存器组定义

定义芯片的工作寄存器

2.Keil C51指针

一般指针和存储器指针
例1:
unsigned char xdata *pt;    //pt本身以存储模式存放
unsigned char xdata * data pt;    //pt被保存在内部RAM中    见上表说明

unsigned char xdata * xdata pt;    //pt被保存在外部RAM中    见上表说明


例2:
char data * str;    //str指向data区中char型数据

int xdata * pow;    //pow指向外部RAM的int型整数

其他:曾经用到volatile,有初步了解。系统运行定时器 volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据,volatile编译器对访问该变量的代码就不再进行优化。
3.中断函数的声明
void Uart1_ISR (void) interrupt 4 using 1
   4:中断顺序号(中断号),
   1:using后对应0~3个寄存器区  不写可以由编译系统自己选择
4.逻辑运算

回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-13 20:47:36 | 显示全部楼层
后面更多的是实验班实验,希望早点得到试验箱,就不用我的老8051实验板了!
回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-13 23:29:06 | 显示全部楼层
第13、14课 中断原理及工作机制
(一)中断的概念

中断的优先级
  --中断嵌套
中断的优势
①解决了快速CPU和慢速外设之间的矛盾,可使CPU和外设并行工作。
②可及时处理控制系统中许多随机参数和信息。
③具备了处理故障的能力,提高了机器自身的可靠性。

中断运行和中断禁止
保护现场和恢复现场  通过堆栈操作实现
堆栈:后进先出原则,SP堆栈指针始终指向栈顶
(二)中断源
sTc8H8K64U单片机共有44个中断源:
5个外部中断(|NT0~|NT4)
5个定时计数器溢出中断(T0~T4)
4个异步串口中断(UART1~UART4)
1个串行外设接口中断(SPI)
|1个2c总线中断、1个USB中断
1个模数转换中断(ADc)

......
截图202310132245192151.jpg

中断源及其控制
截图202310132245585486.jpg

中断号--->查询次序(中断号) //实际是查询次序
中断标志位
串口中断请求标志也不能自动清零

电源控制寄存器PCON中的低电压检测标志位
SPI/ADC等标志位,详见上表
截图202310132252535626.jpg

中断优先级
  00:中断优先级为0级(最低级)
  01:中断优先级为1级(较低级)
  10:中断优先级为2级(较高级)
  11:中断优先级为3级(最高级)

单片机中断处理的过程
  1)条件:中断请求/中断允许/总中断开发
  2)处理原则:先高后低/停低转高/高不采低/中断查询次序(中断号)
     -写程序时候要注意程序关闭总中断对中断的影响,但关闭可以避免中断嵌套
     -主要Delay()函数对其他中断的影响
  3)并不是所有中断都能被相应
   a)中断允许总控制位EA=0或发出中断请求的中断所对应的中断允许控制位为0。
   b)CPU正在执行一个同级或高一级的中断服务程序。
   c)当前执行的机器周期不是指令周期的最后一个机器周期。
   d)正在执行的指令是中断或者是访问专用寄存器或P的指令时,CPU至少要再执行一条指令才能响应中断请求。

  4)中断服务程序尽可能的短
等待试验箱测试后面的程序!!无法正常仿真!
截图202310132328443741.jpg
回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-14 16:59:37 | 显示全部楼层
第15集定时器原理及STC拓展

1.定时/计数器的作用
(1)方便地用于定时控制
(2)用作分频器和用于事件记录
(3)可编程时钟输出功能,用于给外部器件提供时钟
(4)可用作串口的波特率发生器。

2.定时/计数器的一般结构
12分频/不分频-->控制信号-->加1计数器-->TFx-->中断
单片机CPU和定时器相关寄存器
截图202310141610283049.jpg

TCON 定时器0/1控制寄存器
符号地址 B7 B6B5 B4 B3 B2 B1 B0
TCON88H TF1 TR1 TF0 TR0 IE1 IT1IE0 IT0
TF1/0: T1/0溢出中断标志。当产生溢出时由硬件置“1”,一直保持到CPU响应中断时,才由硬件清“0”(也可由査询软件清“0”)。
TR1/0: 定时器T1/0的运行控制位。该位由软件置位和清零。
IE1/0:外部中断1/0请求源标志。IE1/0=1,请求中断,当CPU响应该中断时由硬件清
IT1/0:外部中断源1/0触发控制位。IT1/0=0,上升沿或下降沿均可触发外部中断1。IT1/0=1,为下降沿触发方式。

TMOD 定时器0/1模式寄存器
符号地址 B7 B6B5 B4 B3 B2 B1 B0
TMOD89H T1_GATET1_C/T T1_M1T1_M0 T0_GATE T0_C/TT0_M1T0_M0
Tn_GATE: 控制定时器1/0,置1时只有INT为高TR1/0为高才打开定时/计数器

Tn_C/T: 0作为定时器  1作为对外输入的计数器
T1_M1/0: 定时/计数器模式选择,通常选择00,其他为兼容传统8051
  0   0   16位自动重装
  0  1   16位不自动重装
  1   0   8位自动重装
  1  1    T1停止工作 /T0不可屏蔽中断的16位自动重装,最高优先级,可用作操作系统的时钟
定时器0/1模式0/1 16位自动重装模式
截图202310141642307680.jpg

GATE=0,TRn=1, 定时器计数
GATE=1,INTn控制T0/T1,可实现脉宽测量

AUXR中的Tn x12 = 0 :12T模式   Tn x12 =1 :1T模式

T2的工作模式
T2工作模式固定为16位自动重装模式
截图202310141649341744.jpg

符号地址 B7 B6B5 B4 B3 B2 B1 B0
AUXR8EH T0x12T1x12 UART)M0x6T2RT2_C/T T2x12EXTRAMS1ST2


1) T0x12:T0速度控制位。0:12分频(FOSC/12);1:不分频(FOSC)。
2) Tlx12:T1速度控制位。0:12分频(FOSC/12);1:不分频(FOSC)
   如果UART串口用T1作为波特率发生器,T1x12位决定UART串口是12T还是1T。
3)T2R:  定时器2的运行控制位。   
   0:  定时器2停止计数    1:  定时器2开始计数。
4)T2C/T: 控制T2用作定时器或计数器。
   0:T2用作定时器;1:T2用作计数器。
5)T2x12:T2速度控制位。0:T2每12个时钟计数一次;1:T2每1个时钟计数一次。
   T2除了作为一般定时器使用外,主要用于串行口的波特率发生器。

T4/T3控制寄存器
截图202310141658225781.jpg



回复 支持 反对

使用道具 举报 送花

1

主题

20

回帖

123

积分

注册会员

积分
123
发表于 2023-10-14 23:27:26 | 显示全部楼层
第16集 定时器应用及STC拓展

1.定时/计数器量产的扩展
(1)定时器初值计算
  N = M - Tc/Tp  (M=2^n,n为定时器位数,Tp为计数周期,Tc为定时时间)
(2)T2~T4最大定时18s
(3)定时器量程扩展
    软件扩展法:中断请求计数法 cnt++
    硬件扩展法: 定时器串联
2.定时器初始化步骤
1)设置工作方式 TMOD
2)设定初值,stc自动计算
3)置位TRn启动定时器
4)置位ETn允许中断
5)置位EN使CPU放开中断
例:0.5s将P6.0的状态取反,选择T0:软件启动、定时方式、16位定时器、方式字位00H
     设置定时器50ms,计时10次进行取反
   X =  M - Tc/Tp = 2^16 - (50 x 10^-3)/(12000000/11059200 x 10^-6) = 19456 = 4C 00 H
    使用ISP软件计算也是TH0 = 0x4C;
截图202310142318593929.jpg

等待试验箱实验T2~T4定时器功能!
   
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-6 11:06 , Processed in 0.124529 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表