jnving
发表于 2024-8-23 21:41:38
第十四课:
1.在ADC_CONTR标志位,A/D转换完成后,ADC_FLAG = 1。一定要软件清0。
2.中断的允许、禁止及优先级(低位和高位的区别:高位带H如:PS低,PSH高)可从文档查,很多。和之前学的一样。
3.单片机对中断优先级的处理原则:3.高不睬低。(会否挂起),当高级中断正在执行,来了低级的,此时高级继续,等处理完成后,会自动扫描中断标志位,如果扫到了有低级的,会进行处理。特别的,当高级执行过程中,低级的来了,但是后面又来了同样的(意思也就是标志位被清或改了)那么可能会出现中断丢失的情况发生。--->处理函数一定要简单。
C语言,保护现场,恢复现场由编译器完成了。。如果想要独占,把EA = 0即可,总开关关闭。但会影响性能,所以不要长时间设0
4.项目演示。
在项目中最好通电后进行延时,因为可能会不稳定。设置延时即可。Daleyms(10);
中断函数interrupt
电路设计时,是否加电阻看情况,有电阻,有保护作用,另外有就是在电路中有静电,——————>对新手。如果设计良好,不用电阻无所谓。
通过按钮产生下降沿:比如现在是高电平,按下后,会和GND连通,则会变成低电平,下降沿。
阿杰爱学单片机
发表于 2024-8-23 21:48:17
jnving 发表于 2024-8-20 13:44
第三课:
1.知道了高电平和平时我们所想到的高电压的不同,生活中的高电压基本说的就是220V以上的。而逻辑 ...
搞那个USB弄了几个小时不知道哪里原因{:curse:}
jnving
发表于 2024-8-25 15:15:54
阿杰爱学单片机 发表于 2024-8-23 21:48
搞那个USB弄了几个小时不知道哪里原因
什么问题不知道什么原因。我是第一次学这个,现在还没有老师的那种实验箱。只有在淘宝上买的开发板,反正点灯是没问题
阿杰爱学单片机
发表于 2024-8-25 15:22:20
jnving 发表于 2024-8-25 15:15
什么问题不知道什么原因。我是第一次学这个,现在还没有老师的那种实验箱。只有在淘宝上买的开发板,反正 ...
你是啥开发版啊,我那个问题已经解决了,但又有新的问题出现了,不知道是不是那个视频太老了,有时候照着抄代码也会有问题,今天学的那个printf串口打印,硬是说没有printf这个函数,真难搞{:4_167:}
jnving
发表于 2024-8-25 15:43:56
本帖最后由 jnving 于 2024-8-25 22:49 编辑
第十五课:(T0~T4)用定时/计数器比软件的(Daleyms())程序的方式要好的多。
1.作用:
---定时控制
---分频器(P.S.多少时间之后才给波形的输出),事件记录(生产管理)。
---时钟输出,给外部器件提供时钟
---串口的波特率发生器
2.基本结构
如上图有两个开关控制。OSC的脉冲是均匀的,则通过周期实现计时的功能;Tx端不均匀则可以实现计数的功能。
3.单片机CPU和定时器相关的寄存器
低8位0-255存满后,高8位进1,当高8位满后,溢出。然后由TX控制。另外说明:T2H...THn一回事,叫法问题
-------暂停---------27:05---------------------------------
---T0和T1工作模式
模式0简单好用,大多情况用它就行了。
这里可以结合前面基本结构看。不分频的精度会更高。
--T2工作模式:固定为16位自动重装载模式。
4.寄存器(地址可以被8整除,可以按位寻址如:88H)
更多查看手册。
定时器T2-T4还另外设置了时钟预分频器,有TM2PS(地址FEA2H)这里16位地址,说明是在外部的扩展里。要设XSFR有效才行。才能访问和设置。
jnving
发表于 2024-8-25 15:46:27
阿杰爱学单片机 发表于 2024-8-25 15:22
你是啥开发版啊,我那个问题已经解决了,但又有新的问题出现了,不知道是不是那个视频太老了,有时候照着 ...
STC8H8K64U开发板 STC32位小系统单片机学习实验核心板免费开发票。。16.5的那个。我这打印都正常。。那就快快学,完成申请个免费的老师这款实验箱
jnving
发表于 2024-8-25 23:29:23
第十六课:定时/计数器应用
1.计算定时器最大定时能力
这里最多大约是18s,这依然不够用,此时需要对定时器进行扩展:1.软件方法,2.硬件方法,3.把多个定时器串起来的方法。
扩展:T0->T1->T2->...也可以用串联的方式
2.定时器扩展
3.应用
4.编程
---》在stcai-isp-v6.94K软件中,->定时器计算器,可以自动生成。(注意》》》使能定时器中断,勾选)
void Timer0_Init(void) //50毫秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
然后在main.c程序中,在中断多次以后(取决于要定的总时间长和计时器的时长),执行相关代码
其他的定时器也可以都类似操作。对应着手册的说明进行。
当不能用位寻址时,需要用相关字节操作的方式进行设置或修改内容。
在C语言中,可以用 = ;&= ;|= 这些。
jnving
发表于 2024-8-27 14:01:15
第十七课:
1.并行通信,高速,近/串行通信(传递数据:脉冲高低电平。一定要有一根线共同接地。如,只有发送,那么要两根线)低速,远 <10米。扩展传送距离,RS232:15米,RS485:1000米,总体来 说,速度和距离相互制约
2.异步通信/同步通信。开始和结速的标志:起始位0,停止位1,以字符位为单位发送和接收。
3.串行通信分类
空闲的时候都是高电平。有校验位
8个数据位就没有校验位。最多是0-255数据位。如果要超过255,如:300,那么可以分成2个字节传。收到的时候再合成。
在数据传送中,要约定好:
--字符格式
--通信速率,通常用波特率表示,9600(9600bps),n(没有奇偶校验),8,1
2》按数据传送的方向分类
1.单工方式,固定单向的,如接收广播,只收不发
2.半双工方式,双向的,但是同一时该只能向一个方向传送,对讲机(按下讲话)
3.全双工方式,双向同时的,打电话
4.多终端通信方式。
4.UART,串行并行相互转换
收发:一个一个的传,接收/发送数据缓冲器,再通过总线同时发到CPU
硬件UART即能发送,实现并行->串行输出,又能接收实现串行->并行输入。
与外部同步:以外部时钟的方法进行数据同步。
UART同步过程:
在每一个时钟脉冲上升沿采样接收数据线,连接出现9个“0”,则开始读取数位值。(发现一个0,后边又连接采样8个0,则确定它是起始位,不是干扰信号)(不是字节,是二进制位)
每个数据位时间Td为外部时钟的16倍,则16个外部时钟脉冲读一次数据位, 采样的时间都是中间时该,避开信号上升和下降时的不稳定。
jnving
发表于 2024-8-27 15:44:03
第七课:汇编语言
汇编的注释和C语言一样。
$INCLUDE(文件名) 包含和C语言也类似作用。
在STC8中,可以
$NOMOD51 --->让汇编器不使用预定义的寄存器,因为STC8H.H头文件已经有了。如果没有这一句,会导致寄存器符号重复定义错误。
$INCLUDE(STC8H.H) --->不能用引号
1.助记符语言
CPU只能识别和执行二进制数的指令(机器语言)。如248B。这种语言不直观,不易理解的记忆。所以引入助记符。
汇编语言由操作码和操作数组成。操作码用英文组成,称为助记符。如:MOV是数据的传送,ADD是相加运算,ANL是逻辑与运算(区别与AND与,L是LOGIC的意思)
例:ADD A,#8BH---->一个数后面加了H一般就是16进制的数了,#号后面是真正的数。这名话就是把A和8BH相加。就是248B(16进制,两个字节:24H和8BH),但是这24并非是A,具代表了ADD A,A是累加器,结果会存在其中
例2:MOV A,#76H---->将16进制的76H传送到累加器A中,2个字节:0111 0100和0111 0110这两个二进制数,对应的十六进制就是74H,76H,其中74H是操作码。
8051内核单片机常用的操作码:
操作数:可以是数据也可以是地址,不同功能指令,操作对象形式不同:
---传送类:源地址+目的地址
---数据操作类:运算器和对象一般是两个
---控制类:程序计数器PC和一个数
---逻辑操作类:单双操作数之分
**数据只能是整数不能是小数
**当数据是十六进制且是以字母开头时,该数据需加一个前导0,表示后面的字母不是变量是数字。如MOV A,#ABH <----->MOV A,#0ABH的区别
**8051单片机中,有前缀#号则后面的数据是立即数。否则,则说明该数据表示是直接地址。立即数可以是二进制,十进制,十六进制。后缀H是十六进制,B是二进制,D(可以不写)是十进制
2. 汇编语言格式
【标号:】操作码助记符【第一操作数】【,第二操作数】【,第三操作数】【;注释】【】里的内容可以不写
标号后:是所在行的指令的地址。也可以用作子程序的名字
3.指令代码存储格式
将8位二进制码表示为一个字节,8051单片机指令长度有单字节,双字节,三字节三种,分别占1-3个单元
4.指令中符号约定
5.寻址方式:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址
jnving
发表于 2024-8-27 15:52:25
本帖最后由 jnving 于 2024-8-29 10:14 编辑
第八课:
数据传送类指令主要是给8051系统内名部资源赋值,进行堆栈的存取操作,执行前后,对程序状态字PSW一般不产生影响。分为:1.数据传送,2.数据交换,3.栈操作。
汇编文件:main.asm
1.指令:
--MOV<目的字节>,<源字节>
MOV A,#data8; 把8位二进制数(范围)的立即数给A:1.MOV A,#30(十进制);2.MOV A,#30H(十六进制);3.MOV A,#01000011B(二进制)
MOV ADDR8,#data8; 把8位二进制数(范围)给内部的单元addr8:00-7FH
MOV @Ri #data8; @R0/@R1 有@间接寻址,立即寻址(第二条参数)
MOV Rn,#data8; n=0-7
在编程调试时,Memory ADddress:写D:0即,内部ram从0开始
从上面可以看出,当把50给了R0后,再通过@R0,则修改了0x50的值
从Peripherals里查I/O
如有问题排查时,先看第一个错误,注意符号的英文格式。
--数据交换指令:
--字节交换指令
--堆栈操作指令: PUSH addr8;POP addr8;
压栈和出栈和前面学的中断流程类似
注意:A和ACC是一样的,但是将累加器A进行堆栈操作时,就不能使用PUSH A/POP A(此时是寄存器寻址方式)
而应使用PUSH/POP ACC;此时是直接寻址方式
--逻辑操作指令
--双操作数的逻辑指令:ANL与,ORL或 ,XRL异或
--算术运算类指令