站点首页 建筑下载 法律法规 建筑论文 建筑图库 装饰图库 访客留言 
《江南建筑》搜索: 文章 下载
当前位置: 江南建筑 > 建筑论文 > 电气论文 > 论文正文
单片机遥控控制酒店客房灯光系统
作者:本站收集    论文来源:相关网站    点击数:    更新时间:2006-9-9 【VIVI收藏
摘要:江南建筑>单片机遥控控制酒店客房灯光系统

前言:本人工作的酒店开业于一九九八年,至今已有七年之久,当初选型设备老化过时,特别对于科技飞速发展的当今。酒店原有的智能控制系统较周边新开张酒店相比,已跟不上潮流,失去竞争能力。例如原来酒店客房灯光控制系统均采用TCL2.0系列产品,房间的电视、台灯、地灯、鱼缸照明、夜灯、廊灯、吧台灯等开关与床头灯调光开关均集中安装在床头柜处(如图1)。由于开关较多且固定在床头柜侧面,客人想开灯时必须先看清开关下面的标记才能正确开灯,有时为开一盏灯竟把所有的开关都按了一遍,使用时极为不便。现在大多数星级酒店都采用微动开关轻触式集中控制面板,安装在床头柜的正上方。虽然较以前直观,但是开关多且固定仍不是十分方便。本人采用8051系列单片机将原来固定的机械式开关改用遥控控制,这样一个遥控器就可以控制整个房间的灯光开启,电源控制箱可以放在床头柜内;遥控器在放置在床头柜上,可以任意移动,还可以在遥控面板中间加装一液晶时钟(如图2所示)。美观且实用即大方便客人的使用。

图1

老式控制柜

图2

新式遥控发射器

一  硬件电路的设计

1、  遥控发射电路

如图3所示,为该系统遥控发射器电原理图,其中P1口作为键盘扫描端口,具有16个操作键,可分别控制单片机发出16种不同脉冲,执行16种操作。第9脚为单片机的复位脚,采用RC上电复位电路;15脚作为红外线遥控码的输出口,用于输出38KHz载波编码。脉冲经9013放大然后由红外发射管输出;18、19脚接12M晶振。P1.4—P1.7需接上拉电阻。

图3

遥控发射电路图

2、  遥控接收电路

如图4所示,为该系统遥控接收电原理图,其中P1.0—P1.2口作为数码管的二进制数据输出,显示数字为“0—7”,“0”表示最暗,“7”表示最亮,采用带锁存功能的七段译码电路74HC4511集成块译码显示数值。4511的LE端接8051的30脚(地址锁存允许控制);P0.0—P0.7以及P2.2—P2.7作为14个电器的电源控制输出,接口用继电器隔离输出。P2.0口为调光脉冲输出,输出脉冲由三极管9012放大后经光电耦合器MOC3021驱动双向可控硅控制负载;P3.0口为交流50Hz同步检测输入。系统对市电进行变压、整流、并经施密特触发器整形后得到100Hz的方波(周期10ms),作为发送调光脉冲的同步信号,系统采用10ms为一个“单位时间”的长度,灯的亮度越高,则可控硅导通时间的占空比越大;P3.1口为红外遥控码输入,采用集成红外线接收路SFH506-38,此集成元件体积小、抗干扰性好、灵敏度高、并且价格低廉。它仅有三个脚,分别是电源正极、电源负极以及信号输出端,其工作电压为5V左右,它的主要功能包括放大、选频、解调几大部分,要求输入是已经被调制的信号,经过它的接收放大和解调会在输出端直接输出原始信号至P3.1脚。这款红外线接收电路接收距离可以达8米左右,完全可以满足客房内的遥控距离(一般客房标准间都在30平米左右);P3.2脚为外部中断0输入脚,采用下降沿触发,当有信号时,第一位码的低电平启动中断程序,实时接收数据帧。第9脚为单片机的复位脚,采用RC上电复位电路;18、19脚接12M晶振。

图4

遥控接收电路图

二 系统的遥控功能实现方法

1、  遥控编码格式

该遥控器采用脉冲个数编码,不同的脉冲个数代表不同的码,最小为2个脉冲,最大为17个脉冲。为了使接收可靠,第一位码宽为3ms,其余为1ms,遥控数据帧间隔大于10ms,如图5所示。

图5

遥控脉冲编码图

2、  遥控码的发射

当某个操作键按下时,单片机先读出该键值,然后根据键值设定的遥控脉冲个数,再调制成38KHz的方波由红外线发射管发射出去。P3.5端口的输出调制波如图5所示。

3、  数据帧的接收处理

当红外线接收器输出脉冲帧数据时,第一位码的低电平将启动中断程序,实时接收数据帧。在数据接收时,先对第一位(起始位)码的码宽进行验证。若第一位低电平码的脉宽小于2ms,将作为错误码处理;否则认为是起始码,累加器A加1。当间隔位的高电平大于3ms时,结束接收,然后根据累加器A中的脉冲个数,执行相应的输出操作。图6为红外线接收器输出的一帧遥控码波形图。

图6

