用msp430单片机和RDA5807实现收音机的原理图代码.docx
- 文档编号:12683860
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:15
- 大小:17.68KB
用msp430单片机和RDA5807实现收音机的原理图代码.docx
《用msp430单片机和RDA5807实现收音机的原理图代码.docx》由会员分享,可在线阅读,更多相关《用msp430单片机和RDA5807实现收音机的原理图代码.docx(15页珍藏版)》请在冰点文库上搜索。
用msp430单片机和RDA5807实现收音机的原理图代码
RDA5807的MSP430代码、原理图
说明:
这是我用MSP430G2553单片机实现RDA5807收音芯片实现自动搜台收音机功能的代码〔附原理图〕。
这个收音机有两个按键,一个用于向上搜台,另一个用于向下搜台。
用耳机做天线。
本文档包含三个C文件和两个H文件〔见下表〕
MAIN.C
主程序
INITG2553.C
MSP430G2553的初始化代码〔有些在这个工程中没用到〕
G2553I2C.C
MSP430G2553的I2C代码〔有些在这个工程中没用到〕
G2553I2C.H
G2553I2C.C中函数的头文件
INITG2553.H
INITG2553.C中函数的头文件
亲测能用,工作正常,在这里与大家分享。
MAIN.C
*include
*include"InitG2553.H"
*include"G2553I2C.H"
/*
*main.c
*/
*defineCHIP_ADDR_STD0x11
*defineCHIP_ADDR_SQE0x10
*defineREG020x02
*defineREG030x03
*defineREG0A0x0A
*defineREG0B0x0B
*defineR02_SEEK0x0100
*defineR02_SEEKUP0x0200
*defineR03_TUNE0x0010
*defineR0A_STC0x4000
*defineR0A_SF0x2000
voidRDA5807_init();
unsignedintRDA5807_seek();
unsignedintRDA5807_readfreq();
unsignedintRDA5807_readRSSI();
intfreq;
intrssi;
intmain(void){
unsignedinti;
volatileunsignedintR0a,R0b;
WDTCTL=WDTPW|WDTHOLD;//Stopwatchdogtimer
init_clk();
init_I2C();
init_IO();
RDA5807_init();
_BIS_SR(GIE);
while
(1);
return0;
}
//Port1interruptserviceroutine
*pragmavector=PORT1_VECTOR
__interruptvoidPort_1(void)
{
unsignedinti;
unsignedintreg02_temp;
for(i=0;i<=60000;i++);
for(i=0;i<=60000;i++);
if(P1IFG&BIT4)//S2按下
{
P1IFG=0;
if(P1IN&BIT4)return;
//向上调台
reg02_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD,REG02);
reg02_temp|=R02_SEEKUP;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,REG02,reg02_temp);
freq=RDA5807_seek();
rssi=RDA5807_readRSSI();
return;
}
if(P1IFG&BIT5)//S3按下
{
P1IFG=0;
if(P1IN&BIT5)return;
//向下调台
reg02_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD,REG02);
reg02_temp&=~R02_SEEKUP;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,REG02,reg02_temp);
freq=RDA5807_seek();
rssi=RDA5807_readRSSI();
return;
}
}
voidRDA5807_init()
{
unsignedinti;
for(i=0;i<=60000;i++);
for(i=0;i<=60000;i++);
for(i=0;i<=60000;i++);
for(i=0;i<=60000;i++);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,0x02,0x0002);
for(i=0;i<=60000;i++);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,0x02,0xC201);
for(i=0;i<=60000;i++);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,0x03,0x0000);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,0x04,0x0400);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,0x05,0x86B0);
RDA5807_seek();
}
unsignedintRDA5807_seek()
{
unsignedinti;
unsignedintreg02_temp;
unsignedintreg03_temp;
unsignedintreg0a_temp;
//去除调谐位
reg03_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD,REG03);
reg03_temp&=~R03_TUNE;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,REG03,reg03_temp);
//置seek位
reg02_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD,REG02);
reg02_temp|=R02_SEEK;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD,REG02,reg02_temp);
//开场搜台
do
{
for(i=0;i<=60000;i++);
reg0a_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD,REG0A);
}while(!
(reg0a_temp&R0A_STC));
returnRDA5807_readfreq();
}
unsignedintRDA5807_readfreq()
{
unsignedintfreq;
freq=ReadI2C_ADDR_WORD(CHIP_ADDR_STD,REG0A);
freq&=0x03ff;
freq=8700+freq*10;
returnfreq;
}
unsignedintRDA5807_readRSSI()
{
unsignedintrssi;
rssi=ReadI2C_ADDR_WORD(CHIP_ADDR_STD,REG0B);
rssi&=0xfe00;
rssi>>=9;
returnrssi;
}
INITG2553.C
/*
*InitG2553.c
*
*Createdon:
2021-6-23
*Author:
Huaqing
*修订于2021年4月5日
*/
/*
*适用于MSP430G2553的初始化代码
*/
*include
voidinit_clk()
{
if(CALBC1_16MHZ==0xFF)//Ifcalibrationconstanterased
{
while
(1);//donotload,trapCPU!
!
}
DCOCTL=0;//SelectlowestDCOxandMODxsettings
BCSCTL1=CALBC1_16MHZ;//SetDCO
DCOCTL=CALDCO_16MHZ;//DCO频率16MHz
//BCSCTL2|=DIVS_2;//将SMCLK4分频,4MHz
}
voidinit_TA()
{
TA0CTL=TASSEL_2+MC_1+TAIE;//TASSEL_2表示时钟源是SMCLK,MC_1表示UP模式,TAIE开中断
TA0CCR0=800;//设定这个值是中断设为20kHz
P1DIR|=BIT6;
P1SEL|=BIT6;//将PWM从P1.6引出
TA0CCTL1=OUTMOD_7;
TA0CCR1=200;
TA1CTL=TASSEL_2+MC_1;//TASSEL_2表示时钟源是SMCLK,MC_1表示UP模式,TAIE开中断
TA1CCR0=800;//设定这个值是中断设为20kHz
P2DIR|=BIT1;
P2SEL|=BIT1;//将PWM从P2.1引出
TA1CCTL1=OUTMOD_7;
TA1CCR1=200;
}
voidinit_I2C()
{
P1SEL|=BIT6+BIT7;//AssignI2CpinstoUSCI_B0
P1SEL2|=BIT6+BIT7;//AssignI2CpinstoUSCI_B0
//初始化引脚功能,P1.6是SCL,P1.7是SDA
UCB0CTL1|=UCSWRST;//EnableSWreset
UCB0CTL0=UCMST+UCMODE_3+UCSYNC;//I2CMaster,synchronousmode
UCB0CTL1=UCSSEL_2+UCSWRST;//UseSMCLK,keepSWreset
UCB0BR0=160;UCB0BR1=0;//设定分频
UCB0CTL1&=~UCSWRST;//ClearSWreset,resumeoperation
}
voidinit_IO()
{
P1DIR&=~(BIT3+BIT4+BIT5);//P1.345用作按键输入
P1REN|=(BIT3+BIT4+BIT5);
P1OUT|=(BIT3+BIT4+BIT5);//设定P1.345上拉
P1IE|=(BIT3+BIT4+BIT5);//使能P1.345的中断
P1IES|=(BIT3+BIT4+BIT5);//P1.345下降沿触发中断
P1IFG=0;
P2DIR|=BIT1+BIT2;//test
}
G2553I2C.C
/*
*i2c.c
*
*Createdon:
2021-6-28
*Author:
Huaqing
*修订于2021年4月5日
*/
*include
voidWriteI2C1(intdevaddr,unsignedchardata)
{
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;//起始位
while(!
(IFG2&UCB0TXIFG));//在发送中断产生后写缓存
UCB0TXBUF=data;
while(!
(IFG2&UCB0TXIFG));//在中断标志产生前不能发送停顿位
UCB0CTL1|=UCTXSTP;//发送停顿位
IFG2&=~UCB0TXIFG;//去除中断标志位
}
unsignedcharReadI2C1(intdevaddr)
{
UCB0CTL1&=~UCTR;//接收模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;
while(UCB0CTL1&UCTXSTT);
UCB0CTL1|=UCTXSTP;//发送停顿位
while(!
(IFG2&UCB0RXIFG));
IFG2&=~UCB0TXIFG;//中断标志位复位
returnUCB0RXBUF;
}
voidWriteI2C_ADDR_BYTE(intaddr,unsignedcharregaddr,unsignedchardata)
{
intn=2;
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=addr;//地址
UCB0CTL1|=UCTXSTT;//起始位
while(n)
{
if(IFG2&UCB0TXIFG)
{
if(n==2)
{
UCB0TXBUF=regaddr;
}
if(n==1)
{
UCB0TXBUF=data;
while(!
(IFG2&UCB0TXIFG));//在中断标志产生前不能发送停顿位
UCB0CTL1|=UCTXSTP;//发送停顿位
IFG2&=~UCB0TXIFG;//去除中断标志位
}
n--;
}
}
}
voidWriteI2C_ADDR_WORD(unsignedcharaddr,unsignedcharregaddr,unsignedintdata)
{
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=addr;//地址
UCB0CTL1|=UCTXSTT;//起始位
//发送存放器地址
while(!
(IFG2&UCB0TXIFG));//等待中断,中断标志位表示可以向UCB0TXBUF中写入数据
IFG2&=~UCB0TXIFG;
UCB0TXBUF=regaddr;
//发送高字节
while(!
(IFG2&UCB0TXIFG));//等待中断,中断标志位表示可以向UCB0TXBUF中写入数据
IFG2&=~UCB0TXIFG;
UCB0TXBUF=(data>>8);
//发送低字节
while(!
(IFG2&UCB0TXIFG));//等待中断,中断标志位表示可以向UCB0TXBUF中写入数据
IFG2&=~UCB0TXIFG;
UCB0TXBUF=(data&0x00FF);
//发送停顿位
while(!
(IFG2&UCB0TXIFG));//在中断标志产生前不能发送停顿位
UCB0CTL1|=UCTXSTP;//发送停顿位
IFG2&=~UCB0TXIFG;//去除中断标志位
}
voidReadI2C(intdevaddr,unsignedcharregaddr,unsignedchar*dataarray,intn)
{
/*UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=addr;//地址
UCB0CTL1|=UCTXSTT;//起始位
//先发送一个存放器地址
UCB0TXBUF=regaddr;
while(!
(IFG2&UCB0TXIFG));//在中断标志产生前不能发送停顿位
UCB0CTL1|=UCTXSTP;//发送停顿位
IFG2&=~UCB0TXIFG;//去除中断标志位
UCB0CTL1&=~UCTR;//接收模式
UCB0CTL1|=UCTXSTT;
while(UCB0CTL1&UCTXSTT);
UCB0CTL1|=UCTXSTP;//发送停顿位
while(!
(IFG2&UCB0RXIFG));
IFG2&=~UCB0TXIFG;//中断标志位复位
*/
intiN=n;
WriteI2C1(devaddr,regaddr);
UCB0CTL1&=~UCTR;//接收模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;//发送起始位、芯片地址
while(n)
{
if(n==1)UCB0CTL1|=UCTXSTP;//发送停顿位
while(!
(IFG2&UCB0RXIFG));
dataarray[iN-n]=UCB0RXBUF;
IFG2&=~UCB0TXIFG;
n--;
}
}
unsignedintReadI2C_ADDR_WORD(unsignedchardevaddr,unsignedcharregaddr)
{
unsignedinti=0;
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;//起始位
//发送存放器地址
while(!
(IFG2&UCB0TXIFG));
UCB0TXBUF=regaddr;
//发送转接收
while(!
(IFG2&UCB0TXIFG));//确保发送已经完成
UCB0CTL1&=~UCTR;//接收模式
IFG2&=~UCB0TXIFG;//去除中断标志位
UCB0CTL1|=UCTXSTT;//发送起始位的同时还发送器件地址
//接收高位
while(!
(IFG2&UCB0RXIFG));
IFG2&=~UCB0RXIFG;//中断标志位复位
i|=UCB0RXBUF;i<<=8;
UCB0CTL1|=UCTXSTP;
//接收低位
while(!
(IFG2&UCB0RXIFG));
IFG2&=~UCB0RXIFG;//中断标志位复位
i|=UCB0RXBUF;
while(UCB0CTL1&UCTXSTP);//确保停顿位发送
returni;
}
G2553I2C.H
*ifndef__G2553I2C_H
*define__G2553I2C_H
voidWriteI2C_ADDR_BYTE(intaddr,unsignedcharregaddr,unsignedchardata);
voidReadI2C(intdevaddr,unsignedcharregaddr,unsignedchar*dataarray,intn);
voidWriteI2C1(intdevaddr,unsignedchardata);
unsignedcharReadI2C1(intaddr);
voidWriteI2C_ADDR_WORD(unsignedcharaddr,unsignedcharregaddr,unsignedintdata);
unsignedintReadI2C_ADDR_WORD(unsignedchardevaddr,unsignedcharregaddr);
*endif
INITG2553.H
*ifndef__INITG2553
*define__INITG2553
voidinit_clk();
voidinit_TA();
voidinit_I2C();
voidinit_IO();
*endif
原理图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- msp430 单片机 RDA5807 实现 收音机 原理图 代码