久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7329|回復: 10
打印 上一主題 下一主題
收起左側

AT89C2051單片機單鍵控制掉電并鎖定四路音頻切換電路和程序

[復制鏈接]
跳轉到指定樓層
樓主
本人菜鳥,前段時間按網友推薦用CD4017做了一個4路音頻輸入切換控制板(下圖),發現掉電時不能鎖定掉電前的那一路,每次通電總是默認接通第一路,后加紐扣記憶電池雖然可以實現記憶了,但耗電很快,不到5天時間工作又不能記憶了。跪求單片機大俠提供AT89C2051或其它單片機的電路和程序
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:82765 發表于 2017-6-16 12:25 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

板凳
ID:82765 發表于 2017-6-16 12:29 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

地板
ID:206288 發表于 2017-6-24 11:08 | 只看該作者
cjjcjj1 發表于 2017-6-16 12:29
不好意思,理解錯了

沒關系的,互相學習嘛
回復

使用道具 舉報

5#
ID:213173 發表于 2017-6-25 08:59 | 只看該作者
1.采用內含EEPROM的單片機,把操作數據保存,下次開機讀取保存的操作數據控制相應電路,如STC15F104等
2.AT89C2051+外接EEPROM,把操作數據保存,下次開機讀取保存的操作數據控制相應電路,如AT24CXX系列
3.使用充電電池,只單獨給4017保持供電,4017靜態電流不到1mA,4個晶體管換為MOS管,以降低4017電耗
回復

使用道具 舉報

6#
ID:214390 發表于 2017-6-25 10:15 | 只看該作者

1.采用內含EEPROM的單片機,把操作數據保存,下次開機讀取保存的操作數據控制相應電路,如STC15F104等
2.AT89C2051+外接EEPROM,把操作數據保存,下次開機讀取保存的操作數據控制相應電路,如AT24CXX系列
3.使用充電電池,只單獨給4017保持供電,4017靜態電流不到1mA,4個晶體管換為MOS管,以降低4017電耗
回復

使用道具 舉報

7#
ID:206288 發表于 2017-6-30 15:13 | 只看該作者
wulin 發表于 2017-6-25 08:59
1.采用內含EEPROM的單片機,把操作數據保存,下次開機讀取保存的操作數據控制相應電路,如STC15F104等
2.A ...

我想用STC15F104,能否給具體的電路和程序
回復

使用道具 舉報

8#
ID:213173 發表于 2017-7-1 09:58 | 只看該作者
jimi123 發表于 2017-6-30 15:13
我想用STC15F104,能否給具體的電路和程序

給你寫了程序和電路圖:

#include "STC15W104.H"                                 //單片機頭文件
//#include "STC15F104.H"                                 //單片機頭文件
#include <intrins.h>                                //庫頭文件
#define uint unsigned int                         //宏定義數據類型uint
#define uchar unsigned char                 //宏定義數據類型uchar
/**宏定義ISP的操作命令****/
#define CMD_IDLE    0               //空閑模式
#define CMD_READ    1               //IAP字節讀命令
#define CMD_PROGRAM 2               //IAP字節編程命令
#define CMD_ERASE   3               //IAP扇區擦除命令
#define ENABLE_IAP  0x82            //CPU的等待時間
#define IAP_ADDRESS 0x0400                        //測試地址
/********端口定義*********/
sbit OUT1=P3^0;                                                //輸出端口定義
sbit OUT2=P3^1;
sbit OUT3=P3^2;
sbit OUT4=P3^3;
sbit CN  =P3^4;                                                //備用端口定義
sbit key =P3^5;                                                //按鍵端口定義       
/*******變量聲明**********/
uchar ch;                                                        //中間變量
uint  tim;                                                        //鍵值變量
bit   flag=0;                                                //操作標志
/******子程序聲明*********/
void keyscan();                                                //按鍵識別子程序聲明
void key_service();                                 //按鍵服務程序聲明
void Preservation();                                //寫入狀態數據
/****EEPROM操作程序聲明****/
void IapIdle();                                                //關閉IAP/EEPROM
uchar IapReadByte(uint addr);                //讀取EEPROM數據
void IapProgramByte(uint addr, uchar dat);//寫入EEPROM數據
void IapEraseSector(uint addr);                //擦除EEPROM數據

