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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3502|回復: 6
收起左側

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

[復制鏈接]
ID:95659 發表于 2015-11-14 13:52 | 顯示全部樓層 |閱讀模式
代碼寫了沒有什么邏輯,也沒法測試,有沒有大神幫測試一下,不知道錯了還是對了。。
回復

使用道具 舉報

ID:95659 發表于 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;   //仿真器用三字節空間
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);
}

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

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


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

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

        for (i=0;i<10;i++)        //發送10位數據,共11位,最后1位另外發
        {
                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);
}

/************************按鍵讀取及處理子函數**************************/
void KeyRead()   //讀鍵值子函數。返回值:1、2、3、31、4、41。(31、41為長按)
{
        unsigned char i=250;
        KeyUp=1;
        KeyDown=1;
        if(KeyUp&KeyDown)
        {
                KeyValue=0;
                return;
        }
        MenuDelayTime=0;  //清延時計數器
        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()    //鍵值處理子函數3、4、31、41
{
        switch(KeyValue)
        {

                case 3:
                        if(FmPow)
                                break; //關機狀態下不處理這個按鍵
                        if(Vol)
                                Vol--;
                        VolSet(Vol);
                        KeyValue=0;
                        DatSave();
                        break;
                case 4:
                        if(FmPow)
                                break; //關機狀態下不處理這個按鍵
                        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;
        }
}  

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

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

}
回復

使用道具 舉報

ID:95659 發表于 2015-11-14 14:05 | 顯示全部樓層
發錯了,怎么刪不了。。。
回復

使用道具 舉報

ID:95659 發表于 2015-11-14 14:33 | 顯示全部樓層
cak123jj 發表于 2015-11-14 13:53
#include "list.h"
#include "intrins.h"
#define uchar unsigned char

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

使用道具 舉報

ID:95659 發表于 2015-11-15 09:19 | 顯示全部樓層
貌似不能固定再頻率76Mhz上,有人幫改一下么
回復

使用道具 舉報

ID:95659 發表于 2015-11-16 10:14 | 顯示全部樓層
有沒有人幫忙改改這個程序呀。。感激不盡
回復

使用道具 舉報

ID:96006 發表于 2015-11-16 17:45 | 顯示全部樓層
我的幣現在是0啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频不卡 | 一区二区三区高清在线观看 | 亚洲精品一二三区 | 国产成人综合在线 | 国产精品久久久亚洲 | 国产一区二区在线免费观看 | 一区二区三区国产 | 午夜国产一区 | 国产高清久久久 | 国产成人高清视频 | 欧美日韩综合 | www久久99| 成人福利视频网站 | 在线国产99 | 欧美黄色一区 | 看片地址| 国产观看 | 亚洲成人免费视频 | 玖玖在线免费视频 | 韩日视频在线观看 | 深夜爽视频| 一二三四在线视频观看社区 | av一区二区三区 | 国产免费一区二区 | 免费av观看 | 日韩欧美综合在线视频 | 日韩国产精品一区二区三区 | 一区视频| 国产一区二区三区视频 | 精品一区二区久久 | 亚洲精品一区二区网址 | 亚洲国产精品网站 | 黄色精品 | 亚洲精品9999久久久久 | 国产福利精品一区 | a在线观看| 久久国产精品视频 | 中文欧美日韩 | 成人福利电影 | 久久亚洲欧美日韩精品专区 | 自拍亚洲 |