单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2349|回复: 11
打印 上一主题 下一主题
收起左侧

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


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 转播转播 分享分享 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
admin 发表于 2018-12-5 03:03 | 只看该作者
好资料,能分享一下程序吗?
回复

使用道具 举报

板凳
byalan 发表于 2019-5-8 15:06 | 只看该作者
学习了,好……
回复

使用道具 举报

地板
pleianth 发表于 2019-5-16 07:30 | 只看该作者
求程序
回复

使用道具 举报

5#
 楼主| 新乡家电维修 发表于 2019-5-16 15:33 | 只看该作者

程序已经贴出来了,呵呵
回复

使用道具 举报

6#
 楼主| 新乡家电维修 发表于 2019-5-16 15:40 | 只看该作者
admin 发表于 2018-12-5 03:03
好资料,能分享一下程序吗?

已经直接分享过了,
回复

使用道具 举报

7#
 楼主| 新乡家电维修 发表于 2019-5-16 15:42 | 只看该作者


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



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

1557992336979.jpg

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

1557992354002.jpg
回复

使用道具 举报

8#
找人PK 发表于 2019-5-16 17:29 | 只看该作者
STC15W104性价比完全抵不过义隆,一个STC15W104芯片的价钱都能买10个义隆芯片
回复

使用道具 举报

9#
pleianth 发表于 2019-5-19 00:05 | 只看该作者
新手第一次编译,求解答,

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

IMG_20190518_235938.jpg

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

2019-05-18_23.58.36.jpg

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

IMG_20190519_000502.jpg

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

IMG_20190519_000452.jpg
回复

使用道具 举报

10#
 楼主| 新乡家电维修 发表于 2019-6-24 20:26 | 只看该作者
pleianth 发表于 2019-5-19 00:05
新手第一次编译,求解答,

频率不对,设置成6M
回复

使用道具 举报

11#
 楼主| 新乡家电维修 发表于 2019-6-24 20:28 | 只看该作者
pleianth 发表于 2019-5-19 00:05
新手第一次编译,求解答,

程序是汇编的,你保存成C了,编译是不对的,烧写时候频率调成6M就行了
回复

使用道具 举报

12#
irico58 发表于 2019-8-1 11:43 来自手机 | 只看该作者
有没有烧录文件,汇编有点蒙圈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

快速回复 返回顶部 返回列表