51单片机学习心得

上传人:仙*** 文档编号:37400604 上传时间:2021-11-03 格式:DOC 页数:12 大小:71.50KB
收藏 版权申诉 举报 下载
51单片机学习心得_第1页
第1页 / 共12页
51单片机学习心得_第2页
第2页 / 共12页
51单片机学习心得_第3页
第3页 / 共12页
资源描述:

《51单片机学习心得》由会员分享,可在线阅读,更多相关《51单片机学习心得(12页珍藏版)》请在装配图网上搜索。

1、51单片机的那些事儿(一) 记:笔者在大三下学期开始接触51系列单片机,历时120天的苦苦琢磨,方有小成,回首望去,颇有感慨。现将心得分享一下。希望对广大志同道合之士有所启发和帮助。 一,单片机到底是个什么东东初学单片机,很容易被吓到,看着密密麻麻的管脚,还有一堆什么诸如MOV,DJNZ,AJMP,ORG,EQU等等让人头疼不已的东东,确实摸不着头脑。不用怕,单片机就是一个数字集成电路,一个芯片,可以以一定的频率执行你规划好的一个过程,快速守时,节能高效,并且指令相对精简,过程明了,是一个很给力的助手。单片机具有其工控方面的独特优势,但是由于51系列是8位的,不适合处理多媒体,只可以做一些相对

2、简单的流程控制。说得再简单一些,单片机就是个什么也不知道的孩子,你教他做什么,怎么做,他就一遍遍不厌其烦的重复你教他的东西。 二,单片机的内部应用特点单片机的应用很有特点。大体分为I/O,串行通信,PWM脉宽调制(属于I/O的一部分),定时/计数,中断这几类。至于I/O嘛,就是输入和输出,方式有并行,串行,I2C,PWM脉宽调制等等。以后会一一讲来。 (一),基础I/O应用 单片机最常见的就是I/O应用,一片51单片机,共40个引脚,有32个引脚是负责I/O的,可见单片机就是一个吞吐数据的黑盒子。 单片机首先要看的就是四个I/O端口,什么叫端口,就是负责I/O管脚与外部沟通的数据寄存器。51单

3、片机有4个I/O端口,分别为P0,P1,P2,P3口。我们可以直接对这四个寄存器写入数值,控制这32个管脚的电平高低,高就是1,低就是0。这四个端口一共管辖32个管脚,单片机中的布尔操作(按位操作)是很人性化的,我们可以针对这32个管脚中的某一个管脚进行单独控制。例如,我们让P2.1管脚位高电平,那么我们就用汇编语句“SETB P2.1”或者C51语句,“SBIT P2_1=P21 P2_1=1”即可实现。当然,你会发现,很多集成芯片都是用低电平来控制的,这是为什么呢。C51单片机复位之后,P0,P1,P2,P3四个端口的值均被设置为0FF,也就是说,那32个输入输出的管脚都被设置为高电平。如

4、果那些外部芯片的使能信号是高电平有效,还没等我们操作,刚复位,那些外部芯片就开始该干嘛干嘛去了,整个系统岂不乱了套。所以,单片机无论是控制外部电路还是从外部读取数据,一般都是对低电平很敏感。例如,我们想通过P1.1管脚接一个开关来控制P0.1上面接的LED的亮灭。因为P1.1复位后初始状态时高电平,所以我们得给它一个低电平,它才知道外部发生了情况,所以,单片机在I/O中,低电平是很常用的。一个端口对应了8个管脚,寄存器就有8位,对应那8个管脚的高低电平,哪位是1,哪位就是高电平。如P0拥有8位,分别是P0.0,P0.1,P0.2,P0.3,P0.4,P0.5,P0.6,P0.7。P0中存入的数

5、据也是转化为8位二进制码,最高位对应P0.7,最低位对应P0.0。例如,MOV P0,#7FH,我们发现,7FH转化成二进制是01111111,所以P0.7为低电平,P0.0为高电平。我们用MOV指令向P0,P1,P2,P3四个端口寄存器写入数值,那32个管脚就会对应出现高低电位,1就是高,0就是低。还可以对某一个管脚单独控制高低电位,例如:让P0.0呈现高电位,则SETB P0.0,让3.1出现低电位,则CLR P3.1。通过I/O,我们可以实现彩灯循环,彩灯闪烁等等简单的实验,还可以实现按键控制,包括比较高级的矩阵键盘,数码管,包括更加复杂的LCD1602液晶显示屏的应用。这些具体的例子,

