找回密码
 立即注册
查看: 760|回复: 7

跟着陈桂友教授重温单片机基础 | 建议立即赠送 STC全套开源实验设备,方便测试

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-05-06 00:27:52

44

主题

231

回帖

2863

积分

金牌会员

积分
2863
发表于 2024-1-16 00:12:53 | 显示全部楼层 |阅读模式

学习老师的第一课内容竟然勾起了大学时期的回忆。 相比电路和模电,当时最喜欢的课程就是微机原理和数电了,虽然学的不好。但是也回忆满满,还记得微机原理第一节课老师说的8086麻雀虽小 五脏俱全。

实验课上写8086的汇编语言。实现点灯和流水灯功能。还记得当时整理的长长的机器指令执行时序;

后来选修课单片机,当时单片机课的作业就是画原理图,使用单片机实现一个小功能。我当时的题目是实现电动窗帘。勉强通过。再后来还想参加学校的大学生电子设计竞赛。只是后来因为要准备考研就放弃了。


真的是时光荏苒。一晃10几年过去了。


说一下个人对学习单片机的理解;

学习单片机需要理论加实践,且不分轻重。应该是手中既有文档又有开发板。

以我个人为例:13年大学还没毕业就用零花钱买了个开发板,当时用的就是89c52。也跟着配套的视频学习了,那个时候算是时间比较多了,最终还是没有学会,也就学会了点灯。是配套教程不好吗?还是我脑子笨?其实都不是。 没有成就感,眼高手低,没有学到最基础的灵魂的东西才是最根本原因,慢慢就失去了兴趣;

每个人的学习方式不一样,有的从面到点;有的从点到面,我就是从点到面的那种。需要从基础,甚至电路-模电-微机原理-单片机这样的顺序去学习。

大学期间没学会的模电现在竟然感觉懂了点; 大学期间P0_0 换成P0^0程序就运行失败就傻眼,现在也懂了。以前头文件用“还是<>不懂现在也懂了。 都是理论基础跟实践互相不断穿插的结果。所谓读书百遍其义自现就是这样的。 另外还需要有兴趣,要坚持。 我做过4次光立方失败了3次!

第一次是打算毕业等待研究生开学的那段实践,整天一个人再屋里捣鼓,洞洞板的飞线一大堆,我都理不清了。那时候教程少最后焊好了都不亮;

第二次研究生毕业工作后,后来想起来又想做一个,结果还是光焊接就没完成;

第三次是最接近成功的,因为自己修手机翻出了埋藏已久的电烙铁。手机修好了感觉自己又行了。正好还有PCB免费打样的,就做了个4*4*4的;

第四次是最成功的,因为那个时候已经学习了很多模电相关的内容,还有原先不懂的74h暂存器的使用原理也搞清楚了。单片机也重新温习了下;


微信图片_20240116001151.jpg



不争是争
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-05-06 00:27:52

44

主题

231

回帖

2863

积分

金牌会员

积分
2863
发表于 2024-1-16 19:57:29 | 显示全部楼层

第二节课

嵌入式领域的hello world 通过一个点灯小示例,让我们简单认识了单片机开发的一般流程,和使用到的工具遇到需要我们简单了解的地方也没有花费过多时间,这样不会让初学者一开始就陷入很深的理论中。

简单总结下学习到的内容:
开发一般流程:
1、需求分析(点灯、原理图简单分析)
2、环境搭建(头文件及器件安装)
3、代码编写(这里老师编写代码的过程很值得推荐,尤其是给刚接触编程的同学。以一种编程思维去写程序,而不是一下写完整个程序。这也是很对同学学了很多最后很难自己独立开发)
4、keil的设置(这里也是可圈可点,老师并没有一上来就设置生成hex,而是对比设置与不设置的区别,更能让同学理解为什么要设置。)
5、生成hex
6、烧录
7、看效果(这里看老师在演示的时候比较费劲,建议老师搞一个外置可移动摄像头,演示更方便)
8、分析,改进

