单片机经典实验实例精华详解(附源程序)

控制/MCU

1879人已加入

描述

  单片机

  自学单片机心得体会

  无论是作为一名业余的电子爱好者还是一名电子行业的相关从业人员,掌握单片机技术无疑可以使您如虎添翼,为您的电子小制作或者开发设计电子产品时打开方便的大门!

  而且现在学习单片机技术的热潮正在不断升温,电子发烧友网开设了详细的单片机学习专栏和人气非常旺的论坛讨论组,对于想学习单片机的朋友来说帮助很大,可以说现在的单片机学习环境是最好的,经过一段时间的努力,采用单片机来开发设计电子产品已经不再是专业电子工程师的“专利”!作为一个普通的电子爱好者完全可以通过一番努力后熟练掌握!国外的电子爱好者采用单片机来设计小制作非常普及,一些智能机器人、智能自动装置内部都离不开单片机的身影~~~

  学习单片机技术有一定的难度,不花费一番努力是很难学会的,但是只要不断努力就一定能成功,套用一句广告歌词:努力总有回报!

  学习单片机最好从51系列开始,第一是书多、资料多,而且掌握51技术的人多,碰到问题能请教的老师也就多了,51系列的实验芯片AT89C51价格低廉而且很容易买到,AT89C51芯片而且可以反复擦写1000次以上,对于初学者来说真是太合适了,就算以后考虑工业运用,也可以先学透51后再学其他类型的单片机,毕竟技术是相通的。

  学习单片机的第一步是看书,单片机是一个知识密集的东东,不看书是绝对不行的,北京航空航天大学出版社出版了大量单片机方面的好书,你可以直接登录他们的网站进行邮购。本人认为第一本书应该是8051单片机的基础原理书,我看的第一本书是问单位一位大学生同事借的清华大学出版社的《单片机的原理及接口技术》这本是51的大学教科书,比较系统地介绍了51芯片的基础知识,我认为这本书对我帮助还是很大的,可以很系统地了解51单片机,虽然一开始不容易看懂,不过确实很有用,很有嚼头,可以先大致看一遍,不消化的可以以后在试验实践中反复研究。

  这里我推荐初学者一张学习单片机的多媒体光盘,这张光盘中有比较详细的单片机基础知识,因为是图文并茂,所以学习起来比较容易上手,学习容易产生兴趣,当然最终还是要看书的,毕竟书更系统全面。

  《MCS-51单片机实用接口技术》这是一本北京航空航天大学出版社出版的一本好书,它详细描述了单片机的常见接口技术,对于想以后开发产品的话,那就人手一本吧!《单片机实践与运用》这本书详细介绍了用单片机作的实验,有很实用的汇编源程序,可以通过学习模仿上面的程序加以试验,快速掌握单片机技术。

  学习单片机的第二步是购买工具,单片机芯片必须借助编程器才能写入程序,站长用的编程器是一种性能较好的Genius NSP 通用编程器,通用编程器的特点是专为开发单片机和烧写各类存储器而设计的通用机型,它的编程可靠性高,支持的器件品种很多。

  Genius NSP 通用编程器:

  4Opins万用锁紧插座。适应绝大多数器件编程之所需。使用适配器能够支持非DIP封装器件的编程。

  RS232窜口通讯。通讯波特率:57600bit/s

  9V/500mA电源转换器。

  主要功能:EPROM、EEPROM、FLASH、MPU/CPU、PLD。Serial EEPROM六大类器件的编程;RAM器件及CMOS/TTL器件的测试等等。

  可选择的器件插入自动探测启动功能,即当您选择该功能并启动后,不再需要每次点击鼠标启动操作,每次当您更换芯片并锁紧万用插座后操作自动启动。

  Genius NSP 可以在 WINDOS95、 98、me、2000、XP上运行。

  从长远的方面考虑,购置一台通用编程器是很有必要的。

  学习单片机的第三步是反复编程实践,这里需要一块AT89C51的试验板。

  仿真器对单片机初学者来说既是那么耳熟,同时又有些陌生,这主要是因为市场上传统的仿真器价格都在千元以上,对经济不是非常宽裕的人来说是不小的开支。同时仿真器是用来提高调试程序效率的,也不是非需不可的,所以站长在自学单片机开始的时候也没有用过仿真器,碰到程序出错的时候,只好苦思冥想,或者在程序中插入一些驱动端口的指令,然后再接上一些发光二极管做简单指示,一般调试一个程序,反复烧写几十次芯片是很经常的。

  现在我们介绍一种新型的廉价在线仿真器:它使用一片宏晶公司 【SST公司】的STC89C516RD 的单片机,仿真机通过串口与 PC 连接,该型号单片机是51系列单片机中的一种,具有ISP(在系统可编程)功能,程序可串行下载,可仿真63K用户程序空间,具有450个外部RAM字节。

  具备了必要的工具以后就可以开始学习单片机了,对单片机进行编程可以采用汇编语言或者C语言,汇编语言的特点是代码紧凑,对初学者的电脑水平要求低、上手快,但是程序编写工作量大,站长网站的程序范例就是采用汇编语言编写的,这里说的C语言是专用于51单片机的C语言,它的特点是编写效率高,但是对使用者的电脑水平要求高,最好是已经会C语言了,电子发烧友网网站上也有单片机C语言教程。我认为初学单片机的人最好懂一些汇编语言,汇编语言可以直接控制单片机的资源,比如具体的单片机引脚、内存地址,掌握这些也是很有必要的,学会汇编语言可以打下比较好的基础,很多参考书也是这么说的,如果你是专业单片机开发人员,那么C语言效率高,更适合你。

  自学汇编语言,首先要学会看懂别人的汇编语言程序,可以将汇编语言的指令翻译成自己容易理解的功能描述性文字,详细注释在程序后面,这样便于自己以后引用或者别人容易看懂。站长看到别人写的一些汇编程序的注释都非常少,这非常不利于初学者学习和互相交流,所以只要是站长写的程序都做了非常详细的注释。

  学习汇编语言可以参考相关的书,汇编语言有100多条指令,但是常用的指令也就二三十条,可以先记住常用的汇编指令,如果一时记不住可以打印在纸上慢慢熟悉,然后对别人的汇编程序再加以试验验证,最后还可以在自己理解的基础上对汇编程序的相关参数修改再反复试验,这是快速掌握单片机的捷径!

  一、八路LED跑马灯实验

  现在让我们开始做第一个实验:八路发光二极管轮流点亮的实验,也就是通常所说的跑马灯实验,首先让我们来完成必须的硬件部分,我们需要焊接上8个发光二极管和8个限流电阻,可以参考下面的原理图和实物图像进行操作,需要注意的是LED是有极性的,引脚长的为正极,引脚短的为负极,负极和电阻一侧连接,如果接错那么相应的那一路可能在实验中不会点亮了,在焊接前要看仔细哦~~~

  单片机 单片机

  下面我们来完成软件编程设计,这里我们没有采用高深的编程技巧,而是用了最笨、最直接的向端口送数的办法来实现,一来程序比较简单,没必要玩深沉,而且初学者看起来直观易懂。

  ORG 0000H

  START:MOV P1,#01111111B;最下面的LED点亮

  LCALL DELAY;延时1秒

  MOV P1,#10111111B;最下面第二个的LED点亮

  LCALL DELAY;延时1秒

  MOV P1,#11011111B;最下面第三个的LED点亮 (以下省略)

  LCALL DELAY

  MOV P1,#11101111B

  LCALL DELAY

  MOV P1,#11110111B

  LCALL DELAY

  MOV P1,#11111011B

  LCALL DELAY

  MOV P1,#11111101B

  LCALL DELAY

  MOV P1,#11111110B

  LCALL DELAY

  MOV P1,#11111111B;完成第一次循环点亮,延时约0.25秒

  AJMP START;反复循环

  ;延时子程序,12M晶振延时约250毫秒

  DELAY:

  MOV R4,#2

  L3: MOV R2 ,#250

  L1: MOV R3 ,#250

  L2: DJNZ R3 ,L2

  DJNZ R2 ,L1

  DJNZ R4 ,L3

  RET

  END

  如何精确计算延时子程序的执行时间?

  汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要!

  单片机

  二、两位数码管循环显示00~99的实验

  现在让我们用实验板上的两个数码管来做一个循环显示00~99数字的实验,先来完成必要的硬件部分,

  数码管有共阴和共阳的区分,单片机都可以进行驱动,但是驱动的方法却不同,并且相应的0~9的显示代码也正好相反。

  首先我们来介绍两位共阳数码管的单片机驱动方法,电路如下图:

  单片机 单片机

  网友可以看到:P2.6和P2.7端口分别控制数码管的十位和个位的供电,当相应的端口变成低电平时,驱动相应的三极管会导通,+5V通过IN4148二极管和驱动三极管给数码管相应的位供电,这时只要P0口送出数字的显示代码,数码管就能正常显示数字。

  因为要显示两位不同的数字,所以必须用动态扫描的方法来实现,就是先个位显示1毫秒,再十位显示1毫秒,不断循环,这样只要扫描时间小于1/50秒,就会因为人眼的视觉残留效应,看到两位不同的数字稳定显示。

  下面我们再介绍一种共阴数码管的单片机驱动方法,电路如下图:

  单片机

  网友可以看到:+5V通过1K的排阻直接给数码管的8个段位供电,P2.6和P2.7端口分别控制数码管的十位和个位的供电,当相应的端口变成低电平时,相应的位可以吸入电流。单片机的P0口输出的数据相当于将数码管不要显示的数字段对地短路,这样数码管就会显示需要的数字。

  网友可以看到,共阴数码管的硬件更简单,所以在批量生产时,硬件开销小,节省PCB面积,减少焊接工作量,降低综合成本,所以采用共阴数码管更有利于批量生产,现在销售的试验板都是采用共阴数码管了。

  以下是用AT89C51实验板的两位数码管显示00~99依次循环的汇编语言程序

  a_bit equ 20h ;数码管个位数存放内存位置

  b_bit equ 21h ;数码管十位数存放内存位置

  temp equ 22h ;计数器数值存放内存位置

  star: mov temp,#0 ;初始化计数器,从0开始

  stlop: acall display;调用显示子程序

  inc temp;对计数器加1

  mov a,temp

  cjne a,#100,next ;判断计数器是否满100?

  mov temp,#0;满100就清零重新开始

  next: ljmp stlop;不满就循环执行

  ;显示子程序

  display: mov a,temp ;将temp中的十六进制数转换成10进制

  mov b,#10 ;10进制/10=10进制

  div ab

  mov b_bit,a ;十位在a

  mov a_bit,b ;个位在b

  mov dptr,#numtab ;指定查表启始地址

  mov r0,#4

  dpl1: mov r1,#250 ;

  dplop: mov a,a_bit ;取个位数

  MOVC A,@A+DPTR ;查个位数的7段代码

  mov p0,a ;送出个位的7段代码

  clr p2.7 ;开个位显示

  acall d1ms ;显示162微秒

  setb p2.7;关闭个位显示,防止鬼影

  mov a,b_bit ;取十位数

  MOVC A,@A+DPTR ;查十位数的7段代码

  mov p0,a ;送出十位的7段代码

  clr p2.6 ;开十位显示

  acall d1ms ;显示162微秒

  setb p2.6;关闭十位显示,防止鬼影

  djnz r1,dplop ;循环执行250次

  djnz r0,dpl1 ;循环执行250X4=1000次

  ret

  ;2+2X80=162微秒,延时按12MHZ计算

  D1MS: MOV R7,#80

  DJNZ R7,$

  RET

  ;实验板上的7段数码管0~9数字的共阴显示代码

  numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

  end

  ;如果是共阳数码管的显示代码

  numtab: DB 30H,0FCH,0A2H,0A4H,06CH,25H,21H,0BCH,20H,24H

  三、单片机演奏音乐实验

  利用单片机演奏音乐大概是单片机爱好者感兴趣的问题之一。这里我们用网站提供的实验板来做这个实验,并且了解单片机演奏音乐的基本原理,和相关的源程序。

  首先来完成必要的硬件部分,硬件部分比较简单,如下图:

  单片机 单片机

  AT89C51单片机的P2.5口控制一个8550的三极管,三极管控制电磁蜂鸣器的电源通断。

  我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的高电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。

  例如,要产生200HZ的音频信号,200HZ音频的变化周期为1/200秒,即5ms。这样,当P2.5的高电平或低电平的持续时间为2.5ms时就能发出200HZ的音调。

  乐曲中,每一音符对应着确定的频率,我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。

  此外,结束符和体止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。

  为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符。

  程序框图如图2所示。

  单片机

  下面给出程序序请单,可直接在51实验板上进行演奏。本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。网友也可以自行找出一首歌,将乐曲翻译成码表输入机器,而程序不变。本实验方法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。

  ;标题 ‘八月桂花香’发声程序

  ORG 0000H

  LJMP START

  ORG 000BH

  INC 20H ;中断服务,中断计数器加1

  MOV TH0,#0D8H

  MOV TL0,#0EFH ;12M晶振,形成10毫秒中断

  RETI

  START:

  MOV SP,#50H

  MOV TH0,#0D8H

  MOV TL0,#0EFH

  MOV TMOD,#01H

  MOV IE,#82H

  MUSIC0:

  NOP

  MOV DPTR,#DAT ;表头地址送DPTR

  MOV 20H,#00H ;中断计数器清0

  MUSIC1:

  NOP

  CLR A ;A清零

  MOVC A,@A+DPTR ;查表取代码

  JZ END0 ;是00H,则结束

  CJNE A,#0FFH,MUSIC5 ;如果是休止符,往下执行

  LJMP MUSIC3

  MUSIC5:

  NOP

  MOV R6,A ;R6=18H音符的频率

  INC DPTR DPTR加一

  MOV A,#0

  MOVC A,@A+DPTR ;取节拍代码送R7

  MOV R7,A ;R7=30H音符发音的时间

  SETB TR0 ;启动计数

  MUSIC2:

  NOP

  CPL P2.5 ;P2.5是音乐输出引脚

  MOV A,R6

  MOV R3,A ;R3=R6=18H

  LCALL DEL

  MOV A,R7

  CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?

  ;不等,则继续循环

  MOV 20H,#00H ;等于,则取下一代码

  INC DPTR

  LJMP MUSIC1

  MUSIC3:

  NOP ;休止100毫秒

  CLR TR0

  MOV R2,#0DH ;R2=13

  MUSIC4:

  NOP

  MOV R3,#0FFH ;R3=255

  LCALL DEL

  DJNZ R2,MUSIC4

  INC DPTR

  LJMP MUSIC1

  END0:

  NOP

  MOV R2,#0FFH ;歌曲结束,延时1秒后继续

  MUSIC6:

  MOV R3,#00H

  LCALL DEL

  DJNZ R2,MUSIC6

  LJMP MUSIC0

  DEL:

  NOP

  DEL3:

  MOV R4,#02H

  DEL4:

  NOP

  DJNZ R4,DEL4

  NOP

  DJNZ R3,DEL3

  RET

  NOP

  DAT:

  DB 18H, 30H, 1CH, 10H

  DB 20H, 40H, 1CH, 10H

  DB 18H, 10H, 20H, 10H

  DB 1CH, 10H, 18H, 40H

  DB 1CH, 20H, 20H, 20H

  DB 1CH, 20H, 18H, 20H

  DB 20H, 80H, 0FFH, 20H

  DB 30H, 1CH, 10H , 18H

  DB 20H, 15H, 20H , 1CH

  DB 20H, 20H, 20H , 26H

  DB 40H, 20H , 20H , 2BH

  DB 20H, 26H, 20H , 20H

  DB 20H, 30H , 80H , 0FFH

  DB 20H, 20H, 1CH , 10H

  DB 18H, 10H, 20H , 20H

  DB 26H, 20H , 2BH , 20H

  DB 30H, 20H , 2BH , 40H

  DB 20H, 20H , 1CH , 10H

  DB 18H, 10H, 20H, 20H

  DB 26H, 20H , 2BH, 20H

  DB 30H, 20H, 2BH , 40H

  DB 20H, 30H, 1CH , 10H

  DB 18H, 20H , 15H , 20H

  DB 1CH, 20H , 20H , 20H

  DB 26H, 40H, 20H , 20H

  DB 2BH, 20H, 26H , 20H

  DB 20H, 20H, 30H , 80H

  DB 20H, 30H, 1CH , 10H

  DB 20H, 10H, 1CH , 10H

  DB 20H, 20H, 26H , 20H

  DB 2BH, 20H, 30H , 20H

  DB 2BH, 40H, 20H , 15H

  DB 1FH, 05H, 20H , 10H

  DB 1CH, 10H, 20H , 20H

  DB 26H, 20H, 2BH , 20H

  DB 30H, 20H, 2BH , 40H

  DB 20H, 30H, 1CH , 10H

  DB 18H, 20H , 15H , 20H

  DB 1CH, 20H , 20H , 20H

  DB 26H, 40H, 20H , 20H

  DB 2BH, 20H, 26H , 20H

  DB 20H, 20H, 30H, 30H

  DB 20H, 30H, 1CH, 10H

  DB 18H, 40H, 1CH, 20H

  DB 20H, 20H, 26H, 40H

  DB 13H, 60H, 18H , 20H

  DB 15H, 40H, 13H , 40H

  DB 18H, 80H, 00H

  end

  四、单片机倒计时定时器

  这里我们先要安装好51试验板上的两个轻触按钮开关,我们采用的是独立式按钮开关,也就是说将开关直接连接到电源的地和单片机的对应引脚之间,这里K1接到单片机的P3.6引脚,K2接到P3.7。正常情况下单片机的P3.6、P3.7都被程序初始化时置“1” 当有按键按下时对应的单片机引脚被按钮开关下拉为“0”,这种方法比较直观,而且比较简单,在按键数量不多的场合下使用很广泛。

  单片机

  因为机械开关开关时有抖动,所以需要在程序中加一个软件去抖动程序,它的工作原理如下:当单片机检测到有按键被按下后立即执行一个10毫秒的延时程序,然后再在检测该引脚是否仍然为闭合状态?如果仍然为闭合说明确认该键被按下立即执行相应的处理程序,否则可能是干扰,丢弃这次检测结果。

  接下来我们再安装一个四位的拨码开关,就是图中红色的开关,它相当于四个装在一起的拨动开关,当开关拨到“ON”一侧时,对应的那路就会接通,反之断开。它在单片机中一般用于设置初始参数,而且不经常改变的场合。这里因为单片机引脚资源不够,所以我们只使用了拨码开关的第2、3、4位,第1位闲置。三个开关可以逻辑组合出8种状态,所以我们能够方便灵活地预置多达7种的倒计时时间。

  最后我们来安装两个继电器和相关电路,有了继电器我们的实验板不再仅仅是做做实验而已,可以用于控制一些负载,比如说:充电器,洗衣机,电风扇等,使我们的实验板的实用功能大大增强,这也是电子制作实验室网站的单片机实验板和其他公司的产品不同的地方。

  单片机单片机

  这里继电器由相应的S8050三极管来驱动,开机时,单片机初始化后的P2.3/P2.4为高电平,+5伏电源通过电阻使三极管导通,所以开机后继电器始终处于吸合状态,如果我们在程序中给单片机一条:CLR P2.3或者CLR P2.4的指令的话,相应三极管的基极就会被拉低到零伏左右,使相应的三极管截至,继电器就会断电释放,每个继电器都有一个常开转常闭的接点,便于在其他电路中使用,继电器线圈两端反相并联的二极管是起到吸收反向电动势的功能,保护相应的驱动三极管,这种继电器驱动方式硬件结构比较简单。

  ;电子制作实验室http://www.xie-gang.com/

  ;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时

  ;倒计时时间由四位拨码开关的2/3/4位来控制,

  ;第2位表示5分钟,第3位表示15分钟,第4位表示30分钟,

  ;通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时

  ;P1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁

  ;K1为开始按钮,K2为停止按钮

  a_bit equ 20h ;数码管个位数存放内存位置

  b_bit equ 21h ;数码管十位数存放内存位置

  temp equ 22h ;计数器数值存放内存位置

  ;开机初始化

  MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入

  MOV P0,#0FFH;使显示时间数码管熄灭

  CLR P1.0;点亮LED指示灯

  ;等待键盘输入

  START:JB P3.6,$;循环判断开始按钮K1是否按下?

  ACALL DELAY10;延时10毫秒触点消抖

  JB P3.6,START;如果是干扰就返回

  JNB P3.6,$;等待按键松开

  ;读拨码开关的状态,获得倒计时时间

  SET:MOV A,#0;首先对A清零

  JB P2.0,A1;判断拨码开关的第2位是否接通,接通就对A加5

  ADD A,#5

  A1:JB P2.1,A2;判断拨码开关的第3位是否接通,接通就对A加15

  ADD A,#15

  A2:JB P2.2,A3;判断拨码开关的第4位是否接通,接通就对A加30

  ADD A,#30

  A3:MOV TEMP,A

  ;这时TEMP中的值就是倒计时时间

  ;数码管显示定时时间的程序

  display:CLR P2.4;使继电器1释放,开始定时(开机时继电器处于吸合状态)

  CLR P2.3;使继电器2释放,开始定时(开机时继电器处于吸合状态)

  MOV R2,#120

  AB:MOV R3,#250

  TIME1:mov a,temp ;将temp中的十六进制数转换成10进制

  mov b,#10 ;10进制/10=10进制

  div ab

  mov b_bit,a ;十位在a

  mov a_bit,b ;个位在b

  mov dptr,#numtab ;指定查表启始地址

  mov r0,#4

  dpl1: mov r1,#250 ;

  dplop: mov a,a_bit ;取个位数

  MOVC A,@A+DPTR ;查个位数的7段代码

  mov p0,a ;送出个位的7段代码

  clr p2.7 ;开个位显示

  ACALL DELY1;显示1毫秒

  setb p2.7;关闭个位显示,防止鬼影

  mov a,b_bit ;取十位数

  MOVC A,@A+DPTR ;查十位数的7段代码

  mov p0,a ;送出十位的7段代码

  clr p2.6 ;开十位显示

  ACALL DELY1;显示1毫秒

  setb p2.6;关闭十位显示,防止鬼影

  ;插入一段判断定时过程中是否有按键输入的程序段

  C1:JB P3.6,B1

  ACALL DELAY10;延时10毫秒消抖

  JB P3.6,C1

  JNB P3.6,$;等待按键松开

  AJMP SET

  B1:JB P3.7,M33

  ACALL DELAY10;延时10毫秒消抖

  JB P3.7,B1

  JNB P3.7,$;等待按键松开

  AJMP OVER

  M33:djnz r3,TIME1 ;2毫秒循环执行250次,时间约0.5秒

  CPL P1.0;使LED每1秒闪烁一次

  djnz r2,AB ;循环执行120次,时间为1分钟

  DEC TEMP;满一分钟对定时时间减1

  MOV A,TEMP

  JNZ DISPLAY;判断TEMP的数值是否为0?不为0循环

  ;结束定时

  OVER:CLR P1.0;LED指示灯常亮

  SETB P2.4;继电器1吸合,定时结束,退回到开机时的状态

  SETB P2.3;继电器2吸合,定时结束,退回到开机时的状态

  AJMP START;退到开机初始化状态

  ;1毫秒延时子程序

  DELY1:MOV R4,#2

  D1:MOV R5,#248

  DJNZ R5,$

  DJNZ R4,D1

  RET

  ;10毫秒延时子程序

  DELAY10:MOV R4,#20

  D2:MOV R5,#248

  DJNZ R5,$

  DJNZ R4,D2

  RET

  ;实验板上的7段数码管0~9数字的共阴显示代码

  numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH

  end

  五、单片机和PC机串口通讯试验

  51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。电子制作实验室网站的提供的带扩展元件的51单片机实验板上已经装配好了全部硬件。

  单片机

  串口通讯的硬件电路如上图所示,我们可以采用以下方法来判断串口是否存在硬件问题,将MAX232的第9脚接地,测量一下串口的第3脚和第5脚之间是否输出10V左右的直流电压?将MAX232的第9脚接正5V,测量一下串口的第3脚和第5脚之间是否输出-10V左右的直流电压?这样可以判断MAX232是否完好和串口线的排线压接处是否有接触不良。

  为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。

  单片机

  点击这里可以下载并运行这个串口调试软件,这是一个绿色的软件,无需安装,可以直接在当前位置运行这个软件。软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源,这时只要按下K1一次,在串口调试助手软件的接收区界面中就会增加一个“AF”字符,表示单片机向电脑发送“AF”字符成功。串口实验的源程序如下所示:

  ;这是一个AT89C51单片机实验开发板向PC机的串口单向发送数据AF的演示程序

  ;采用MAX232专用芯片作RS232/TTL电平转换。

  ;通讯波特率为4800KBPS,只要按下一次K1(就是P3.6引脚变成低电平)

  ;就发送一个16进制的AF字符

  ORG 0000H

  MOV SCON,#50H;设置成串口1方式

  MOV TMOD,#20H;波特率发生器T1工作在模式2上

  MOV PCON,#80H;波特率翻倍为2400x2=4800BPS

  MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)

  MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)

  SETB TR1;启动定时器T1

  ;以上完成通讯初始化设置

  WRIT:JB P3.6,$;判断K1是否按下,如果没有按下就等待

  ACALL DELAY10;延时10毫秒消触点抖动

  JB P3.6,WRIT;去除干扰信号

  JNB P3.6,$;等待按键松开

  MOV A,#0AFH;将16进制的字符AF发送到串口去

  MOV SBUF,A;将AF通过串口发送出去

  AJMP WRIT

  ;10毫秒延时子程序

  DELAY10:MOV R4,#20

  D2:MOV R5,#248

  DJNZ R5,$

  DJNZ R4,D2

  RET

  END

  六、红外线遥控器声光测试器

  这里我们要用单片机实验板制作一个红外线遥控器声光测试器,红外线遥控器广泛用于电视机、VCD、音响等家用电器中,经过长时间使用可能会出现一些小故障,用我们制作的测试器可以方便地判断遥控器是否能发射红外信号?各个按键工作是否可靠?这个测试器非常简单,制作也很容易,但是也有一定的实用价值,站长就是用这个小东东帮邻居修了不少遥控器哦~~

  首先让我们来完成试验板上的硬件部分,需要再焊接一个一体化红外接收器,一体化红外线接收器是一种集红外线接收和放大于一体,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,而体积又很小巧,它适合于各种红外线遥控和红外线数据传输。 再焊上两个滤波电容,可以使接收器工作更可靠

  单片机

  ORG 0000H

  START:MOV P0,#0FFH;开机初始化

  MOV P1,#0FFH

  MOV P2,#11100111B

  MOV P3,#0FFH

  JB P3.2,$;等待遥控信号出现

  MOV P1,#0

  MOV p2,#0

  JNB P3.2,$;如果是低电平就原地等待,如果出现高电平就退出

  AJMP START

  END

  七、红外线遥控器解码程序

  这里我们以红外线遥控编码芯片为LC7461等芯片为例来说明用单片机实现红外遥控解码的详细过程,站长琢磨这个解码程序花了相当多的精力,期间几经修改逐步完善,后来还用它开发了几个小产品,希望能对网友学习单片机有所帮助。

  红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

  1 红外遥控系统

  通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

  单片机

  2 遥控发射器及其编码

  遥控发射器专用芯片很多,根据编码格式可以分成脉冲宽度调制和脉冲相位调制两大类,这里我们以运用比较广泛,解码比较容易的脉冲宽度调制来加以说明,现以LC7461组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:

  采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”

  上述“0”和“1”组成的42位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,

  7461产生的遥控编码是连续的42位二进制码组,其中前26位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的操作码和8位的操作反码用于核对数据是否接收准确。

  当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。

  解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始,不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右即可。

  根据红外编码的格式,程序应该等待9ms的起始码和4.5ms的结果码完成后才能读码。

  单片机

  如果邮购我们开发的51单片机试验板和扩展元件的网友,可以获得如上图所示的红外遥控手柄,这种遥控器的编码格式符合上面的描述规律,而且价格低廉,有32个按键,按键外形比较统一,如果用于批量开发,可以把遥控器上贴膜换成你需要的字符,这为开发产品提供了便利。

  接收器及解码

  LT0038是塑封一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集成电路,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。

  下面是一个对51实验板配套的红外线遥控器的解码程序,它可以把上图32键的红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。

  ORG 0000H

  AJMP MAIN;转入主程序

  ORG 0003H ;外部中断P3.2脚INT0入口地址

  AJMP INT ;转入外部中断服务子程序(解码程序)

  ;以下为主程序进行CPU中断方式设置

  MAIN:SETB EA ;打开CPU总中断请求

  SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发

  SETB EX0 ;打开INT0中断请求

  ;以下对单片机的所有引脚进行初始化,全部设置成高电平

  MOV P2,#11100111B

  AJMP $

  ;以下为进入P3.2脚外部中断子程序,也就是解码程序

  INT: CLR EA ;暂时关闭CPU的所有中断请求

  MOV R6,#10

  SB: ACALL YS1;调用882微秒延时子程序

  JB P3.2,EXIT;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序

  DJNZ R6, SB;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序

  ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。

  JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲

  ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码

  MOV R7,#26;忽略前26位系统识别码

  JJJJA:JNB P3.2,$;等待地址码第一位的高电平信号

  LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态

  MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中

  JNC UUUA;如果为0就跳转到UUUA

  LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束

  UUUA: DJNZ R7,JJJJA

  MOV R1,#1AH ;设定1AH为起始RAM区

  MOV R2,#2;接收从1AH到1BH的2个内存,用于存放操作码和操作反码

  PP: MOV R3,#8;每组数据为8位

  JJJJ: JNB P3.2,$;等待地址码第一位的高电平信号

  LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态

  MOV C,P3.2;将P3.2引脚此时的电平状态0或1存入C中

  JNC UUU;如果为0就跳转到UUU

  LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束

  UUU: MOV A,@R1;将R1中地址的给A

  RRC A;将C中的值0或1移入A中的最低位

  MOV @R1,A;将A中的数暂时存放在R1数值的内存中

  DJNZ R3,JJJJ;接收满8位换一个内存

  INC R1;对R1中的值加1,换下一个RAM

  DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中

  MOV A,1AH

  CPL A;对1AH取反后和1BH比较

  CJNE A,1BH,EXIT;如果不等表示接收数据发生错误,放弃

  MOV P1,1AH;将按键的键值通过P1口的8个LED显示出来!

  CLR P2.5;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功

  LCALL YS2

  LCALL YS2

  LCALL YS2

  SETB P2.5;蜂鸣器停止

  EXIT: SETB EA ;允许中断

  RETI ;退出解码子程序

  YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒

  D1: MOV R5,#20

  DJNZ R5,$

  DJNZ R4,D1

  RET

  YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒

  D2: MOV R5,#235

  DJNZ R5,$

  DJNZ R4,D2

  RET

  YS3: MOV R4,#2;延时程序3,精确延时1000微秒

  D3:MOV R5,#248

  DJNZ R5,$

  DJNZ R4,D3

  RET

  END