6、后面我们详谈。 (二)串行,PWM,定时/计数这几个为什么要混在一起呢,因为这些东东都与定时器有关。在51单片机中,有三个叫定时/计数器的东东十分神奇,为什么呢,因为它们最准时守信用,而且一遍遍不厌其烦的在那里查数。它们是最准确的时间标准。定时/计数器在单片机的应用十分广泛,这也是在测量领域应用较多的地方。顾名思义,定时/计数器的作用就是可以进行定时,也可以计数。什么是定时呢,就是你告诉他从几开始查起,他就开始查数,查到他无法容纳的那个最大值的时候,他开始给你个提醒,然后你再不理他,他就保留在最大的值那里,然后在那里罢工,歇歇脚。超出他所能容纳的数值,就叫做溢出。由于我们不能决定单片机查到多少

7、时候停止,单片机比较傻,只知道查到他能容纳的最大值,不到溢出,他是不会轻易停下来的,所以我们只能依靠改变初始值来得到我们想要的预定时间,单片机每查一个数,消耗的时间是固定的,为一个机器周期,时间是可以算出来的,一般是晶振频率的倒数,再除以12。所以,查了多少个数就消耗了多少个周期,我们就给它个初始值,让其查到最大值,中间查过多少个数,就是多少个周期,总时间就是已知的。定时/计数器的使用,需要设置模式,就是一个叫TMOD的寄存器,TMOD就像一个盒子,你扔进去一个对应的数字,它就得到一个对应的工作方式。例如:MOV TMOD,#20HTMOD寄存器共有8位,可存储8位二进制码。从高到低分别是D7

8、D6D5D4D3D2D1D0GATEC/TM1M0GATEC/TM1M0这四位负责T1定时器这四位负责T0定时器 其中:GATE=0时,只要将TR0/1置1,就可以启动定时器工作。GATE=1时候,首先要将TR0/1置1,然后INT0/1为高电平,才启动T0/1。 C/T=0,是定时器。C/T=1时是计数器,对外部P3.4/P3.5管脚的信号进行计数。M1M0工作方式功能00方式013位计数器,取TH为高八位01方式116位计数器10方式2自动填装8位计数器,TH将值填给TL11方式3定时器0分为2个8位计数器 至于M1,M0,参照如下表格 除此之外,SETB TR0就可以启动T0,SETB

9、TR1就可以启动T1. CLR TR0就可以停止T0工作。CLR TR1就可以停止T1。 T1定时器发生溢出时候,TF1由0变成1. T0定时器发生溢出时候,TF0由0变成1. TH1,TL1为T1定时器初始计数值,TH1为高八位,TL1为低八位。 当13位计数器计数达到1FFFH,16位计数器达到FFFFH时候,发生计数器中断。TF0/1变为1.由TF0/1变化我们知道它计数计满了,我们需要得到的时间间隔达到了,利用TF0/1来提醒时间到,进行相应操作,是计数器应用中很常用的办法。 至于定时器中断,我们在中断一节中再谈。至于计数器,初始状态应该从TH=00H,TL=00H开始,到TR0/1被

10、置为0,停止工作为止。 方式2为自动填装8位定时器。即每次计数计到0FFH,TH1将值自动填装给TL1,然后T1再从TL1的值开始计数,一直计到0FFH。它一般作为串行通信的波特率发生器。串行通信用的不多,除了烧录固件,剩下的就是简单的通信应用,因为每个字母和符号都可以用ASCII码表示,ASCII码其实是8位二进制,即两位十六进制表示的。串行通信涉及到的参数有,波特率(由定时器管辖或者固定的),SCON(控制串行通信的方式)SCON的各位定义如下SCON地址为98H复位时候是00HD7D6D5D4D3D2D1D0SM0SM1SM2RENTB8RB8TIRI其中:SM0,SM1定义如下SM0S

