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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3490|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機控制fm在固定頻率上加減音量和去噪音【求解】

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:95659 發(fā)表于 2015-11-14 13:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
代碼寫了沒有什么邏輯,也沒法測試,有沒有大神幫測試一下,不知道錯了還是對了。。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:95659 發(fā)表于 2015-11-14 13:53 | 只看該作者
本帖最后由 cak123jj 于 2015-11-14 14:33 編輯

#include "list.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_();_nop_();_nop_();
unsigned char code C51BOX2[3] _at_ 0x43;   //仿真器用三字節(jié)空間
unsigned long frequency=760000; //開機初始化的電臺頻率為76MHz
unsigned char KeyValue; //鍵值
unsigned char MenuDelayTime;

sbit FmPow=P1^7;//電源
//sbit KeyGnd  =P3^7;
sbit DATA_M62429=P3^0;
sbit KeyUp   =P1^2;
sbit KeyDown =P1^3;
sbit CK_M62429=P3^1;

unsigned char Vol;

#define Delay1 45    //AT89C2051+12M晶振使用
#define Delay2 150
#define Delay3 2
#define Delay4 100

void Delayus(unsigned char x)
{
        for(;x>0;x--);
}

void iic_start(void)
{
        P30=1;
        Delayus(4);
        P31=1;
        Delayus(4);
        P30=0;
        Delayus(4);
        P31=0;
        Delayus(4);
}

void iic_stop(void)
{
        P31=0;
        Delayus(4);
        P30=0;
        Delayus(4);
        P31=1;
        Delayus(4);
        P30=1;
        Delayus(4);
}

/* 延時子函數(shù) */
void uDelay(unsigned char i)   //us延時子函數(shù),入口參數(shù)每加1約加100us
{
        unsigned char j;
        for(;i>0;i--)
        {
                j=Delay1;
                while(--j);
        }
}
void mDelay(uint Dat)  //ms延時子函數(shù)
{
        uint j;   
        for (;Dat>0;Dat--)
                for (j=Delay2;j>0;j--);
}

/****************以下為EPPROM讀寫相關(guān)函數(shù)*******************************/
/*以下為EPPROM保護,每次操作后更改指令值,使EPPROM免于被誤操作*/
void EPPROM_Protect()
{
        ISP_CONTR=0x00;   //更改指令值,防止出現(xiàn)誤操作
        ISP_CMD=0x00;
        ISP_TRIG=0x00;
        ISP_ADDRH=0x00;
        ISP_ADDRL=0x00;
}


/*以下為扇區(qū)擦除指令,入口參數(shù)為扇區(qū)首地址 */
void EEPROM_Erase(uint Addr)
{
        ISP_ADDRH=Addr/0x100;  //待寫入扇區(qū)首地址
        ISP_ADDRL=0x00;
        ISP_CONTR=0x83;
        ISP_CMD=0x03;  //扇區(qū)擦除指令
        ISP_TRIG=0x46;  //觸發(fā),將擦除整個扇區(qū)
        ISP_TRIG=0xB9;
        EPPROM_Protect(); //更改相關(guān)數(shù)值,防止誤操作
}
/*以下為寫入指令,入口參數(shù)為寫入的地址(16位)和內(nèi)容(8位),每次要寫入的位置*/
void EEPROM_Write(uint Addr,uchar Data)
{
        ISP_DATA=Data; //待寫入值
        ISP_ADDRH=Addr/0x100;  //待寫入扇區(qū)首地址
        ISP_ADDRL=Addr%0x100;
        ISP_CONTR=0x83;
        ISP_CMD=0x02;  //寫入指令
        ISP_TRIG=0x46;  //觸發(fā),數(shù)據(jù)寫入
        ISP_TRIG=0xB9;
        EPPROM_Protect(); //更改相關(guān)數(shù)值,防止誤操作
}

void VolSet(uchar Volume)
{
        uint Dat;
        uchar i;
        Volume=87-Volume;  //得到要送到芯片的實際數(shù)
        Dat=0x600|(Volume&0xfc)|((Volume&0x03)<<7);  //音量合并成控制數(shù)據(jù),詳看DATASHEET

        for (i=0;i<10;i++)        //發(fā)送10位數(shù)據(jù),共11位,最后1位另外發(fā)
        {
                DATA_M62429=Dat&0x01;  
                nop;
                DATA_M62429=0;      
                Dat>>=1;      
        }
        DATA_M62429=1;  
        CK_M62429=1;
        nop;
        CK_M62429=0;
}

void DatSave()
{
        EEPROM_Erase(0x1000);
        EEPROM_Write(0x1000,Vol);
        EEPROM_Write(0x1001,frequency/0x100);
        EEPROM_Write(0x1002,frequency%0x100);
}

