标题: STC15W104单片机遥控开关电路图+程序(汇编语言) [打印本页]

作者: 新乡家电维修    时间: 2018-12-3 10:45
标题: STC15W104单片机遥控开关电路图+程序(汇编语言)
电路原理图如下:


STC15W104单片机遥控开关
功能介绍:
1.按键控制继电器释放吸合
2.遥控码控制继电器(只一个按键编码识别,其他编码无效)
3.按键按下时,按遥控器,学习当前遥控码,前码失效(利用内部eeprom)

/*15W408单片机遥控灯,外部中断方式通过测试2018.09.04

IAP_DATA    EQU 0C2H        ;IAP数据寄存器
IAP_ADDRH   EQU 0C3H        ;IAP地址寄存器高字(地址需要改变时,才需要重新送地址)
IAP_ADDRL   EQU 0C4H        ;IAP地址寄存器低字(指令完成后地址不会自动加1或减1)
IAP_CMD     EQU 0C5H        ;IAP命令寄存器
IAP_TRIG    EQU 0C6H        ;IAP命令触发寄存器
IAP_CONTR   EQU 0C7H        ;IAP控制寄存器
P0M1    DATA    0x93        ; P0M1.n,P0M0.n     =00--->准双向口,  01--->推挽输出
P0M0    DATA    0x94        ;                            =10--->高阻输入,  11--->开漏输出
P1M1    DATA    0x91        ; P1M1.n,P1M0.n   
P1M0    DATA    0x92        ;                 
P2M1    DATA    0x95        ; P2M1.n,P2M0.n  
P2M0    DATA    0x96        ;                 
P3M1    DATA    0xB1        ; P3M1.n,P3M0.n   
P3M0    DATA    0xB2        ;               
P4M1    DATA    0xB3        ; P4M1.n,P4M0.n  
P4M0    DATA    0xB4        ;               
P5M1    DATA    0xC9        ; P5M1.n,P5M0.n   
P5M0    DATA    0xCA        ;               
P6M1    DATA    0xCB        ; P6M1.n,P6M0.n  
P6M0    DATA    0xCC        ;               
P7M1    DATA    0xE1            ;
P7M0    DATA    0xE2            ;
;ENABLE_IAP  EQU  80H          ;if SYSCLK<30MHz
;ENABLE_IAP  EQU  81H          ;if SYSCLK<24MHz
;ENABLE_IAP  EQU  82H          ;if SYSCLK<20MHz
;ENABLE_IAP  EQU  83H          ;if SYSCLK<12MHz
ENABLE_IAP  EQU  84H           ;if SYSCLK<6MHz
;ENABLE_IAP  EQU  85H          ;if SYSCLK<3MHz
;ENABLE_IAP  EQU  86H          ;if SYSCLK<2MHz
;ENABLE_IAP  EQU  87H          ;if SYSCLK<1MHz


ADDRESS  EQU 00H        ;EEPROM扇区地址(第1扇区0000H)(第2扇区0200H)(第3扇区0400H)(第4扇区0600H
P5_0 BIT 0C8H                ;P5口定义
P5_1 BIT 0C9H
P5_2 BIT 0CAH
P5_3 BIT 0CBH
P5_4 BIT 0CCH
P5_5 BIT 0CDH


        SSR        BIT        P3.4        ;输出控制脚
        S0        BIT        P3.3        ;开关灯键和记忆键
        IRIN        BIT        P3.2   ;红外线输入脚

        ORG        0000H
        LJMP        MAIN
        ORG        0003H         ;外部中断P3.2脚INT0入口地址
        LJMP        INT_0
        ORG        0100h
;=========================主程序================================
MAIN:
        MOV        SP,        #60h
        CLR        P3.5
        CLR     A
        MOV        P0M1, A    ;设置准双向口 00--->准双向口,    01--->推挽输出
        MOV        P0M0, A
        MOV        P1M1, A    ;设置准双向口 10--->高阻输入,  11--->开漏输出
        MOV        P1M0, A
        MOV        P2M1, A    ;设置准双向口
        MOV        P2M0, A
        MOV        P3M1, A    ;设置准双向口
        MOV        P3M0, A

        SETB        SSR
        mov        IE,#10000001b        ;允许外部中断0
        mov        IP,#00000001B        ;外中断1优先中断
        MOV        TCON,#00000101B        ;都是脉冲下降中
        MOV        R0,#20h    ;20h单元开始放数据
MAIN1:
;        LCALL DISPLAY
        ACALL KEY
        JMP MAIN1
;==================================继电器输出========================================
OUT_0:
        MOV  A,20H
        CJNE A,2AH,WWW    ;将接收到的20H、21H、22H与读出的数据比较,
        MOV  A,21H                ;相同继电器就进行动作
        CJNE A,2BH,WWW   ;
        MOV  A,22H
        CJNE A,2CH,WWW
        MOV  A,23H
        CJNE A,2DH,WWW
        CPL        SSR
WWW:
        RET
;=================================按键程序===========================================
KEY:
        JB        S0,        KEY_D
        ACALL        DELAY
        JB        S0,        KEY_D
        JNB        S0,        $
        ACALL        DELAY
        JNB        S0,        $
        cpl SSR
KEY_D:
        RET
;=========================写入EEPROM数据========================================
WERED:
        MOV   DPTR,#ADDRESS        ;EEPROM扇区起始地址(擦除起始地址)
        LCALL IAP_ERASE                ;扇区擦除
;        MOV   DPTR,#ADDRESS        ;EEPROM指针写入数据起始地址
;        MOV   R0,#0                ;检测512字节(256*2=512)
;        MOV   R1,#2
;CHECK_0:                        ;检测是否擦除成功(全FF检测)
;        LCALL IAP_READ                ;读IAP数据
;        CJNE  A,#0FFH,ERROR        ;如果出错,则退出
;        INC   DPTR                ;IAP地址+1
;        DJNZ  R0,CHECK_0
;        DJNZ  R1,CHECK_0
;写入数据程序                  ;
        MOV   DPTR,#ADDRESS        ;EEPROM扇区起始地址(写数据起始地址)
        MOV   R0,#4                ;编程3字节
        MOV   R1,#20H                ;写红外解码数据地址
NEXT:                              
        MOV   A,@R1                ;准备数据
        LCALL IAP_PROGRAM        ;字节编程
        INC   DPTR                ;IAP地址+1
        INC   R1                ;修改数据地址
        DJNZ  R0,NEXT
        RET
;===============读取EEPROM数据===========================
READ_ROM:
        MOV   DPTR,#ADDRESS        ;设置要读取的EEPROM地址(扇区)
        MOV   R0,#4                ;读取多少字节
        MOV   R1,#2AH                ;数据存放起始地址
CHECK2:                             
        LCALL IAP_READ                ;读IAP数据
        MOV  @R1,A                ;数据转移到地址R1指向
        INC   DPTR                ;IAP地址+1
        INC   R1                ;数据保存地址加1
        DJNZ  R0,CHECK2                ;是否读完
        RET

;=====================关闭IAP========================
IAP_IDLE:
    MOV   IAP_CONTR,#0              ;关闭IAP功能
    MOV   IAP_CMD,#0               ; 清除命令寄存器
    MOV   IAP_TRIG,#0               ;清除触发寄存器
    MOV   IAP_ADDRH,#80H            ;将地址设置到非IAP区域
    MOV   IAP_ADDRL,#0
    RET
;=====================读取一字节=====================
IAP_READ:
    MOV   IAP_CONTR,#ENABLE_IAP     ;允许擦除与等待时间设置(10000xxxB)
    MOV   IAP_CMD,#01H                 ;字节读命令
    MOV   IAP_ADDRL,DPL             ;设置IAP低地址
    MOV   IAP_ADDRH,DPH             ;设置IAP高地址
    MOV   IAP_TRIG,#5AH             ;写触发命令(0x5a)
    MOV   IAP_TRIG,#0A5H            ;写触发命令(0xa5)
    NOP                             ;等待ISP/IAP/EEPROM操作完成
    MOV   A,IAP_DATA                ;度IAP数据
    LCALL IAP_IDLE                  ;关闭IAP功能
    RET
;====================写一字节数据==================
IAP_PROGRAM:
    MOV   IAP_CONTR,#ENABLE_IAP    ;允许擦除与等待时间设置(10000xxxB)
    MOV   IAP_CMD,#02H                     ;字节写命令
    MOV   IAP_ADDRL,DPL            ;设置IAP低地址
    MOV   IAP_ADDRH,DPH            ;设置IAP高地址
    MOV   IAP_DATA,A               ;写IAP数据
    MOV   IAP_TRIG,#5AH            ;写触发命令(0x5a)
    MOV   IAP_TRIG,#0A5H           ;写触发命令(0xa5)
    NOP                            ;等待ISP/IAP/EEPROM操作完成
    LCALL IAP_IDLE                 ;关闭IAP功能
    RET
;====================扇区擦除======================
IAP_ERASE:
    MOV   IAP_CONTR,#ENABLE_IAP    ;允许擦除与等待时间设置(10000xxxB)
    MOV   IAP_CMD,#03H               ;扇区擦除命令
    MOV   IAP_ADDRL,DPL            ;设置IAP低地址
    MOV   IAP_ADDRH,DPH            ;设置IAP高地址
    MOV   IAP_TRIG,#5AH            ;写触发命令(0x5a)
    MOV   IAP_TRIG,#0A5H           ;写触发命令(0xa5)
    NOP                            ;等待ISP/IAP/EEPROM操作完成
    LCALL IAP_IDLE                 ;关闭IAP功能
    RET
;===================中断程序=======================
INT_0:
        CLR EA         ;暂时关闭CPU的所有中断请求
        MOV R0,#20h    ;20h单元开始放数据
        MOV R5,#17
L2:        ACALL DELAY05_R5
        JB IRIN,L10      ;
        DJNZ R5,L2        ;重复多次
         JNB IRIN,$
        MOV R5,#8
L3:        ACALL DELAY05_R5  
        JNB IRIN,L10   
        DJNZ R5,L3        
L4:        MOV R3,#0
L5:        JNB IRIN,L6
        ACALL DEL
        JMP L5
L6:        JB IRIN,L7
        ACALL DEL
        JMP L6
L7:        MOV R2,#0
L8:        ACALL DEL
        JB IRIN,L9
        MOV A,#8
        CLR C
        SUBB A,R2
        MOV A,@R0
        RRC A
        MOV @R0,A
        INC R3
        CJNE R3,#8,L5
        MOV R3,#0
        INC R0
        CJNE R0,#24H,L5   
        JMP L10
L9:        INC R2
        CJNE R2,#30,L8  
        JB        S0,L9_0
        LCALL WERED
        LCALL READ_ROM
L9_0:
L10:
        SETB EA ;允许中断,然后退出中断程序
        RETI
;=============================================
DE:
DELAY540US:                        ;@6.000MHz
        NOP
        PUSH 38H
        PUSH 39H
        MOV 38H,#3
        MOV 39H,#128
NEXT1:
        DJNZ 39H,NEXT1
        DJNZ 38H,NEXT1
        POP 39H
        POP 38H
        RET


DELAY05_R5:       ;总延时时间为0.5ms*R5
DELAY500US:                        ;@6.000MHz
        NOP
        PUSH 38H
        PUSH 39H
        MOV 38H,#3
        MOV 39H,#80
NEXT2:
        DJNZ 39H,NEXT2
        DJNZ 38H,NEXT2
        POP 39H
        POP 38H
        RET
DEL:             ;延时为0.093ms
DELAY93US:                        ;@6.000MHz
        NOP
        NOP
        PUSH 38H
        MOV 38H,#108
NEXT3:
        DJNZ 38H,NEXT3
        POP 38H
        RET   
;=================延时程序==================
DELAY: MOV  R6, #30
D1:    MOV  R7, #250
       DJNZ R7, $
       DJNZ R6, D1
       RET
;==================================================

        END



作者: admin    时间: 2018-12-5 03:03
好资料,能分享一下程序吗?
作者: byalan    时间: 2019-5-8 15:06
学习了,好……
作者: pleianth    时间: 2019-5-16 07:30
求程序
作者: 新乡家电维修    时间: 2019-5-16 15:33
pleianth 发表于 2019-5-16 07:30
求程序

程序已经贴出来了,呵呵

作者: 新乡家电维修    时间: 2019-5-16 15:40
admin 发表于 2018-12-5 03:03
好资料,能分享一下程序吗?

已经直接分享过了,

作者: 新乡家电维修    时间: 2019-5-16 15:42

下面是PCB照片和焊接好的成品,供喜欢单片机的朋友借鉴

1557992336979.jpg (1.86 MB, 下载次数: 126)

1557992336979.jpg

1557992354002.jpg (2.17 MB, 下载次数: 153)

1557992354002.jpg

作者: 找人PK    时间: 2019-5-16 17:29
STC15W104性价比完全抵不过义隆,一个STC15W104芯片的价钱都能买10个义隆芯片
作者: pleianth    时间: 2019-5-19 00:05
新手第一次编译,求解答,

IMG_20190518_235938.jpg (4.77 MB, 下载次数: 132)

IMG_20190518_235938.jpg

2019-05-18_23.58.36.jpg (7.12 MB, 下载次数: 132)

2019-05-18_23.58.36.jpg

IMG_20190519_000502.jpg (5.12 MB, 下载次数: 120)

IMG_20190519_000502.jpg

IMG_20190519_000452.jpg (5.46 MB, 下载次数: 141)

IMG_20190519_000452.jpg

作者: 新乡家电维修    时间: 2019-6-24 20:26
pleianth 发表于 2019-5-19 00:05
新手第一次编译,求解答,

频率不对,设置成6M
作者: 新乡家电维修    时间: 2019-6-24 20:28
pleianth 发表于 2019-5-19 00:05
新手第一次编译,求解答,

程序是汇编的,你保存成C了,编译是不对的,烧写时候频率调成6M就行了
作者: irico58    时间: 2019-8-1 11:43
有没有烧录文件,汇编有点蒙圈
作者: yanghb81    时间: 2020-1-29 13:17
学习了!!!
作者: dxdsjyx    时间: 2020-3-24 22:56
汇编怎么烧写?
作者: cooleaf    时间: 2020-3-25 10:39
汇编代码,还是很牛逼的!
作者: liuhl_2005    时间: 2021-2-26 08:38
不错的资料,谢谢!
作者: 快乐a123    时间: 2021-3-1 18:08
求c语言
作者: xjlfh    时间: 2021-5-15 11:48
最近在学习中,想仿制楼主的,可是编译无法通过,不知道是啥原因,下面是截图,MCU选15W104和15W408都不行。

作者: xjlfh    时间: 2021-5-15 11:51
不知为何无法上传截图,编译提示错误如下:
*** FATAL ERROR L210: I/O ERROR ON INPUT FILE:
    EXCEPTION 0021H: PATH OR FILE NOT FOUND
    FILE: STC15W104单片机遥控开关电路.obj
Target not created
代码保存的是ASM格式。


作者: 一时    时间: 2021-5-19 12:01
不懂汇编呀
作者: 965153391    时间: 2021-5-30 21:29
接收端怎么一个遥控器发送的啥信息呀
作者: 超级赛亚人8402    时间: 2022-9-19 11:48
怎么样进入学习红外信号模式,长按按键不放吗??、
作者: liu2454004961    时间: 2022-10-13 15:44
很好一次编译通过。想做个阻容降压做电源,试一下看有没有干扰
作者: 新乡家电维修    时间: 2022-11-18 10:59
超级赛亚人8402 发表于 2022-9-19 11:48
怎么样进入学习红外信号模式,长按按键不放吗??、

对,按着不放,按下遥控键就学习成功了
作者: 新乡家电维修    时间: 2022-11-18 11:01
liu2454004961 发表于 2022-10-13 15:44
很好一次编译通过。想做个阻容降压做电源,试一下看有没有干扰

阻容降压要考虑继电器吸合电流,继电器吸合电流100ma比较可靠
作者: 电子爱好114514    时间: 2022-12-23 09:53
为什么我还是报错?Build target 'Target 1' assembling 2.asm... 2.asm(271): error A300: unterminated comment 2.asm(272): warning A41: MISSING 'END' STATEMENT Target not created. Build Time Elapsed:  00:00:01
作者: liu2454004961    时间: 2022-12-23 12:01
仔细一看,程序还是有问题的。主程序:第一行,带分号不编译;第二行,按键处理程序;第三行,跳回主程序标题。按键处理程序,只包含继电器状态取反。
作者: liu2454004961    时间: 2022-12-26 10:05
pleianth 发表于 2019-5-19 00:05
新手第一次编译,求解答,

不要想了,这个程序明显有问题。烧录进去运行结果是红外无法解码,按一次按键,输出脚取反一次
作者: 新乡家电维修    时间: 2023-1-4 18:47
liu2454004961 发表于 2022-12-23 12:01
仔细一看,程序还是有问题的。主程序:第一行,带分号不编译;第二行,按键处理程序;第三行,跳回主程序标 ...

你看不懂汇编就不要说,
遥控中断程序最后是判断按键状态是否决定学习,和对比存储数据决定是否反转继电器
作者: tnovicet    时间: 2023-1-5 15:41
        LCALL WERED
        LCALL READ_ROM
L9_0:
   
       LCALL OUT_0

L10:
        SETB EA ;允许中断,然后退出中断程序
        RETI
作者: XDDZ1013    时间: 2023-9-6 22:34
电路简洁,值得学习。。。





欢迎光临 (http://www.51hei.com:80/bbs/) Powered by Discuz! X3.1