RDA5807的数控收音机教学提纲 下载本文

内容发布更新时间 : 2024/11/20 18:32:13星期一 下面是文章的全部内容请认真阅读。

精品文档

I2C_start();

// 收音模块读取操作 I2C_write_byte(0x21);

// 寄存器连续读操作

reg_buf[0] = I2C_read_byte(I2C_ACK); reg_buf[1] = I2C_read_byte(I2C_ACK); reg_buf[2] = I2C_read_byte(I2C_ACK); reg_buf[3] = I2C_read_byte(I2C_NACK);

I2C_stop(); }

模块上电初始化子函数 void RDA5807_power(void) {

delayms(50);

// 发送软件复位指令 RDA_reg_data[0] = 0x00; RDA_reg_data[1] = 0x02; RDA5807_write_reg();

delayms(10);

// 收音模块默认参数 RDA_reg_data[0] = 0xd0; RDA_reg_data[1] = 0x01; RDA5807_write_reg(); }

功能描述:收音模块自动寻台模式 void RDA5807_FM_seek(void) {

uint chan;

收集于网络,如有侵权请联系管理员删除

精品文档

uchar reg_data[4] = {0x00, 0x00, 0x00, 0x00};

RDA_reg_data[3] &= ~(1 << 4); //调谐禁用

// 内部自动寻台使能

RDA_reg_data[0] |= (1 << 0); //SEEK位置1 RDA5807_write_reg();

// 等待STC 标志置位

while(0 == (reg_data[0] & 0x40)) {

delayms(20); // 读取内部状态

RDA5807_read_reg(reg_data); }

// 获取当前工作频点 chan = reg_data[0] & 0x03; chan = reg_data[1] | (chan << 8); chan = chan << 6;

// 保存当前工作频点

RDA_reg_data[2] = (chan >> 8) & 0xff; RDA_reg_data[3] = (chan & 0xff); }

频率显示子函数

void show_frequency(void) {

unsigned char i,display[5]; unsigned int temp;

temp = (RDA_reg_data[2]*256)+(RDA_reg_data[3]&0xc0); temp = temp>>6;

frequency = (unsigned long)(100*temp+87000)/100;

收集于网络,如有侵权请联系管理员删除

计算 //

精品文档

for(i=0; i<5; i++) // 清显存单元 display[i] = 0x00;

display[0] = (frequency)/1000 ; //数据转换 display[1] = (frequency00)/100; display[2] = (frequency0)/10;

display[3] = 0x2e; //小数点 display[4] = (frequency);

if(display[0] == 0) {

display[0] = display[1]+0x30; display[1] = display[2]+0x30; display[2] = display[3]; display[3] = display[4]+0x30; display[4] = 0x20; } else {

display[0] += 0x30; display[1] += 0x30; display[2] += 0x30; display[4] += 0x30; }

lcd_pos_xy(3,2); //频率显示 lcd_wdat(display[0]); lcd_wdat(display[1]); lcd_wdat(display[2]); lcd_wdat(display[3]); lcd_wdat(display[4]); }

音量显示子函数 void show_volume()

收集于网络,如有侵权请联系管理员删除

精品文档

{

unsigned char temp,display[2];

temp = RDA_reg_data[7] & 0x0f; //取音量值

display[0] = temp/10; display[1] = temp;

if(display[0] == 0) //如果高位为0 {

display[0] = display[1]; //低位显存内容进入高位显存 display[1] = 0x20; //低位不显示 } else {

display[1] += 0x30; }

display[0] += 0x30;

lcd_pos_xy(13,2); //音量值显示 lcd_wdat(display[0]); lcd_wdat(display[1]); } 主函数

void main(void) {

P0 = 0xff; P1 = 0xff; P2 = 0xff; lcd_init();

lcd_w_string(0,1,cdis1,0); lcd_w_string(0,2,cdis2,0);

RDA5807_power();

收集于网络,如有侵权请联系管理员删除

精品文档

while(1) {

if(K1 == 0) {

delayms(20); if(K1 == 0) {

RDA_reg_data[0] |= (1 << 1); RDA5807_FM_seek(); while(K1 == 0); } }

if(K2 == 0) {

delayms(20); if(K2 == 0) {

RDA_reg_data[0] &= ~(1 << 1); //SEEK DOWN RDA5807_FM_seek(); while(K2 == 0); } }

if(K3 == 0) {

delayms(20); if(K3 == 0) {

if((RDA_reg_data[7] & 0x0f) < 0x0f) {

RDA_reg_data[0] = 0xd0; RDA_reg_data[1] = 0x01;

//SEEK UP

收集于网络,如有侵权请联系管理员删除