单片机入门—STC89C51
单片机入门
学习单片机也有些时日了,经常在论坛看各位大佬花式解答难题,在博客里学习各位大佬的经验、方法,获益颇多。
本人不才,也在此记录自己的学习经验,也算是为自己的学习做一下总结,毕竟好记性不如烂笔头,踩过的坑要记下来才不会再掉进去。
一、单片机入门之路
就单片机入门而言,门槛较低的就是传统8051单片机,原因如下:
1)结构简单:传统8051单片机内部的寄存器相对较少,IO口也基本只有一种模式(准双向口),外设一般也只用到定时器、串口;
2)资料丰富:传统8051的相关书籍、网络资料可以说相当丰富,在这方面几乎可以不投入成本,对学生而言大大降低了入门门槛;
3)对知识储备的要求相对较低:从本人的学习经验来看,传统8051的学习对模拟电路、数字电路、C语言等的要求并不高,只要能看懂基本的电路图,能看懂简单的C语言程序,会一些C语言相关的语法,就能够将8051玩起来。
很多人初学单片机是通过仿真软件,这样确实成本最低,但是缺点也很明显,对硬件没有一个直观的感受,并且搭出来的电路通常无法应用到实际中,反而会将仿真软件中的固定思维带入到后续基于硬件的学习过程中,造成不必要的思维误区。
8051发展至今,开发板的价格已经相当低了,且种类很多,在这里需要注意的是选择开发板务必要保证相关资料、教程的完善,尤其要保证提供的例程能够直接在开发板上正确运行,原因是初入门缺少调试经验,当自己编写的程序出现问题是多半摸不着头脑,也没有类似逻辑分析仪等设备辅助开发,这时例程就能够帮助我们快速理解问题。
在众多的8051单片机中,推荐STC89C51的原因如下:
1)典型的8051封装结构,大部分课本里的8051单片机就是这种40个引脚、P0-P3口齐全的单片机,容易上手;
2)国产芯片,容易购买,无论是裸片还是最小系统都能够很容易买到,且数据手册是中文的,不存在阅读障碍;
3)开发环境相对友好,开发软件自不用说,下载程序只需要一个USB转串口的模块即可。
不足之处在于:
1)下载程序的冷启动方式,其实对于开发而言属于很繁琐的操作,尤其当项目程序结构比较复杂时,每次验证程序都需要手动操作一次实在麻烦;
2)无法进行在线调试,降低了学习效率;
二、入门学习之路
软件仿真也好、买开发板也罢,终究只是一种学习方式,关键还是要多学、多写、多练、多理解。
本人当初刚开始学习单片机也是在对各种名词一知半解的状态下一步步走过来的,什么寄存器,什么准双向口,什么上拉下拉,初学者往往很难深入理解这些内容,但不建议初学者在这些问题上过分纠结,不理解没关系,先按照教程上的思路一点一点写自己的程序,努力将报错和警告一个个消灭掉,让单片机按照目的动起来,哪怕照着例程写都没问题,一定要自己写,不要复制粘贴,自己写才能熟练的编写程序、理解语法。
只要能让单片机动起来,就能体会到其中的乐趣,这就是坚持学习下去的动力,初学者抱着打破砂锅问到底的态度确实难得,但是也要分重点,类似寄存器这类相对晦涩难懂的内容,可以先跳过,避免被繁多的概念和冰冷的文字劝退。
单片机的编程说白了就是使用程序语句去操作对应的寄存器,比如控制IO口、读取引脚状态,实际上就是对应寄存器的读写,传统8051单片机由于内部资源很少,往往需要编写较为复杂的驱动程序,比如数码管的动态显示驱动,单总线的时序驱动,IIC的时序驱动等,这些驱动程序如何实现,实现的原理才是初学者需要重点关注的。
0)点亮LED灯:简单而重要,程序简单,重点在于软件开发环境的使用,程序模板的搭建,单片机IO口的理解;
1)数码管显示:无论是静态还是动态显示,在未使用数码管专用驱动芯片的情况下,只需要操作IO口即可,重点在于显示原理,软件延时,余辉消除;
2)定时器:定时器通常是初学者接触的第一个单片机内部资源,重点在于每种模式的工作方式、设置方法,中断的理解,时长的计算方法;
3)按键:重点在于独立按键、矩阵按键的扫描方法以及实现;
4)PWM:重点在于理解PWM原理,如何使用定时器实现PWM;
5)串口通信:可以使用单片机的硬件串口,也可以使用IO口+定时器模拟串口,重点在于对通信协议的理解,波特率的理解以及计算方法;
6)单总线传感器:例如DS18B20温度传感器,DHT11温湿度传感器都是单总线传感器,重点在于驱动程序的编写,通过传感器数据手册正确读写传感器对应寄存器,获得我们需要数据,可以结合串口通信进行调试,如果能够顺利完成这一部分内容,编程能力、对单片机的理解都能提升一个层次;
7)LCD1602:操作非常简单的液晶显示屏,之后的学习配上LCD能够更加激发兴趣,且有成就感;
8)ADC和DAC:传统8051单片机不具备ADC和DAC功能,需要外接对应的芯片,重点在于驱动程序编写,ADC和DAC工作原理理解;
9)IIC总线类:IIC总线可以说是整个传统8051单片机学习的难点之一,原因在于通讯协议比较复杂,使用IO口模拟IIC的SCLK和SDA进行通信,对应的驱动程序比较复杂,容易出错,这里推荐结合例程编写驱动程序,多借鉴,这里推荐使用实时时钟芯片(RTC)进行学习;
10)LCD12864:这里推荐使用带字库的模块,方便初学者使用,当不满足于字符显示时,也可以参考资料,让LCD12864显示图片,甚至编写画点、线、圆等GUI程序;
11)模块整合:单片机学习需要多举一反三,将学习的各模块功能组合起来,例如数码管+按键可以做秒表,DHT11+LCD1602可以做温湿度计,ADC+LCD1602可以做简易电阻测量仪,实时时钟芯片(RTC)+LCD12864可以做数字时钟等,当能够把这些功能整合到一起并实现功能,基本就可以进入下一阶段的学习了;
能够顺利完成上述内容,基本上初学时对于寄存器、上下拉等的疑惑也就都随之解开了,并且关于这些内容的资料非常多,在这个阶段找到学习的乐趣非常重要,当然如果能够规范编程习惯,并学会将各类驱动程序单独写成.H和.C文件,增加程序的可移植性就更好了。
本人是利用业余时间来进行学习的,掌握了学习方式,完成上述内容大概花了半年时间,期间各种硬件电路都是一个个焊起来的,相较于使用开发板,自己制作硬件电路要难一些,软件硬件都要调试,对于初学者难度相对较大,不过能够对单片机的外围电路有更深入的理解。
以下是本人制作的LCD1602数字万年历,使用了DS1307实时时钟芯片和DS18B20温度传感器,非常适合初学者拿来练手。
相关的原理图以及程序上传至本人的文件中,需要的自取:https://files.cnblogs.com/files/sk3241/%E5%9F%BA%E4%BA%8E%E5%8D%95%E7%89%87%E6%9C%BA%E7%9A%84%E6%95%B0%E5%AD%97%E4%B8%87%E5%B9%B4%E5%8E%86.rar