/*******主函數*************/
void main()                                               
{
        P3M1 = 0x00;                                         //設置P3.0~P3.3推挽模式:0000 0000
        P3M0 = 0x0f;                                         //設置P3.0~P3.3推挽模式:0000 1111
        tim=IapReadByte(IAP_ADDRESS);        //程序開始時讀取EEPROM中數據               
        if((tim<1)||(tim>4))                        //判斷讀取的鍵值數據是否有效
        {
                tim=0;                                                //鍵值數據無效即清0
        }
        while(1)
        {
                keyscan();                                        //按鍵識別程序
                key_service();                                //按鍵服務程序
                Preservation();                                //保存鍵值程序
                P1=ch;                                                //輸出狀態
        }
}
/*********按鍵識別子程序**********/
void keyscan()
{
        static bit key_sign=0;                //按鍵自鎖標志
        static uchar count=0;                //消抖計數變量                       
        if(key==0)                                        //檢測按鍵如果為0
        {
                count++;                                //消抖計數
                if(count>=100)                        //100次檢測按鍵如果為0
                {                       
                        count=100;                        //防止溢出
                        if(key_sign==0)                //按鍵自鎖標志為0
                        {
                                key_sign=1;                //按鍵自鎖標志置1
                                flag=1;                        //操作標志置1
                                tim++;                        //狀態變量自+1               
                                if(tim>4)                //如果tim>4
                                  tim=0;                //tim>4清0
                        }
                }
        }
        else
        {
                key_sign=0;                                //按鍵自鎖標志清0
                count=0;                                //消抖計數清0
        }
}
/*********按鍵服務程序**********/
void key_service()
{
        switch(tim)
        {
                case 0: ch=0xf0;                 //備用端輸出高電平
                break;

                case 1: ch=0xe1;                //第1通道輸出高電平
                break;

                case 2: ch=0xe2;                //第2通道輸出高電平
                break;

                case 3: ch=0xe4;                //第3通道輸出高電平
                break;

                case 4: ch=0xe8;                //第4通道輸出高電平
                break;
        }
}
/*********保存鍵值數據程序**********/
void Preservation()
{
        if(flag==1)                                                //如果操作標志為1
        {
                flag=0;                                                //操作標志清0
                IapEraseSector(IAP_ADDRESS);//擦除EEPROM數據
                IapProgramByte(IAP_ADDRESS,tim);//寫入EEPROM數據
        }
}
/**********關閉IAP功能************/
void IapIdle()
{
    IAP_CONTR = 0;                  //關閉IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除觸發寄存器
    IAP_ADDRH = 0x80;               //將地址設置到非IAP區域
    IAP_ADDRL = 0;
}
/***從ISP/IAP/EEPROM區域讀取一字節***/
uchar IapReadByte(uint addr)
{
    uchar 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(uint addr, uchar 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();                      //關閉IAP功能
}
/***ISP/IAP/EEPROM扇區擦除****/
void IapEraseSector(uint 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();                      //關閉IAP功能
}

4路記憶控制器.zip (57.33 KB, 下載次數: 66)

回復

使用道具 舉報

9#
ID:206288 發表于 2017-7-4 09:28 | 只看該作者
wulin 發表于 2017-7-1 09:58
給你寫了程序和電路圖:

#include "STC15W104.H"                                 //單片機頭文件

感謝您的無私奉獻,回頭我試試。
回復

使用道具 舉報

10#
ID:46999 發表于 2018-7-20 08:00 | 只看該作者
wulin 發表于 2017-7-1 09:58
給你寫了程序和電路圖:

#include "STC15W104.H"                                 //單片機頭文件

照著搭了個電路試了下。手動切換是可以的。但是貌似EEPROM沒能寫成功。斷電后重新上電不是斷電前的狀態。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产97久久 | 日韩av在线不卡 | 国产你懂的在线观看 | 一级黄色播放 | 国产精品自拍av | 免费成人在线网站 | 亚洲精品视频在线观看视频 | 亚洲成人动漫在线观看 | 新疆少妇videos高潮 | 黄色免费av | 99久久婷婷国产综合精品电影 | 成人免费视频久久 | 欧美日韩在线一区二区三区 | 日韩在线观看中文字幕 | 亚洲免费观看视频网站 | 久久这里只有精品首页 | 国产精品久久久久久久久免费樱桃 | 色.com| 黄色精品视频网站 | 天堂色区 | 精品中文字幕在线 | 国产成人99 | 一区二区三区四区av | 亚洲性网| 青草久久免费视频 | 欧美日韩中文字幕在线 | 久久久久国产精品www | 午夜影院视频 | 久久这里只有精品首页 | 日韩一区二区成人 | 综合久久综合久久 | 九九热精品视频在线观看 | 国产欧美日韩精品在线观看 | av色在线| 久www| 久久99视频精品 | 久久久久久91 | 一区二区三区福利视频 | a免费视频 | 欧美做暖暖视频 | 一二区成人影院电影网 |