龙空技术网

51单片机的另类入门方式与编程思想

大方老师进阶上位机 328

前言:

此刻我们对“单片机取反指令编程怎么写”大约比较着重,兄弟们都需要剖析一些“单片机取反指令编程怎么写”的相关资讯。那么小编也在网摘上搜集了一些关于“单片机取反指令编程怎么写””的相关资讯,希望朋友们能喜欢,各位老铁们快快来学习一下吧!

51单片机的另类入门方式与编程思想

\\\插播一条:

自己在今年整理一套单片机单片机相关论800余篇

论文制作思维导图

原理+源代+开题报++外文资料

想要的同学私信找我。

在写之前我先说一下为什么写这篇文章,其实主要是出于这么一些考虑:

一、如何学习单片机

发表一下个人的观点:书要看,但是不要过多的看,把它作为一个知识的补充,我们读了这么多年的书,其实只有在自己静下心来看书的时候效率才最高。
首先,我们不能像以往学习其他课程一样,又是背,又是拿笔计算,学什么寄存器,从那难懂的汇编语言入....我直接告诉大家,这样是达不到效果的,反而会丧失学习单片机的兴趣。那该如何去学呢,我们要充分利用自己的兴趣去学,单片机,而不是被它,在此过程中切记浮躁,不要跟着自己的情绪走,想学就学一下,不想学就不学,要持之以恒。

刚开始可以对照着别人的代码抄写,但是后期只能借鉴别人的,不要一味CTRL+C,CTRL+V,我晓得大家这两个东西用的很熟,多借鉴别人的编程方法,用自己的思路去写;

不要蜻蜓点水,得过且过,细微之处体现实力;

把时髦的技术挂在嘴边,不如把过时的技术记在心里;

经典的书时不时的去重新看一遍,多看国外的书;

网上的资源要多利用,但是不要瞎逛,要有目的;

单片机十天是学不会的,只能入门,要打持久战;

思想很重要,方法很重要!!

二、学习的一个基本流程

1、了解单片机是个什么东西,主要出现在那些领域,弄清自己为什么要学?

2、基本开发软件安装,代码下载Keil是最基本的);

3、跟着教程从零开始建立第一个工程,一次不会多试几次:跟着教程把代码一个一个的敲上去,然后编译,出现错误不要立马询问他人,先自行尝试去解决,实在搞不懂再去问别人,当控制LED的亮灭工作后,就要去分析一下这LED到底是怎么点亮的,里面相应的代码又是怎么回事,都要去了解一遍;

4、到了这个阶段,就可以学习单片机的其他东西,对照着代码一个一个字母的抄,不要觉得繁琐,没抄完一个功能,正确无误后,先做好备份,然后再去修改,看是否与你的预期相符,抄着抄着你就有感觉了,有了感觉就可以尝试着不参考别人的程序自己从零去建立自己想要实现的功能,从最简单的开始,哪怕是点亮一LED灯,这个很重要!!!;

5、当把单片机的基本功能都学完后,就可以以工程的形式进一步学习了;用单片机实现一个电子钟,用单片机控制一辆小.....在做这种工程的过程中我们会发现很多问题,解决很多问题,这样我们就上升了一个层次了;

6、编程规范,本来想将编程规范放在最前面,考虑到可能会让大家丧失学习单片机的热情。这阶段就要看人家写的代码,为什么看上去那么舒服,并且很容易阅读,函数一看就知道它用来干......从规范着手,编写能重复利用,便于维护的代码;

7、工程也做了,规范也有了,是不是有点感觉单片机不怎么好玩了?其实还有大把的东西需要你了解,随着工程一个比一个大,我们就要从全局开始思考这些问题了。要对一个复杂的工程分成一个个的模块,比如说在电子钟工程里,我们可以尝试着把它分为按键模块,显示模块,时钟模......

Keil:软件不要汉化,英语没有那么可怕,它本身也自带了说明书,遇到有些问题可以去看它


(二维码自动识)

Pretous:个人建议只用来做一些功能性的检验,像算法类型的,切不可在实际硬件中用其作为真实参考

Notepade++

Notepade++:平时查看,编写代码非常方便

Notepad++软件截面

三、了51单片的的基本东西C语言

单片机:硬件设施,躯壳首先要了解基本51单片机知识,实验室一般以国产宏晶公司STC89C52RC为例,要知道怎么给单片机供电,有哪些基本I/OI/O口的基本内部结构,串口(这些东西只做基本了解,不需要刻意去记住,在后续的练习过程中,大家会慢慢记住)

C语言:灵魂对于学习单片C语言,个人建议刚开始可以直接跟着抄写代码就行了,至于为什么是那样写的不必纠结太多,练习一段时间后再去看那些单片机C语言书籍,这样大家更深刻些。

Keil软件的安装以及怎么ISP软件下载

