我的单片机学习之路
2020年注定是不平凡的一年,无数大学生被困家中无所事事,我也是其中一员,在家学习对一个自制力弱的人来说是比较难的事情,但是一直颓废下去也是让人心里很难受的,所以我就想着随便学点自己感兴趣的东西,总比什么也不干强点。于是我就在这些天开始学习了单片机。
我一直觉得单片机是一个很酷的东西,可以用它做小车,做无人机,尤其是做无人机和玩无人机算是我这两年的梦想了吧,其实我以前就学过一点51单片机,当时也买了一套清翔的51开发板,不过当时就学了一点,好像是刚学到中断,我是一个懒散没有常性的人,这次既然想要好好学学,希望着有一天学成可以自己做很多有意思的东西玩意,那么一些额外的督促等手段可以说是必不可少的。我思来想去决定用写知乎的方法来监督自己,同时也可以通过写文章的方法来总结单片机开始学习路上遇到问题和我的尝试解决,我准备做成一个实时更新的系列,学完一部分便总结反思一部分,既可以加深印象提升自己,又可以分享给和我一样的小白在学习路上所碰到的问题(菜鸡都是有共性的,所以可能遇到和我一样的问题),虽然可能没有人看。
因为我是想自己做一个小四轴玩的,我给我自己准备的学习路线是先学习51单片机,等学的扎实后就去买小马哥(一个教四轴的up主)的四轴套件和教程,小马哥的四轴是32单片机的。我看着教程挺好的,不过 我现在连51单片机都没有学会,所以不先考虑学32单片机的。听同学说32是很难学,我准备考完研的寒假学小马哥的这个。
我学重新学51单片机的时间大概有一个月了 吧,因为有课加准备考研加自己懒散,所以进度缓慢,我清翔老师的教程倒是先过了一遍,但是感觉还是没啥用,该会的也还是不会,所以我是准备把老师上课写的程序再自己重新敲一遍,估摸着把课上的所有程序都自己独自敲一遍并且编译成功我的51 单片机就算小成了,我也可以考虑学32 了,其实我在学习51单片机的时候感觉并不简单,甚至觉得还挺难得,我一度怀疑郭天祥10天学会51单片机是吹牛逼。
--------------------------------------------------------------------------------------------
持续更新中~~~~~~~~
虽然很多大佬说51单片机非常简单,但是我还是一直觉得要想学好51单片机10天根本做不到,特别在我看了电子万年历这个比较综合的项目,我是更觉得学10天不可能自己写得出来(也是可能是因为我太笨了),清翔老师是说能独立写出电子万年历这个项目51单片机就算学的可以了,我看完了大概得讲解也是一头雾水,什么应用层,底层驱动啥得感觉特别懵逼,附个图
对于我这种看课基本是一遍过,也没有课下写程序练习的笨比小白可以说是太难了,我回想LCD1602液晶, DS18B20数字温度传感器, DS1302实时时钟,只觉得脑袋一片空白,再想想红外通讯,I2C通讯,好像也是写不出来,只对定时器中断好像有点印象,那天我真的是备受打击,虽然我是刚学的小白,但我也明白,写无人机的飞控应该比这个电子万年历要难太多。真的是一度心灰意冷,以为自己笨的什么都学不会。不过还好我没心没肺,难受的快忘的的也快,接受现实也快,要是我只看一遍教程就能学会,那我也就不是我了哈哈哈。
其实这个过程已经过去两天了,我昨天才开始打定主意写知乎的,给大家先看一下我的进度
这是我前两天写的,我没有写点灯的,因为我学会了哈哈哈哈(笨比笑),我是从矩阵按键和数码管那开始写的。但现在已经过去好几天了,我就粗略的总结一下,以后当天的内容肯定要更加详细的说的,那么现在正式开始分享~
矩阵键盘篇
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint KeyValue;
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0; y--);
}
void KeyScan()
{
//4*4¾ØÕó¼üÅÌɨÃè
P3 = 0XF0;//ÁÐɨÃè
if(P3 != 0XF0)//Åжϰ´¼üÊÇ·ñ±»°´ÏÂ
{
delay(10);//Èí¼þÏû¶¶10ms
if(P3 != 0XF0)//Åжϰ´¼üÊÇ·ñ±»°´ÏÂ
{
switch(P3) //ÅжÏÄÇÒ»Áб»°´ÏÂ
{
case 0xe0: KeyValue = 0; break;//µÚÒ»Áб»°´ÏÂ
case 0xd0: KeyValue = 1; break;//µÚ¶þÁб»°´ÏÂ
case 0xb0: KeyValue = 2; break;//µÚÈýÁб»°´ÏÂ
case 0x70: KeyValue = 3; break;//µÚËÄÁб»°´ÏÂ
}
P3 = 0X0F;//ÐÐɨÃè
switch(P3) //ÅжÏÄÇÒ»Ðб»°´ÏÂ
{
case 0x0e: KeyValue = KeyValue; break;//µÚÒ»Ðб»°´ÏÂ
case 0x0d: KeyValue = KeyValue + 4; break;//µÚ¶þÐб»°´ÏÂ
case 0x0b: KeyValue = KeyValue + 8; break;//µÚÈýÐб»°´ÏÂ
case 0x07: KeyValue = KeyValue + 12; break;//µÚËÄÐб»°´ÏÂ
}
while(P3 != 0X0F);//ËÉÊÖ¼ì²â
}
}
}
void main()
{
while(1)
{
KeyScan();
if(KeyValue == 0)
{
P1 = 0x6F;
}
if(KeyValue == 1)
{
P1 = 0;
}
if(KeyValue == 2)
{
P1 = 0xFF;
}
}
}
不知道为啥代码复制到知乎上会有注释乱码现象,有点头大,以后黏贴代码把注释去掉。
矩阵键盘倒是也不难基本操作和独立按键差不多,说到底矩阵按键就是一大堆按键排列到一起,都是需要消抖加松手检测这两个步骤。我的开发板矩阵按键是4x4的,16个按键,接在P3上,矩阵按键在检测哪个按键被按下是需要键盘扫描->我是先进行的列扫描然后又行扫描,列扫描时先把接在列上面的所有IO口拉高,接在行上的所有IO置低。当其中有一列内任何一个按键按下那么整条列线都会被拉低。也就是先将P3 = 0xF0; 这一块倒是不难,印象中没有碰到问题。
我当时自己写程序的时候其实只有一个疑惑,就是switch case 语句,进行列扫描,uint 了一个KeyValue, 列扫描初值是 0, 1, 2 , 3, 然后行扫描的时候使 KeyValue + 0, 4, 8 ,12; 我开始的时候怎么也想不起来为啥非得加4 的倍数,到后来又看了下视频
--------------------------------------------------------------------------------------------
持续更新中~~~~~~~~2020/4/29继续更新
我觉得在没人指导的情况下自学一些东西是挺难的,你总会遇到一些问题,有的问题很简单但是你脑子当时转不过来圈,有的问题真的很难,你的知识储备不够逻辑能力不强就是没办法解决。对小白来说最可怕的是遇到的一些对别人来说是常识问题的,百度都不怎么知道百度一个确切的问题,很多时候就是想要放弃~
今天精神很差,我白天学习的心思太淡了,晚上就容易亢奋,昨晚看完考研设定的目标量后已经11点多了,又开始学51单片机,昨天把URAT串口看手册看教程最后独立写完整个程序已经12点多了~昨晚写完串口发送数据数码管显示的程序,基本没问题,想要真正学好还是要自己重新做一遍啊,只看视频效果接近没有,后续得总结一下经验。洗完澡躺床上玩会手机再睡觉到差不多凌晨2点,今早又7点起床属实有点萎靡~今天想想怎么安排一下时间,时间管理可是个技术活。
随便扯点继续顺着昨天向下写,看完矩阵按键视频教程后,又看了下开发板,这他娘的不是16个按键嘛!0~15一个数对应一个按键,想明白之后是真觉得自己傻*,写完这个基础的矩阵按键程序之后其实我还写了一个麻瓜通过矩阵按键触发外部中断0进行控制流水灯模块,但是就是实现不了,编译倒是0waining 0error,我又看教程,又看原理图,又看手册,后来又百度都没找到问题,很多时候我真觉得我愚笨,脑子不会转。折腾了一个小时,我又对着原理图重新敲程序,我是用的外部中断0下降沿触发嘛,当时跟着清翔老师说的通过一根杜邦线让P32口和P37相连通过P37口赋值1再赋值0来控制下降沿触发中断。
开发板P3口
当我写到位定义的时候我突然想明白了为什么矩阵按键程序写的没问题,外部中断0程序写的没问题,偏偏它们两个合起来就发挥不出来我预期的作用呢。我买的开发板的矩阵按键是接在P3口上
sbit P32 = P3^2;
sbit P37 = P3^7;
恰好外部中断0是由P3.2口触发,这样矩阵键盘在行列扫描的时候就出错了。
学完矩阵键盘这我算是意识到看手册和原理图对小白来说是很重要的,下边的图是我截的手册中断里面的一小块
矩阵按键这块我这些问题,因为我是先开始重新学的,学了几天后开始弄的知乎总结,分享,知乎总结有点跟不上我学的速度了。也可能是前面的内容过于简单的原因,我本来想着数码管动态扫描还有定时器中断啥的各作为一部分进行写的,今天想想好像不可行,我串口那也没遇到什么特别的问题,所以接下来计划将数码管显示加串口部分一块写完,今天晚上开始学习I2C。定时器中断啥的也都会用到,不想再作为单独的知识总结了。
数码管我准备总结两块内容,1是延时部分写delay函数延时和定时器延时,2是在动态扫描中我犯的错误;串口这一部分我就分享一下我遇到的问题,并分享出来,希望有大佬以后可以在评论讲解一下~今天白天就写这么多吧~大部分时间还是准备考研要紧,嘿嘿
--------------------------------------------------------------------------------------------
持续更新中~~~~~~~~
记录51单片机学习经历
#头条创作挑战赛#
本文主要是记录一下近些天来自己从零开始学习51的心路历程和一些感悟,以及一些学习方法。
所用开发板为STC89C52,师从清翔老师的视频~
正文
刚接触51时,兴趣盎然,点亮第一个led灯的成就感更不必多说,但随着学习的不断深入,枯燥感不可避免,于是过上了三天打鱼两天晒网的生活[流泪]......
努力加油吧,大学牲。
接下来分享一下从0到1成为一灯“大师”的一些感悟~
学习过程中,有个问题在脑海中挥之不去:单片机种类繁多,单片机学的到底是什么? 比如,不同芯片的引脚位置不尽相同,外设也因厂家们的喜好略有差异,难道学一个不同的型号就要看一遍对应的芯片手册重学一遍吗?
答案是否定的。尽管不同单片机间看似差异较大,但其中各种外设的原理,I/O口的使用,以及各种通信协议大同小异,因此我们学习单片机主要就是学习这些通用的基础!
芯片手册需要什么看什么~
学习方法上,通过看视频学习 是理解最快的途径(俺也一样)。虽然我们大多会专精一套视频学习,但切忌拘泥于一个老师,正所谓:兼听则明,偏听则暗。
其次,通过阅读学习 也是不可或缺的,比如上面的芯片手册和一些书籍。众所周知:文字的知识密度远大于视频,有基础的话以阅读的方式学习也许更有效率。
郭天祥、江协讲得都不错~
作为初学小白,我觉得知其所以然是相当重要的,so编码过程中我们更要关心背后的原理,达到自己能亲自复原例程并进一步根据自己想法改动 就可以啦。
以上是我这阵子学习的一点心得感悟,每个人学习方法不一,所以上述也仅供参考。由于初窥门径错误不可避免,若有更好的学习方法望不吝赐教。[红脸]
道阻且长,行则将至
在完整学完C51并完成几个小项目后我也会分享下自己的笔记一起学习,与君共勉。
相关问答
单片机 通电但检测不到?51单片机连接电脑后,关闭单片机电源电脑无法检测出单片机,必须打开单片机电源才可以原因如下:1、要想让电脑检测到51单片机,那么单片机必须处于工作状态。...