历史上的今天
今天是:2026年01月03日(星期六)
2023年01月03日 | 怎样学会单片机?先学什么,怎么入门?
2023-01-03 来源:zhihu
怎么学习单片机?我给大家分享一下我的单片机学习之路。
我的单片机可以说是自学的,过程有点曲折。
刚开始是啃理论,学习单片机的设计框架,内存、寄存器,GPIO口功能,定时器,单片机汇编语句等。
每天背概念,记理论,过了大概一个月,结果肯定就是一个懵逼的状态。
正在这个懵逼的时候,实验室的一个同学建议我先学C语言,再学习单片机程序开发,说汇编没有啥用。
我又花了2-3个月的时间学习了C语言,买了一本谭浩强的C语言教程,从头到尾抄笔记,抄完了几个笔记本,但这次更加迷茫。
因为大学里的学习,都要靠自己,老师没有太多的时间专门辅导你,而且自己又不是那种特别优质的学生,是得不到老师的特别眷顾,同学之间有存在一些比较幼稚的比较和竞争。可以帮助你的人很少。
后来我自己买了一个电脑,那种大尾巴的台式机,开始自己装软件,在淘宝上买了一个开发板,开始了一个大胆的尝试和投资。
很快,我完成了点亮第一个LED灯的实验,后来又学会了GPIO的外部中断,定时器,串口通讯,LCD1602显示,数码管驱动等。

每完成一个功能,都是特别的兴奋,尤其是点亮第一个LED灯的时候,那种喜悦和满足感相信大家都是知道的。
虽然刚开始有点曲折,但结果是美好的。
大学毕业之后,找工作就有点傻眼了,找不到工作,没人要。
你有工作经验吗?你做过什么项目?你是应届生?说到和单片机开发相关的招聘需求,我几乎都不能满足,想撒个谎都骗不了别人。
如果我现在出去招嵌入式单片机工程师,如果你是应届生,不要。
如果你没有单片机开发经验,等我通知。
或许你不相信,但现实就是这么残酷的。
甚至我找第二份工作的时候,也是面对同样的残酷现实,面试官给一个全英文的考卷,我不知道从何下手,特别绝望和不自信。
其实说到底,就是自己的开发经验不足,单片机开发能力太差导致的。
回想起来,我成长的还是非常缓慢的。
大学的时候,就是做一些简单的单片机程序,复杂点的就是电子时钟,红绿灯计时控制器之类的。
参加第一份工作写的程序就是if 套while,while套if之类的,当时也只能做基于51内核的单片机产品。
几年之后才开始慢慢的接触STM32单片机,学习单片机程序开发的框架,消息队列等相关知识……
想想自己的成长之路,感觉自己走了好多弯路,浪费了太多的时间。
如果有人问我,如果再给我一次机会,会如何去学习单片机程序开发?先学什么?如何入门?
1.首先,学习单片机C语言基础
C语言是单片机程序开发的基础,所以首先是学习单片机C语言的基础知识。
有人问,单片机汇编语言,要不要学习?
汇编语言是最接近单片机底层机制的语言,运行效率最高,但是汇编语言学习相对比较复杂,而且可移植性差,不同芯片厂家的汇编也有所差别。
所以建议大家先学习C语言,等你完全掌握了单片机程序开发之后,再有需要的时候再去学习。
从C语言开始入门单片机相对比较容易,通用性强。
C语言学习过程中,大家要注意一个误区,再刚开始学习单片机开发的时候,只需要C语言的一些基础语法和变量定义就可以开始了,不需要深入的学习.
C语言太强大了,如果深入的学习,会导致你进入一个学习的误区。
2.从C51单片机开始学习单片机,掌握单片机的相关理论知识
C51内核单片机可以说是最经典的。
C51单片机的寄存器相对比较少,所以我们可以从芯片底层深入了解单片机程序的工作原理和单片机程序开发。
其次,C51单片机的入门学习相对比较简单,可以尽快的上手,同时可以培养大家的兴趣。
3.进一步提升C语言知识,结构体,指针,枚举,队列等,再学习STM32单片机。
C51内核的单片机学习完成之后,大家就需要提升一下C语言开发能力。
大家要掌握结构体,指针,队列等相关知识。
这块无际单片机编程也有相关系统课程和源码,都是无偿分享,需要自行去查找,这里就不方便留链接那些了。
STM32单片机的资源相对就比较丰富,FLASH,RAM的空间更大,工作的频率更高,可以做一些更加负责的产品。
STM32单片机的学习,建议大家直接通过标准库的方式学习即可,不需要深入的去了解相关寄存器,寄存器我们在需要的时候再去查看。
其次在STM32单片机上我们还可以跑一些比较简单的小系统,例如FreeRTOS等。这样可以提高程序的运行效率。
4.通过实战掌握单片机程序开发

学习理论是非常枯燥的,而且也是非常耗时的,时间太久了就失去了继续学习的兴趣和毅力。
我们学习的目的就是为了实战,那我们为何不去通过实战来掌握单片机程序开发的理论知识呢?
有了单片机程序开发的基础,和一些简单的单片机基础,就直接可以开始一些简单项目的实战了,然后循序渐进。
在实战过程中,遇到问题,就去学习相关的理论知识,然后完成实战开发,这样学习的东西更加的牢固,也会更加的有效。
史海拾趣
|
经过大家的集思广益,本次活动确定制作大家熟悉的,伴有烂漫神奇色彩的魔幻摇摇棒~ 摇一摇,摇出你的心意,摇一摇,摇出你的勤劳~ 换种方式大胆说出:I LOVE YOU! 年轻的工程师们,你们还等什么?DO IT YOURSELF ! 参与活 ...… 查看全部问答> |
|
据我所知,CE中分32个进程槽,每个进程可以使用32M的内存。 加起来就是1GB。。 可是CE最大支持512M物理内存。 如果32个进程同时运行,,哪儿有那么多物理内存可用呀???? … 查看全部问答> |
|
一个裸机程序,温度传感器裸机可以测试通过,串口可以打印温度信息,为什么把它移植到wince操作系统下,做成一个一按键就读取数据的驱动程序,为什么读取的数据不对呢?… 查看全部问答> |
|
keil+uC/OS,是如何实现在任务的堆栈中操作局部变量的? keil+uC/OS,是如何实现在任务的堆栈中操作局部变量的? 比如在程序中建立了一个任务TASK1,任务中定义了几个局部变量a,b,c, 在任务建立的时候,分配的堆栈是arrStask[500]。 那么程序执行到TASK1的时候,是如何保证把几个局部变量分配到对应的 ...… 查看全部问答> |
|
以前做好的一个VISTA的NDIS filter,现在编译出来用osrloader总是加载不起来。错误原因就是“连到系统上的设备没有发挥作用”。试了下把WDK6000自带的filter编译出来也是同样的结果,应该不是代码的问题。出现这个的原因是什么呢 … 查看全部问答> |
|
很多软件的主界面的最下方,都有一个状态栏,而状态栏的右下角的一个三角标,可以用鼠标拖动改变窗口的大小,这就是状态栏的SBARS_SIZEGRIP样式,但Windows CE中没有这样式。WCE下如何实现类似功能?… 查看全部问答> |
|
以后后想做嵌入式。 但是我就懂点C和UNIX方面的,现在没有任何的硬件,电路基础。 我听别人说,看《数字电路》 我买了这本书,发现看不懂,好像需要数字逻辑方面的知识,我又买了本《数字逻辑与数字系统》,但是发现还是欠缺知识。 ...… 查看全部问答> |