开发使用工具:
1、stc新片手册,单片机想知道的都在里边,没事可以多看看;
2、原理图。
3、代码编辑、编译工具
4、固件烧录工具;
5、开发实验板;

温故而知新……
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:59
  • 最近打卡:2025-05-06 09:22:11

718

主题

1万

回帖

1万

积分

管理员

积分
15674
发表于 2024-1-17 11:38:31 | 显示全部楼层
建议立即赠送 STC全套开源实验设备,方便测试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-05-06 00:27:52

44

主题

231

回帖

2863

积分

金牌会员

积分
2863
发表于 2024-1-17 22:31:56 | 显示全部楼层

1、单片机引脚的复用,任何资源都是有限的,如何让有限的资源发挥的作用最大化是各行各业都在解决的问题。 同样的,在一个智能电子产品中单片机的引脚也是有限的资源。单片机的引脚被用作多种不同的功能是实现引脚资源灵活分配的基础。STC8系列单片机引脚功能复用就可以让我们在拥有adc的同时也可以拥有多个串口,将单片机的功能发挥到极致!
2、内部上拉电阻可设置,极大的增加了芯片的抗干扰能力,主要原因是上拉或者下拉电阻能给引脚一个确定的电平,如果没有确定的电平,外部的干扰信号就可能使引脚上的电平摇摆不定……哈哈哈;
3、有幸聆听到了姚总关于汇编语言的高屋建瓴,汇编语言之于C语言甚至更加高级的C++,C#语言就像 8086之于各种高级单片机。 它是基础,任何事物唯有根基打牢才能立于不败之地,就像武侠小说中的打通任督二脉,学什么都能融会贯通。遇到问题也能从本质上解决它们;但是,听到老是说汇编以后学不到了,感觉是计算机教育的一个很大的问题,另外有一点不太认同,所谓有教无类,因材施教。并不是专科同学就不需要学习汇编,做维护有的时候更需要底层原理。出了问题总不能重启解决一切问题吧。 近几年面对外国垄断,国内出了很多国产芯片,有人就问51单片机是不是过时了,还有没有学习的价值。很多B站老师都给出了明确且肯定的答复:没有过时,不仅没有过时它还在各个领域不断的发挥着自己的作用。同样的汇编语言也不会过时。 比如在SDCC板块,大佬分享的关于演示函数如何计算的时候就必须要用汇编计算执行的指令数量来计算。
4、汇编语言学习:
4.1 伪指令:
有个疑问,是不是我理解错了:
截图202401172228444378.jpg

这里低位字节在前是不是数据低位在地址低位,数据高位在地址高位? 等价于小端序存储? 如果是这样的话,这两个就不等价了,这个前后理解上可能有差异吧。
汇编疑问.jpg





不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-05-06 00:27:52

44

主题

231

回帖

2863

积分

金牌会员

积分
2863
发表于 2024-1-21 15:36:22 | 显示全部楼层
第七节课主要讲解了汇编语言的基础知识,
经过重新学习又回顾了很多已经遗忘的知识:
1、通过 INCLUDE 引用头文件;
2、汇编指令的一般格式;
3、几种条件跳转指令,这个是感觉很有价值的,对于后边分析延时函数很有作用;
4、指令代码的存储格式,这里讲到了不同的指令其实都是存储在存储器中的数据。这个数据很难记,因此就有了助记符,实际存储到程序存储器中的数据还是原来的指令码。
5、运行过程中如何找到程序中的操作数叫做寻址方式,不同的寻址方式使用的指令周期数也是不同的。在使用C语言写代码的时候我们也是需要关心的,尤其是在做
延时程序的时候,必须要精确到每个操作使用的机器周期数。
5.1: 立即数寻址, 操作数是立即数, 如:MOV A #08H
5.2: 寄存器寻址, 操作数是寄存器的内容,例如:INC R5 把R5的内容自增1然后送回R5;
5.3: 直接寻址,特殊功能寄存器的唯一寻址方式,51内核00h - 7FH  内部ram地址空间的的寻址,可位寻址空间;
    MOV A 45H; 将内部RAM  45H的内容赋值给A,注意这里的45H没有#;