一帧遥控码波形图

三 遥控发射及接收控制程序流程图

1、  遥控发射程序控制流程图

图7

遥控发射控制流程图

2、  遥控接收程序控制流程图

图8

遥控接收控制流程图

四 主要程序分析

1、  键盘扫描程序

本电路采用4×4矩阵式键盘电路,共16个按健开关可发送16种编码指令。首先将立即数#0F0H送至P1口,再读入P1口值与#0F0H相比较,相等则说明没有键按下,返回。不相等则表示有键按下,再调用延时消抖程序,确认有键按下。转至行扫描程序确认按键所在的行,并将R2赋行号初值,然后调用列扫描程序确认按键所在例号。例号与行号初值相加即得按键号(送寄存器A)。

KEYWORK:   MOV        P1,#0F0H        ;置P1口输入状态

   MOV         A,P1           ;读入P1口值

    MOV         B,A           ;P1口值暂存B中

CJNE      A,#0F0H,KEYHIT  ;不等于#0FFH,转KEYHIT(有键按下)

KEYOUT:         RET                     ;没有键按下返回;

KEYHIT:         LCALL       DL10MS          ;延时去抖动

               MOV          A,P1          ;再读入P1口值至A

               CJNE     A,B,KEYOUY      ;A不等于B(是干扰),子程序返回

    SETB       P1.1            ;有键按下,找键号开始,查0行

    SETB        P1.2

    SETB        P1.3

    MOV        A,P1          ;读入P1口值

CJNE       A,#0FEH,KEYVAL0  ;P1不等于#0FEH,按下键在第0行

    SETB       P1.0          ;不在第0行,开始查1行

    CLR         P1.1

    MOV        A,P1          ;读入P1口值

CJNE      A,#0FDH,KEYVAL1  ;P1口不等于#0FDH,按下键在第1行

    SETB       P1.1          ;不在第1行,开始查2行

    CLR        P1.2

    MOV        A,P1            ;读入P1口值

CJNE      A,#0FBH,KEYVAL2  ;P1口不等于#0FBH,按下键在第2行

    SETB       P1.2          ;不在第2行,开始查3行

    CLR         P1.3

    MOV        A,P1          ;读入P1口值

CJNE      A,#0F7H,KEYVAL3  ;P1口不等于#0F7H,按下键在第3行

               LJMP    KEYOUT          ;不在第3行,子程序返回

KEYVAL0:        MOV        R2,#00H     ;按下键在第0行,R2赋行号初值0

              LJMP      KEYVAL4         ;跳到KEYVAL4

KEYVAL1:       MOV        R2,#04H     ;按下键在第1行,R2赋行号初值4

              LJMP      KEYVAL4    ;跳到KEYVAL4

               .

               .

KEYVAL4:      MOV       DPTR,#KEYVALTAB ;翻译成连续数字

              MOV           B,A           ;P1口值暂存B内

              ANL       B,#0F0H       ;取高四位

              MOV       R0,#0         ;清R0

KEYVAL5:        MOV         A,R0          ;查列号开始,R0数据放入A

              SUBB      A,#04H        ;A中数减4

              JNC       KEYOUT          ;借位C为0,查表出错,返回

              MOV           A,R0          ;查表次数小于4,继续查,

              MOVC      A,@A+DPTR       ;查列号表

              INC       R0            ;R0加1

              CJNE      A,B,KEYVAL5    ;查得值和P1口值不等,转KEYVAL5再查

              DEC       R0            ;查得值和P1口值相等,R0减1

MOV         A,R0          ;放入A(R0中数值即为列号值)

ADD         A,R2           ;与行号初值相加成为键号值(0-15)

KEYVALTAB:     DB  0E0H,0D0H,0B0H,07H      ;列号对应数据表

;对应列号:         0    1    2    3

2、  键号处理程序

根据寄器A中的键号,首先执行A×3程序,(因为以下所执行的长跳转指令“LJMP”为3字节指令)然后使用散转指令“JMP A,@A+DPTR”跳到相应的程序标号。各键号相应的程序标号均为一条长跳转指令,各跳转指令均指向与之相应的红外线脉冲赋值程序,最后跳转至脉冲发送程序,发出与键号相对应的脉冲。

MOV         B,A           ;键号乘3处理用于JMP散转指令

               RL      A             ;键号乘3处理用于JMP散转指令

                ADD         A,B           ;键号乘3处理用于JMP散转指令

               MOV          DPTR,#KEYFUNTAB ;取散转功能程序(表)首址

               JMP     @A+DPTR         ;散转至对应功能程序标号

KEYFUNTAB:      LJMP        KEYFUN00      ;跳到键号0对应功能程序标号

            LJMP     KEYFUN01      ;跳到键号1对应功能程序标号

             .

.       

.

             LJMP      KEYFUN15      ;跳到键号15对应功能程序标号

             RET

KEYFUN00:       MOV         A,#02H          ;发2个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN01:       MOV         A,#03H          ;发3个脉冲

              LJMP      REMOTE          ;转发送程序

              RET                           

              .

              .

              .

