91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發新帖

高山云----自制一款帶記憶的開關

前些天在自己的車上改裝了一個音頻切換電路,由于音頻信號是雙聲道,就必須要一個雙刀雙擲的開關來進行切換,但現在雙刀雙擲的開關已經很少了,再者安裝不方便于是就有了這個小電路。花了20分鐘寫了個小程序,測試了一下效果很不錯,價格也和好點的雙刀雙擲開關差不太多。

電路:

33332222111

實際電路:

111111111111

來個背面圖,簡潔小巧

222222222222

功能:上電先調用上次單片機內部EEPROM中的數據控制繼電器是開或關,按鍵按下后把數據取反送入內部EEPROM進行保存,方便下次開機調用。

全部回復(5)
正序查看
倒序查看
2014-10-28 13:57

程序如下:

#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		        //測試地址

/*----------------------------
關閉IAP
----------------------------*/
void IapIdle()
{
    IAP_CONTR = 0;                  //關閉IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除觸發寄存器
    IAP_ADDRH = 0x80;               //將地址設置到非IAP區域
    IAP_ADDRL = 0;
}

/*----------------------------
從ISP/IAP/EEPROM區域讀取一字節
----------------------------*/
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;                     //返回
}

/*----------------------------
寫一字節數據到ISP/IAP/EEPROM區域
----------------------------*/
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);  
			}
		}					
	}
}

0
回復
2014-10-28 16:39
@yueyunno1
程序如下:#include"reg51.h"#include"intrins.h"typedefunsignedcharBYTE;typedefunsignedintWORD;/*---------------------------------------------------------------------*//*--端口定義---------------------------------------*//*---------------------------------------------------------------------*/sbitSWITCH=P3^2;sbitLED=P3^4;/*---------------------------------------------------------------------*//*--變量定義---------------------------------------*//*---------------------------------------------------------------------*/bitflag,BUTTON_TEMP;//-----------------------------------------------sfrIAP_DATA=0xC2;//IAP數據寄存器sfrIAP_ADDRH=0xC3;//IAP地址寄存器高字節sfrIAP_ADDRL=0xC4;//IAP地址寄存器低字節sfrIAP_CMD=0xC5;//IAP命令寄存器sfrIAP_TRIG=0xC6;//IAP命令觸發寄存器sfrIAP_CONTR=0xC7;//IAP控制寄存器sfrWDT_CONTR=0xC1;//0000,0000看門狗控制寄存器#defineCMD_IDLE0//空閑模式#defineCMD_READ1//IAP字節讀命令#defineCMD_PROGRAM2//IAP字節編程命令#defineCMD_ERASE3//IAP扇區擦除命令#defineENABLE_IAP0x83//ifSYSCLK>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發命令(0x5a)IAP_TRIG=0xa5;//寫觸發命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成dat=IAP_DATA;//讀ISP/IAP/EEPROM數據IapIdle();//關閉IAP功能returndat;//返回}/*----------------------------寫一字節數據到ISP/IAP/EEPROM區域----------------------------*/voidIapProgramByte(WORDaddr,BYTEdat){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_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();}/*----------------------------扇區擦除----------------------------*/voidIapEraseSector(WORDaddr){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_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();}/*---------------------------------------------------------------------*//*--延時子程序---------------------------------------*//*---------------------------------------------------------------------*/voidDELAY_1MS(unsignedintz){unsignedchari,j,k;for(k=z;k>0;k--){_nop_();_nop_();_nop_();i=11;j=190;do{while(--j);}while(--i);}}/*---------------------------------------------------------------------*//*--主程序---------------------------------------*//*---------------------------------------------------------------------*/voidmain(){flag=0;WDT_CONTR=0x35;//啟動看門狗while(1){WDT_CONTR=0x35;//啟動看門狗if(flag==0){if(IapReadByte(BUTTON_ADDRESS)==0){LED=1;}elseif(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);}}}}
樂老師,你又有好東西
0
回復
2014-10-28 21:13
@電源網-娜娜姐
樂老師,你又有好東西[圖片]
哈哈,我的車車沒有藍牙,自己給車車改裝了藍牙。
0
回復
2015-01-20 13:34
云哥,什么時候專門開個帖子,講講:RAM,SRAM,DRAM,FRAM;還有ROM,PROM,EPROM,EEPROM,FLASH~~
0
回復
2024-03-06 09:51

點贊

0
回復
主站蜘蛛池模板: 河南省| 新沂市| 即墨市| 株洲县| 汤原县| 凤台县| 商城县| 遂川县| 福清市| 京山县| 西盟| 任丘市| 台山市| 宜城市| 从化市| 银川市| 醴陵市| 宝坻区| 博乐市| 通许县| 射洪县| 阿巴嘎旗| 浦县| 耿马| 多伦县| 宁海县| 嘉兴市| 交口县| 利辛县| 桃江县| 尉氏县| 滦南县| 嘉黎县| 甘孜县| 南宁市| 开原市| 平昌县| 禄劝| 开远市| 昭苏县| 岚皋县|