5.4: 寄存器间接寻址;将指定寄存器中的内容作为操作数的地址,去这个地址获取实际的操作数;
5.5: 变址寻址,以指定的偏移量寄存器,和 基址寄存器(DPTR,PC)相加得到的结果作为操作数的地址。
5.6: 相对寻址,主要用于相对跳转指令
    通过三级跳的方式,实现相对地址相差较大的情况;
5.7: 位寻址,可以位操作的地址空间;


除了对新知识的认知,对老师的一些观点也有一些感悟;
1、老师说没想到高中生学习单片机的兴趣要比大学生高。这里相信经历过高中,高考的同学都知道。可能陈老师那个时候的高中生活跟我们不一样吧。  可以说我们的高中生活是相当的无趣。
从进入高中开始就在备战高考。所有的事情都是围绕高考来的。这个时候如果有人说学单片机我相信没有几个同学会拒绝。但是进入大学之后就不一样了。
2、关于老师讲课方式,不知道有没有考研的同学,有没有看过文都教育何凯文,汤家凤老师的课。 相信看过的印象都很深刻,其中最不同的就是两位老师都是手书,
虽然不是在很版上,但是效果也绝对比很多老师用了几届几年的ppt要强的多。一页一页的翻ppt几乎不考虑学生的学习进度;
3、还有一点关于keil 这个工具的使用问题。我们很多同学一开始就用keil。 跟老师上课的时候频繁的提到这个工具有关,感觉老师应该跳出舒适区,至少讲一下keil是收费的,另外提一下其他的可选方案,给学生一个选择空间。




不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-05-06 00:27:52

44

主题

231

回帖

2863

积分

金牌会员

积分
2863
发表于 2024-1-21 21:20:16 | 显示全部楼层

第8节课学习笔记
汇编指令
1 数据传输指令
MOV 目的字节 源字节
1.1 立即数为源字节:
MOV A #data8 :  将立即数data8传送到累加器A。 立即数寻址;
MOV addr8  #data8  :  将立即数data8传送到addr8所在的地址,其中addr8的范围为 00-7FH;
MOV @Ri  #data8 : 将立即数data8传送到Ri内存放的地址所指向的地址单元;
MOV Rn #data8 :  将立即数data8传送到Rn;

1.2、外部数据存储器的访问
MOVX 目的字节 源字节:
主要用于累加器A和外部RAM进行通信:

1.3、程序存储器向累加器传送 MOVC
1.3.1 以PC作为基地址的变址寻址方式:MOVC A @A+PC
1.3.2 以DPTR作为基地址的变址寻址方式: MOVC A @A+DPTR

1.4、数据交换指令
1.4.1、字节交换指令 XCH
1.4.2、半字节交换指令 XCHD

1.5、堆栈操作指令
堆栈是内部ram的一部分,主要用于保护现成,先进后出,SP永远指向栈顶;
PUSH和POP需要成对出现,注意顺序;

2、逻辑运算类指令:
2.1 单操作数指令:对A进行操作;
2.2 双操作数指令:第一个操作数是A;  第二个可以是:(立即数、地址、间接寻址(@Ri),寄存器);

3、算数运算指令:
3.1 加 ADD
3.2 带进位的加:ADDC
3.3 减 SUBB 带借位的减;
3.4 MUL  乘
3.5 DIV 除
3.6 DA  
3.7 自增指令
3.8 减量指令

需要注意各领所影响的标志位;