Keil软件怎么安装,以及怎么破解,基本的设置,怎么使用,大家网上去搜索,如果这一点都做不到,不要说你会用电(关于使用这一块了解就行,后面在写代码的过程中会反反复复的用到的,不必刻意去)

keil软件图标keil软件界面截图

程序烧写ISP(ISP--In System Programming是在线编程的意)软件可直接下STC-ISP,这里面也有很多值得参考的东西,有事没事可以去看看,也可以百度,怎么安USB转串口的驱动USB转串口常用芯片CP2102,PL2303,CH341),它的功能也就是将我们编写好的代码下载到我们的单片机当中,怎么ISP软件中找相应单片机的型号进行代码的下载

STC单片机烧写软件图标ISP烧写截图

烧写步骤:

(1)、在烧写前先断开单片机的电()

(2)、首先选中单片机的型号,根据自己用的单片机选定,我这里STC89C52RC

(3)、打开要烧写的文件:LED.HEX

(4)、选择当前有效的串口

(5)、点击下载按钮。

(6)、接通单片机的电源

关于下载我总结了一下,如果要重复下载的话,最好装个那种自锁的开关,然后每次去点击下载,直接按开关

将别人验证成功简单功(etc:LED灯闪)HEX文件下载进单片机以便验证自己的思路是否正确

五、点亮一LED

LED灯实物(摘自爱上单片机)

LED灯其实我们平时到处都可以看到,不同LED灯的驱动电压有区别,这个我就不多说了,百度上一大堆,大家只要记住一LED灯的那个限流电阻的值是怎么来的就行了,比如说红LED灯的驱动电压3V,电源5V,一般的驱动电流大10mA就足够 R = (5V-3V)/10mA*1000 = 200Ω,我这只是举个例子,其他的大家都可以根据数据手册,或者某宝卖家提供的参数进行电阻的计算。

硬件部分

如图所D1连接P0.0端口,我们为什么要采用这种方式连接呢?可不可以LED灯反向呢?对于这个问题我给出的回答是,有些可以,有些不可以。为什么是这样呢?

这个我们就要了STC89C52RC这款单片机GPIO内部的基本结构了,在本实验中所使用的端口P0口,内部为开漏输出,什么是开漏输出?度.....因为在这个教程中我只教大家学习单片机知识,其它的不过多的说,以免牵扯太多,大家消化不了P1~P3口是准双向上拉,这款单片机5VI/O口的驱动能力的灌电20mA;弱上拉时,拉电流能力200uA,设置成强推挽时,拉电流能力也可20mA

灌电流:MCU被动输入电流。

拉电流:MCU主动输出电流。

那下图就不用多解释.....

点亮一LED灯实验原理图

代码:

/************ (C) COPYRIGHT 2016 wllis ************** * *文件: LED.C *述:点亮一LED *: wllis *: 2016/01/15 * ****************************************************/

#includetypedefunsignedcharUINT8;

typedefunsignedintUINT16;

sbitLED=P0^0;/* *函数名void DelayMS( UINT16 n ) *述:延 *UINT16 *出: */

voidDelayMS(UINT16n)

{

UINT8a;

while(--n)

{

for(a=114;a>0;a--);}

}/* *函数名void main() *述:主函 *入: *出: */

voidmain()

