一、本文通过红外发射接收对管,来达到简单计数的小玩意,下图就是原型,白色是发射管,和普通的LED一样,黑色的是接收管,通电以后也不发亮,反正就是不亮,检测方法后续发。

如何实现计数器的扩展(简单的外设计数)(1)

1、红外线接收管

功能与光敏接收管相似只是不受可见光的干扰,感光面积大,灵敏度高,属于光敏二极管,一般只对红外线有反应。它是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压(看好了,很重要,反向电压)。无光照时,有很小的饱和反向漏电流,此时光敏管不导通。当光照时,饱和反向漏电流马上增加,形成光电流,在一定的范围内它随入射光强度的变化而增大。------百度抄写

2、红外线发射管

红外发射管是由红外发光二极管矩组成发光体,用红外辐射效率高的材料(常用砷化镓)制成PN结,正向偏压向PN结注入电流激发红外光,其光谱功率分布为中心波长830~950nm。LED是英文Light Emitting Diode的简称,表现是正温度系数,电流越大温度越高,温度越高电流越大,LED红外灯的功率和电流大小有关,但正向电流超过最大额定值时,红外灯发射功率反而下降。------百度抄写

二、程序达到目的是把红外发射对管摆放好了(D1和D2),中间没有物体过时,什么事情都不会发生,当有物体过去以后,就记1次数,点亮1个LED(D3到D7)灯,记满5次就让蜂鸣器(BUZ1)响1声。

如何实现计数器的扩展(简单的外设计数)(2)

硬件

如何实现计数器的扩展(简单的外设计数)(3)

分解看清楚点1

如何实现计数器的扩展(简单的外设计数)(4)

分解看清楚点2

需要硬件清单:1、电池1.5V的4节搞个电池盒,能输出5V左右,不要太大,可以使用充电电池,那个一节才1.3V,电压太大就串二极管降下来

2、22PF瓷片电容2个

3、12MHZ晶振1个

4、10μF电解电容1个

5、AT89C51单片机1块

6、面包板(插杜邦线或者0.5平方电线)或者万用板(需焊接)

7、单片机程序下载器(淘宝买)

8、220欧姆电阻6个,1M欧姆电阻1个,1K欧姆电阻1个,S8050三极管2个,4.7K欧姆电阻3个,普通发光二极管5个,5V有源蜂鸣器1个

蜂鸣器有2种:分有源的和无源的,有源的给电平就能响,无源的要给脉冲才能响。本例使用有源蜂鸣器。

9、5mm 940nm红外对管1对

原理:D1和D2之间没东西时,D1发射红外光被D2接收,D2导通,三极管Q1的基极B得到偏置电压而导通,所以Q1的集电极C就会为低电平,导致P1.0口被拉低,内部程序检测不到异样不会下一步动作。而当有东西经过红外管的时候,红外线被挡住,D2没有接到红外光,D2截止,导致三极管基极B没有电流过去,直接让Q1截止,其集电极C一下就高电平了,随即P1.0拉成高电平,那么内部程序就让外设LED灯D3到D7点亮一盏。上面的事循环直到5盏灯全部点亮,蜂鸣器叫一声,本次循环结束,全部灯灭,等待一下次红外管被触发。

注意:单片机40角VCC要接 5V,GND20角要接地

三、源码程序

ORG 00H ;设置起始地址

Apple EQU P1.0 ;把Apple指向P1.0口,随便叫的,你起卜娜娜也行

BUZZER EQU P2.7 ;把BUZZER指向P2.7口,容易理解

START:

CLR BUZZER ;清P2.7口,清零,为的是让从R10下来的5V电直接进P2.7口,不去偏置激活Q2三极管,那么蜂鸣器就不会响,这很好理解,仔细琢磨一下,电流总是流向比较顺利的地方

CLR C ;进位C清零,这里一会说

MOV A,#0FFH ;累加器ACC=FFH

CHECK: ;检测有没有物体过红外对射管

JNB Apple, $ ;一直看P1.0口的状态,原理中说过,P1.0口为高电平的话,证明有东西经过,那么就可以执行下一句,如果P1.0口一直为低电平,就一直执行本语句

JB Apple, $ ;这句话就是确定东西过去了,确定P1.0为低电平的话,就执行下一句,如果挡住中间不过,P1.0为高电平,就一直执行本行

CLR C ;和下一句一块说

RRC A ;这里面的指令RRC有说法,看后面备注

MOV P0,A ;让刚才解释的A中的0在P0口跑动,低电平了。灯就被点亮,进位C循环回来本来是1,我把C清零在带进A,那么0000 0排过去了,造成灯一直亮

MOV R1,A ;存进R1进行比对

CJNE R1,#07H,CHECK ;5个灯都点亮就是0000 0111=07H,A第一次运行是01111111,第二次是0011 1111,第三次是0001 1111 第四次是0000 1111

CALL BEEP ;调蜂鸣器子程序,执行5次就来激活蜂鸣器

MOV P0,#0FFH ;灭灯

JMP START ;跳回循环

BEEP: ;发音程序段

SETB BUZZER ;开蜂鸣器

MOV R3, #20 ;这里是延时不说了

D1:

MOV R4, #200

D2:

MOV R5, #248

DJNZ R5, $

DJNZ R4, D2

DJNZ R3, D1

RET

END ;结束

备注:指令RRC和进位标志位C、还有累加器A进行讲解,先说进位标志位C,单片机里面有个程序状态字的特殊功能寄存器,叫PSW,1个字节,里面有8位。

依次是最高位进位标志位C|辅助标志位AC|标志位F0|RS1|RS0|溢出标志位OV|不用位|奇偶标志位P,这个进位标志位C就是单片机执行加法时,如果有进位或借位,就C就被硬件置1,没进位就是0。

累加器A是一个有8位的特殊功能寄存器,以后用到的地方很多,很重要,他与程序运行状态无关,可以赋值,运算好多操作,相当于一个变量。

现在说下RRC A,它的意思是让进位标志位C在8位A中向右移动一位,例如现在A中为11111111,是8个1,这时刚好C为0,那么执行一次RRC A,就是C=0进入A的最左边的最高位,原来的最高位1被0挤到次高位上去了,11111111→01111111。而原次高位的1又向右边被挤一次,一个挨着一个被挤向右边,最低位的1被挤出8人队列,赋值给了C。就是这么一个很无聊的过程。然后可以在执行一次RRC A,做这个干什么,就是让0在A里面跑动,实现挨个点LED灯,跳回程序看。

下次上C51程序。

,