全国 【切换城市】欢迎您来到装修百科!
关注我们
我要装修

自制一款带记忆的开关(记忆开关是什么)

发布:2024-07-27 浏览:35

核心提示:前些天在自己的车上改装了一个音频切换电路,由于音频信号是双声道,就必须要一个双刀双掷的开关来进行切换,但现在双刀双掷的开关已经很少了,再者安装不方便于是就有了这个小电路。花了20分钟写了个小程序,测试了一下效果很不错,价格也和好点的双刀双掷开关差不太多。电路:实际电路:来个背面图,简洁小巧功能:上电先调用上次单片机内部EEPROM中的数据控制继电器是开或关,按键按下后把数据取反送入内部EEPROM进行保存,方便下次开机调用。程序如下:#include "reg51.h" #includ

前些天在自己的车上改装了一个音频切换电路,由于音频信号是双声道,就必须要一个双刀双掷的开关来进行切换,但现在双刀双掷的开关已经很少了,再者安装不方便于是就有了这个小电路。
花了20分钟写了个小程序,测试了一下效果很不错,价格也和好点的双刀双掷开关差不太多。
电路:实际电路:来个背面图,简洁小巧功能:上电先调用上次单片机内部EEPROM中的数据控制继电器是开或关,按键按下后把数据取反送入内部EEPROM进行保存,方便下次开机调用。
程序如下:#include "reg51.h"#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;sbit SWITCH = P3^2;sbit LED = P3^4;bit flag,BUTTON_TEMP;//-----------------------------------------------sfr IAP_DATA = 0xC2; //IAP数据寄存器sfr IAP_ADDRH = 0xC3; //Iap地址寄存器高字节sfr IAP_ADDRL = 0xC4; //IAP地址寄存器低字节sfr IAP_CMD = 0xC5; //IAP命令寄存器sfr IAP_TRIG = 0xC6; //IAP命令触发寄存器sfr IAP_ConTR = 0xC7; //IAP控制寄存器sfr WDT_ConTR = 0xC1; //0000,0000 看门狗控制寄存器#define CMD_IDLE 0 //空闲模式#define CMD_READ 1 //IAP字节读命令#define CMD_PROGRAM 2 //IAP字节编程命令#define CMD_ERASE 3 //IAP扇区擦除命令#define ENABLE_IAP 0x83 //if SYSCLK<12MHz#define BUTTON_ADDRESS 0x0100 //测试地址void IapIdle(){ IAP_ConTR = 0; //关闭IAP功能 IAP_CMD = 0; //清除命令寄存器 IAP_TRIG = 0; //清除触发寄存器 IAP_ADDRH = 0x80; //将地址设置到非IAP区域 IAP_ADDRL = 0;}BYTE IapReadBYTE(WORD addr){ BYTE dat; //数据缓冲区 IAP_ConTR = ENABLE_IAP; //使能IAP IAP_CMD = CMD_READ; //设置IAP命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); //等待ISP/IAP/EEPROM操作完成 dat = IAP_DATA; //读ISP/IAP/EEPROM数据 IapIdle(); //关闭IAP功能 return dat; //返回}void IapProgramByte(WORD addr, BYTE dat){ IAP_ConTR = ENABLE_IAP; //使能IAP IAP_CMD = CMD_PROGRAM; //设置IAP命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_DATA = dat; //写ISP/IAP/EEPROM数据 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); //等待ISP/IAP/EEPROM操作完成 IapIdle();}void IapEraseSector(WORD addr){ IAP_ConTR = ENABLE_IAP; //使能IAP IAP_CMD = CMD_ERASE; //设置IAP命令 IAP_ADDRL = addr; //设置IAP低地址 IAP_ADDRH = addr >> 8; //设置IAP高地址 IAP_TRIG = 0x5a; //写触发命令(0x5a) IAP_TRIG = 0xa5; //写触发命令(0xa5) _nop_(); //等待ISP/IAP/EEPROM操作完成 IapIdle();}void DELAY_1MS(unsigned int z){ unsigned char i, j,k; for(k=z;k>0;k--) { _nop_(); _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); }}void main(){ flag=0; WDT_ConTR = 0x35; //启动看门狗 while (1) { WDT_ConTR = 0x35; //启动看门狗 if(flag==0) { if(IapReadByte(BUTTON_ADDRESS)==0) { LED=1; } else if(IapReadByte(BUTTON_ADDRESS)==1) LED=0; else { IapEraseSector(BUTTON_ADDRESS); IapProgramByte(BUTTON_ADDRESS,BUTTON_TEMP); } flag=1; } if(SWITCH==0) { DELAY_1MS(20); if(SWITCH==0) { while(!SWITCH); flag=0; BUTTON_TEMP=!BUTTON_TEMP; IapEraseSector(BUTTON_ADDRESS); IapProgramByte(BUTTON_ADDRESS,BUTTON_TEMP); } } }}

  • 收藏

分享给我的朋友们:

上一篇:双控开关的连接方法及常见的照明控制原理(双控开关的连接方法及常见的照明控制原理图) 下一篇:天燃气热水器选购注意什么 天燃气热水器的禁忌是什么

一键免费领取报价清单 专享六大服务礼包

装修全程保障

免费户型设计+免费装修报价

已有312290人领取

关键字: 装修百科 装修咨询 装修预算表

发布招标得免费设计

申请装修立省30%

更多装修专区

点击排行