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, 下载次数: 25)
|