KEYFUN15:       MOV         A,#11H          ;发17个脉冲

              LJMP      REMOTE          ;转发送程序

           RET

3、38KHz载波及编码脉冲发射程序

本系统所用的红外线接收集成电路SFH506-38的解调中心频率为38KHz,故发射频率也采用38KHz,通过定时器中断程序实现,每次溢出中断时对P3.5取反,输出38KHz载波。

      

计算得周期为26.3us,则定时器设定为模式2,初值为(256-13)=0F3H。利用1ms与3ms延时程序控制定时器的启停,从而控制P3.5发出相应的脉冲。并根据寄存器A中的脉冲个数确定发送次数。

MOV         IE,#00H    ;关所有中断

              MOV       TMOD,#20H       ;8位自动重装初值模式

              MOV       TH1,#0F3H       ;定时为13微秒初值

              MOV       TL1,#0F3H      

SETB        EA             ;开总中断允许

INTT1:          CPL         P3.5            ;38kHZ红外线遥控信号产生

                RETI                        ;中断返回

REMOTE:         MOV         R1,A            ;装入发射脉冲个数

              LJMP      OUT3            ;转第一个码发射处理

OUT:            MOV         R0,#64H    ;1MS宽低电平发射控制数据

OUT1:           SETB        ET1             ;开T1中断

              SETB      TR1             ;开启定时器T1

              NOP                          ;延时

              NOP

              NOP

              NOP

              NOP

              DJNZ      R0,OUT1    ;时间不到转OUT1再循环

              MOV       R0,#3CH    ;1MS高电平间隙控制数据

OUT2:           CLR         TR1             ;关定时器T1

              CLR       ET1             ;关T1中断

              CLR       P3.5            ;关脉冲输出

              NOP                      ;空操作延时

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              DJNZ      R0,OUT2     ;时间不到转OUT2再循环

              DJNZ      R1,OUT          ;脉冲未发完,转OUT再循环发射

              LCALL     DL500MS      

              RET          

OUT3:           MOV         R0,#0FFH       ;装发谢3MS宽控制数据

              LJMP      OUT1           ;转OUT1

4、遥控接收及处理程序

采用中断接收,经过红外线接收集电路SFH506接收处理后的脉冲信号送至P3.1与P3.2(中断输入脚,采用低电平触发),当接收到第一个低电平时将启动中断程序,实时接收数据帧,接收程序首先采用8us循环计时程序对第一位码(起始码)的码宽进行验证,当计时大于8×255=2040us时则认为是起始码,开始对输入的脉冲进行计数与校验,将计数值送到累加A中。脉冲高电位大于设定时间513×6=3072us时则结束接收,然后根据累加器中的脉冲个数,跳转至相应的操作子程序。2——15个脉冲所对应程序分别控制每盏灯的开关,通过将相应输出端口取反方法,从而控制了灯的亮灭,系统上电时所有输出I/O口均为“1”(高电平)外接晶体管均无输出,当某个按键按下时,程序将相应端口取反,输出为“0”(低电平)外接晶体管放大后,驱动继电器继合亮灯。再次按下该键时,程序再次将该相应端口取反,输出为“1”关灯,如此便控制了每一路灯的亮、灭。16、17个脉冲为亮度调整信号,接收到该脉冲信号时,将P1口加“1”(调亮)或减“1”(调暗),然后再调亮度调整程序,亮度调整程序根据P1口的值确定灯的亮度。

INTEX0:         CLR         EX0           ;关外中断

              JNB       P3.1,READ1    ;P3.1口为低电平转READ1

READOUTT0: SETB        EX0           ;P3.1口为高电平开中断(系干扰)

              RETI                      ;退出中断

READ1:          CLR         A               ;清A

              MOV       DPH,A         ;清DPTR

              MOV       DPL,A        

HARD1:          JB          P3.1,HARD11   ;P3.1变高电平转HARD11

              INC       DPTR          ;用DPTR对低电平计数

              NOP                       ;1微秒延时

              NOP

              NOP

              AJMP      HARD1      ;转HARD1循环(循环周期为8微秒)

HARD11:         MOV         A,DPH         ;DPTR高8位放入A

              JZ        READOUTT0 ;为0(脉宽小于8*255=2毫秒)退出

              CLR       A          ;不为0,说明是第一个宽脉冲(3毫秒)

READ11:         INC         A          ;脉冲个数计1

READ12:         JNB         P3.1,READ12     ;低电平时等待

              MOV       R1,#06H       ;高电平宽度判断定时值

READ13:         JNB         P3.1,READ11  ;变低电平时转READ11脉冲计数

              LCALL     DELAY        ;延时(512微秒)

              DJNZ      R1,READ13    ;6次延时不到转READ13再延时

              DEC       A            ;超过3毫秒判为结束,减1

              DEC       A            ;减1

              JZ        FUN0         ;为0执行FUN0(2个脉冲)

              DEC       A            ;减1

.

.

.

FUN0:           CPL         P0.0         ;P0口各端口开关输出控制

              LJMP      READOUTT0    ;转中断退出