/************************按鍵讀取及處理子函數(shù)**************************/
void KeyRead()   //讀鍵值子函數(shù)。返回值:1、2、3、31、4、41。(31、41為長按)
{
        unsigned char i=250;
        KeyUp=1;
        KeyDown=1;
        if(KeyUp&KeyDown)
        {
                KeyValue=0;
                return;
        }
        MenuDelayTime=0;  //清延時計數(shù)器
        mDelay(10);  

        if(!KeyUp)
        {
                if(KeyValue)
                        return; //短按
                while(i)
                {
                        if(KeyUp)
                        {
                                KeyValue=3;
                                return;
                        }
                        mDelay(3);
                        i--;
                }     //短按
                KeyValue=31;  //長按
                return;
        }
        if(!KeyDown)
        {
                if(KeyValue)
                        return;//短按
                while(i)
                {
                        if(KeyDown)
                        {
                                KeyValue=4;
                                return;
                        }
                        mDelay(3);
                        i--;
                }     //短按
                KeyValue=41;     //長按
                return;
        }
}
void KeyProc()    //鍵值處理子函數(shù)3、4、31、41
{
        switch(KeyValue)
        {

                case 3:
                        if(FmPow)
                                break; //關(guān)機狀態(tài)下不處理這個按鍵
                        if(Vol)
                                Vol--;
                        VolSet(Vol);
                        KeyValue=0;
                        DatSave();
                        break;
                case 4:
                        if(FmPow)
                                break; //關(guān)機狀態(tài)下不處理這個按鍵
                        if(Vol<83)
                                Vol++;    //音量減       
                        VolSet(Vol);
                        KeyValue=0;
                        DatSave();
                        break;
                case 31: //KeyUp長按處理
                        if(FmPow)
                                break;
                        if(Vol>4)
                                Vol-=5;
                        else
                                Vol=0;
                        VolSet(Vol);
                        mDelay(600);
                        DatSave();
                        break;
                case 41: //KeyDown長按處理
                        if(FmPow)
                                break;
                        Vol+=5;
                        if(Vol>83)
                                Vol=83;
                        VolSet(Vol);
                        mDelay(600);
                        DatSave();
                        break;
        }
}  

/****************************主函數(shù)*******************************/
void main()
{
        mDelay(1000);       //開機延時,等待設(shè)備穩(wěn)定
        while(frequency != 760000)
        {
                iic_stop();        //去噪音
        }
        iic_start();

        while(1)
        {
                KeyRead();
                KeyProc();
        };

}
回復(fù)

使用道具 舉報

板凳
ID:95659 發(fā)表于 2015-11-14 14:05 | 只看該作者
發(fā)錯了,怎么刪不了。。。
回復(fù)

使用道具 舉報

地板
ID:95659 發(fā)表于 2015-11-14 14:33 | 只看該作者
cak123jj 發(fā)表于 2015-11-14 13:53
#include "list.h"
#include "intrins.h"
#define uchar unsigned char

不知道能成功不。有人幫測試一下么?
回復(fù)

使用道具 舉報

5#
ID:95659 發(fā)表于 2015-11-15 09:19 | 只看該作者
貌似不能固定再頻率76Mhz上,有人幫改一下么
回復(fù)

使用道具 舉報

6#
ID:95659 發(fā)表于 2015-11-16 10:14 | 只看該作者
有沒有人幫忙改改這個程序呀。。感激不盡
回復(fù)

使用道具 舉報

7#
ID:96006 發(fā)表于 2015-11-16 17:45 | 只看該作者
我的幣現(xiàn)在是0啊
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日本啊v在线 | 国产欧美精品一区二区色综合朱莉 | 国产自产21区 | 日本不卡视频 | 欧美激情一区 | 国产欧美一区二区三区日本久久久 | 91视频88av| 天堂色综合| 国产精品美女久久久久久免费 | 国产在线精品一区二区 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲国产欧美精品 | 狠狠干影院 | 国产香蕉视频在线播放 | 午夜久久久久久久久久一区二区 | 日韩不卡一区二区三区 | 欧美性猛交一区二区三区精品 | 宅男噜噜噜66一区二区 | 91久久久www播放日本观看 | 一区二区三区视频播放 | 欧洲一区二区在线 | www.v888av.com | 日韩欧美精品在线 | 亚洲国产精品久久人人爱 | 永久精品| 91香蕉嫩草| 欧美一区二区三区久久精品视 | 日韩精品免费视频 | 欧美电影免费网站 | 欧美精品一区在线观看 | 日韩中文在线观看 | 999国产精品视频免费 | 日韩av视屏 | 在线观看av中文字幕 | 国产一区二区三区 | 午夜电影福利 | 黑人一级片视频 | 精品国产一级片 | 中文字幕亚洲在线 | 性欧美hd| 亚洲精品99|