硬件电路的设计
(末尾附文件)
系统的功能分析及体系结构设计
3.1.1系统功能分析
本设计由STM32F103C8T6单片机电路+液晶1602显示电路+收音机模块TEA5767电路+按键电路+LM386喇叭功放电路组成。
1、通过LCD1602液晶实时显示收音机的频率。
2、通过按键可以调节频率,当调制解调成功后,喇叭输出广播或者通过耳机进行收听。
4、耳机和喇叭只能进行一个接受,本设计不赠送耳机的,有板载喇叭。
3、频率调节范围:87.5MHZ–108MHZ。
3.1.2系统总体结构
本系统具体框图如下图所示:
原理图:
STM32单片机核心电路设计
STM32系列处理器是意法半导体ST公司生产的一种基于ARM 7架构的32位、支持实时仿真和跟踪的微控制器。选择此款控制芯片是因为本系统设计并非追求成本的最低或更小的功耗,而是在实现本设计功能的前提下能够提供更丰富的接口和功能以便于设计实验系统各实验项目所需的外围扩展电路。此款控制芯片在完成单片机课程的学习后上手较为容易,在医疗器械中应用广泛,具有很好的学习、实验研究价值。
一、STM32的主要优点:
(1)使用ARM最新的、先进架构的Cortex-M3内核
(2) 优异的实时性能
(3) 杰出的功耗控制
(4) 出众及创新的外设
(5) 最大程度的集成整合
(6) 易于开发,可使产品快速将进入市场
二、STM32——最佳的平台选项
对于使用同一平台进行多个项目开发而言,STM32是最
佳的选择:
(1) 从仅需少量的存储空间和管脚应用到需要更多的存储空间和管脚的应用
(2) 从苛求性能的应用到电池供电的应用
(3) 从简单而成本敏感的应用到高端应用
(4) 全系列脚对脚、外设及软件的高度兼容性,给您带来全方位的灵活性。您可以在不必修改您原始框架及软件的条件下,将您的应用升级到需要更多存储空间或精简到使用更少存储空间/ 或改用不同的封装的规格。
STM32F103C8T6单片机核心板接口电路图如下图所示。
按键电路(含上拉电阻)设计
轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以是开关接通,松开时是开关就断开连接,实现原理主要是通过轻触按键内部的金属弹片受力弹动来实现接通和断开的。
在本系统中,按键作为系统的输入,起到了人机交互的枢纽作用。按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平。进而实现对系统的手动输入。其电路原理图如下图所示。电路中电阻作用为上拉电阻,保证按键信号的稳定输出。
LM386功率放大器电路设计
本设计扬声器放大电路选择LM386芯片进行放大,放大声音可调。
LM386是美国国家半导体公司生产的音频功率放大器,是一种音频集成功放,具有自身功耗低、更新内链增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点的功率放大器,广泛应用于录音机和收音机之中。为使外围元件最少,电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。
二、注意事项
(1)PCB设计时,所有外围元件尽可能靠近LM386;地线尽可能粗一些;输入音频信号通路尽可能平行走线,输出亦如此。
(2)耦合电容。此电容的作用有二:隔直+耦合。隔断直流电压,直流电压过大有可能会损坏喇叭线圈;耦合音频的交流信号。它与扬声器负载构成了一阶高通滤波器。减小该电容值,可使噪声能量冲击的幅度变小、宽度变窄;太低还会使截止频率(fc=1/(2πRLCout))提高。功率放大器的电路原理图如下图所示。电位器可以调节声音大小,电容均为滤波电容。电阻均为限流电阻。
TEA5767收音机模块电路设计
TEA5767是飞利浦公司生产的一款收音机芯片,FM收音功能,这个功能主要是有FM收音模块来完成。其中FM收音模块的核心就是下面的Philips(飞利浦)TEA5767。这是一块性能比较良好的FM收音芯片,很多的MP3都是用这个型号来实现FM收音功能。高灵敏度,高稳定性,低噪音。
本收音机模块采用飞利蒲公司FM调频专用芯片模组TEA5767,板上采用飞利蒲公司耳机功放芯片TDA1308作为音频放大。板载3.5MM 音频接口 可以直接接耳机、功放等。
和单片机通讯只要接 电源 地 和2根I2C 通讯线就可以。
电路板 背后,标有 I2C接口定义 电源接口定义,音频输出,天线接口。
TEA5767内置了主频高达75MHZ的数字信号处理器,实现384KBPS/48KHZ的MD级高品质MP3音乐文件回放,加上拥有一般MP3播放器难以企及的高保真回放线路(信噪比高达95DB,THD总谐波失真率〈0.05%〉,同时非常省电。
一、TEA5767模块参数
(1)频率范围从76—108MHZ自动数字调谐。
(2)一片低功耗电调谐调频立体声收音机电路,其内部集成了中频选频和解调网络,可以做到完全免调。
(3)高灵敏度(使用低噪声射频输入放大器)。
(4)高放自动增益控制(AGC)电路。
(5)LC调谐振荡用低成本固定芯片。
(6)调频中频选择在内部完成,中频免调。
(7)锁相环调谐系统。
(8)软静音,立体声消噪(SNC),高电平切割 (HCC)能通过总线关断
(9)电源:5V
(10)电路板尺寸:31 X 30 MM
(11)带有电源反向保护二极管
(12)板上带有电源输出滤波电感
(13)多个电容组合滤波
(14)蓝色电源指示灯
(15)可以直接拔插的天线口
(16)I2C总线通讯
TEA5767模块在电路中的原理图如下,电阻均为上拉电阻,保证信号的稳定输出。
系统软件设计
#include "fm_TEA5767.h"//*****************参数定义*****************************
unsigned long int FM_FREQ; //频率
unsigned short int FM_PLL; //PLL
//uchar sbuf[5]; // 数据发送缓冲区uchar sbuf[5]={0XF0,0X2C,0XD0,0X10,0X40}; //FM模块预设值uchar rbuf[5]={0X00,0X00,0X00,0X00,0X00};uchar ampint[5]={0X27,0X40,0X42,0X46,0XC3};uchar numbyte;
uchar numbyte_AMP;
uchar ADDRESS_AMP;
uchar ADDRESS_SEND; //TEA5767发送地址
uchar ADDRESS_RECEIVE; //TEA5767接收地址
//uchar rbuf[5]; // 数据接收缓冲区
//uchar ampint[5];
uchar PLL_HIGH;
uchar PLL_LOW; //设定用于搜索和预设的可编程频率合成器
uchar I2C_byte1;//发送的五字节TEA5767可位寻址的设置值
uchar I2C_byte2;
uchar I2C_byte3;
uchar I2C_byte4;
uchar I2C_byte5;#define MUTEI2CB1 0x80
#define SMI2CB1 0x40
#define SUDI2CB3 0x80
//sbit MUTE =I2C_byte1^7;//如果MUTE=1,则左右声道被静音;MUTE=0,左右声道正常工作
//sbit SM = I2C_byte1^6; //SM=1,则处于搜索模式;SM=0,不处于搜索模式
//sbit SUD=I2C_byte3^7; //SUD=1,增加频率搜索;SUD=0,减小频率搜索uchar byte1;
uchar byte2;
uchar byte3;
uchar byte4;
uchar byte5;
uchar num1,num2,num3,num4;
uchar tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
unsigned char NACK; // 错误标志位
unsigned char foo;#define SDA_RCC RCC_APB2Periph_GPIOC
#define SDA_GPIO GPIOC
#define SDA_GPIO_PIN GPIO_Pin_13#define SCL_RCC RCC_APB2Periph_GPIOC
#define SCL_GPIO GPIOC
#define SCL_GPIO_PIN GPIO_Pin_14#define SCL_OUT() SCL_Set_Output() //置位scl
#define SET_SCL() GPIO_SetBits(SCL_GPIO, SCL_GPIO_PIN) //置位scl
#define CLE_SCL() GPIO_ResetBits(SCL_GPIO, SCL_GPIO_PIN)//清楚scl#define SDA_OUT() SDA_Set_Output()
#define SDA_INT() SDA_Set_Input()
#define SET_SDA() GPIO_SetBits(SDA_GPIO, SDA_GPIO_PIN)//置位sda
#define CLE_SDA() GPIO_ResetBits(SDA_GPIO, SDA_GPIO_PIN)//清楚sda
#define SDA_VAL() GPIO_ReadInputDataBit(SDA_GPIO, SDA_GPIO_PIN)#define SDA_V PCin(13)
#define SDA PCout(13)
#define SCL PCout(14) void SCL_Set_Output(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(SDA_RCC,ENABLE);//使能时钟GPIO_InitStructure.GPIO_Pin = SCL_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SCL_GPIO, &GPIO_InitStructure);
} void SDA_Set_Output(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(SDA_RCC,ENABLE);//使能时钟GPIO_InitStructure.GPIO_Pin = SDA_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SDA_GPIO, &GPIO_InitStructure);
} void SDA_Set_Input(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(SCL_RCC,ENABLE);//使能时钟 GPIO_InitStructure.GPIO_Pin = SDA_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SDA_GPIO, &GPIO_InitStructure);
}//void LCMInit(void);//LCD初始
//void DelayMs(uint Ms);//1MS基准延时程序
//void WriteDataLCM (uchar WDLCM);//LCD模块写数据
//void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令
//uchar ReadStatusLCM(void);//读LCD模块的忙标
//void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
//void LCDshow(void);
//void DelayMs(uint Ms);
//void show(); //开机问候语//******************************************
void init(void)
{ SCL_OUT();SDA_OUT();numbyte = 5;numbyte_AMP=5;ADDRESS_SEND = 0xC0;// TEA5767写地址 1100 0000ADDRESS_RECEIVE=0XC1;//TEA5767读地址 1100 0001ADDRESS_AMP=0X8E;// uchar sbuf[5]={0XF0,0X2C,0XD0,0X10,0X40}; //FM模块预设值
// uchar rbuf[5]={0X00,0X00,0X00,0X00,0X00};
// uchar ampint[5]={0X27,0X40,0X42,0X46,0XC3};FM_PLL=0X302C;FM_FREQ=97000000; //开机预设频率 PLL_HIGH=0;PLL_LOW=0;delay_ms(100);// delay100ms();delay_ms(100);//delay100ms();// P1=0XFF;
// P2=0XFF;I2C_byte1=0XF0; //FM模块预设值I2C_byte2=0X2C;I2C_byte3=0XD0;I2C_byte4=0X10;I2C_byte5=0X40;byte1=0X27; byte2=0X40;byte3=0X42;byte4=0X46;byte5=0XC3;sendnbyte(&ADDRESS_SEND,numbyte);delay_ms(100);//delay100ms();AMP_sendnbyte(&ADDRESS_AMP,numbyte_AMP);
}//************************************************
//送n字节数据子程序
void sendnbyte(uchar *sla, uchar n)
{ uchar *p;sbuf[0]=I2C_byte1;sbuf[1]=I2C_byte2;sbuf[2]=I2C_byte3;sbuf[3]=I2C_byte4;I2C_start(); // 发送启动信号sendbyte(sla); // 发送从器件地址字节checkack(); // 检查应答位if(foo == 1){ NACK = 1;return; // 若非应答表明器件错误置错误标志位NACK}delay_us(5);p = &sbuf[0];while(n--){ sendbyte(p);checkack(); // 检查应答位delay_us(5);if (foo == 1){NACK=1;return; // 若非应答表明器件错误置错误标志位NACK}p++;}stop(); // 全部发完则停止
}//*************************************************
//在SCL为高时,SDA由高变低即为I2C传输开始
void I2C_start(void)
{SCL_OUT();SDA_OUT();SDA=1;SCL=1;delay_us(5);//DELAY5US;SDA=0;delay_us(5);//DELAY5US;SCL=0;
}void stop(void) //在SCL为高时,SDA由低变高即为I2C传输结束
{SCL_OUT();SDA_OUT();SDA=0;SCL=1;delay_us(5);//DELAY5US;SDA=1;delay_us(5);//DELAY5US;SCL=0;
}
//****************************************************
//发送一个字节数据子函数
void sendbyte(uchar *ch)
{ uchar n00 = 8; uchar temp00;temp00 = *ch;SCL_OUT();SDA_OUT(); while(n00--){ if((temp00&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1{SDA = 1; // 传送位1SCL = 1;delay_us(15);//DELAY5US;SCL = 0; SDA = 0;}else{ SDA = 0; // 否则传送位0SCL = 1;delay_us(15);//DELAY5US;SCL = 0; }temp00 = temp00<<1; // 数据左移一位}
}
//发送n字节数据子程序
void AMP_sendnbyte(uchar *sla, uchar n)
{ uchar *p;ampint[0]=byte1;ampint[1]=byte2;ampint[2]=byte3;ampint[3]=byte4;ampint[4]=byte5; I2C_start(); // 发送启动信号sendbyte(sla); // 发送从器件地址字节checkack(); // 检查应答位delay_us(5);if(foo == 1){ NACK = 1;return; // 若非应答表明器件错误置错误标志位NACK}p=&int[0];while(n--){ sendbyte(p);checkack(); // 检查应答位
delay_us(5); if (foo == 1){NACK=1;return; // 若非应答表明器件错误置错误标志位NACK}p++; }stop(); // 全部发完则停止
}
//****************************************
//向上搜索
void search_up(void)
{ I2C_byte1 |= MUTEI2CB1;//MUTE=1; //静音I2C_byte3 |= SUDI2CB3;//SUD=1; //搜索标志位设为向上if(FM_FREQ>108000000){FM_FREQ=87500000;} // 判断频率是否到顶FM_FREQ=FM_FREQ+100000; //频率加100KFM_PLL=(unsigned short)((4000*(FM_FREQ/1000+225))/32768);//计算PLL值setByte1Byte2(); //设置I2C第一第二字节PLL 值
}
//*******************************
// 向下搜索
void search_down(void)
{ I2C_byte1 |= MUTEI2CB1;//MUTE=1; //静音I2C_byte3 &= ~SUDI2CB3;// SUD=0;//搜索标志位设为向下if(FM_FREQ<87500000){FM_FREQ=108000000;} // 判断频率是否到底FM_FREQ=FM_FREQ-100000; //频率减100KFM_PLL=(unsigned short)((4000*(FM_FREQ/1000+225))/32768); //计算PLL值setByte1Byte2(); //设置I2C第一第二字节PLL 值}
//应答位检查子函数
void checkack(void)
{ SCL_OUT();SDA_OUT();SDA_INT(); SDA = 1; // 应答位检查(将p1.0设置成输入,必须先向端口写1) SCL = 1;foo = 0;delay_us(20);//DELAY5US;if(SDA_V == 1) // 若SDA=1表明非应答,置位非应答标志F0foo = 1;SCL = 0;SDA_OUT();
}
//第一第二字节PLL值设定
void setByte1Byte2(void)
{PLL_HIGH=(uchar)((FM_PLL >> 8)&0X3f); //PLL高字节值I2C_byte1=(I2C_byte1&0XC0)|PLL_HIGH; //I2C第一字节值PLL_LOW=(uchar)FM_PLL; //PLL低字节值I2C_byte2= PLL_LOW; //I2C第二字节值sendnbyte(&ADDRESS_SEND,numbyte); //I2C数据发送I2C_byte1 &= ~MUTEI2CB1;//MUTE=0;delay_ms(100);//delay100ms(); //延时100mssendnbyte(&ADDRESS_SEND,numbyte); //I2C 数据发送delay_us(5);//DELAY5US;
}
.
链接:https://pan.baidu.com/s/1OEtvg-TRUTeeCCMg3WZsiQ
提取码:iq3o
.