FUN1:           CPL         P0.1         

              LJMP      READOUTT0 

.

.

.

FUN14:          INC         P1

              MOV       A,P1

              CJNE      A,#00H,OUTT0    ;不等转OUTT0(显示值大于7)

              MOV       P1,#0FFH        ;放回P1(显示值为7)

OUTT0:          LCALL       LOOP            ;亮度调整

              LJMP      READOUTT0       ;中断退出                

FUN15:          DEC         P1              ;P1口值减1

              MOV       A,P1            ;移入A

              CJNE      A,#0F7H,OUTT1   ;不等转OUTT1(显示值小于0)          

              MOV       P1,#0F8H        ;放回P1(显示值为0)

OUTT1:          LCALL       LOOP       ;亮度调整

              LJMP      READOUTT0       ;中断退出

.

.

.

5、  调光程序

系统调光电路采用双向可控硅,利用它的“过零自动关闭”特性,AT89C51只需在每个交流信号的1/2周期(10ms)内控制可控硅打开的时刻,由于交流电过零点时可控硅自动关断,即间接控制了灯光的亮度。上电时,首先调用调光程序,根据P1口值设定延时值并放在寄存器B中。再根据P3.0输入的交流同步信号,确定调光脉冲的发送时间,当交流信号过零时调用调光程序,调光程序根据寄存器B中的值确定延时次数(每次延时512us)从而确定调光脉冲的发送时间,延时到P2.0置“0”经过外接晶体管反向放大后经光电耦合器隔离驱动双向可控硅导通的时间,当交流信号再次过零时,双向可控硅自动关闭,再次调用调光程序。这样便控制了双向可控硅的导通时间,从而达到调光的目的。

START:          LCALL       CLEARIO         ;上电初始化

              LCALL     LOOP            ;调用调光控制程序

MAIN:           JB          P3.0,MAIN     ;50HZ交流电未过零转MAIN

              LCALL      DLX       ;过零点时调用延时子程序(延时可变)

              CLR       P2.0            ;发调光脉冲

              LCALL     DELAY           ;持续512微秒

              SETB      P2.0            ;关调光脉冲

               LJMP    MAIN            ;转MAIN循环

DLX:            MOV         R2,B            ;置延时初值

DLX1:           LCALL       DELAY           ;调512微秒延时子程序

              DJNZ      R2,DLX1         ;循环控制

              RET                       ;返回

LOOP:           MOV         A,P1          ;读入P1口值

              SUBB      A,#0FFH         ;比较

              JZ            LOOP7           ;值为#0FFH(显示7)时转LOOP7

              MOV       A,P1        

              SUBB      A,#0FEH       

              JZ            LOOP6           ;值为#0FEH(显示6)时转LOOP6

MOV         A,P1         

.

.

.

RET

LOOP7:          MOV         B,#01H        ;设置延时值#01H(最亮)

              RET                       ;返回

LOOP6:          MOV         B,#02H        ;设置延时值#02H(次亮)

              RET                       ;返回

LOOP5:          MOV         B,#04H       

.

.

.

               RET

6、  延时子程序

采用循环结构实现513微秒、10微秒、500微秒延时功能。

DELAY:       MOV            R2,#0FFH        ;513微秒延时程序

DELAY1:      DJNZ           R2,DELAY1

              RET

DL10MS:      MOV            R3,#14H         ;10毫秒延时程序

DL10MS1:     LCALL          DELAY

             DJNZ           R3,DL10MS1

              RET

DL500MS:     MOV            R4,#32H         ;500毫秒延时程序

DL500MS1:    LCALL          DL10MS

             DJNZ           R4,DL500MS1

RET

五、系统调试

上电,测试发送板单片机各IO口电平,P3.5、P1.0、P1.1、P1.2、P1.3均为低电平,其余均为高电平,表明单片机上电复位正常,且程序运行正常。然后用万用表毫伏档测量红外线发射管两端,同时按各输入键,表针应有左右摆动现像,则表明键扫描程序与红外线发射程序运行正常,且在发射红外线脉冲。

接收电路上电时,数码管显示“7”各继电器及可控硅均无输出。遥控信号输入脚P3.1应高电平。则表明单片机上电复位正常,外围电路接线正确。然后将发射板红外线发射管对准接收电路,按压输入键,同时用万用表测量P3.1脚,应有轻微摆动。红外脉冲接收正常。且相应输出继电器应动作,或调光电路应正确动。如无动作或万用有针无摆动,可以稍为改动发射脉冲频率,将定时器初值改为(0FFH-12)=0F4H对应发射频率为41.7KHz或(0FFH-13)=0F3H对应发射频率为38.5KHz,因为红外线发射与接收电路的中心频率相差1KHz时大都能正常遥控,相差2KHz以上会出现遥控失灵现象。大多晶振或接收电路都有一定的频率偏差,我们可以调整定时器的初值来稍为改动发射频率或换用12M晶振,直到能够接收为止。调光程序调试,按调光键,调至显示“0”,此时灯为最暗,应熄灭。否则可以改变调光程序中寄存器B中的值,加长或减少延时时间,使灯能在最低亮度时能正常熄灭,最高亮度时能达最大亮度。按本程序中的值,实测数据如下。

