arison 发表于 2023-10-11 19:36:42

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

本帖最后由 arison 于 2023-11-4 08:45 编辑

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

arison 发表于 2023-10-11 20:42:29

本帖最后由 arison 于 2023-10-11 20:44 编辑

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



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


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


arison 发表于 2023-10-12 12:58:53

第七课笔记
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:04:06

本帖最后由 arison 于 2023-10-13 00:07 编辑

1.传送指令 MOV。第一个小实验就报错{:cry:}。明天再来吧!

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

arison 发表于 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
如工作频率为12MHz,则将IAP_TPS设置为12



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



arison 发表于 2023-10-13 20:42:05

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.逻辑运算

arison 发表于 2023-10-13 20:47:36

后面更多的是实验班实验,希望早点得到试验箱,就不用我的老8051实验板了!

arison 发表于 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)

......


中断源及其控制


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

电源控制寄存器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)中断服务程序尽可能的短
等待试验箱测试后面的程序!!无法正常仿真!

arison 发表于 2023-10-14 16:59:37

第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控制寄存器




arison 发表于 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;


等待试验箱实验T2~T4定时器功能!
   
页: [1] 2
查看完整版本: 【实验箱已收到】跟陈教授系统学习单片机