单片机  

  这是按照红外遥控器按键的实际位置给出的32个按键的键值(16进制)

  八、 红外线电脑遥控器

  将烧写文件烧录到AT89C51单片机内部后,再将电脑串口连接好带有扩展元件的51实验板,打开51实验板电源后,P1.0端口上的LED就会闪烁,这说明单片机程序已经正常运行了,再把红色的拨码开关的第2、第3位开关打开。

  如上图所示就可以接收红外遥控编码了。这时实验板就变成了一个超级的PC遥控器了。当然我们还要借助Grider软件来实现。

  1.安装软件

  Grider是国外一款很优秀的免费红外遥控软件,支持多种的硬件,如红外键盘鼠标,红外接收器等,软件的功能强大有OSD屏显,名种常用的相关系统操作如开关显示器等等。这里就简单介绍一些简单的用法。首先要安装软件,点击这里下载Grider3.2,也可到www.grider.nl上下载新版或旧版的。下载完后运行。出现下面的画面:

  单片机

  点NEXT,再到下一画面:

  单片机

  选上“I accept the agreement”,再按Next,这些都是通常的安装步骤,不多说,一直按Next,直到出现完成画面。

  单片机

  然后就可以在“开始”中找到程序并运行它了。

  单片机

  2.设置软件

  单片机

  运行Girder3.2程序后,点击File菜单->Settings打开设置窗口

  单片机

  在设置菜单UserInterface(用户界面)页中,选择设置中文菜单,再按Apply键,这时程序就变成了中文汉化版的了。

  单片机

  在“常规”页中可以设置是否自动加载设置文件,随WINDOWS启动,启动后只出现在任务栏而不出现主窗口等等。好了下面的硬件设置是最重要的。

  单片机

  在插件页中选中UIR/IRman/IRA.。..。.(选中QuestionOSD就可以使用像电视中的屏显提示了),选好后你就按设置弹出下面的画面

  单片机

  然后按画面上的设置进行设置,当然串口就选你自己所连接的串口,再把前面一个画面中的“自动打开输入设置”选中就可以了。

  3遥控键学习

  单片机

  在图中空白处右击弹出菜单,选添加命令,则新建了一个命令,可以对其重命名。

  单片机

  以打开WINAMP为例,在“系统页”选“执行”,按“浏览”找到你所安装的WINAMP的程序文件,这里中文件中有其详细路径,再按“应用”,最后按学习事件

  单片机

  然后按我们配套的红外遥控器,软件就取得了实验板上发来的红外编码,并在图中1处显示。comments是注释命令有的,图中2是设定重复按键的等待时间,就是说按下一个键执行命令后,要等多久才能再次响应该键。这样就定义了一个键的命令。软件功能很强大这里也无法一一说明。自已多使用摸索几次就可以轻松上手了。



 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
评论(0)
发评论
yangtaodanpi 2017-09-09
0 回复 举报
好东西 收起回复
h1654155963.2451 2017-04-11
0 回复 举报
我想写一个芯片需要大神指点。 收起回复
全部评论

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分