延时子程序为512us,电源交流电压227V

灯光亮度显示

负载电压(60W)

灯光亮度显示

负载电压(60W)

0

2V

4

102V

1

20V

5

135V

2

47V

6

168V

3

73V

7

216V

六、结束语

通过此次改造,利用单片机遥控控制房间灯光取得了良好的效果,使酒店的硬件服务水平提高了一个台阶。同时也应总结经验,逐步完善客房灯光智能控制,例如可以增加房间灯具的自动巡检与电脑联网功能,灯具故障即可自动发出报修信号,服务人员可以通过主服务器方便的了解各个房间电气设备工作情况,即提高了工作效率又方便管理。也体会到我的知识面还是很狭窄,作为从事电气工作的技术人员,在学好本专业的基础前提下,还要不断的学习其他领域的科学技术知识,拓宽自己的知识面,才能胜任新设备、新技术的工作,更好发挥本专业的作用。

本人因水平、经验有限,文中难免有错漏以及不足之处,恳请专家、教授及同行批评指正。

七、参考文献

房小翠  主编:《单片微型计算与机电接口技术》国防工业出版社

陈永甫  主编:《红外线探测与控制电路》人民邮电出版社

陈  科、陈清山  主编:《最新世界晶体三极管详尽参数及互换手册》湖南科学技术出版社

科  林、孙人杰  主编:《TTL、高速CMOS手册》电子工业出版社

八、附录

1、  遥控发射电路原理图

附图一

遥控发射电路原理图

2、遥控接收电路原理图

附图二

遥控接收电路原理图

3、遥控发送控制器程序                                                       

               ORG     0000H           ;程序执行开始地址

                AJMP        START           ;跳至START执行         

                ORG         001BH           ;定时器T1中断入口地址

                LJMP       INTT1           ;跳至INTT1中断服务程序     

CLEARIO:        MOV         P0,#0FFH        ;P0-P3口置1

                MOV         P1,#0FFH       

              MOV       P2,#0FFH       

              MOV       P3,#0FFH       

              CLR       P3.5            ;关遥控输出

CLEARMEM:  MOV         SP,#70H         ;设堆栈基址为70H

              MOV       IE,#00H    ;关所有中断

              MOV       TMOD,#20H       ;8位自动重装初值模式

              MOV       TH1,#0F3H       ;定时为13微秒初值

              MOV       TL1,#0F3H      

              SETB      EA             ;开总中断允许

                RET                        ;返回

START:          LCALL       CLEARIO         ;调用初始化子程序;

MAIN:           LCALL       KEYWORK         ;主体程序。调用查键子程序

                LJMP       MAIN           ;转MAIN循环

                NOP                         ;PC值出错处理

                NOP

                NOP

                LJMP        START           ;重新初始化

INTT1:          CPL         P3.5            ;40kHZ红外线遥控信号产生

                RETI                        ;中断返回

KEYWORK:   MOV        P1,#0F0H        ;置P1口输入状态

   MOV         A,P1           ;读入P1口值

    MOV         B,A           ;P1口值暂存B中

CJNE      A,#0F0H,KEYHIT  ;不等于#0FFH,转KEYHIT(有键按下)

KEYOUT:         RET                     ;没有键按下返回;

KEYHIT:         LCALL       DL10MS          ;延时去抖动

               MOV          A,P1            ;再读入P1口值至A

               CJNE     A,B,KEYOUY      ;A不等于B(是干扰),子程序返回

    SETB       P1.1            ;有键按下,找键号开始,查0行

    SETB        P1.2

    SETB        P1.3

    MOV        A,P1            ;读入P1口值

CJNE      A,#0FEH,KEYVAL0  ;P1不等于#0FEH,按下键在第0行

    SETB       P1.0            ;不在第0行,开始查1行

    CLR         P1.1

    MOV        A,P1            ;读入P1口值

CJNE      A,#0FDH,KEYVAL1  ;P1口不等于#0FDH,按下键在第1行

    SETB       P1.1            ;不在第1行,开始查2行

    CLR         P1.2

    MOV        A,P1          ;读入P1口值

CJNE      A,#0FBH,KEYVAL2  ;P1口不等于#0FBH,按下键在第2行

    SETB       P1.2          ;不在第2行,开始查3行

    CLR         P1.3

    MOV        A,P1          ;读入P1口值

CJNE      A,#0F7H,KEYVAL3  ;P1口不等于#0F7H,按下键在第3行

               LJMP    KEYOUT          ;不在第3行,子程序返回

KEYVAL0:        MOV        R2,#00H     ;按下键在第0行,R2赋行号初值0

              LJMP      KEYVAL4         ;跳到KEYVAL4

KEYVAL1:       MOV        R2,#04H     ;按下键在第1行,R2赋行号初值4

              LJMP      KEYVAL4    ;跳到KEYVAL4

KEYVAL2:       MOV        R2,#08H     ;按下键在第2行,R2赋行号初值8

              LJMP      KEYVAL4         ;跳到KEYVAL4