{

P0=0XFF;//P0端口全部初始化为高电平while(1)

{

LED=1;// LEDDelayMS(500);//500毫秒LED=0;// LEDDelayMS(500);//500}

}

/********************end of file ***********************/

代码分析:

首先我们看下我们要点亮LED怎么实现,先在代码中定[图片上传失败sbit LED0 = P0^0;也就P0口的最低位,这句代码大家可能是初次接触,不怎么好懂sbitKeil开发环境中的关键字,是直接用来进行位定义的,它的用法大家参考我后面给出的书籍。这P0又是怎么来的呢?我们来看REG52.H这个头文件

REG52.H头文件

在里面是不是看到有关P0的定义,再看下那个英文单BYTE Registers字节寄存器,一个字节是多少位?八位sfr又是怎么回事呢?它的全称Special Function Register这个Keil软件规定的用来定义特殊寄存器的,这是规定,大家也没必要了解为什么了,感兴趣的话自行去了解。然后再来看P0后面0X80是什么意思?,这个其实就P0端口的地址,讲到这里大家可能又会问,地址又是怎么回事?这个问题我给大家打个比方,比如说你到宾馆去住宿,你上服务台那边花钱开了一间房,服务员告诉你的房间112号,这112号也就是宾馆房间的一个地址,有了这个地址你就可以在你的房间自由进出了,看电视,睡觉等等。如果说没有地址那岂不是乱了套了,大家到处乱走,很容易走错别人的房间。单片机也是如此,有了这个地址我们就可以对它里面的东西进行操作,变换高低电平,读取高低电平,这个地址是怎么来的,从单片机的数据手册上可以找到,这个就不要问为什么了,当初造这块单片机的时候就早已经固定好了。

特殊功能寄存器映像(摘STC80C52RC数据手册)

大家看下最下面80h是不是有P0 .....,功能越强大的单片机,它的寄存器就越多,以至于它们的数据手册写了厚厚的一本书,STM32S3C2410大家可以去找它们的数据手册看看。再来看看当中的延时函数,如果我们把它进行拆解,外面一500次的循环,内部一114次的循环500*114我的天呐500多万次的减法,不停的对其中的数进行减法运算,一直到运算条件不成立为止,也就CPU每运行一个指令都要花费一点时间,将这些时间全部加起来达到我们需要时间。说道这里,大家是不是感觉TM浪费了,一个小小的延时,这么占MCU的资源,以至于如果还有其他的东西需要运行的话都有困难,那有没有别的方法可以将这种方式的延时资源占用释放出来呢?答案肯定是有的,只要大家坚持往下看就会学到自己想学的东西....

六、流水灯实验

流水灯实验原理图

1

/************ (C) COPYRIGHT 2016 wllis ************** * *文件: Flow_LED.C *LED流水灯实 *: wllis *: 2016/01/21 * ****************************************************/

#includetypedefunsignedcharUINT8;

typedefunsignedintUINT16;/* *函数名void DelayMS( UINT16 n ) *述:简单的延 *UINT16 *出: */

voidDelayMS(UINT16n)

{

UINT8a;

while(--n)

{

for(a=114;a>0;a--);

}

}/* *函数名void main() *述:主函 *入: *出: */

voidmain()

{

UINT8i=0;

P0=0XFF;//P0端口全部初始化为高电 0XFF化为二进制 1111 1111while(1)

{

for(i=0;i<8;i++)

{

P0=0XFE;// 1111 1110DelayMS(100);//100毫秒P0=0XFD;// 1111 1101DelayMS(100);//100毫秒P0=0XFB;// 1111 1011DelayMS(100);//100毫秒P0=0XF7;// 1111 0111DelayMS(100);//100毫秒P0=0XEF;// 1110 1111DelayMS(100);//100毫秒P0=0XDF;// 1101 1111DelayMS(100);//100毫秒P0=0XBF;// 1011 1111DelayMS(100);//100毫秒P0=0X7F;// 0111 1111DelayMS(100);//100毫秒}

}

}

2

/************ (C) COPYRIGHT 2016 wllis ************** * *文件: Flow_LED.C *LED流水灯实 *: wllis *: 2016/01/21 * ****************************************************/

#includetypedefunsignedcharUINT8;

typedefunsignedintUINT16;/* *函数名void DelayMS( UINT16 n ) *述:简单的延 *UINT16 *出: */

voidDelayMS(UINT16n)

{

UINT8a;

while(--n)

{

for(a=114;a>0;a--);

}

}/* *函数名void main() *述:主函 *入: *出: */

voidmain()

{

UINT8i=0;

P0=0XFF;//P0端口全部初始化为高电 0XFF化为二进制 1111 1111while(1)

{

for(i=0;i<8;i++)

{

P0=~(0X01<<i);// 1111 1110DelayMS(100);//100ms}

}

}

/********************end of file ***********************/

比较一下代1及代2,实现的功能是一样的,但是代2精简了很多,到后面讲到定时器时我还将给大家介绍另外一种实现该功能的代码。

代码分析:

首先P0全部初始化为高电平,这么做的目的主要是为了方便后面的操作,打个简答的比方,如果我们起跑没有起跑线的话,那么我们100米赛跑中怎么确定终点线呢,同样在这里我们只有初始化了,后面我们才晓得哪个位为高电平,怎么去操作,以免导致误触发,影响我们想要的结果。这个东西这么做大家现在可能不理解,但是慢慢的随着大家经历的多了,就能理解了。

流水的核心思想就是每个端口开启一段时间的低电平,然后把它关掉,在下一个位开启低电平这么循环操作,从而达到我们想要的效果,我给大家画个框图解释下。代码二用的相当简洁,我们首先来分解(0X01<<>,变成二进制就(0000 0001<<>,如果此i0的话,取反后得1111 1110,赋值P0端口P0.0输出低电平LED1亮,其余全灭i1,则移动一位变000 0010,取反得1111 1101,赋值P0端口P0.1输出低电平LED2亮,其余全灭;以此类推,达到我么想要的效果,大家在以后的编程中可充分利用位操作去解决一些问题。

P0 P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0

~(0X01)<

~(0X01)<

~(0X01)<

~(0X01)<

~(0X01)<

~(0X01)<

~(0X01)<

~(0X01)<

标签: #单片机取反指令编程怎么写