新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AT89S52+12MHZ+TEA5767的數碼管顯示調頻收音機

        AT89S52+12MHZ+TEA5767的數碼管顯示調頻收音機

        作者: 時間:2016-11-30 來源:網絡 收藏
        /**************************************************************************************************************
        AT89S52+12MHZ+TEA5767的數碼管顯示調頻收音機
        本程序使用數碼管顯示頻率晶振是用12M 已通過測試,收音機的頻率調節是用計算的方法 將顯示的頻率算好后寫到TEA5767
        芯片里面實現調節的 兩個按鍵實現自加或自減頻率 加了連續加減功能!
        使用的是在淘寶上買的4.5元/片的簡化版的TEA5767模塊.
        2012-05-08
        /**************************************************************************************************************/
        #include < reg51.h >
        #define uchar unsigned char
        #define uint unsigned int
        /**************************************************************************************************************/
        sbit SDA = P3^0; //接在TEA5767的數據端口
        sbit SCL = P3^1; //接在TEA5767的時鐘端口
        sbit KEY1 = P3^4; //頻率增加按鍵端口
        sbit KEY2 = P3^5; //頻率減小按鍵端口
        sbit KEY3 = P3^6; //頻率增加按鍵端口
        sbit KEY4 = P3^7; //頻率減小按鍵端口
        #define duan P0 //頻率顯示的數碼管段選P0端口
        //#define gy //使用共陰極時屏蔽這行
        sbit dula=P2^6;
        sbit wela=P2^7;
        uchar IF,ADC,CH;
        //bit RF,STEREO;
        #ifdef gy
        unsigned char code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//顯示位碼
        unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//數碼管顯示編碼
        #else
        /**************************************************************************************************************/
        unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //數碼管顯示編碼
        unsigned char code dispbit[]={0x7e,0x7d,0x7b,0x77,0x6f,0x5f};/*定義點亮的數碼管與數組的關系*/
        #endif
        /**************************************************************************************************************
        unsigned char radio_write_data[5] = {0x2c,0xe1,0x70,0x16,0x80}; //頻率為93.9MHz 廣東音樂電臺
        unsigned char radio_write_data[5] = {0x30,0x5c,0x70,0x16,0x80}; //頻率為101.2MHz 廣東電臺音樂之聲
        unsigned char radio_write_data[5] = {0x31,0x38,0x70,0x16,0x80}; //頻率為103.0MHz 廣東珠江經濟電臺
        unsigned char radio_write_data[5] = {0x31,0xd7,0x70,0x16,0x80}; //頻率為104.3MHz 寶安廣播電臺
        unsigned char radio_write_data[5] = {0x32,0x20,0x70,0x16,0x80}; //頻率為104.9MHz 中央人民廣播電臺華夏之聲
        unsigned char radio_write_data[5] = {0x33,0x2d,0x70,0x16,0x80}; //頻率為107.1MHz 中國國際廣播電臺環球資訊
        /**************************************************************************************************************/
        unsigned char radio_read_data[5];
        unsigned char radio_write_data[5];
        unsignedlongfrequency = 104900; //開機初始化的電臺頻率為104.9MHz中央民廣播電臺華夏之聲
        unsigned int PLL; //計算頻率合成時用的變量
        /**************************************************************************************************************/
        void Delayus(unsigned char x)
        {
        for(;x > 0;x--);
        }
        /**************************************************************************************************************/
        void iic_start() //啟動總線傳輸
        {
        SDA = 1;
        Delayus(4);
        SCL = 1;
        Delayus(4);
        SDA = 0;
        Delayus(4);
        SCL = 0;
        Delayus(4);
        }
        /**************************************************************************************************************/
        void iic_stop() //結束總線傳輸
        {
        SCL = 0;
        Delayus(4);
        SDA = 0;
        Delayus(4);
        SCL = 1;
        Delayus(4);
        SDA = 1;
        Delayus(4);
        }
        /**************************************************************************************************************/
        void iic_ack() //發送應答位
        {
        SDA = 0;
        Delayus(4);
        SCL = 1;
        Delayus(4);
        SCL = 0;
        Delayus(4);
        SDA = 1;
        Delayus(4);
        }
        /**************************************************************************************************************/
        bit iic_testack()
        {
        bit ErrorBit;
        SDA = 1;
        Delayus(4);
        SCL = 1;
        Delayus(4);
        ErrorBit = SDA;
        Delayus(4);
        SCL = 0;
        return ErrorBit;
        }
        /**************************************************************************************************************/
        void iic_write8bit(unsigned char input) //寫一個字節的數據到總線上
        {
        unsigned char temp;
        for(temp = 8;temp > 0;temp--)
        {
        SDA = (bit)(input & 0x80);
        Delayus(4);
        SCL = 1;
        Delayus(4);
        SCL = 0;
        Delayus(4);
        input = input << 1;
        }
        }
        /**************************************************************************************************************/
        uchar iic_rdbyt() //從總線上讀取一個字節的數據
        {
        uchar a = 0,i = 0;
        for(i = 0;i < 8;i++)
        {
        SDA = 1;
        SCL = 1;
        if(SDA == 1)
        {
        a = (a << 1) + 1;
        SCL = 0;
        }
        else if(SDA == 0)
        {
        a = a << 1;
        SCL = 0;
        }
        }
        return(a);
        }
        /**************************************************************************************************************/
        void delays (unsigned char b) //按鍵消抖用的延時程序
        {
        unsigned char i;
        for(b;b > 0;b--)
        for(i = 0;i < 250;i++);
        }
        /**************************************************************************************************************/
        void radio_write(void) //寫入TEA5767
        {
        unsigned char i;
        iic_start(); //啟動總線傳輸
        iic_write8bit(0xc0); //TEA5767寫地址
        if(!iic_testack())
        {
        for(i = 0;i < 5;i++)
        {
        iic_write8bit(radio_write_data); //寫一個字節的數據到總線上
        iic_ack(); //發送應答位
        }
        }
        iic_stop(); //結束總線傳輸
        }
        /**************************************************************************************************************/
        //將顯示的頻率算好后寫到TEA5767芯片里面實現調節,不用考慮TEA5767用于搜臺的相關位:SM,SUD
        //寫模式
        //數據字節1 數據字節2 數據字節3 數據字節4 數據字節5
        void search()
        {
        PLL = (unsigned int)((float)((frequency + 225)) / (float)8.192); //計算合成頻率數據 頻率單位:k
        /**************************************************************************************************************/
        //數據字節1的格式 radio_write_data[0]
        //位7(高位) 位6 位5 位4 位3 位2 位1 位0(低位)
        // MUTE SM PLL13 PLL12 PLL11 PLL10 PLL9 PLL8
        //7 MUTE 如果MUTE=1 則左右聲道被靜音;MUTE=0 左右聲道正常工作。
        //6 SM 如果SM=1 則處于搜索模式 SM=0 不處于搜索模式。
        //5到0 PLL[13:8] 設定用于搜索和預設的可編程頻率合成器。
        radio_write_data[0] = PLL / 256; //將算好的頻率高位數據存入將要TEA5767的數組里
        /**************************************************************************************************************/
        //數據字節2的格式 radio_write_data[1]
        //位7(高位) 位6 位5 位4 位3 位2 位1 位0(低位)
        // PLL7 PLL6 PLL5 PLL4 PLL3 PLL2 PLL1 PLL0
        //PLL[7:0] 設定用于搜索和預設的可編程頻率合成器。
        radio_write_data[1] = PLL % 256; //將算好的頻率低位數據存入將要TEA5767的數組里

        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 图片| 封开县| 峨山| 无棣县| 会昌县| 香港| 紫阳县| 武冈市| 筠连县| 新平| 曲周县| 青州市| 京山县| 吴川市| 绵竹市| 聂拉木县| 千阳县| 望谟县| 西畴县| 彭山县| 定南县| 红桥区| 前郭尔| 合山市| 霍邱县| 兰坪| 上犹县| 榆中县| 娄底市| 隆德县| 漳平市| 永善县| 手游| 分宜县| 灵武市| 张家港市| 湾仔区| 本溪| 永嘉县| 克山县| 平和县|