11、M1方式说明波特率是多少000同步移位寄存器晶振频率/1201110位异步收发由定时器控制10211位异步收发晶振频率/32或6411311位异步收发由定时器控制 其中:REN设为1,是允许接收。当单片机接收一个ASCII码完工,就是SBUF存满了,RI会由0变成1,告诉系统,它接收的信息全面了,可以使用了。当一个ASCII码发送完工,发成功了,SBUF寄存器就空了,可以再用,这时候,TI会由0变为1,告诉系统它空了,可以再送入SBUF寄存器中一个字符,让它再发送出去。方式0时候,波特率固定,就是晶振频率除以12.方式1和方式3的波特率通常是晶振频率fosc/(12*32*(256-TH1);

12、方式2的波特率一般为晶振频率/64;但是有一种情况,方式1,2,3的波特率不是上面所说的一般情况。那就是SMOD等于1的时候,一般情况,SMOD=0;波特率是上面写的公式;SMOD是PCON寄存器的最高位,就是地址87H中存的数的最高位。用MOV 87H,#80H就可以让SMOD=1,上面写的方式1,2,3的波特率公式都要乘以2,就是当SMOD=1时候波特率加倍。PWM,叫脉宽调制,就是控制一个周期信号的占空比,就是一个周期中,高电平占多少,它的作用一般就是控制电机转速。就是通过定时器定下一定的时间来维持高电平和低电平。高电平时候电机工作,低电平时候不供电。或者相反。具体代码在程序一章会讲。

13、(三),中断中断,是单片机应用中最为给力的一项功能,中断,顾名思义,就是在程序执行过程中,遇到一个情况,程序执行出现断路,断开之后,要去执行别的东西,这些突发的事情处理完,回过头来,从刚刚断开的那个地方的下一句再执行。举个例子,我正在兴致勃勃的写着程序,突然间老婆大人打来电话,我就得放下手里的事情,马上出去接老婆的电话,挂了电话之后,又得继续写我的程序。来电话之后,我放下手头工作,就叫中断。出去接电话就叫中断处理,回来继续写的第一句代码就叫中断断点。51单片机中,AT89C52有6个中断源,从优先级的高到低,分别为:中断源中断编号说明中断程序地址外部中断01由P3.2管脚控制0003H定时器0

14、溢出2定时器0溢出000BH外部中断13由P3.3管脚控制0013H定时器1溢出4定时器1溢出001BH串行口收发完5串口收发完工0023H定时器2溢出6定时器2溢出002BH 中断的使用,首先要打开中断,然后设置中断相关参数:打开中断,首先要打开总中断开关,就是让EA为1,即SETB EA串行口中断需要打开它的开关,就是ES,执行SETB ES就可以。然后,用到哪个中断,就打开对应开关,就是把下面对应的参数设为1就可以ET1T1溢出中断,SETB ET1就可以开启ET2T2溢出中断,ET0T0溢出中断EX1外部中断1,使用时要SETB EX1EX0外部中断0除此外,外部中断还可以选择是用低电

15、平触发还是下降沿触发。IT0=1,就是执行SETB IT0之后,外部中断0为下降沿触发,否则是低电平触发。IT1=1,外部中断1是下降沿触发,否则是低电平触发。 三,单片机中的灵魂-程序代码 说到程序,很多初学的同学甭提多么纠结了,程序给人的感觉和我们的语言习惯大不一样,整个一个逻辑竞猜和脑筋急转弯。其实程序就是一个过程,只是表现形式为代码,通过算法的各种原理,组合到了一起。其实所有程序的过程都是清晰明了的。只要细心思考分析,并不是那么可怕。51系列单片机,可以采用汇编语言来编写程序,最后存储为asm类型的文件,或者用C语言编写,最后存为c类型的文件,通常我们用keil软件将其编译为hex类型

16、的文件,然后用单片机烧录软件将其烧录到单片机中,就可以达到我们预想的结果了。笔者个人觉得,想学好程序,要先懂得单片机的内部构造,主要是要懂得各大寄存器的名字和使用方式。这个通晓了,一切自在掌握之中。51单片机有如下一些寄存器。通用寄存器,就是R0,R1, R2,R3,R4,R5,R6,R7.这些寄存器用着比较方便,只要直接向里面传送数据就可以。例如,我们向R0里面存一个数23H,那么就编写MOV R0,#23H。算数寄存器,ACC和B,ACC累加寄存器用的较多,关于加减乘除很多都围绕ACC进行,使用中我们将ACC的名字简化为A,例如,我们向A中存一个数33H,那么就编写MOV A,#33H。这

17、里面的#33H,为什么要加一个“#”呢,因为单片机中,内存的地址也是两位十六进制,33H既可以表示内存中33H那个存储区域,又可以表示一个数字33H。为了区分,我们将数字写成#33H。什么?你想在内存中33H那个区域存一个数72H?好吧,我们就和这个33H地址对应的区域较一较劲。单片机中,我们不能直接对一个明确的地址写入数据。但是我们可以间接的访问这个33H对应的地址,那就要借助,R0和R1。只有它们才能起到间接辅助寻址的功能。好,我们来实现它。首先要访问33H,我们就先把33H存入R0,编写MOV R0 ,#33H 现在R0里面有了个33H,然后编写MOV R0 , #72H 很多朋友都会说

18、这个不就是寻址方式中的寄存器寻址吗,对,寻址方式不是重点,有兴趣大家参照单片机教材资料,了解一下即可。重点是为什么这里用R0,其实和电子邮箱地址中的一样,这里的表示的就是“在R0里面的数字对应的地址”,R0存了33H,这里R0,就是指的33H这个地址,我们对这个地址写入一个72H,所以就要编写,MOV R0 , #72H。还有就是四个I/O寄存器,P0,P1,P2,P3它们直接关系到那32个管脚的高低电平,直接对其写入就可以了,MOV P1 , #33H.当然也可以针对某一个管脚操作,就是布尔操作,用SETB P1.0就可以把P1.0置为高电平,CLR P1.0就是把P1.0置为低电平。其余的

19、,有个位寄存器C,其实C就可以存1或者0,它是表示进位的标志,再没有进位情况下,我们可以用它来当做位操作的中间站。闲言少叙,我们开始谈谈汇编语言。51系列的汇编指令不是很多,而且规律性比较强。还有那些伪指令,大家可以参照教科书一一了解。汇编语言模块化不是很强,调用模块比较麻烦,属于底层语言,直接面向硬件,每个操作都可以落实到确切的寄存器上。大体上设计方法有四种:顺序法,查表发,分支法,循环法。程序设计要注意伪指令的应用。首先ORG很重要,它可以定义程序对应ROM的地址,然后是END,虽然程序并不是执行到END结束,但是END可以告诉编译工具,到END就可以停止编译了。BIT伪指令表示用一个名字

20、替代位地址。例如 EN BIT P1.1那么P1.1就可以用EN来表示。SETB P1.1 和SETB EN就是等价的了。EQU的作用就是表示等价。例如:PI EUQ 34H 表示这个数34H可以用PI来代表。执行MOV P1,#34H和MOV P1 ,#PI是等价的。DATA伪指令用于定义一个ROM中的地址。例如 L1 DATA 3000H表示标签为L1的程序要存在3000H开始的ROM中的区域。那么什么是标签呢?程序中的某一句话可能比较重要,我们需要切换到这句话怎么办,就在这句话前面加上一个标签,例如,我们把 MOV P1,#30H这句加上标签L1.它就可以写成L1:MOV P1,#30H

21、 然后跳转到L1,或者调用L1,就执行后面的MOV P1,#30H了。接下来列举几个小程序,逐一分析一下。彩灯循环:这是常见的简单程序,我们先让P0口接的LED中的一个灯亮,然后顺序左移,移到最后一个再右移。循环往复。代码如下:ORG 0000HAJMP MAINORG 0080HMAIN : MOV A , #7FH 这行是让一个灯亮起来 MOV P0 , AMOV R0,#07H 移动7次 MOV R1,#07H MOV R2 , #0FFH 用来延时,要不然太快了 MOV R3 ,#0FFHL1:RRC A MOV P0 , AL2 : DJNZ R2 , L2 NOP NOP NOP NOP DJNZ R3,L2DJNZ R0,L1MOV R3 ,#0FFHMOV R2 , #0FFHL3:RLC A MOV P0,AL4:DJNZ R2,L4 NOP NOP NOP NOPDJNZ R3, L4DJNZ R1 , L3AJMP MAINEND程序编写很重要的一个原则是节约简洁高效,我写这个程序为了细致明了,其实已经浪费了很多代码。希望专业的朋友不要见怪。整个过程主体是顺序执行,结尾又跳转回开头的主程序,这就是循环体。到此为止,第一节就结束了,后续文章中我会继续分享心得和体验。欢迎支持。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!