KEYVAL3:        MOV        R2,#0CH    ;按下键在第3行,R2赋行号初值12

               LJMP     KEYVAL4         ;跳到KEYVAL4

KEYVAL4:      MOV       DPTR,#KEYVALTAB ;翻译成连续数字

              MOV           B,A           ;P1口值暂存B内

              ANL       B,#0F0H       ;取高四位

              MOV       R0,#0         ;清R0

KEYVAL5:        MOV         A,R0          ;查列号开始,R0数据放入A

              SUBB      A,#04H        ;A中数减4

              JNC       KEYOUT          ;借位C为0,查表出错,返回

              MOV           A,R0          ;查表次数小于4,继续查,

              MOVC      A,@A+DPTR       ;查列号表

              INC       R0            ;R0加1

              CJNE      A,B,KEYVAL5     ;查得值和P1口值不等,转KEYVAL5再查

              DEC       R0            ;查得值和P1口值相等,R0减1

              MOV       A,R0          ;放入A(R0中数值即为列号值)

                ADD         A,R2           ;与行号初值相加成为键号值(0-15)

                MOV         B,A           ;键号乘3处理用于JMP散转指令

               RL      A             ;键号乘3处理用于JMP散转指令

                ADD         A,B           ;键号乘3处理用于JMP散转指令

               MOV          DPTR,#KEYFUNTAB ;取散转功能程序(表)首址

               JMP     @A+DPTR         ;散转至对应功能程序标号

KEYFUNTAB:      LJMP        KEYFUN00        ;跳到键号0对应功能程序标号

               LJMP     KEYFUN01      ;跳到键号1对应功能程序标号

               LJMP     KEYFUN02      ;跳到键号2对应功能程序标号

               LJMP     KEYFUN03      ;跳到键号3对应功能程序标号

                LJMP        KEYFUN04      ;跳到键号4对应功能程序标号

                LJMP        KEYFUN05      ;跳到键号5对应功能程序标号

                LJMP        KEYFUN06      ;跳到键号6对应功能程序标号

                LJMP        KEYFUN07      ;跳到键号7对应功能程序标号

                LJMP        KEYFUN08      ;跳到键号8对应功能程序标号

                LJMP        KEYFUN09      ;跳到键号9对应功能程序标号

                LJMP        KEYFUN10      ;跳到键号10对应功能程序标号

                LJMP        KEYFUN11      ;跳到键号11对应功能程序标号

LJMP        KEYFUN12      ;跳到键号12对应功能程序标号

                LJMP        KEYFUN13      ;跳到键号13对应功能程序标号

                LJMP        KEYFUN14      ;跳到键号14对应功能程序标号

                LJMP        KEYFUN15      ;跳到键号15对应功能程序标号

                RET

KEYVALTAB:      DB  0E0H,0D0H,0B0H,07H      ;列号对应数据表

;对应列号:          0    1    2    3

               RET

KEYFUN00:       MOV         A,#02H          ;发2个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN01:       MOV         A,#03H          ;发3个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN02:       MOV         A,#04H          ;发4个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN03:       MOV         A,#05H          ;发5个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN04:       MOV         A,#06H          ;发6个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN05:       MOV         A,#07H          ;发7个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN06:       MOV         A,#08H          ;发8个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN07:       MOV         A,#09H          ;发9个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN08:       MOV         A,#0AH          ;发10个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN09:       MOV         A,#0BH          ;发11个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN10:       MOV         A,#0CH          ;发12个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN11:       MOV         A,#0DH          ;发13个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN12:       MOV         A,#0EH          ;发14个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN13:       MOV         A,#0FH          ;发15个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN14:       MOV         A,#10H          ;发16个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

KEYFUN15:       MOV         A,#11H          ;发17个脉冲

              LJMP      REMOTE          ;转发送程序

              RET

REMOTE:         MOV         R1,A            ;装入发射脉冲个数

              LJMP      OUT3            ;转第一个码发射处理

OUT:            MOV         R0,#64H    ;1MS宽低电平发射控制数据

OUT1:           SETB        ET1             ;开T1中断

              SETB      TR1             ;开启定时器T1

              NOP                          ;延时

              NOP

              NOP

              NOP

              NOP

              DJNZ      R0,OUT1    ;时间不到转OUT1再循环

              MOV       R0,#3CH     ;1MS高电平间隙控制数据

OUT2:           CLR         TR1             ;关定时器T1

              CLR       ET1             ;关T1中断

              CLR       P3.5            ;关脉冲输出

              NOP                      ;空操作延时

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              NOP

              DJNZ      R0,OUT2     ;时间不到转OUT2再循环

              DJNZ      R1,OUT          ;脉冲未发完,转OUT再循环发射

              LCALL     DL500MS        

              RET          

OUT3:           MOV         R0,#0FFH       ;装发谢3MS宽控制数据

              LJMP      OUT1           ;转OUT1

DELAY:          MOV         R2,#0FFH        ;513微秒延时程序

DELAY1:         DJNZ        R2,DELAY1

                RET

