1,VFD 16311顯示+按鍵
2,360度編碼開關
3,紅外遙控6221轉發和解碼
4,音量IC PT2314控制
5,PLL收音 AM/FM控制
6,DVD通訊數據處理
編程規范,代碼風格標準
仔細研究,對初學者應該有一點的幫助,附上源碼
- // Copyright (c) 2006,PTC-SZ-SD
- // All rights reserved.
- // 文件名稱:Tuner.c
- // 文件標識:見配置管理計劃書
- // 摘 要:調用LC72130的驅動程序,實現對tuner接口函數的實現
- #include "..\source\tuner.h"
- //全局變量
- bit b_band = 1; //b_band = 1 FM ;0 AM
- bit b_tuner_flag; //=1收音狀態,=0非
- bit b_tuner_auto_flag; //全自動搜索
- unsigned char tuner_muted_time; //收音靜音時間控制
- unsigned int FMfreq = 8750;
- unsigned int AMfreq = 522;
- unsigned char tuned_current_count;
- unsigned char backup_tuned_FMcount = 30; //
- unsigned char backup_tuned_AMcount = 10;
- //模塊內部變量
- unsigned char LC_dataout[3]; //定義輸出中頻數據緩存數組
- unsigned char IN2_cdata[3]; //定義IN2模式數據緩存數組
- unsigned char IN1_cdata; //定義一個字節IN1地址緩存
- unsigned int IN1_pdata; //定義16bit的分頻數據緩存
- unsigned long IF_count; //中頻記數器
- unsigned char tuned_FMcount; //存儲的電臺臺號
- unsigned char tuned_AMcount;
- bit b_IF_cte_flag = 0;
- bit b_tuner_mute_flag; //收音靜音標志
- bit b_tuner_stereo_flag; //立體聲單聲道標志
- bit b_tuned_flag = 0; // b_tuned_flag = 1 收到臺,0 無臺
- bit b_tuner_search_to_max_flag; //搜索頻段完成標志
- bit b_tuner_scan_flag; //自動搜索
- bit b_tuner_auto_all_ok_flag; //全自動結束
- /*********************************************************************************************
- Function: Tuner PLL72131讀寫控制
- *********************************************************************************************/
- /* Description:
- // HAOYUE's Tuner
- // Macro : No need Macro define
- // Crystal Frequency: 4.5MHz
- // BO1(Out Port): Low -> AM, High -> FM;
- // BO2(Out Port): Low -> Normal, High -> Enable IF count and Mute output(for search station);
- // BO3(Out Port): Low -> MONO, High -> Stereo; (For LC72131)
- // BO4(Out Port): NO USE
- // IO1: No use(10K resistor connected to GND in order to lock-IF)
- // IO2(output Port): Low -> Stereo led on, High -> MONO led on
- */
- void Send_A_byte_to_72131(unsigned char temp)
- {
- unsigned char i;
- for(i = 0; i < 8; i++)
- {
- LC72131_CLK = 0;
- NOP;
- NOP;
- if (temp & 0x01)
- {
- LC72131_DI = 1;
- }
- else
- {
- LC72131_DI = 0;
- }
- temp >>= 1;
- LC72131_CLK = 1;
- }
- }
- void Send_CMD_to_72131(unsigned char cmd,unsigned char part1,unsigned char part2,unsigned char part3)
- {
- LC72131_CE = 0;
- Send_A_byte_to_72131(cmd); //PL72131_IN1_ADD,PL72131_IN2_ADD
- LC72131_CE = 1;
-
- Send_A_byte_to_72131(part1);
- Send_A_byte_to_72131(part2);
- Send_A_byte_to_72131(part3);
-
- LC72131_CE = 0;
- }
- void Read_data_from_72131(void)
- {
- unsigned char i;
- unsigned char j;
- unsigned char value;
-
- LC72131_CE = 0;
- Send_A_byte_to_72131(0x2a); //讀命令
- LC72131_CE = 1;
-
- LC_dataout[0] = 0;
- LC_dataout[1] = 0;
- LC_dataout[2] = 0;
- for( i = 0; i < 3; i++)
- {
- value = 0;
- for( j = 0; j < 8; j++)
- {
- LC72131_CLK = 0;
- NOP;
- NOP;
- NOP;
- NOP;
- NOP;
- value <<=1;
- if( LC72131_DO )
- {
- value |= 0x01;
- }
- LC72131_CLK = 1;
- NOP;
- NOP;
- NOP;
- NOP;
- }
- LC_dataout[i] = value;
- }
- LC72131_CE = 0;
- }
- /*********************************************************************************************
- Function: FM模式狀態設置和數據輸入讀出
- *********************************************************************************************/
- void FM_IN1_mode(void)
- {
- if(b_IF_cte_flag)
- {
- IN1_cdata = 0x26; // H R3 R2 R1 R0 XS CTE DVS SNS L
- // 0 0 1 0 0 0 1 0
- //R3~R0為25KHZ參考頻率設置,XS晶體4.5M
- //CTE=0記數復位 ,CTE=1開始記數
- //DVS SNS(10)fmin 10~160MHZ (00)AMIN 0.5~10M (01)AMIN 2~40MHZ
- }
- else
- {
- IN1_cdata = 0x22;
- }
-
- IN1_pdata = (FMfreq + 1070) / 5; //DVS = 1, SNS = 0覺得實際分頻系數是參考頻率的2倍 = 0.25X2 = 0.5(顯示圓整10倍)
- Send_CMD_to_72131(0x28,(unsigned char)(IN1_pdata),(unsigned char)((IN1_pdata) >> 8),IN1_cdata);
- }
- void FM_IN2_mode(void)
- {
- IN2_cdata[0] = 0x02 ; // BO4 BO3 BO2 BO1 IO2 IO1 IOC2 IOC1; IOC2=1,指定IO2為輸出,IOC1=0,指定IO1為輸入
- // no use stereo1 1(if & mute) AM 1=低電平 FM 0=開路
- /*設置if/mute,b02 high ---->控制mute和if接收*/
- if(b_tuner_mute_flag)
- {
- IN2_cdata[0] &= 0xdf;//BO2 = 1 mute off BO2 = 0 mute on
- }
- else
- {
- IN2_cdata[0] |= 0x20;//BO2 = 1 mute off BO2 = 0 mute on
- }
- /*設置if/mute,b03 high ---->控制stereo*/
- if(b_tuner_stereo_flag)
- {
- IN2_cdata[0] &= 0xbf;//BO3 = 1 stereo BO3 = 0 mono
- }
- else
- {
- IN2_cdata[0] |= 0x40;//BO3 = 1 stereo BO3 = 0 mono
- }
- IN2_cdata[1] = 0x22; //end_UC
- //IN2_cdata[1] = 0x32; // 準備寫入:DNC DOC0 DOC1 DOC2 UL0 UL1 DZ0 DZ1
- // x 0 1 1 0 0 1 0
- IN2_cdata[2] = 0x12; // TEST0-TEST1-TEST2 IFS DLC-TBC-GT1-GT0
- // 0 0 0 1 0 0 1 0
- // TEST0~2 必須為0, 正常模式IFS=1,=0為靈敏度衰減模式
- // DLC電荷泵正常為0 ,TBC=1控制BO1輸出8HZ,40%占空基準信號
- // GT1,GT0(00 4MS 01 8MS 10 32MS 11 64MS)門控時間
- // 中頻記數/門控時間=中頻(FM=10.7MHZ,AM=450KHZ)
- Send_CMD_to_72131(0x29,IN2_cdata[0],IN2_cdata[1],IN2_cdata[2]);
- }
- void FM_Send(void)
- {
- FM_IN2_mode();
- FM_IN1_mode();
- }
- /*********************************************************************************************
- Function: AM模式狀態設置和數據輸入讀出
- *********************************************************************************************/
- void AM_IN1_mode(void)
- {
- if(b_IF_cte_flag)
- {
- IN1_cdata = 0xc4;
- }
- else
- {
- IN1_cdata = 0xc0; // H R3 R2 R1 R0 XS CTE DVS SNS L
- // 1 0 0 1 0 0 0 0
- // R3~R0為9KHZ參考頻率設置,XS晶體4.5M
- // CTE=0記數復位 ,CTE=1開始記數
- // DVS SNS(10)fmin 10~160MHZ (00)AMIN 0.5~10M (01)AMIN 2~40MHZ
- }
-
- IN1_pdata = ((AMfreq + 450) / 3) << 4; //參考頻率是3K,AM是1倍關系,中頻450K //P0 to P3 must be set to 0
- Send_CMD_to_72131(0x28,(unsigned char) IN1_pdata,(unsigned char) (IN1_pdata >> 8),IN1_cdata);
- }
- void AM_IN2_mode(void)
- {
- IN2_cdata[0] = 0x12; // BO4 BO3 BO2 BO1 IO2 IO1 IOC2 IOC1; IOC2=1,指定IO2為輸出,IOC1=0,指定IO1為輸入
- // no use stereo1 1(if & mute) AM 1=低電平 FM 0=開路
- if(b_tuner_mute_flag)
- {
- IN2_cdata[0] &= 0xdf;//BO2 = 1 mute off BO2 = 0 mute on
- }
- else
- {
- IN2_cdata[0] |= 0x20;//BO2 = 1 mute off BO2 = 0 mute on
- }
-
- if(b_tuner_stereo_flag)
- {
- IN2_cdata[0] &= 0xbf;//BO3 = 1 stereo BO3 = 0 mono
- }
- else
- {
- IN2_cdata[0] |= 0x40;//BO3 = 1 stereo BO3 = 0 mono
- }
- IN2_cdata[1] = 0xa4;
- //IN2_cdata[1] = 0xc4; // 準備寫入:DNC DOC0 DOC1 DOC2 UL0 UL1 DZ0 DZ1
- // x 0 1 1 0 0 1 0
- IN2_cdata[2] = 0x11; // TEST0-TEST1-TEST2 IFS DLC-TBC-GT1-GT0
- // 0 0 0 1 0 0 1 0
- // TEST0~2 必須為0, 正常模式IFS=1,=0為靈敏度衰減模式
- // DLC電荷泵正常為0 ,TBC=1控制BO1輸出8HZ,40%占空基準信號
- // GT1,GT0(00 4MS 01 8MS 10 32MS 11 64MS)門控時間
- // 中頻記數/門控時間=中頻(FM=10.7MHZ,AM=450KHZ)
- Send_CMD_to_72131(0x29,IN2_cdata[0],IN2_cdata[1],IN2_cdata[2]);
- }
- void AM_Send(void)
- {
- AM_IN1_mode();
- AM_IN2_mode();
- }
- /*********************************************************************************************
- Function: IF數據獲得和判斷
- *********************************************************************************************/
- void Get_IF_value(bit band)
- {
- b_IF_cte_flag =0; //記數前復位
- if(band)
- {
- FM_IN1_mode();
- }
- else
- {
- AM_IN1_mode();
- }
-
- b_IF_cte_flag =1; //中頻記數開始
- b_tuner_mute_flag = 1; //mute控制開,if數據輸入
- if(band)
- {
- FM_IN1_mode();
- }
- else
- {
- AM_IN1_mode();
- }
- // system_time = 10; //50ms
- // while(system_time);
- system_time = 6; //60ms
- while(LC72131_DO && system_time);
- Read_data_from_72131();
- // Read_data_from_72131();
- IF_count = ( ( ((unsigned long) LC_dataout[0]) << 16 ) | ( ((unsigned long) LC_dataout[1]) << 8 ) | (unsigned long) LC_dataout[2] ) & 0x0fffff;
-
- }
- void FM_IF_compare(void)
- {
- if( (LC_dataout[0] & 0x10) != 0x10) //判斷UL,PLL鎖存了才判斷中頻,否則很多雜臺
- {
- b_tuned_flag = 0; //當沒收到臺
- }
- else
- {
- // if (LC72131_SD == 1)
- if((IF_count > 342250 ) && (IF_count < 342550 )) //FM門控時間32MS, 342400/32 =10700
- {
- b_tuned_flag = 1;
- b_IF_cte_flag =0; //中頻計數器復位
- FM_IN1_mode();
-
- }
- }
- }
- void AM_IF_compare(void)
- {
- if( (LC_dataout[0] & 0x10) != 0x10) //判斷UL,PLL鎖存了才判斷中頻,否則很多雜臺
- {
- b_tuned_flag = 0; //當沒收到臺
- }
- else
- {
- // if (LC72131_SD == 1)
- if((IF_count > 3200 ) && (IF_count < 4000 )) //FM門控時間8MS, 3600/8 = 450
- {
- b_tuned_flag = 1;
- b_IF_cte_flag =0;
- AM_IN1_mode();
- }
- }
- }
復制代碼
全部程序51hei下載地址,注意不含原理圖:
dvdmcu_code.rar
(207.58 KB, 下載次數: 32)
2020-1-6 11:03 上傳
點擊文件名下載附件
|