【实验箱已收到】跟陈教授系统学习单片机
本帖最后由 arison 于 2023-11-4 08:45 编辑之前一直要学习单片机,但是一直没有坚持下来。两个月前重新捡起开始学习,跟着bilibil坚持把8051开发板学习了2-3遍,算是入门了。但是好多东西讲解的不够系统、具体。
今天无意中在论坛中发现陈教授的课,听了之后,感觉好多东西能串起来了!
前几节课一下午时间重新浏览温故了一下,晚上在细细品味! 本帖最后由 arison 于 2023-10-11 20:44 编辑
第五课讲到数据存储的时候,讲解了xdata声明,这种讲解加举例的方式让我明白了前两天出现的疑问:代码正好出现:ERROR L107: ADDRESS SPACE OVERFLOW!百度后只告诉修改Memory Model中的Small改成Large就可以了!完全不理怎么回事。
通过陈教授的课,对这个参数才真正了解。我重新改回small模式,把其中一个数组用xdata声明了一下,确实也能解决了这个问题,虽然warning还很多。
还有通过调试功能,加深了印象,调试功能听说过一直没有深入的了解!后面会进行这方面的补充。
第七课笔记
A.操作码
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单元中
5.变址寻址
例 MOVC A,@A+PC ;读取A+PC指向的程序存储器单元的值送给A
MOVC A,@02H MOVC DPTR,#TABLE ;把TABLE指向的地址赋给DPTR,DPTR地址再+2后的内容赋给A
6.相对寻址:主要用于相对跳转指令
7.位寻址,相当于C语言的位寻址
例 MOC C,P1.0 ;将P1.0的状态传送到进位标志CY
本帖最后由 arison 于 2023-10-13 00:07 编辑
1.传送指令 MOV。第一个小实验就报错{:cry:}。明天再来吧!
哎!发现问题了,Main写错了
本帖最后由 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
如工作频率为12MHz,则将IAP_TPS设置为12
仿真功能真的很不错,可以我的8051芯片不支持在线仿真。无法从仿真中看出来是否擦除成功
arison 发表于 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.逻辑运算
后面更多的是实验班实验,希望早点得到试验箱,就不用我的老8051实验板了! 第13、14课 中断原理及工作机制
(一)中断的概念
中断的优先级
--中断嵌套
中断的优势
①解决了快速CPU和慢速外设之间的矛盾,可使CPU和外设并行工作。
②可及时处理控制系统中许多随机参数和信息。
③具备了处理故障的能力,提高了机器自身的可靠性。
中断运行和中断禁止
保护现场和恢复现场通过堆栈操作实现
堆栈:后进先出原则,SP堆栈指针始终指向栈顶
(二)中断源
sTc8H8K64U单片机共有44个中断源:
5个外部中断(|NT0~|NT4)
5个定时计数器溢出中断(T0~T4)
4个异步串口中断(UART1~UART4)
1个串行外设接口中断(SPI)
|1个2c总线中断、1个USB中断
1个模数转换中断(ADc)
......
中断源及其控制
中断号--->查询次序(中断号) //实际是查询次序
中断标志位
串口中断请求标志也不能自动清零
电源控制寄存器PCON中的低电压检测标志位
SPI/ADC等标志位,详见上表
中断优先级
00:中断优先级为0级(最低级)
01:中断优先级为1级(较低级)
10:中断优先级为2级(较高级)
11:中断优先级为3级(最高级)
单片机中断处理的过程
1)条件:中断请求/中断允许/总中断开发
2)处理原则:先高后低/停低转高/高不采低/中断查询次序(中断号)
-写程序时候要注意程序关闭总中断对中断的影响,但关闭可以避免中断嵌套
-主要Delay()函数对其他中断的影响
3)并不是所有中断都能被相应
a)中断允许总控制位EA=0或发出中断请求的中断所对应的中断允许控制位为0。
b)CPU正在执行一个同级或高一级的中断服务程序。
c)当前执行的机器周期不是指令周期的最后一个机器周期。
d)正在执行的指令是中断或者是访问专用寄存器或P的指令时,CPU至少要再执行一条指令才能响应中断请求。
4)中断服务程序尽可能的短
等待试验箱测试后面的程序!!无法正常仿真!
第15集定时器原理及STC拓展
1.定时/计数器的作用
(1)方便地用于定时控制
(2)用作分频器和用于事件记录
(3)可编程时钟输出功能,用于给外部器件提供时钟
(4)可用作串口的波特率发生器。
2.定时/计数器的一般结构
12分频/不分频-->控制信号-->加1计数器-->TFx-->中断
单片机CPU和定时器相关寄存器
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位自动重装
01 16位不自动重装
1 0 8位自动重装
11 T1停止工作 /T0不可屏蔽中断的16位自动重装,最高优先级,可用作操作系统的时钟
定时器0/1模式0/1 16位自动重装模式
GATE=0,TRn=1, 定时器计数
GATE=1,INTn控制T0/T1,可实现脉宽测量
AUXR中的Tn x12 = 0 :12T模式 Tn x12 =1 :1T模式
T2的工作模式
T2工作模式固定为16位自动重装模式
符号地址 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控制寄存器
第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;
等待试验箱实验T2~T4定时器功能!
页:
[1]
2