标题:
代码规范的组合音响 单片机程序开源
[打印本页]
作者:
feeling1791
时间:
2020-1-6 11:05
标题:
代码规范的组合音响 单片机程序开源
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.png
(12.9 KB, 下载次数: 54)
下载附件
2020-1-6 18:05 上传
全部程序51hei下载地址,注意不含原理图:
dvdmcu_code.rar
(207.58 KB, 下载次数: 32)
2020-1-6 11:03 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
GUOJF2020
时间:
2022-12-7 10:51
这个就是另外一个贴子的主控程序,我现在想把手头上的功放板升级一下。更换一下蓝牙前级,有这方面问题想请教你一下479361682
作者:
dabin895888
时间:
2022-12-15 16:20
感谢楼主,新手学习的好资料。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1