tips:
手把手的keil仿真调试对于理解指令更加直观。更有利于理解:
D:0  表示从内部ram 地址0开始展示内容;
X:addr, 用于访问外部RAM的内容;
在单步调试的过程中,在左下角的内存信息中也可以看到 00H地址的内容变成了50H,也就是此时R0的位置就是00H;
如何查看端口寄存器的值;
测试过程中可以手动修改指定地址单元里的值;



不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-05-06 00:27:52

44

主题

231

回帖

2863

积分

金牌会员

积分
2863
发表于 2024-1-26 22:20:45 | 显示全部楼层
第9课学习笔记

1 位操作指令
以位为处理对象,可以进行:位传送、位状态控制、位逻辑操作、位条件转移等;
1.1 位地址的表示方法:
直接使用位地址(这里需要是可位寻址的地址)
字节地址.位 的方式;
定义的位寄存器名称;
字节寄存器名.位数;
使用伪指令事先定义的符号地址;
1.2 常用指令
1.2.1 位传送:MOV
MOV C, bit;
MOV bit,C;
把第二操作数所指出的布尔变量送到由第一操作数指定的变量中;
注意,其中一个操作数必须是C,C的存在便是位操作;
1.2.2 位状态控制:CLR、CPL、SETB
知识点:
MOV SP,#80H 将80H这个立即数给堆栈指针,使用的是8052新增的128字节地址,
8052的高128字节空间需要间接寻址方式,而堆栈操作恰好是间接欸寻址方式;

1.2.3 位逻辑操作:ANL、ORL
第一个操作数一定是C,结果存储到C;

1.2.4 位跳转-判C转移:JC、JNC 根据C的值操作
JC: CY 为1则 PC = PC+rel;
JNC: CY 为0则 PC = PC+rel;
其中rel 为偏移量,这里一般直接使用标号;
1.2.5 位跳转-判直接寻址位转移:JB、JNB、JBC(跳转的同时清零)

2、控制转移类指令
2.1 程序转移指令
LJMP: 无条件转移指令;
AJMP:绝对转移指令;
SJMP:相对短转移指令;
JMP:根据累加器A的值动态的选择;
DJNZ 循环转移,相当于否循环;
2.2 子程序调用和返回指令
RET: 子程序返回
RETI: 中断服务子程序返回;
NOP: 空指令;




不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:473
  • 最近打卡:2025-05-06 00:27:52

44

主题

231

回帖

2863

积分

金牌会员

积分
2863
发表于 2024-1-26 23:32:10 | 显示全部楼层
第10节学习笔记

汇编语言程序涉及的一般步骤:
1、需求分析、确定算法、需求解决方案;
2、根据算法及方案绘制流程图,方便理解,查错;
3、根据方案分配资源(内部ram、定时器、中断、adc、pwm等等)
4、编写程序;
5、上级调试,确定源程序;

汇编语言程序的框架
$NOMOD51
$INCLUDE (STC8H.H)
        ORG     0000H       ;从0000H开始存放程序
START:  LJMP    MAIN        ;跳转到主程序(该指令占用3个字节的程序存储器空间);
        ORG     0003H      
        LJMP    INT0_ISR    ;外部中断0入口
        ORG     000BH
        LJMP    T0_ISR      ;定时器0中断入口
        ORG     0013H
        LJMP    INI1_ISR    ;外部中断1入口
        ORG     001BH
        LJMP    T1_ISR      ;定时器1中断入口
        ORG     0023H
        LJMP    UART1_ISR   ;串口1中断入口
        。。。。。。。。。。。。。。。。
        ORG     0200H
MAIN:   MOV     SP,#80H
        ....... 初始化内存区域内容
        ....... 设置有关特殊功能寄存器SFR的控制字
        ....... 根据需要开放相应的中断控制
MAINLOOP:
        ;主程序循环
        LJMP MAINLOOP

多文件变成还是很重要的,初学者由于编写的例程很简单一个文件就够了。但是看上去就是一团乱码
使用多文件结构更加清晰。






不争是争
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-6 21:52 , Processed in 0.151109 second(s), 93 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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