“多功能收音机”程序设计说明
1 工程文件下载:
2 程序设计思想与总体框架说明
2.1 程序设计思想
本程序是想在上一个案例的基础上实现一个功能更多,能够手动搜台,保存台号,音量功能的收音机,设计思想主要包括初始化硬件,监听按键然后触发相应的功能。由于需要保存音量以及电台频率等数据,因此除了上个案例使用到的相关硬件部分外还需使用非易失性存储器。
2.2 程序总体框架流程
图1 程序流程图
3 程序相关宏定义、变量和函数说明
3.1宏定义和变量说明
表1程序中相关宏和变量说明表
| 变量名 | 初始值 | 含义 | |
| FM.h | |||
| 宏 | UP | 1 | IO端口高电平值。 |
| DOWN | 0 | IO端口低电平值。 | |
| MAX_Frequency | 108000 | 收音机能够搜索的最大电台频率。 | |
| MIN_Frequency | 87500 | 收音机能够搜索的最小电台频率。 | |
| 变量 | Unsigned char Radio_Write_Data[8] | 0xc0,0x11,0x1a,0x50,0x40,0x0a,0x88,0xa0 | 往收音模块写入的8个字节数据。 |
| Radio_Read_Data[4] | 0,0,0,0, | 从收音模块读取的四字节数据 | |
| unsigned char VOLUME | 0x00 | 音量 | |
| unsigned long frequency | 97500 | 当前电台频率。 | |
| unsigned int pll | 0 | PLL值,将该值写入RDA5807P芯片的03H寄存器的第6~15位可以收听与PLL值相关频率的电台。 | |
| 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输入通道。 | |
| Led.h | |||
| 宏 | ON | 0 | 数码管点亮和熄灭的控制位。 |
| OFF | 1 | ||
| 宏函数 | LED1~8_ON | 分别控制8个数码管亮 | |
| LED_OFF | 熄灭数码管 | ||
| IIC.h | |||
| 宏 | SDAUP | 1 | 数据线高电平值 |
| SDADOWN | 0 | 数据线低电平值 | |
| SCLUP | 1 | 时钟线高电平值 | |
| SCLDOWN | 0 | 时钟线低电平值 | |
3.2 函数说明
表2程序中相关函数说明表
| 函数名 | 参数 | 返回值 | 功能描述 |
| FM.c | |||
| Set_Volume | void | void | 将全局变量VOLUME的值按照相关通信协议写入音量调节模块的控制字节从而实现调节电台收听音量功能。 |
| Init_Radio | void | void | 初始化收音模块,从非易失性存储器读取上次收听听的电台PLL值然后写入收音模块。 |
| IIC_Radio_Start | void | void | IIC总线读写操作开始。 |
| IIC_Radio_Stop | void | void | IIC总线读写操作结束。 |
| IIC_Radio_ACK | void | void | IIC总线写操作时的响应函数。 |
| IIC_Radio_WriteByte | unsigned char Data | void | 向IIC总线输出一个字节的数据。 |
| IIC_Radio_WriteData | void | void | 向收音模块写入五字节数据。 |
| Get_PLL | void | void | 从读取的八字节数据中获取PLL值 |
| PllToFrequency | void | void | 将PLL值转化为频率值。 |
| FrequencyToPll | void | void | 将频率转化为PLL值。 |
| Manual_Search | unsigned char flag | void | 通过调用Get_PLL函数将frequency值转化为PLL,然后调用IIC_Radio_WriteData将PLL值写入收音模块实现手动换台。 |
| Change_FM | unsigned char i | void | 可以上下调节收听频道。 |
| Delay.c | |||
| Delayms | char i | void | 延时ims。 |
| Delayus | int i | void | 延时ius。 |
| Delay | char n | void | 一般的延时函数。 |
| Key.h | |||
| Init_KEY | void | void | 初始化A/D转换相关寄存器。 |
| GetADC | void | unsigned char | 进行A/D转换并获取转换值。 |
| Search_Keyscan | void | void | 调用GetADC函数获取AD值判断哪个按键按下,然后触发相关功能。 |
| KeyScan | void | void | 按键1和按键2扫描函数,判断这两个键是否按下并进行延时消抖,然后触发相关功能。 |
| Led.h | |||
| Config_LED | 配置与数码管相关的IO口。 | ||
| Frequency_Display | void | void | 调用Display_Num函数将频率显示在数码管6,7,8,上 |
| Display_Num | unsigned int num | void | 将频率显示在数码管6,7,8,上 |
| Volume_Display | void | void | 调用Display_LED_Num函数将音量显示在数码管3,4上 |
| AOH_Display | void | void | 调用Display_LED_Num函数将台号显示在数码管1上 |
| Display_LED_Num | int i,int j,unsigned char flag | void | 数码管显示函数;将频率值按照相应的格式显示道数码管上。 |
| Main.c | |||
| Init | Void | void | 系统初始化函数;调用Init_KEY和Config_LED函数并初始化定时器0。 |
| main | void | void | 程序主函数;在while(1)循环中调用Frequency_Display,Volume_Display,AOH_Display,Search_Keyscan,KeyScan函数实现整个收音机功能。 |
| IIC.c | |||
| IIC_Start | void | void | 非易失存储器的IIC通信开始 |
| IIC_Stop | void | void | 非易失存储器的IIC通信结束 |
| IIC_ACK | void | void | 应答 |
| IIC_ReadByte | unsigned char | void | 读取一字节 |
| IIC_ReadData | unsigned char | void | 读取数据 |
| IIC_WriteByte | void | unsigned char Data | 写入一字节 |
| IIC_WriteData | void | unsigned char Address,unsigned char Data | 写入数据
|
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口模式设定