DL10MS:         MOV         R3,#14H         ;10毫秒延时程序

DL10MS1:        LCALL       DELAY

              DJNZ      R3,DL10MS1

               RET

DL500MS:        MOV         R4,#32H         ;500毫秒延时程序

DL500MS1:       LCALL       DL10MS

              DJNZ      R4,DL500MS1

              RET

                END                        ;程序结束

4、遥控接收控制器程序                                                        

                ORG         0000H           ;程序开始地址

                LJMP        START           ;跳至START执行

                ORG         0003H           ;外中断0中断入口

                LJMP        INTEX0          ;跳至INTEX0执行中断服务程序

CLEARIO:        MOV         P0,#0FFH      ;P0-P3口置1

              MOV       P1,#0FFH       

              MOV       P2,#0FFH     

              MOV       P3,#0FFH     

CLEARMEM:  MOV         IE,#00H       ;关所有中断

              SETB      EX0             ;开外中断

              SETB      EA              ;总中断允许

               RET                      ;子程序返回

START:          LCALL       CLEARIO         ;上电初始化

              LCALL     LOOP            ;调用调光控制程序

MAIN:           JB          P3.0,MAIN     ;50HZ交流电未过零转MAIN

              LCALL      DLX        ;过零点时调用延时子程序(延时可变)

              CLR       P2.0            ;发调光脉冲

              LCALL     DELAY           ;持续512微秒

              SETB      P2.0            ;关调光脉冲

               LJMP    MAIN            ;转MAIN循环

              NOP                       ;PC值出错处理

               NOP

               LJMP     START           ;出错时重新初始化

;采用中断接收

INTEX0:         CLR         EX0           ;关外中断

              JNB       P3.1,READ1    ;P3.1口为低电平转READ1

READOUTT0: SETB        EX0           ;P3.1口为高电平开中断(系干扰)

              RETI                      ;退出中断

READ1:          CLR         A               ;清A

              MOV       DPH,A         ;清DPTR

              MOV       DPL,A        

HARD1:          JB          P3.1,HARD11   ;P3.1变高电平转HARD11

              INC       DPTR          ;用DPTR对低电平计数

              NOP                       ;1微秒延时

              NOP

              NOP

              AJMP      HARD1      ;转HARD1循环(循环周期为8微秒)

HARD11:         MOV         A,DPH         ;DPTR高8位放入A

              JZ        READOUTT0   ;为0(脉宽小于8×255=2毫秒)退出

              CLR       A          ;不为0,说明是第一个宽脉冲(3毫秒)

READ11:         INC         A          ;脉冲个数计1

READ12:         JNB         P3.1,READ12     ;低电平时等待

              MOV       R1,#06H       ;高电平宽度判断定时值

READ13:         JNB         P3.1,READ11   ;变低电平时转READ11脉冲计数

              LCALL     DELAY           ;延时(512微秒)

              DJNZ      R1,READ13     ;6次延时不到转READ13再延时

              DEC       A               ;超过3毫秒判为结束,减1

              DEC       A               ;减1

              JZ        FUN0            ;为0执行FUN0(2个脉冲)

              DEC       A               ;减1

              JZ        FUN1            ;为0执行FUN1(3个脉冲)

              DEC       A              

              JZ        FUN2            ;为0执行FUN2(4个脉冲)

              DEC       A              

              JZ        FUN3            ;为0执行FUN3(5个脉冲)

              DEC       A              

              JZ        FUN4            ;为0执行FUN4(6个脉冲)

              DEC       A              

              JZ        FUN5            ;为0执行FUN5(7个脉冲)

              DEC       A              

              JZ        FUN6            ;为0执行FUN6(8个脉冲)

              DEC       A              

              JZ        FUN7            ;为0执行FUN7(9个脉冲)

              DEC       A              

              JZ        FUN8            ;为0执行FUN8(10个脉冲)

              DEC       A              

              JZ        FUN9            ;为0执行FUN9(11个脉冲)

              DEC       A              

              JZ        FUN10           ;为0执行FUN10(12个脉冲)

              DEC       A              

              JZ        FUN11           ;为0执行FUN11(13个脉冲)

DEC         A  

JZ          FUN12           ;为0执行FUN8(114个脉冲)

              DEC       A              

              JZ        FUN13           ;为0执行FUN9(15个脉冲)

              DEC       A              

              JZ        FUN14           ;为0执行FUN10(16个脉冲)

              DEC       A              

              JZ        FUN15           ;为0执行FUN11(17个脉冲)      

              NOP                      

              NOP                      

              LJMP      READOUTT0  ;出错退出

FUN0:           CPL         P0.0            ;P0口各端口开关输出控制

              LJMP      READOUTT0  ;转中断退出

FUN1:           CPL         P0.1         

              LJMP      READOUTT0 

FUN2:           CPL         P0.2

              LJMP      READOUTT0

FUN3:           CPL         P0.3

              LJMP      READOUTT0

FUN4:           CPL         P0.4

              LJMP      READOUTT0

FUN5:           CPL         P0.5

              LJMP      READOUTT0

