“FM收音机”程序设计说明
1 相关资料下载:
2 程序设计思想与总体框架说明
2.1 程序设计思想
本程序主要是做一个具有手动调台,调节音量功能的相对简单的收音机,主要思想就是先初始化相关硬件(数码管,按键,A/D,FM模块等);然后循环监听按键;根据不同的按键实现收音机的相关部分的功能。
2.2 程序总体框架流程

图1 程序流程图
3 程序相关宏定义、变量和函数说明
3.1宏定义和变量说明
表1程序中相关宏定义与变量说明表
| 变量名 | 初始值 | 含义 | |
| FM.h | |||
| 宏 | UP | 1 | IO端口高电平值。 |
| DOWN | 0 | IO端口低电平值。 | |
| MAX_Frequency | 108000 | 收音机能够搜索的最大电台频率。 | |
| MIN_Frequency | 87500 | 收音机能够搜索的最小电台频率。 | |
| 变量 | unsigned char VOLUME | 0x0f | 收音机音量值。 |
| 变量 | Unsigned char Radio_Write_Data[8] | 0xc0,0x11,0x1a,0x500x40,0x02,0x88,0xa0 | 往收音模块写入的八个字节数据。 |
| unsigned long frequency | 0 | 当前电台频率。 | |
| unsigned int chan | 0 | CHAN值,将该值写入RDA5807P芯片的03H寄存器的第6~15位可以收听与CHAN值相关频率的电台。 | |
| Key.h | |||
| 宏 | P1_7_ADC | 0x80 | P1.7口作为模拟功能A/D使用。 |
| ADC_POWER | 0x80 | 打开A/D电源。 | |
| ADC_FLAGE | 0x10 | 将A/D转换完成标志置1。 | |
| ADC_START | 0x08 | A/D转换开始。 | |
| ADC_SPEEDLL | 0x00 | 控制A/D转换速度。 | |
| ADC_SPEEDL | 0x20 | ||
| ADC_SPEEDH | 0x40 | ||
| ADC_SPEEDHH | 0x60 | ||
| ADC_CHANNEL | 0x07 | 将P1.7口作为A/D输入通道。 | |
3.2 函数说明
表2程序中相关函数说明表
| 函数名 | 参数 | 返回值 | 功能描述 |
| FM.c | |||
| Init_Radio | void | void | 初始化收音模块,向收音模块写入8字节初始化数据,收听初始化频率为97.5的电台。 |
| IIC_Radio_Start | void | void | IIC总线读写操作开始。 |
| IIC_Radio_Stop | void | void | IIC总线读写操作结束。 |
| IIC_Radio_MACK | void | void | IIC主机应答函数 |
| IIC_Radio_ACK | void | void | IIC从机应答函数。 |
| IIC_Radio_WriteByte | unsigned char Data | void | 向IIC总线输出一个字节的数据。 |
| IIC_Radio_WriteData | void | void | 向收音模块写入五字节数据。 |
| Get_CHAN | void | void | 从写入的八字节数据中获取CHAN值 |
| Get_Frequency | void | void | 将CHAN值转化为电台频率frequency |
| FrequencyToChan | void | void | 将frequency转化为CHAN值 |
| Manual_Search | unsigned char flag | void | 通过调用Get_CHAN函数将frequency值转化为CHAN,然后调用IIC_Radio_WriteData将CHAN值写入收模块实现手动换台。 |
| SetVolume | unsigned char flag | Void | 向RDA5807P芯片写入数据调节音量。 |
| Frequency_Display | void | void | 调用Display_LED_NUM函数将音量值和电台频率按照相关格式显示在数码管上。 |
| Delay.c | |||
| Delayms | char i | void | 延时ims。 |
| Delayus | int i | void | 延时ius。 |
| Delay | char n | void | 一般的延时函数。 |
| Key.c | |||
| Init_KEY | void | void | 初始化A/D转换相关寄存器。 |
| GetADC | void | unsigned char | 对通道P1.7的模拟量进行A/D转换并获取数字转换值。 |
| Search_Keyscan | void | void | 导航按键扫描函数,通过调用GetADC函数判断哪个导航按键按下然后触发相关功能。 |
| KeyScan | void | void | 按键1和按键2扫描函数,判断这两个键是否按下并进行延时消抖,然后触发相关功能。 |
| Led.c | |||
| Config_LED | 配置与数码管相关的IO口。 | ||
| Display_LED_Num | int i,int j,unsigned char flag | void | 数码管显示函数;将频率值按照相应的格式显示道数码管上。 |
| Main.c | |||
| Init | Void | void | 系统初始化函数;调用Init_KEY和Config_LED初始化按键和数码管相关寄存器,并初始化其它IO。 |
| main | void | void | 程序主函数;在while(1)循环中调用Frequency_Display,Search_Keyscan,KeyScan函数实现整个收音机功能。 |
4 相关寄存器
4.1 RDA5807P芯片读写相关寄存器


4.2 A/D获取键值相关寄存器P1ASF

初始化时,设置P1ASF=P1_7_ADC(0x80),即P1.7口为模拟功能A/D使用;
4.3 A/D转换结果寄存器ADC_RES

初始化时,设置ADC_RES=0x00;
4.4 ADC_CONTR寄存器

初始化时,设置ADC_CONTR = ADC_POWER | ADC_FLAG |ADC_START | ADC_SPEED_90 | ADC_CHS1_7,即对应位都值1,其中ADC_SPEED_90对应SPEED1、SPEED0均为1;ADC_CHS1_7对应CHS2、CHS1、CHS0均为1;
4.5P3口IO模式设定

4.6 P2口IO模式设定

4.7 P0口模式设定


