资源描述:
《51单片机学习心得(四)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、51单片机的那些事儿(四)这一篇谈谈单片机的常用外部设备——键盘,直流电机(PWM)。掌握这些,对于大家单片机应用可以增加一些乐趣。在这里,就要谈谈C语言编程与汇编编写程序的区别。C语言最大特点是模块化,可移植性能好。不同的处理器只需要修改一部分模块就可以。汇编语言没有模块化,只有顺序执行的主体,和其中的一些跳转和循环。设计到的寄存器一旦因为处理器不同,那么必须将汇编程序中涉及到的寄存器名称都修改一遍。而C语言编写程序涉及到移植时候,只需要修改寄存器对应的地址就可以,利用“#define寄存器名字对应十六进制的地址”这种方式就可以把整个程序移
2、植成对应的处理器。寄存器寻址在编写程序过程中十分重要,我们处理数据过程中,一旦涉及控制和I/O时候,就要对寄存器进行读写操作,如何寻找寄存器呢,就要把寄存器对应到对应的十六进制表示的地址。书归正传,说说键盘的应用方式,与对应驱动代码。键盘一般有两种,有一种叫独立按键,一般是独立的,每个按键对应I/O口的一位,也就是说,P0口只能驱动8个独立按键。由于单片机复位后,P0口自动设置为0FFH,就是说P0口的8个管脚都是高电平,所以,我们只有让管脚电平变为低电平,单片机才知道,有外部信号进入。所以,独立按键一端接I/O口的某个管脚,另一个接到GND
3、,就是接到低电平。读取驱动信号之前,要将对应管脚置为高电平。然后判断按键对应的管脚为低电平之后,做出对应反应。独立按键一般这样判断:例如,我们在P1.0管脚上面接一个独立按键,独立按键另一端接在GND端,那么我们这样判断:P1_0=1;If(!P1_0)——!P1_0表示当P1.0变为低电平时候,!P1.0变为1{这里是对应的处理程序;}独立按键虽然编写程序简单,但是浪费资源,51单片机只有32个标准I/O管脚,浪费就是最大的犯罪。所以,为了节约资源,引入矩阵键盘。顾名思义,矩阵键盘是方形的,一般是4X4结构,利用8个管脚,驱动16个按键。四
4、行的按键A端都依次接在低四位,四列按键的B端依次接在高四位。我们把键值编为12345678910111213141516对此,我引入了一位高人编写的键值判断程序:ucharKeyscan(void){uchari,j,temp,Buffer[4]={0xfe,0xfd,0xfb,0xf7};for(j=0;j<4;j++){P1=Buffer[j];temp=0x10;for(i=0;i<4;i++){if(!(P1&temp)){return(i+j*4);}temp<<=1;}}}它的方式比较容易理解,其实就是按照行列查询法。每次先让一行
5、为低电平,依次判断该行的四个键子,哪个是低电平。虽然没有按键消除抖动,但是效果依然十分给力。有兴趣的读者可以自行慢慢分析。除此之外还有很多方法,但是代码普遍比较冗长。有兴趣大家可以学习一下其他方法。接下来说说直流电机的变速驱动,就是PWM,就是脉宽调制。根据高电平存在的时间和低电平的时间比例,改变速度,也可以理解成根据数字信号的占空比来控制电动机的转速。PWM在单片机应用中属于常用范围,在ARM单片机中都集成了PWM模块。那么如何实现PWM呢,PWM是周期控制的一种,所以涉及到周期信号,一定要利用单片机中的定时器。复习一下定时器,定时器涉及四
6、个寄存器,TMOD,TH0/1,TL0/1,TCON(主要是TR0/1这一位,控制定时器的启动)我们借助汇编,可以利用中断,也可以不借助中断。利用C语言,就一定要利用中断,中断还要涉及EA位,ET0/1位,以及中断编号和中断向量。51汇编语言编写的范例如下:不利用中断的版本,P1.0管脚接在直流电机+端,电机—端接在GND.代码如下:ORG0000HAJMPMAINORG0080HMAIN:MOVTMOD,#10HT1是方式1,定时器。LOOP2:CLRP1.0MOVTH1,#08HMOVTL1,#0ABHSETBTR1LOOP:JNBTF1
7、,LOOPSETBP1.0CLRTR1MOVTH1,#0AAHMOVTL1,#0AAHSETBTR1LOOP1:JNBTF1,LOOP1CLRTR1AJMPLOOP2不利用中断方式的汇编程序,不需要中断入口,只需要判断TF1/0,是否为零。而利用中断方式,就需要中断处理程序。例如:P1.0管脚接在直流电机+端,电机—端接在GND.ORG0000HAJMPMAINORG000BH-----定时器0中断程序入口AJMPPROC-------定时器中断处理程序的名字ORG0080HMAIN:CLRP1.0CLRCMOVTMOD,#01HMOVTH0
8、,#04HMOVTL0,#44HSETBEASETBET0SETBTR0LOOP0:AJMPLOOP0------等待中断PROC:CPLCJNBC,LOOP1CL