FUN6:           CPL         P0.6

              LJMP      READOUTT0

FUN7:           CPL         P0.7

              LJMP      READOUTT0

FUN8:           CPL         P2.7               

              LJMP      READOUTT0         

FUN9:           CPL         P2.6

              LJMP      READOUTT0

FUN10:          CPL         P2.5           

              LJMP      READOUTT0         

FUN11:          CPL         P2.4

              LJMP      READOUTT0

FUN12:          CPL         P2.3               

              LJMP      READOUTT0         

FUN13:          CPL         P2.2            ;P2口各端口开关输出控制

              LJMP      READOUTT0       ;转中断退出

FUN14:          INC         P1

              MOV       A,P1

              CJNE      A,#00H,OUTT0    ;不等转OUTT0(显示值大于7)

              MOV       P1,#0FFH   ;放回P1(显示值为7)

OUTT0:          LCALL       LOOP            ;亮度调整

              LJMP      READOUTT0     ;中断退出                

FUN15:          DEC         P1              ;P1口值减1

              MOV       A,P1            ;移入A

              CJNE      A,#0F7H,OUTT1 ;不等转OUTT0(显示值小于0)          

              MOV       P1,#0F8H        ;放回P1(显示值为0)

OUTT1:          LCALL       LOOP            ;亮度调整

              LJMP      READOUTT0     ;中断退出

DELAY:          MOV         R0,#0FFH

DELAY1:         DJNZ        R0,DELAY1

               RET

DL10MS:         MOV         R1,#14H

DL10MS1:        LCALL       DELAY

              DJNZ      R1,DL10MS1

                RET

DLX:            MOV         R2,B            ;置延时初值

DLX1:           LCALL       DELAY           ;调512微秒延时子程序

              DJNZ      R2,DLX1         ;循环控制

              RET                       ;返回

;根据数码管指示值设置调光脉冲延时值

LOOP:           MOV         A,P1          ;读入P1口值

              SUBB      A,#0FFH         ;比较

              JZ            LOOP7           ;值为#0FFH(显示7)时转LOOP7

              MOV       A,P1        

              SUBB      A,#0FEH      

              JZ            LOOP6           ;值为#0FEH(显示6)时转LOOP6

              MOV       A,P1         

              SUBB      A,#0FDH     

              JZ            LOOP5           ;值为#0FDH(显示5)时转LOOP5

              MOV       A,P1         

              SUBB      A,#0FCH     

              JZ            LOOP4           ;值为#0FCH(显示4)时转LOOP4

              MOV       A,P1        

              SUBB      A,#0FBH    

              JZ            LOOP3           ;值为#0FBH(显示3)时转LOOP3

              MOV       A,P1       

              SUBB      A,#0FAH   

              JZ            LOOP2      ;值为#0FAH(显示2)时转LOOP2

MOV         A,P1      

SUBB        A,#0F9H       

              JZ            LOOP1           ;值为#0F9H(显示1)时转LOOP1

              MOV       A,P1        

              SUBB      A,#0F8H     

              JZ       LOOP0           ;值为#0F8H(显示0)时转LOOP0

              RET                       ;返回

LOOP7:          MOV         B,#01H        ;设置延时值#01H(最亮)

              RET                       ;返回

LOOP6:          MOV         B,#02H        ;设置延时值#02H(次亮)

              RET                       ;返回

LOOP5:          MOV         B,#04H       

               RET

LOOP4:          MOV         B,#06H       

              RET

LOOP3:          MOV         B,#08H       

              RET

LOOP2:          MOV         B,#0AH      

              RET

LOOP1:          MOV         B,#0CH          ;设置延时值#0CH(次暗)

              RET                       ;返回

LOOP0:          MOV         B,#0DH          ;设置延时值#0DH(最暗)

              RET                       ;返回

                END                         ;程序结束


[江南建筑>单片机遥控控制酒店客房灯光系统]
论文录入:admin    责任编辑:admin 
发表您的评论 加入到收藏夹 告诉好友 打印此文 关闭窗口
  • 上一篇论文:
  • 下一篇论文:
  • 热点论文 推荐论文 相关论文
  • 建立现代企业制度必须改善和加强企业

  • 建筑企业集团母公司功能定位及管理组

  • 施工企业相关信息系统的发展趋势与对

  • 行业信息化必须“书同文、车同轨”

  • 应用软件服务供应商(ASPs)对建筑施工

  • 运用信息技术提升建筑业的竞争力实现

  • 以信息化促进工程建设管理现代化

  • 信息技术在建筑行业的应用

  • BPR:施工企业信息化不容忽视的环节

  • 铁路施工企业计算机信息网络的建设与

  • 【本站声明】江南建筑刊载的部分内容是由网友自由上传及转载(包括-单片机遥控控制酒店客房灯光系统),对于此类文章本站仅提供交流平台,不为其版权负责。如果您发现本网站上有侵犯您的知识产权的文章,请联系我们
    规范下载 图集下载 学习资料
     
      网友评论:(单片机遥控控制酒店客房灯光系统)