51单片机控制的FM收音机(1)

合集下载

51单片机控制RDA5820制作 数字FM对讲机收音发射一体机程序

51单片机控制RDA5820制作 数字FM对讲机收音发射一体机程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuint key_=0;uint k_1=0;uint a_3=0;uint m1,m_1,m_4;uint a_4=0;uint k_2=0;uint i_1=0;uint n_0=1;uint l1=1;uint l2=1;uint z,p=1;uint j_=1;uint r_i=0x0427;double b1=0;uint a1=0;uint a2=0;uint FreqTune=0x0000;uint vol=0xa;const uchar FmAddr = 0x22;sbit SDA =P0^0;sbit SCL =P0^1;sbit KEY =P1^4;sbit KEYu=P1^0;sbit KEYd=P1^2;sbit KEY1=P1^1;sbit KEY2=P1^3;sbit rs=P0^5;sbit rw=P0^6;sbit en=P0^7;sbit P02=P0^2;sbit P03=P0^3;sbit P04=P0^4;uchar code table[]="0123456789."; uchar code table_[]="Mhz Vol:";uchar code table_1[]="RT";uchar code table1[]="Welcome";uchar code table2[]="Digital FMdevice"; uchar code table3[]="Please choose"; uchar code table_3[]="s ";uchar code table4[]="function keys"; uchar code table5[]=" -Interphone "; uchar code table6[]=" FM receiver "; uchar code table7[]=" -FM receiver "; uchar code table8[]=" FM transmitter"; uchar code table9[]=" -FM transmitter"; uchar code table10[]=" Transmit Data "; uchar code table11[]=" -Transmit Data "; uchar code table12[]=" Interphone "; uchar code table14[]="Waiting ";uchar code table15[]="............... "; uchar code table16[]=" Interphone "; uchar code table18[]=" FM RX ";uchar code table20[]=" FM TX ";uchar code table22[]=" TX DATA ";uchar code tabletp[]=" ";uchar codetable23[]={0x00,0x1F,0x0A,0x04,0x04,0x0 4,0x04,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F, };uchar codetable24[]={0x00,0x1F,0x0A,0x04,0x04,0x0 4,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x06,0x0E,0x1E, };uchar codetable25[]={0x00,0x1F,0x0A,0x04,0x04,0x0 4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C ,};uchar codetable26[]={0x00,0x1F,0x0A,0x04,0x04,0x0 4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x18, } ;uchar codetable27[]={0x00,0x1F,0x0A,0x04,0x04,0x0 4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10, };uchar codetable28[]={0x00,0x1F,0x0A,0x04,0x04,0x0 4,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, };uchar codetable29[]={0x02,0x06,0x1E,0x1E,0x1E,0x1 E,0x06,0x02,};void Dela_y(uint c) //延时{int i=0;for(i=0;i<c;i++);}void DelayIT(uint del_1)//延时 10ms * del {uint i,j;for(i=0; i<del_1; i++)for(j=0; j<1827; j++);}void delay_lcd(uint n)//lcd延时{uint x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}void lcd_wcom(uchar com)//lcd写命令{rs=0;rw=0;P3=com;delay_lcd(5);en=1;en=0;}void lcd_wdat(uchar dat)//lcd写数据{rs=1;rw=0;P3=dat;delay_lcd(5);en=1;en=0;}void lcd_init()//lcd初始化{lcd_wcom(0x38);lcd_wcom(0x0c);lcd_wcom(0x06);lcd_wcom(0x01);}void OpenIIC(){SDA = 1;SCL = 1; Dela_y(5);SDA = 0; Dela_y(5);SCL = 0; Dela_y(5);}void CloseIIC(){SDA = 0 ;SCL = 1; Dela_y(5);SDA = 1; Dela_y(5);SCL = 1; SDA = 1; Dela_y(150); //防止过快的读取造成EPPROM 来不及反应}}void IICWriteByte( uchar byte ){uchar i=0;int f=30000;bit bitdata;for(i=0;i<8;i++){bitdata=byte>>(7-i) & 1;SDA = bitdata;SCL =1; Dela_y(5);SCL = 0; Dela_y(5);}SCL = 1;while(SDA && -f); Dela_y(5);SCL = 0; Dela_y(5);}void IICWrite(uchar uaddr, uchar romaddr, uint rdata,bit _16b){uchar temp;OpenIIC();IICWriteByte(uaddr);IICWriteByte(romaddr);if(_16b){temp =(uchar)((rdata>>8) & 0x00ff) ; IICWriteByte(temp);}temp = (uchar) (rdata & 0xff); IICWriteByte(temp);CloseIIC();}uchar IICReadByte(bit next){uchar buf =0,i=0;for(i=0;i<8;i++){buf <<=1;SCL = 1; buf |= SDA; Dela_y(5);SCL = 0; Dela_y(5);}if(next){SDA = 0; SCL = 1; Dela_y(5);SCL = 0; Dela_y(5); SDA = 1;}else{SDA = 1; SCL = 1; Dela_y(5);SCL = 0; Dela_y(5); SDA=0;}return buf;}uint IICRead(uchar uaddr, uchar ramAddr,bit _16b){uint buf;OpenIIC();IICWriteByte(uaddr);IICWriteByte(ramAddr);OpenIIC();IICWriteByte(uaddr | 0x01);if(_16b){buf = IICReadByte(1);buf = buf<<8;buf =buf|IICReadByte(0);}else{buf = IICReadByte(0);}CloseIIC();return buf;}uint FM_ReadReg(uchar regAddr)//读取FM 模块的寄存器{return IICRead(FmAddr,regAddr,1);}void FM_WriteReg(uchar regAddr,uint dat)//写FM模块的寄存器{IICWrite(FmAddr,regAddr,dat,1);}void FM_SetFreq_RX(uint FreqTune_1)//设置RX频道的频率87-1*,步进频率100k0x00{FM_WriteReg(3,(FreqTune_1<<6) |0x0010);}void FM_SetFreq__RX(uint FreqTune__1)//设置RX频道的频率65-90,步进频率100k 0x00{FM_WriteReg(53,0x28a);FM_WriteReg(53,0x384);FM_WriteReg(3,(FreqTune__1<<6) |0x001c);}void FM_SetVolume(uint vol_)//设置音量0x0{FM_WriteReg(5,vol_|=0x88a0);}void show(uint addr,double m)//lcd显示初始地址addr及数字xxx.x{uchar n;uchar _n=10;for(n=0;n<5;n++){if(n==0) _n=m/100;if(n==1) _n=((int)m/10)%10;if(n==2) _n=(int)m%10;if(n==3) _n=10;if(n==4) _n=((int)(m*10))%10;lcd_wcom(addr+n);lcd_wdat(table[_n]);}}void show_(uint a_ddr,double k_)//lcd显示初始地址addr及数字xx{uchar n;uchar _n=10;for(n=0;n<2;n++){if(n==0) _n=(int)k_/10;if(n==1) _n=(int)k_%10;lcd_wcom(a_ddr+n);lcd_wdat(table[_n]);}}void rssi(uint r_addr,int rssi) //LCD信号强度指示显示(地址,0——5){lcd_wcom(0x40);if(rssi==0){for(m1=0;m1<16;m1++){lcd_wdat(table28[m1]);}};if(rssi==1){for(m1=0;m1<16;m1++){lcd_wdat(table27[m1]);}};if(rssi==2){for(m1=0;m1<16;m1++){lcd_wdat(table26[m1]);}};if(rssi==3){for(m1=0;m1<16;m1++){lcd_wdat(table25[m1]);}};if(rssi==4){for(m1=0;m1<16;m1++){lcd_wdat(table24[m1]);}};if(rssi==5){for(m1=0;m1<16;m1++){lcd_wdat(table23[m1]);}};lcd_wcom(r_addr); //显示地址for(m1=0;m1<2;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(m1);} ;}void kanji()//开机画面{uchar m1;DelayIT(20);lcd_init(); //液晶初始化lcd_wcom(0x84); //显示地址for(m1=0;m1<7;m1++) //将table1[Welcome]中的数据依次写入1602显示{lcd_wdat(table1[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table2[Digital FMdevice]中的数据依次写入1602显示{lcd_wdat(table2[m1]);}DelayIT(100);lcd_init(); //液晶初始化lcd_wcom(0x81); //显示地址for(m1=0;m1<13;m1++) //将table3[Please choose]中的数据依次写入1602显示{lcd_wdat(table3[m1]); DelayIT(4) ;}lcd_wcom(0x80+0x41); //显示地址for(m1=0;m1<13;m1++) //将table4[function keys]中的数据依次写入1602显示{lcd_wdat(table4[m1]); DelayIT(5) ;}DelayIT(50) ;}void K_S()//主键盘扫描{if(a_3!=1)//有后退按键{a_3=1;if(k_1==0)//对讲机模式{lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table5[-Interphone]中的数据依次写入1602显示{lcd_wdat(table5[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table6[FM receiver]中的数据依次写入1602显示{lcd_wdat(table6[m1]);}};if(k_1==1)//收音机模式{lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table12[]中的数据依次写入1602显示{lcd_wdat(table12[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table7[]中的数据依次写入1602显示{lcd_wdat(table7[m1]);}};if(k_1==2)//FM发射模式{lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table6[]中的数据依次写入1602显示{lcd_wdat(table6[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table9[]中的数据依次写入1602显示{lcd_wdat(table9[m1]);}};if(k_1==3) //第四模式{lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table8[]中的数据依次写入1602显示{lcd_wdat(table8[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table11[]中的数据依次写入1602显示{lcd_wdat(table11[m1]);}};};if(KEYu==0) key_--;//按键判断if(KEYd==0) key_++;if(k_1!=key_%4) //有上下选择按键{k_1=key_%4;if(k_1==0){lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table5[]中的数据依次写入1602显示{lcd_wdat(table5[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table6[]中的数据依次写入1602显示{lcd_wdat(table6[m1]);}};if(k_1==1){lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table12[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table7[m1]);}};if(k_1==2){lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table6[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table9[m1]);}};if(k_1==3){lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table11[]中的数据依次写入1602显示{lcd_wdat(table8[m1]);}lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table11[m1]);}};DelayIT(30);};}使用道具举报13#枫霰中级会员发表于 2012-1-19 16:22:58|只看该作者接上:void mace()//主程序扫描{•串个门•加好友•打招呼•发消息if(k_1==0)//第一模式{for(;m_1>0;m_1--){m_4=8;lcd_init(); //液晶初始化for(;m_4<12;m_4++){lcd_wcom(0x80+0x44); //显示地址for(m1=0;m1<m_4;m1++) //将table15[ ]中的数据依次写入1602显示{lcd_wdat(table15[m1]);DelayIT(4);}}lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table16[m1]);}};z=1;};if(k_1==1) //第二模式{for(;m_1>0;m_1--){m_4=8;lcd_init(); //液晶初始化for(;m_4<12;m_4++){lcd_wcom(0x80+0x44); //显示地址for(m1=0;m1<m_4;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table15[m1]);DelayIT(4);}};lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<18;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table18[m1]);}};z=2;};if(k_1==2)//第三模式{for(;m_1>0;m_1--){m_4=8;lcd_init(); //液晶初始化for(;m_4<12;m_4++){lcd_wcom(0x80+0x44); //显示地址for(m1=0;m1<m_4;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table15[m1]);DelayIT(5);}};lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table20[m1]);}};z=3;};if(k_1==3&&k_2==1) //第四模式{for(;m_1>0;m_1--){m_4=8;lcd_init(); //液晶初始化for(;m_4<12;m_4++){lcd_wcom(0x80+0x44); //显示地址for(m1=0;m1<m_4;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table15[m1]);DelayIT(5);}};lcd_init(); //液晶初始化lcd_wcom(0x80); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table22[m1]);}};z=4;};}void main() //主程序{ uint z_1,Tune;P1=0xff;FM_WriteReg(2,0xd281);//rda5820地址FM_ReadReg(0x0b);P02=0;P03=0;kanji(); //开机画面while(1) //进入程序死循环{if(KEY2==0&&k_2<1) k_2++;//左右按键判断if(KEY1==0&&k_2>0) k_2--;if(k_2==0) //没有右按键{n_0=1;m_1=1;K_S(); //上下模式建扫描};if(k_2==1) //有右键{a_3=0;mace(); //模式扫描if(z==1) //第一模式{if(KEY==1){for(;p>0;p--) FM_SetFreq__RX(0x00);//设置频率65Mhzlcd_wcom(0x80+0x46); //显示地址for(m1=0;m1<8;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table_[m1]);} ;lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<1;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table_1[m1]);} ;for(;l1>0;l1--)l2=1;FM_WriteReg(0x40,0x0000);//进入接收模式if(KEYu==0&&KEY2==0&&vol<0xf)vol+=0x1;else if(KEYd==0&&KEY2==0&&vol>0x0)vol-=0x1;else if(KEYu==0&&Tune<20)a1++,Tune+=1;else if(KEYd==0&&Tune>0)a1--,Tune-=1; //声音,频率调节FreqTune=Tune*10;if(b1!=65+(double)Tune*1){b1=65+(double)Tune*1;FM_SetFreq__RX(FreqTune);//写入频率=65+tune};z_1=0xff&(FM_ReadReg(0x0a));FM_SetVolume(vol); //写入音量show(0x80+0x41,65+((double)z_1)/10);show_(0x80+0x4e,((double)vol)); //显示频率音量rssi(0x8d,(uint)((FM_ReadReg(0x0b)>>10)/5)); //显示信号强度if( ((FM_ReadReg(0x0b)>>10)/5) ){lcd_wcom(0x8f);for(m1=6;m1<7;m1++) //将s显示{lcd_wdat(table10[m1]);} ;};if( !((FM_ReadReg(0x0b)>>10)/5) ){lcd_wcom(0x8f);for(m1=0;m1<1;m1++) //将显示{lcd_wdat(table10[m1]);} ;};DelayIT(10);//延时 10ms * del};if(KEY==0){for(;l2>0;l2--){l1=1,FM_WriteReg(0x40,0x0001),FM_SetFreq__RX(FreqTune), lcd_wcom(0x80+0x40); //显示地址for(m1=0;m1<16;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(tabletp[m1]);} ;};FM_WriteReg(0x40,0x0001) ;z_1=0xff&(FM_ReadReg(0x0a));show(0x80+0x44,65+((double)z_1)/10);lcd_wcom(0x80+0x43); //显示地址for(m1=1;m1<2;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table_1[m1]);} ;if(KEYu==0&&KEY==0&&r_i<0x043b)r_i+=0x000c;//功率调节if(KEYd==0&&KEY==0&&r_i>0x0405)r_i-=0x000c;FM_WriteReg(0x42,r_i);rssi(0x80+0x4d,(uint)((r_i&0xff)/0x0c));DelayIT(10);//延时 10ms * del};};if(z==2) //第二模式{p=1;for(;j_>0;j_--)FM_SetFreq_RX(0x00);FM_WriteReg(0x40,0x0000);lcd_wcom(0x80+0x46); //显示地址for(m1=0;m1<8;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table_[m1]);} ;if(KEYu==0&&KEY2==0&&FreqTune<0xd2)a1+=10,FreqTune +=0x000a;else if(KEYd==0&&KEY2==0&&FreqTune>0x00)a1-=10,FreqTune-=0x000a;else if(KEYu==0&&KEY==0&&vol<0xf)a2++,vol+=0x1;else if(KEYd==0&&KEY==0&&vol>0x0)a2--,vol-=0x1;else if(KEYu==0&&FreqTune<0xd2)a1++,FreqTune+=0x0001; else if(KEYd==0&&FreqTune>0x00)a1--,FreqTune-=0x0001; if(b1!=87+(double)a1*0.1){b1=87+(double)a1*0.1;FM_SetFreq_RX(FreqTune);};FM_SetVolume(vol);z_1=0xff&(FM_ReadReg(0x0a));show(0x80+0x41,87+((double)z_1)/10);show_(0x80+0x4e,((double)vol));rssi(0x8d,(uint)((FM_ReadReg(0x0b)>>10)/5));if( ((FM_ReadReg(0x0b)>>10)/5) ){lcd_wcom(0x8f);for(m1=6;m1<7;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table10[m1]);} ;};if( !((FM_ReadReg(0x0b)>>10)/5) ){lcd_wcom(0x8f);for(m1=0;m1<1;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table10[m1]);} ;};DelayIT(10);//延时 10ms * del};if(z==3) //第三模式{ p=1;for(;j_>0;j_--)FM_SetFreq_RX(0x00);FM_WriteReg(0x40,0x0001) ;lcd_wcom(0x80+0x49); //显示地址for(m1=0;m1<3;m1++) //将table[]中的数据依次写入1602显示{lcd_wdat(table_[m1]);} ;if(KEYu==0&&KEY2==0&&FreqTune<0xd2)a1+=10,FreqTune +=0x000a;else if(KEYd==0&&KEY2==0&&FreqTune>0x00)a1-=10,FreqTune-=0x000a;else if(KEYu==0&&KEY==0&&r_i<0x043b)r_i+=0x000c;else if(KEYd==0&&KEY==0&&r_i>0x0405)r_i-=0x000c;else if(KEYu==0&&FreqTune<0xd2)a1++,FreqTune+=0x0001; else if(KEYd==0&&FreqTune>0x00)a1--,FreqTune-=0x0001; if(b1!=87+(double)a1*0.1){b1=87+(double)a1*0.1;FM_SetFreq_RX(FreqTune);};z_1=0xff&(FM_ReadReg(0x0a));FM_WriteReg(0x42,r_i);show(0x80+0x44,87+((double)z_1)/10);rssi(0x8d,(uint)((r_i&0xff)/0x0c));DelayIT(10);//延时 10ms * del};if(z==4) //第四模式{p=1;};};};}使用道具举报枫霰中级会员•串个门•加好友•打招呼14#发表于 2012-1-19 17:08:50|只看该作者本帖最后由枫霰于 2012-1-19 17:10 编辑RDA5820收音+发射模块PL102BH-20.pdf 资料•发消息近几天刚刚学了IIC总线控制,想亲自实践一下,就从众多IIC控制的芯片中找到了这个RDA5820模块,刚从网上淘回来就开始写控制它的C51程序,经过一周多努力终于调试成功。

毕业设计(论文)-基于单片机的多功能钟控收音机的设计与实现--闹钟子系统的设计与实现[管理资料]

毕业设计(论文)-基于单片机的多功能钟控收音机的设计与实现--闹钟子系统的设计与实现[管理资料]

基于单片机的多功能钟控收音机的设计与实现——闹钟子系统的设计与实现摘要收音机是现在生活中的一种娱乐工具,它可以扩展我们的知识面,丰富我们是日常生活。

但是现在的收音机仅仅只拥有收台、听台、存台的功能,功能上非常的单一,为了让收音机具有更强大的的功能,设计了这套基于单片机的多功能钟控收音机系统。

这套系统在传统的收音机上增加了时钟设置、温度测量、液晶显示以及闹钟设置多项功能。

本文主要论述了系统的方案设计,系统硬件设计包括硬件选型和硬件电路图;系统软件设计包括程序流程图设计和关键代码。

通过编写代码实现收音机节目的播放、音量调节、电台切换及节目的自动搜索、节目频点存储功能、时钟设置、温度测量、液晶显示以及闹钟功能。

且能够通过按键调整系统时钟,到达设定闹铃时间值可选择蜂鸣器响或开启收音机到指定频点。

该系统与传统的收音机系统相比较,具有结构简单,抗干扰能力强,测量精度高,使用方便的特点。

关键字:单片机;收音机;闹钟;液晶显示Based on SCM multi-function clock radio control design and realized ——Alarm subsystem of design and implementationAuthor:Li XinfangTutor:Yang BoAbstractThe radio is now in the life of the one kind of entertainment tool, it can expand our knowledge, enrich our daily life is. But now the radio only accept ,listen , save a function, the function is a single, in order to let the radio has more powerful function, the set design based on single chip microcomputer multifunctional clock radio control system. The system in the traditional radio increased the clock set, temperature measurement, liquid crystal display and alarm multiple functions. This paper discusses the design of the whole system, hardware design including hardware selection and hardware circuit diagram; System software design including program flowchart design and key code. By writing code realization of radio programs broadcast, volume adjustment, radio switch and programs to be automatic search, the program frequency memory function, clock set, temperature measurement, liquid crystal display and alarm clock function. And to be able to button to adjust the system clock, to set the alarm time value can choose a buzzer rang or open radio frequency to the specified. This system and the traditional radio system comparison, the structure is simple, strong anti-jamming ability, high accuracy, easy to use features.Key words: Single chip microcomputer; the radio; the alarm clock; liquid crystal display目录1 绪论 0 0研究的目的及意义 0本文结构 (1)2 系统方案设计 (2) (2) (2)收音机模块 (3)时钟模块 (3)温度模块 (3)显示模块 (3)闹钟模块 (3)按键模块 (4)3 系统硬件设计 (5) (5) (5)AT89S52单片机的引脚结构分析 (6)单片机最小系统设计图 (7)显示模块硬件电路设计 (7) (7)显示模块电路设计 (8)按键模块硬件电路设计 (8)时钟模块的硬件电路设计 (9) (9) (9) (10)存储模块硬件电路设计 (11) (11) (11)AT24C02电路设计 (12)打铃模块电路设计 (12)4 系统软件设计 (14)系统软件总体设计 (14)主控模块详细设计 (14)显示模块详细设计 (16)按键模块详细设计 (17)时钟模块详细设计 (18) (18)存储模块详细设计 (20) (21) (23)5系统的调试与实现 (25)C介绍 (25)6 结束语 (27)参考文献 (28)致谢 (29)1 绪论收音机一直在人们的生活娱乐中占有非常重要的地位。

沉脉亦主表证——论文

沉脉亦主表证——论文

基于PIC的数字调谐收音机设计楼赵辉摘要:随着我国经济的高速发展,微电子技术、无线电通信技术和自动控制技术也得到了迅速发展,锁相环和频率合成技术已经进入一个崭新的时代,其应用越来越广。

而收音机作为现代的娱乐工具,与人们的生活紧密相关,随着人们对其要求的提高,收音机得到了快速发展,传统的电容、电感调台收音机已经向数字化收音机发展。

本文在已有的收音机模块的基础上,采用PIC系列微控制器对收音机进行控制,通过合理设计,制作了一款完善的数字调协收音机,并增加了传统收音机所不具备的功能,使之达到了较为理想的效果。

关键词:PICMA TE2004 、16f877、收音机ABSTRACT:With the development of the economy, microelectronic technology, radio communication technology and the automatic theory are developed rapidly, the compound frequency technology has been in a new state. It's application is becoming more and more widely. But the radio as an important pastime tools , it also has developed quickly with the improving requirement of the people .It's radio technology has developed from tradition capacitance or inductance to digital .The article is based on the now-being general radio module, using PIC miccontroller to control the radio, the reliability is improved and the feeling of comfort is better through the reasonable design, so the function of radio is more powerful compared with tradition one .Key words:PICMATE2004 、16f877 、RADIO1.收音机的发展近年来,随着无线电通信技术的迅速发展,锁相环和频率合成技术[6]在各个领域得到了广泛的应用。

RDA5820和51单片机制作的FM数字收音机源代码及电路原理图

RDA5820和51单片机制作的FM数字收音机源代码及电路原理图

* 晶振:8M*/#include <reg52.h>#include <string.h>#define ChannelCount 50 //最多支持多少个台,因为常驻内存,多了RAM放不下#define uchar unsigned char#define uint unsigned inttypedef struct{uchar Freq;uchar Rssi;}ChannelInfo;sbit SDA = P2^0;sbit SCL = P2^1;sbit key1 = P3^4;sbit key2 = P2^7;sbit key3 = P2^6;sbit key4 = P2^5; // P3^7;sbit LcdEn = P3^4;sbit LcdRs = P3^5;uchar Channel = 0;uchar FreqTune = 0;const uint MinFreq = 870; //起始频率* 100KHzconst uint MaxFreq = 1080; //最高频率* 100KHzconst uchar FmAddr = 0×22; //FM模块IIC 地址const uchar EpAddr = 0xA0; //24C02 EPPRom 的地址uchar RSSI = 0; //信号强度uchar ChannelTune[ChannelCount];uchar code LevlChar[5][8] ={{0x1F,0×11,0x0A,0×04,0×04,0×04,0×04,0×04},{0×00,0×00,0×00,0×00,0×00,0×00,0×06,0x1E},{0×00,0×00,0×00,0×00,0×06,0x1E,0x1E,0x1E}, //显示型号强度的自定义字符{0×00,0×00,0×06,0x1E,0x1E,0x1E,0x1E,0x1E},{0×06,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E}};uchar vol = 0×8; //音量0~0xFuchar Func = 0×0; //当前功能号bit AutoScan = 0; //标记当前是不是在自动搜台bit Mute = 0; //标记是否被静音uchar KeyNumber = 0;void OpenIIC();void CloseIIC();void IICWrite(uchar uaddr, uchar romaddr, uint rdata,bit _i6b);void IICWriteByte( uchar byte );uint IICRead(uchar uaddr, uchar romaddr,bit _i6b);uchar IICReadByte(bit next);void FM_SetFreq();void FM_SetVolume();uint FM_ReadReg(uchar regAddr); //读取FM模块的寄存器void FM_WriteReg(uchar regAddr,uint dat); //写FM模块的寄存器uchar FM_GetRSSI(); //获取当前的信号强大void Delay(uint c);bit KeyScan();void BeginScan();void Lcd_DispNumber(uint number);void Lcd_Init();void Lcd_Comm(uchar cmd);void Lcd_Data(uchar dat);void Lcd_String(char* dat);void Lcd_DispRssi();void Lcd_DispFreq();void Lcd_Refresh();void Lcd_DispDiscript();void Eprom_LoadInitData();uint Eprom_Read(uchar addr,bit _16bit);void Eprom_Write(uchar addr,uint dat,bit _16bit);void main(){P3 = 0xff;P2 = 0xff;Delay(10000); //延时,等待外部FM模块的启动Eprom_LoadInitData(); //从EppRom 加载频道音量等信息 FM_WriteReg(2,0xd281); //启动FM模块FM_SetVolume(); //设置启动音量FM_SetFreq(); //设置默认频道的频率Lcd_Init();Lcd_Refresh();while(1){if( KeyScan()){Lcd_Refresh();}}}void Eprom_LoadInitData(){uint result = 0;int i=0;result =Eprom_Read(0,0);if(result>0){ vol = (uchar)result –1;}result =Eprom_Read(1,0);Channel = (uchar)result;for(i=0;i<ChannelCount;i++){result =Eprom_Read(i * 2 + 2,1);ChannelTune[i] = result;}FreqTune = ChannelTune[Channel];}void Eprom_Write(uchar addr,uint dat,bit _16bit) {IICWrite(EpAddr,addr,dat,_16bit);}uint Eprom_Read(uchar addr,bit _16bit){return IICRead(EpAddr,addr,_16bit);}uint FM_ReadReg(uchar regAddr){return IICRead(FmAddr,regAddr,1);}void FM_WriteReg(uchar regAddr,uint dat) {IICWrite(FmAddr,regAddr,dat,1);}void FM_SetFreq(){FM_WriteReg(3,(FreqTune<<6) | 0×10);}void FM_SetVolume(){uint reg2H;if(vol>0){if(Mute){reg2H = FM_ReadReg(2);reg2H |= 0×4000;FM_WriteReg(2,reg2H);}FM_WriteReg(5,vol);}else{Mute = 1;reg2H = FM_ReadReg(2);reg2H &= 0xBFFF;FM_WriteReg(2,reg2H);}Eprom_Write(0,vol+1,0);}void Lcd_Init(){uchar CGRamAddr = 0×40;int i,j;LcdEn = 0;Lcd_Comm(0×38);Lcd_Comm(0x0c);Lcd_Comm(0×06);Lcd_Comm(0×01);for(j=0;j<5;j++){Lcd_Comm(CGRamAddr + 8 * j); //建立自定义字符(显示信号强度的) for(i=0;i<8;i++){Lcd_Data(LevlChar[j][i]);Delay(510);}}}void Lcd_Comm(uchar cmd){LcdRs =0;P0 = cmd;Delay(50);LcdEn = 1;Delay(50);LcdEn = 0;}void Lcd_Data(uchar dat){LcdRs = 1;P0 = dat;LcdEn = 1;Delay(50);LcdEn = 0;}void Lcd_String(char* dat){char *p;int j, i=strlen(dat);for(j=0;j<i;j++){p=dat + j;Lcd_Data(*p);}}void Lcd_DispRssi(){int i;Lcd_Comm(0×80);for(i=0;i<5;i++){Lcd_Data(‘‘);}RSSI = FM_GetRSSI();Lcd_Comm(0×80);Lcd_Data(0×00);if(RSSI>=1) Lcd_Data(0×01);if(RSSI>=2) Lcd_Data(0×02);if(RSSI>=3) Lcd_Data(0×03);if(RSSI>=4) Lcd_Data(0×04);}void Lcd_DispFreq(){uint curFreq = MinFreq + FreqTune;int i;Lcd_Comm(0×85);for(i=5;i<16;i++){Lcd_Data(‘‘);}Lcd_Comm(0×80+6);if(curFreq>=1000)Lcd_Data(48 +curFreq /1000 % 10); Lcd_Data(48 +curFreq /100 % 10);Lcd_Data(48 +curFreq /10 % 10);Lcd_Data(‘.’);Lcd_Data(48 + curFreq % 10);Lcd_Data(‘M’);Lcd_Data(‘H’);Lcd_Data(‘Z’);}void Lcd_DispDiscript(){int i;Lcd_Comm(0×80+0×40);for(i=0;i<15;i++){Lcd_Data(‘‘);}Lcd_Comm(0×80+0×40);switch(Func){case 0:Lcd_String(“Channel:”);Lcd_DispNumber(Channel+1);break;case 1:Lcd_String(“Volume:”);Lcd_DispNumber(vol);break;case 2:Lcd_String(“Tune”);break;case 3:Lcd_String(“Auto Scan”);}}void Lcd_Refresh(){Lcd_DispRssi();Lcd_DispFreq();Lcd_DispDiscript();}void Lcd_DispNumber(uint number){int i=0,len;char str[6]={‘\0′,’\0′,’\0′,’\0′,’\0′,’\0′}; char temp;dostr[i++] = ’0′+ (number % 10); number /= 10;}while(number) ;len = strlen(str);for(i=0;i<len/2;i++){temp = str[i];str[i] = str[len-i-1];str[len-i-1] = temp;}Lcd_String(str);}bit KeyScan(){bit keyRel = 0; //按键释放检测char value=0;int i;uint temp;if(AutoScan) return 0;if(KeyNumber==0){if(key3==0){Delay(50);if(key3==0){KeyNumber =3;}}if(key4==0){Delay(50);if(key4==0){KeyNumber=4;}}if(key2==0){Delay(50);if(key2==0)KeyNumber=2;}}return 0;}else{switch(KeyNumber){case 1:if(key1==1)keyRel = 1; break;case 2:if(key2==1)keyRel = 1; break;case 3:if(key3==1)keyRel = 1; break;case 4:if(key4==1)keyRel = 1; break;}if(keyRel){switch(KeyNumber){case 2:Func++;if(Func>3) Func = 0;break;case 3:value = -1;break;case 4:value = 1;break;}if(KeyNumber>2){if(Func==0){if((value > 0 && Channel<ChannelCount) || (value<0 && Channel > 0)) {Channel+=value;FreqTune= ChannelTune[Channel];FM_SetFreq();Eprom_Write(1,Channel, 0);}else if(Func==1){if((value > 0 && vol<0xF) || (value<0 && vol > 0)){vol+=value;FM_SetVolume();}}else if(Func==2){if((value > 0 && FreqTune<0xd2) || (value<0 && FreqTune > 0)) {FreqTune+=value;ChannelTune[Channel] = FreqTune;FM_SetFreq();Eprom_Write(Channel * 2 + 2 ,FreqTune,1);}}else if(Func==3) //开始自动扫描{AutoScan = 1;BeginScan();AutoScan = 0;Channel = 0;FreqTune = ChannelTune[0];Func = 0;FM_SetFreq();//覆盖EppRom中的所有的频道for(i=0;i<ChannelCount;i++){temp = ChannelTune[i];Eprom_Write(i * 2+2,temp,1);}Eprom_Write(0×01,0,0); //重置EPPROM中的频道号为0}}KeyNumber=0;}return keyRel;}}//全自动搜索void BeginScan(){uint state;int i=0,count=0;bit cmp = 0;uint seekth = 0×8; //灵敏度0~127,默认为8 灵敏度越低越可能搜索到假台,高了可能一些信号弱一点的频道被跳过。

51单片机控制的16介音乐盒程序及图

51单片机控制的16介音乐盒程序及图
TR0=1。
P1_7=~P1^7。
STH0=tab4[key_number]/256。
STL0=tab4[key_number]%256。
delayms(10>。
}。break。
case 8:{
TR0=1。
P1_7=~P1^7。
STH0=tab4[key_number]/256。
STL0=tab4[key_number]%256。
TR0=1。
P1_7=~P1^7。
STH0=tab4[key_number]/256。
STL0=tab4[key_number]%256。
delayms(10>。
}。break。
case 8:{
TR0=1。
P1_7=~P1^7。
STH0=tab4[key_number]/256。
STL0=tab4[key_number]%256。
STL0=tab4[key_number]%256。
delayms(10>。
}。break。
case 1:{
TR0=1。
P1_7=~P1^7。
STH0=tab4[key_number]/256。
STL0=tab4[key_number]%256。
delayms(10>。
}。break。
case 2:{
64820,64898,64968,65030, 65058,65110,65157,65178}。
void delayms(uchar no>。
void keydetect(>。
void display(>。
void timer0_interrupt(>。

STC89C51单片机的数字音乐盒设计(含代码)

STC89C51单片机的数字音乐盒设计(含代码)

HEFEI UNIVERSITYFPGA综述报告系别电子信息与电气工程系任课教师汪济洲班级姓名成绩日期数字音乐盒设计摘要:本设计是一个基于STC89C51系列单片机的音乐盒,依据单片机技术原理,通过硬件电路制作以及软件编译,设计制作出一个多功能音乐盒。

该音乐盒主要由按键电路、复位电路、时钟电路以及蜂鸣器组成。

使用两个按键控制音乐盒,一个用来切换歌曲,另一个用来切换8路LED的变化花样,本音乐盒共有两首歌曲,花样灯花样共计4种。

播放歌曲时,蜂鸣器发出某个音调,与之对应的LED亮起。

本设计利用KEIL编程软件对音乐盒源程序进行编程并调试,配合PROTEUS仿真软件对硬件进行仿真调试,节约了设计时间。

关键字:音乐盒 STC89C51单片机 KEIL PROTEUS 音调目录1概述 (3)1.1设计方案 (3)1.2研究内容 (3)1.3音乐盒的功能结构图 (3)2硬件设计 (4)2.1总体设计框图 (4)2.2各部分硬件设计及其原理 (4)2.2.1 STC89C51简介 (4)2.2.2 LED显示电路设计与原理 (5)2.2.3 时钟振荡电路 (5)2.3硬件电路图及功能 (6)3软件设计 (7)3.1音调、节拍以及编码的确定方法 (7)4.1.1 音调的确定 (7)4.1.2 节拍的确定 (8)4.1.3 编码 (9)4.2软件程序设计 (10)4.2.1 程序流程图及相应代码块 (10)4.2.2 程序源代码(见附录A) (14)5调试 (14)5.1检查硬件连接 (14)5.2检查软件系统 (14)5.3测试结果 (14)5.3.1.总体运行图 (14)5.3.2.花样灯4种花样图 (15)参考文献 (16)附录A 程序源代码及注释 (16)1概述本设计是以STC89C51芯片的电路为基础,外部加上放音设备,以此来实现音乐演奏控制器的硬件电路,通过软件程序来控制单片机内部的定时器使其演奏出优美动听的音乐。

通过单片机模拟I2C总线来控制TEA5767收音模块(具有自动搜索功能)

通过单片机模拟I2C总线来控制TEA5767收音模块(具有自动搜索功能)

/****************************************************功能:通过单片机模拟I2C总线来控制TEA5767收音模块,通过4个按键调整收音频率,达到换台的目的设计者:姚松金联系QQ:190719416编写日期:2015年7月20日****************************************************/#include <reg52.h>#include <intrins.h>#include <string.h>#include <math.h>#define uchar unsigned char#define uint unsigned int/****************************************************位定义及变量定义****************************************************/sbit key5=P1^5;//手动搜索加sbit key6=P1^6;//手动搜索减sbit key7=P1^4;//向上自动搜索sbit key4=P1^7;//向下自动搜索uchar idata sbuf[5];//要写入5767的数据uchar idata rbuf[5];//缓存读出的数据uint temp1; //计算频率合成时用的变量unsigned long PLL,frequency=104300; //开机初始化的电台频率为104.3MHz extern bit flag1,flag2;bit led_flag,hisi;uchar code led2[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00,//从左边开始递增亮灯0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//从右边开始递增亮灯0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//从左边开始递减灭灯0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,//从右边开始递减灭灯0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,//一个亮灯从左边开始移动0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//一个亮灯从右边开始移动0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,//一个暗灯从左边开始移动0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//一个暗灯从右边开始移动0x81,0xc3,0xe7,0xff,0xe7,0xc3,0x81,0xff,//从外向内灭灯/从内向外灭灯0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0xff};/****************************************************子函数声明****************************************************/void delayus(uchar x);void delayms (uchar b);void iic_start();void iic_stop();void iic_ack();//i2c应答bit iic_testack();void iic_write8bit(uchar input);//i2c写8位数uchar iic_read8bit();//读取8bit数据void write_com(uchar com);//写1602命令函数void write_data(uchar date);//写1602数据函数void init1602();//1602初始化函数void LCD1602_String(uchar *str);void LCD1602_setXY(uchar y,uchar x);/**************************************************** 计算PLL(单位KHZ)函数****************************************************/ void get_pll(){unsigned long freq1,y=frequency;freq1=y;hisi=sbuf[2]&0x10;if(hisi)PLL=(uint)((float)(freq1+225)/(float)8.192);elsePLL=(uint)((float)(freq1-225)/(float)8.192);}/**************************************************** 计算频率(单位HZ)函数****************************************************/ void get_frequency(){uint y=0;y=PLL;hisi=sbuf[2]&0x10;if(hisi)frequency=(unsigned long int)((y*(float)8.192-225));elsefrequency=(unsigned long int)((y*(float)8.192+225)); }/**************************************************** 写5个字节到收音模块,在写字节前需要先写器件地址****************************************************/ void radio_write(void){uchar i;iic_start();iic_write8bit(0xc0); //TEA5767写地址if(!iic_testack()){for(i=0;i<5;i++){iic_write8bit(sbuf[i]);iic_ack();}delayus(5);;}iic_stop();}/****************************************************从收音模块读5个字节出来,读字节前需要先写器件的读地址指令****************************************************/void radio_read(){uchar i,tempH,tempL;iic_start();iic_write8bit(0xc1);//写读命令iic_testack();for(i=0;i<5;i++){rbuf[i]=iic_read8bit();iic_ack();}iic_stop();tempH=rbuf[0];tempL=rbuf[1];tempH&=0x3f;PLL=tempH*256+tempL;//get_frequency();}/****************************************************写频率到1602函数****************************************************/void write_FREQ(uchar add,uchar date){write_com(0x80+0x40+add);//第二行数据指针地址40H为第二行的第一个字符write_data(0x30+date);}/****************************************************显示频率函数****************************************************/void LCDshow(void){uchar num1,num2,num3,num4,num5;num1=frequency/100000;num2=frequency%100000/10000;num3=frequency%10000/1000;num4=frequency%1000/100;num5=frequency%100/10;if(num1==0){write_com(0x80+0x40+5);write_data(0x20);}else write_FREQ(5,num1);write_FREQ(6,num2);write_FREQ(7,num3);write_FREQ(9,num4);write_FREQ(10,num5);}/**************************************************** 手动搜索电台****************************************************/ void Search(bit mode){if(mode){frequency+=100;//手动设置频率,+0.1MHz;if(frequency>108000) //频率如果大于108.5MHzfrequency=87500; //频率设定为87.5MHz }else{frequency-=100;//手动设置频率,-0.1MHz;if(frequency<87500) //频率如果小于87.5MHzfrequency=108000; //频率设定为108.5MHz }get_pll();sbuf[0]=PLL/256;sbuf[1]=PLL%256;radio_write();LCDshow();}/*************************************************** 自动搜台,mode=1,频率增加搜台; mode="0:频率减小搜台".****************************************************/void Auto_Search(bit mode){do{if(mode){frequency+=100;//手动设置频率,+0.1MHz;if(frequency>108000) //频率如果大于108.5MHzfrequency=87500;}else{frequency-=100;//手动设置频率,-0.1MHz;if(frequency<87500) //频率如果小于87.5MHzfrequency=108000; //频率设定为108.5MHz }get_pll();sbuf[0]=PLL/256+0x80;sbuf[1]=PLL%256;radio_write();LCDshow();radio_read();}while(!(((rbuf[3]&0xf0)/16)>=7));sbuf[0]&=0x7f;radio_write();LCDshow();}/**************************************************** 收音机按键扫描函数****************************************************/ void radio_key_scan(void){static bit curr_encoder_b,last_encoder_b;static bit st=0;uchar i,num,led;temp1++;if(led_flag){if(temp1>4000){temp1=0;if(led==79)led=0;P3=led2[led];led++;}}if(flag1==1) //此语句写空格刷新显示{flag1=0;write_com(0x80+1);write_data(' ');write_com(0x80+2);write_data(' ');radio_read();num=(rbuf[3]&0xf0)/16/4;//显示天线信号强度for(i=0;i<num;i++){write_com(0x80+i);write_data(i);}LCD1602_setXY(1,11);if(rbuf[2]&0x80){write_com(0x80+14);//显示立体声标志write_data(3);write_com(0x80+15);write_data(4);}else{write_com(0x80+14);write_data(' ');write_com(0x80+15);write_data(' ');}radio_write();LCDshow();}if(key7==0&&key4!=0)//控制跑马灯开启或者关闭{delayms(10);if(key7==0&&key4!=0)Auto_Search(1);}if(key4==0&&key7!=0){delayms(10);if(key4==0&&key7!=0)Auto_Search(0);}if(key4==0&&key7==0&&flag1==1){flag1=0;led_flag=~led_flag;//跑马灯标志位if(led_flag)P3=0x00; //当标志位为真时关闭跑马灯,系统上电默认跑马灯是开启的else P3=0xff;while(key4==0||key7==0);}if(key5&&key6){st=0;return;}last_encoder_b=key6;while(!key5){curr_encoder_b=key6;st=1;}if(st){st=0;if((last_encoder_b==0)&&curr_encoder_b==1){Search(1);}else if((last_encoder_b==1)&&(curr_encoder_b==0)){Search(0);}}}。

基于单片机的数字FM收音机(毕业设计)

基于单片机的数字FM收音机(毕业设计)

基于单片机的数字FM收音机设计摘要:本文在具体分析了STC89C52单片机的技术特点与数字FM收音机的基础上,提出了采用单片机控制收音机实现数字调频的方法,并给出了具体的软硬件设计。

该系统利主要由STC89C52单片机、液晶显示器、按键、调频收音模块TEA5767、功放LM386组成[1]。

实际运行时,用TEA5767搜索频率,利用单片机STC89C52控制处理,经LM386芯片放大音频功率同时再通过液晶显示器显示频率,最终实现87.5MHz~108MHz调频广播的接收。

相关的功能验证实验表明,本系统达到了既定的设计目标。

关键词:单片机技术;收音机;频率搜索;液晶显示The Design of Digital FM Radio Which Based on Single ChipMicrocomputerAbstract:This paper mainly proposes the method of using single chip computer to control digital FM radio . It gives the specific hardware and software design which based on a detailed analysis on of the technical characteristics of STC89C52 SCM and digital FM radio. The system uses STC89C52 SCM as CPU for overall control, mainly composed of STC89C52 SCM, LCD display, keypad, FM radio module TEA5767 and LM386 amplifier. When it operates, firstly you should use the TEA5767 display to show the search frequency. Then, control and process it with STC89C52 SCM. By the way magnify the audio power through LM386 chip. The LCD display frequency. Ultimatel y, it’ll reach a broadcast reception range from 87.5MHz to 108MHz FM. Some related functional verification experiments show that the system achieves the established design goals.Keywords:SCM technology; Radio; Frequency search;Liquid-crystal display目录序言 (1)第1章课题分析与方案论证 (2)1.1 课题任务分析 (2)1.2 方案论证 (2)第2章硬件电路 (5)2.1主控电路 (5)2.2音频输出电路 (9)2.3FM收音电路 (12)2.4LCD1062液晶屏模块 (15)2.5按键电路 (16)2.6I2C总线简介 (16)2.7电路装配注意事项 (18)第3章软件设计 (19)3.1主程序设计 (19)3.2液晶屏显示控制子程序 (21)3.3收音机控制子程序 (23)第4章系统测试 (25)4.1硬件测试 (25)4.2软件测试 (25)4.3整机调试 (26)4.4调试结果 (26)结束语 (27)参考文献 (28)致谢 (29)附录 (30)附录1 程序清单 (30)附录2 硬件原理图 (42)附录3 硬件实物图 (43)附录4 外文资料原文 (44)外文资料译文 (50)序言当前时代,虽然电视、手机、互联网等媒体和各种便携式娱乐设备已经普及到千家万户,但传统的收音机在丰富的娱乐媒介中任然占有重要地位。

51单片机蜂鸣器的参数

51单片机蜂鸣器的参数

51单片机蜂鸣器的参数1.引言蜂鸣器是一种常见的电子元件,可发出具有较高频率的声音信号。

在51单片机中,蜂鸣器被广泛应用于各类电子产品中,如报警系统、计时器等。

本文将详细介绍51单片机蜂鸣器的参数及其相关知识。

2.蜂鸣器的工作原理蜂鸣器是一种电声转换器,它将电信号转换为声音信号。

在使用51单片机控制蜂鸣器时,通常使用IO口输出高低电平信号控制蜂鸣器的开关状态,进而产生不同频率的声音。

3.蜂鸣器的参数3.1工作电压蜂鸣器的工作电压范围通常为3V至5V,因此在使用51单片机控制蜂鸣器时,需要注意选择合适的电源电压,以确保蜂鸣器正常工作。

3.2频率蜂鸣器的声音频率是指每秒钟震动的次数,单位为赫兹(H z)。

在51单片机中,通过调节I O口输出的高低电平信号的时间间隔来控制蜂鸣器的频率。

一般而言,蜂鸣器的工作频率范围为2k Hz至5kH z,不同的应用场景可以选择不同的频率。

3.3声压级声压级是指蜂鸣器发出的声音的相对强度,通常以分贝(d B)为单位表示。

在使用51单片机控制蜂鸣器时,可以通过调节IO口输出的高低电平信号的幅度来控制蜂鸣器的声压级。

4.使用51单片机控制蜂鸣器4.1硬件连接在使用51单片机控制蜂鸣器之前,需要将蜂鸣器与51单片机正确连接。

通常情况下,蜂鸣器的正极连接到51单片机的I O口,负极连接到G N D端。

4.2编写程序首先,需要在程序中定义IO口控制蜂鸣器的引脚。

然后,通过设置I O口输出高低电平信号的时间间隔和幅度来控制蜂鸣器的频率和声压级。

下面是一个简单的示例程序,实现了在51单片机上通过蜂鸣器发出不同频率的声音:#i nc lu de<r eg51.h>#d ef in eB EE P_PI NP1//定义蜂鸣器控制引脚v o id de la y_ms(u nsi g ne di nt ms)//延时函数{w h il e(ms--){u n si gn ed in ti=120;//假设晶振频率为12MH zw h il e(i--);}}v o id ma in(){w h il e(1){B E EP_P IN=0;//使蜂鸣器断开d e la y_ms(500);//延时500m sB E EP_P IN=1;//使蜂鸣器闭合d e la y_ms(500);//延时500m s}}5.总结本文介绍了51单片机蜂鸣器的参数及其相关知识。

RDA5807m+IIC收音机51单片机C程序

RDA5807m+IIC收音机51单片机C程序

RDA5807m驱动程序+ IIC 程序/****************************************************************************** ************ 介绍: RD5807M收音机程序供电3.3v 主控使用51单片机显示使用LCD1602** 作者: 胖子** 时间:2016-1-5** 地点:桂林电子科技大学******************************************************************************* **********/#include <reg51.h>#include <string.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulint unsigned long int#define lint long intuchar code xian[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};uchar code hang[]={0xfe,0xfd,0xfb,0xf7}; //矩阵键盘扫描使用//RDA 的寄存器地址#define RDA_R00 0X00 //读出16个位的ID =0X5800#define RDA_R02 0X02 //DHIZ[15],DMUTE[14]静音,MONO[13]声道,BASS[12]重低音,SEEKUP[9],SEEK[8],SKMODE[7],CLK_MODE[6:4]时钟源选择,SOFTRESET[1]软复位,ENABLE[0]电源使能#define RDA_R03 0X03 //CHAN[15:6],TUNE[4],BAND[3:2],SPACE[1:0] 设置频率带宽步长#define RDA_R04 0X04 //STCIEN[14],DE[11],I2Senable[6],#define RDA_R05 0X05 //INT_MODE[15],SEEKTH[14:8](设定自动搜索信号强度阀值),LNA_PORT_SEL[7:6]=0b10,LNA_ICSEL_BIT[5:4],VOLUME[3:0]音量;#define RDA_R0A 0X0A //STC[14]seek complete SF[13]seek fail readchan[9:0]当前频道#define RDA_R0B 0X0B //RSSI[15:9],FM TRUE[8]当前频道是一个节目台#define RDA_READ 0X23 //读RDA5807#define RDA_WRITE 0X22 //写RDA5807//IO操作函数sbit SDA=P2^1;sbit SCL=P2^0;sbit RW =P1^1;sbit RS=P1^0;sbit EN=P2^5;uchar code a[]="FM: . ";uchar code b[]="Vol: RSSI: ";uchar code shu[]="0123456789";uchar num ;void delayms(uint x) //延迟程序uint i,j;for(i=x;i>0;i--)for(j=113;j>0;j--);}/*********************************************** 矩阵键盘程序********************************************************************/uchar ScanKey() //矩阵键盘扫描返回值是当前按键数值如没按下则返回值为零{uint x,y;for(x=0;x<4;x++){uchar temp,gaowei;P3=hang[x]; //分行置零temp=P3&0xf0;if(temp!=0xf0){delayms(10);if(temp!=0xf0){gaowei=P3/16; //判断是第几列的按键按下,将数据装入高四位switch(gaowei){case 0xe:y=0; break;case 0xd:y=1; break;case 0xb:y=2; break;case 0x7:y=3; break;}while(temp!=0xf0){temp=P3&0xf0;}return xian[x][y];}}}return 0;}/******************************************************* LCD1602程序************************************************************************/void write_com(unsigned char com)RS=0;P0=com;delayms(5);EN=1;delayms(5);EN=0;}void write_data(unsigned char date){RS=1;P0=date;delayms(5);EN=1;delayms(5);EN=0;}void init_1602(){P0=0xc0;RW =0;EN=0;write_com(0x38); //éè??16*2??ê?£?5*7μ??ó£?8??êy?Y?úwrite_com(0x0c); //éèa??ê?£?2ê?1a±êwrite_com(0x06); //D′ò×?·?oóμ??·ó1write_com(0x01); //??êá?£?êy?Yá?}void DisplayFrq(float Frq) //显示频率{uint F;F=Frq*10;write_com(0x80+3);write_data(shu[F/1000]);delayms(1);write_data(shu[F/100%10]);delayms(1);write_data(shu[F/10%10]);delayms(1);write_com(0x80+7);write_data(shu[F%10]);delayms(1);}void DisplayVol(uint Vol) //显示音量{write_com(0x80+0x40+4);write_data(shu[V ol/10]);delayms(1);write_data(shu[V ol%10]);delayms(1);}void Display_mute() //显示静音{write_com(0x80+0x40+4);write_data('x');delayms(1);write_data('x');delayms(1);}void Display_RSSI(uint RSSI) //显示信号强度{write_com(0x80+0x40+14);write_data(shu[RSSI/10]);delayms(1);write_data(shu[RSSI%10]);delayms(1);}/*----------------------------------------IIC通信程序---------------------------------------------------*/ void IIC_delayms() //用于IIC延时{_nop_();_nop_();_nop_();_nop_();}void OpenIIC() //IIC启动信号{SDA=1;SCL=1;IIC_delayms();SDA=0;IIC_delayms();SCL=0;}void CloseIIC() //IIC停止信号{SCL=0;SDA=0;IIC_delayms();SCL=1;SDA=1;IIC_delayms();}uchar IIC_Wait_Ack(void) //IIC发送字节后等待从机发送响应信{uchar ucErrTime=0;SDA=1;IIC_delayms();SCL=1;IIC_delayms();while(SDA==1){ucErrTime++;if(ucErrTime>250){CloseIIC();return 1;}}SCL=0;return 0;}void IIC_Ack(void) //发送应答信号{SCL=0;SDA=0; //0±íê?ó|′eIIC_delayms();SCL=1;IIC_delayms();SCL=0;}void IIC_NAck(void) //IIC 非应答信号{SCL=0;SDA=1;IIC_delayms();SCL=1;IIC_delayms();SCL=0;}void IICsendByte(uchar txd) //IIC·写一个字节{uchar t;SCL=0;for(t=0;t<8;t++){if(((txd&0x80)>>7)==1)SDA=1;elseSDA=0;txd<<=1;IIC_delayms();SCL=1;IIC_delayms();SCL=0;IIC_delayms();}}uchar IICReadByte(unsigned char ack) //IIC读一个字节{unsigned char i,receive=0;SDA=1; //51单片机讲引脚置高可设为输入引脚for(i=0;i<8;i++ ){SCL=0;IIC_delayms();SCL=1;receive<<=1;if(SDA==1)receive++;IIC_delayms();}if (!ack)IIC_NAck();elseIIC_Ack();return receive;}uint ReadReg(uchar regAddr) //芯片读寄存器{uint buf;OpenIIC();IICsendByte(RDA_WRITE); //发送芯片地址方向为写IIC_Wait_Ack();IICsendByte(regAddr); //发送寄存器地址IIC_Wait_Ack();OpenIIC();IICsendByte(RDA_READ); // 发送芯片地址方向为读IIC_Wait_Ack();buf = IICReadByte(1);buf = buf<<8;buf =buf|IICReadByte(0);CloseIIC();return buf;}void WriteReg(uchar regAddr,uint val) //芯片写寄存器{OpenIIC();IICsendByte(RDA_WRITE); //发送芯片地址方向为写IIC_Wait_Ack();IICsendByte(regAddr); //发送寄存器地址IIC_Wait_Ack();IICsendByte(val>>8);IIC_Wait_Ack();IICsendByte(val&0XFF);IIC_Wait_Ack();CloseIIC();}void Vol_Set(uchar vol) //音量设置0~15{uint temp=0;temp=ReadReg(RDA_R05);temp&=0xfff0;WriteReg(0x05,vol|temp) ;}void Mute_Set(uchar mute) //静音设置1为静音0为不静音{uint temp=0;temp=ReadReg(0X02);if(!mute)temp|=1<<14;else temp&=~(1<<14);WriteReg(0X02,temp) ;}void Bass_Set(uchar bass) //频带设置{uint temp=0;temp=ReadReg(0X02);if(bass)temp|=1<<12;else temp&=~(1<<12);WriteReg(0X02,temp) ;}uchar Rssi_Get(void) //信号强度获取0~63{uint temp=0;temp=ReadReg(0X0B);temp=(temp>>9)&0x7f;return temp;}void Seekth_Set(uint rssi) //自动搜台信号阈值强度0~15 默认为8 数值越低搜到的台越多{uint temp;rssi = rssi & 0xf;temp=ReadReg(0X05);temp&=~(0xf<<8);temp|= rssi<<8;WriteReg(0X05,temp) ;}void Seek_direction(uchar direction) //搜台方向1向上搜索0向下搜索{uint temp;temp=ReadReg(RDA_R02);temp&=~(1<<9);if(direction == 1)temp|= 1<<9;// if(direction == 0)// temp|= 0<<9;WriteReg(0X05,temp) ;}void Freq_Set(uint freq) //频率设置单位是:10KHz 6500~10800{uint temp;uchar spc=0,band=0;uint fbtm,chan;temp=ReadReg(0X03);temp&=0X001F;band=(temp>>2)&0x03;spc=temp&0x03;if(spc==0)spc=10;else if(spc==1)spc=20;else spc=5;if(band==0)fbtm=8700;else if(band==1||band==2)fbtm=7600;else{fbtm=ReadReg(0X53);fbtm*=10;}if(freq<fbtm)return;chan=(freq-fbtm)/spc;chan&=0X3FF;temp|=chan<<6;temp|=1<<4;WriteReg(RDA_R03,temp) ;delayms(20);// while((ReadReg(0X0B)&(1<<7))==0);}unsigned int seek_channel(void) //半自动搜台{unsigned long temp;temp=ReadReg(RDA_R02);temp |= (1<<8);WriteReg(RDA_R02,temp) ; //SEEK位置一使能自动搜台while( (ReadReg(RDA_R0A)&(1<<14)) == 0 ) // 等待STC位置一表示搜索完成{delayms(10); //?óê±10ms}temp = ((ReadReg(RDA_R0A)&0x3FF) * 100000 + 87000000)/10000 ; //获取当前频率return temp; //返回搜到电台频率单位是:10Khz}void FM_enable(uchar flag) //1 使能芯片0 禁用芯片{uint temp;temp=ReadReg(RDA_R02);if(flag ==1 )temp |=1;if(flag == 0)temp &= ~0x1;WriteReg(RDA_R02,temp);}void RDA_Init(void) //RDA3?ê??ˉ{WriteReg(RDA_R02,0x0002); //软复位delayms(30);WriteReg(RDA_R02,0xd081); //?§32.768Khz ?òé÷??μíò? á¢ì?éùSKMODE = 1÷μ?±??μê±í£?1WriteReg(RDA_R03,0x0000); //?μ?êéè?a87MHz £?2100Khz ?μ′??a87M~108MWriteReg(RDA_R04,0x0040); //?ù±WriteReg(RDA_R05,0X8882); //ò?á?éèavol=2 ÷·§?μ?a8FM_enable(1); //??Dé?μ?Seekth_Set(8); //自动搜台信号阈值强度0~15 默认为8 数值越低搜到的台越多}void display_1602(){write_com(0x80);for(num=0;num<34;num++){write_data(a[num]);delayms(5);}write_com(0x80+0x40);for(num=0;num<34;num++){write_data(b[num]);delayms(5);}}void main(){unsigned char Key_num=0,V ol=1,RSSI=0,mute=1;unsigned int RXFreq=8830,time=0;unsigned int Diantai[40]={8830};char Num=0,station=1;unsigned int test=7896;unsigned int temp=10;init_1602();display_1602();RDA_Init(); //RDA5807初始化Freq_Set(8830); //频率设置V ol_Set(2) ;DisplayFrq(88.3);DisplayVol(2); //显示音量while (1){time++;if(time>1000)Display_RSSI(Rssi_Get()); //显示信号强度Key_num=ScanKey();switch(Key_num){case 1: { if(RXFreq==8800)RXFreq=8800; //频率减else RXFreq-=10;Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);while(0!=ScanKey()); //按键释放break;}case 2:{ if(RXFreq==10800)RXFreq=10800;//频率加else RXFreq+=10;DisplayFrq(RXFreq/100.0);while(0!=ScanKey()); //按键释放break;}case 5: { //声音减if(V ol==0)V ol=0;elseV ol-=1;Vol_Set(V ol);DisplayV ol(V ol); //显示音量while(0!=ScanKey()); //按键释放break;}case 6:{ if(V ol==15)V ol=15; //声音加else V ol+=1;V ol_Set(V ol);DisplayV ol(V ol); //显示音量while(0!=ScanKey()); //按键释放break;}case 7:{ if(mute==1) //静音{Mute_Set(1);Display_mute(); //显示静音while(0!=ScanKey()); //按键释放mute=0;break;}if(mute==0){Mute_Set(0);DisplayV ol(V ol); //取消静音显示音量mute=1;}while(0!=ScanKey());break;}case 9:{ //电台减但是必须先按9进行电台搜索while(0!=ScanKey()); //按键释放Seek_direction(0); //向下搜索RXFreq = seek_channel(); //搜索下一个频道DisplayFrq(RXFreq/100.0);break;}case 10:{ //电台加但是必须先按11进行电台搜索while(0!=ScanKey()); //按键释放Seek_direction(1); //向上搜索RXFreq = seek_channel(); //搜索下一个频道Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);break;}default:break;}}}// case 9:{ //电台减但是必须先按11进行电台搜索// if(station==0)break;// if(Num>0)Num-=1;// else Num=station-1;// Freq_Set(Diantai[Num]);// DisplayFrq(Diantai[Num]/100.0);// RXFreq=Diantai[Num];// Display_now(1) ; //显示当前电台号// while(0!=ScanKey()); //按键释放// break;// }// case 10:{ if(station==0)break; //电台加但是必须先按11进行电台搜索// if(Num<(station-1))Num+=1;// else Num=0;// Freq_Set(Diantai[Num]);// DisplayFrq(Diantai[Num]/100.0);// RXFreq=Diantai[Num];// Display_now(Num); //显示当前电台号// while(0!=ScanKey()); //按键释放// break;// }//// case 11:{ //自动搜台并且存储按9 或者10 可以上下变换电台。

基于单片机的FM收音机设计

基于单片机的FM收音机设计

ELECTRONIC ENGINEERING & PRODUCT WORLD2022.4电子产品世界基于单片机的FM收音机设计Design of home internet detection system based on STM32许可嘉,杨晓军 (成都大学电子信息与电气工程学院,成都610106)摘 要:该设计是单片机控制电路与TEA5767模块电路及音频功率放大电路共同组成的FM收音机电路,用来实现频道接收、保存、播放等功能。

系统采用STC89C52为主控,TEA5767作为数字信号处理器,I2C总线协议为主控与数字信号处理器之间的通信协议,可以实现频道自动搜索、接收、保存、播放等功能。

通过LCD显示器实时显示当下操作及相应频道所在频率。

最终测试结果表明:该设计可以实现频率在87.5 MHz~108 MHz调频广播的接收,本设计能够达到了既定的设计目标。

关键词:单片机;FM收音机;TEA5767;I2C总线随着现代科学技术的不断发展,电子产品也不断更新换代,单片机的广泛应用使用使现在的电子产品设计越来越方便、功能越来越好,而单片机是所有微处理器中性价比最高的一种,它的功能不断完善,种类不断增加,因此它的应用领域也不断扩大,本文我们将单片机与FM收音机芯片综合运用起来,设计了一款可以实现调频、存台的FM收音机系统。

1 系统方案1.1 系统总体设计该系统设计采用模块化设计,主要由存储模块,主控制器,数字处理芯片和音频功率放大器组成。

系统工作原理框图如图1所示,由主控制器接收按键信号进行人机交互,通过I2C总线,主控制器作为主机,TEA5767为从机,双机通信,TEA5767芯片输出音频信号经LM386放大后通过耳机或扬声器播放,系统运行时,收听电台的频率可在LCD显示器上实时显示,通过按键手动控制频率搜台,或切换至自动搜台模式,音频输出设备音量可由电位器调节[8]。

2 系统硬件设计该系统的硬件设计部分分为TEA5767数字处理电路、主控制器电路和音频功放电路。

51单片机专用FM调频立体声收音模块操作指南

51单片机专用FM调频立体声收音模块操作指南

51单片机专用FM调频立体声收音模块操作指南
首先下载HEX文件到MCU中,即可插上耳机收听调频广播
在使用过程中如收音效果不理想,请按照以下进行操作
第一种方法:不使用电脑USB供电,改用带USB插口的电源(5V 1A)的都可以。

如没有别的电源可用,就按下一种方法进行:
第一步:打开我的电脑属性,点击硬件----设备管理器
在设备管理器里面找到COM口
如下图,点右键—选择停用即可,如果要从新下载程序必须再点一次右键选择启用
注:如你的单片机开发板没有自动下载的功能,而是使用ISP下载的方式即不需要以上步骤就能接收到满意的效果。

基于RDA5807的数控FM收音机实训论文

基于RDA5807的数控FM收音机实训论文
P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入P1.1/T2EX)。在flash编程和校验时,P1口接收低8位地址字节。
XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:振荡器反相放大器的输出端。
2.1.2STC89C52主要性能
--与MCS-51单片机产品兼容
--8K字节在系统可编程Flash存储器
--1000次擦写周期
参考文献………………………………………………………………
附录…………………………………………………………………
引言
本设计研究FM收音机分为硬件电路和程序设计两个方面。从硬件电路来说,主要是实现所需电压值、稳压、搜台、控制和频率显示等方面;从系统程序来说,主要是通过软件来实现RDA5807模块的功能,使用IIC总线方式调台,并且得到当前的频率,处理并实现频率转换、显示。
1.方案选择
1.1方案一
使用分立元件来搭接电路,实现模块的功能,收发信号,对信号调频或者调幅,从而得到可以处理的信号,实现收听功能。
由于本方案,调试极为复杂,很难成功,而且接收频率范围小,工作也很不稳定,很容易受外界影响。
1.2方案二
采用RDA5807模块,实现接收信号,并处理功能,并于单片机相结合,实
ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE 仅在执行MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

51单片机FM收音机代码

51单片机FM收音机代码
if(K2 == 0)
{
ring();
while(K2 == 0);
RDA_reg_data[0] &= ~(1 << 1); //SEEK DOWN
frequency=RDA5807_FM_seek();
if((RDA_reg_data[7] & 0x0f) < 0x0f)
{
RDA_reg_data[0] = 0xd0;
RDA_reg_data[1] = 0x01;
RDA_reg_data[3] &= ~(1 << 4);
RDA_reg_data[7]++; // 音量递增
RDA5807_write_reg();
volume=RDA_reg_data[7] & 0x0f;
printf("volume:%d\n",volume);
}
RDA_reg_data[7]--; // 音量递减
RDA5807_write_reg();
volume=RDA_reg_data[7] & 0x0f;
printf("volume:%d\n",volume);
else
P2 = distab[DisplayData[i]]; /*送显示编码*/
P3 = led_bit[i];
j=600;
while(j--);
i++;
P2 = 0xFF;
P3=0xFF;
}
}
/*************蜂鸣器************************/

51单片机毕业课程设计音乐播放器

51单片机毕业课程设计音乐播放器

51单片机毕业课程设计音乐播放器本文档旨在提供关于51单片机毕业课程设计的音乐播放器的详细内容。

音乐播放器是一种通过使用51单片机来实现的设备,它可以播放音乐文件并提供一些基本的控制功能。

设计概述功能要求音乐播放器的主要功能要求包括:1. 播放音乐文件:能够读取存储器中的音乐文件,并将其播放出来。

2. 控制功能:提供基本的控制功能,如播放、暂停、下一曲和音量调节等。

3. 显示功能:在显示屏上显示当前播放的音乐信息,如歌曲名、艺术家和播放进度等。

硬件组成音乐播放器的硬件组成包括:1. 51单片机:作为主控芯片,负责控制整个系统。

2. 存储器:用于存放音乐文件。

3. 音频模块:用于将数字音频信号转换为模拟音频信号输出。

4. 控制模块:包括按钮、旋钮等,用于用户控制音乐播放器的操作。

5. 显示屏:用于显示当前播放的音乐信息。

软件实现音乐播放器的软件实现包括以下几个方面:1. 文件系统:实现对存储器中音乐文件的读取和管理。

2. 音频解码:将读取的音乐文件进行解码,并将解码后的音频数据传递给音频模块输出。

3. 用户界面:通过用户界面与用户进行交互,接受用户的控制指令。

4. 显示管理:管理显示屏的内容,实时显示当前播放的音乐信息。

设计步骤1. 硬件搭建:按照硬件组成部分的描述,搭建音乐播放器的硬件平台。

2. 软件编写:实现音乐播放器的软件功能,包括文件系统、音频解码、用户界面和显示管理等。

3. 调试测试:进行软硬件的调试和测试,确保音乐播放器的各项功能正常运行。

4. 完善优化:在实际测试中发现问题,进一步完善和优化音乐播放器的功能和性能。

5. 文档撰写:完成毕业课程设计文档的撰写,详细描述音乐播放器的设计思路、实现过程和测试结果。

总结通过本文档,你可以了解到51单片机毕业课程设计音乐播放器的完整设计内容,包括设计概述、硬件组成、软件实现和设计步骤等方面的内容。

这将帮助你更好地理解音乐播放器的原理和实现方法,为你的毕业课程设计提供一定的参考和指导。

51单片机+TEA5767+数码管的FM收音机制作电路图+程序

51单片机+TEA5767+数码管的FM收音机制作电路图+程序

51单片机+TEA5767+数码管的FM收音机制作电路图+程序展开全文现在网上很多网友都在做和TEA5767有关的东东,今天找到个MP4的尸体,屏碎了,打开一看刚好有能用的TEA5767,验证了一下这个东西的实用性,用手上刚好有的51单片机开发板和lm386,为这个集成模块搭建了一个测试平台,下面是试验图片,如果在西安的朋友,肯定知道我手的那个电台了,哈哈!图片一:这个图可以看到整体结构了,其实硬件电路很简单,看看pdf文档完全可以搭建出来,单片机实验板是以前开发的商品。

图片二:这一部分是主要部分了,中间上面那个就是拆下来的TEA5767,它右边是LM386,做功率放大的,下面的扬声器是从一个笔记本里边拆下来的(太败家了,衰!)。

下面的程序可以直接运行了,绝对没问题的,这个也是参考了几个网站的程序,做了些修改,可以手动自动调台了,手动调台有问题,算法好像不对,但是出来的频率问题不大,自动搜索的结果是正确的,我要提醒大家一点,自动搜台的效果和接受强度,也就是天线,有很大的关系,我的天线是一截不到15mm的软导线,good luck!1./*********************************************************** ****************************************2.TEA5767采用I2C接口控制,单片机用AT89S52.晶振11.0592Mhz。

采用四位LED显示。

3.TEA5767采用I2C接口控制.TEA5767读写数据都是5个字节,其中PLL参数14位. Fosc =11.0592Mhz.4.************************************************************ ****************************************/5.#include "regx52.h"6.#include "intrins.h"7./*********************************************************** ************************/8.#define max_freq 108000 //108Mhz9.#define min_freq 87500 //87.5Mhz10.#define max_pll 0x339b //108MHz时的pll.11.#define min_pll 0x299d //87.5MHz时的pll.12.#define Add_Freq 113.#define Dec_Freq 014.#define REFERENCE_FREQ 32.76815.#define ATIIcxxDriverAddressW 0xC016.#define ATIIcxxDriverAddressR 0xC117.#define _Nop()_nop_(),_nop_(),_nop_(),_nop_(),_nop_() /*定义空指令*/18.#define LED P019.void Initialization(void);20.void Get_Pll(void);21.void Get_Frequency(void);22.void Search(unsigned char mode);23.void Auto_Search(unsigned char mode);24.unsigned char GetKey();25.void Delay(unsigned char Time);26.void Led_Display(unsigned long i);27.void DelayD(unsigned char Time);28.unsigned char GetKey();29.void Delay(unsigned char Time);30.void ATIICxx_PWrite(unsigned char *McuAddress,unsigned char count);31.void ATIICxx_PRead(unsigned char *McuAddress,unsigned char count);32.void I2C_Send_Byte(unsigned char sendbyte);33.unsigned char I2C_Receive_Byte(void);34.void I2C_Start(void);35.void I2C_Stop(void);36.void I2C_Ack(void);37.void I2C_Noack(void);38.39./******************************************************** *************/40./* IIC读写程序芯片型号*/41.sbit I2C_SCK=P3^0; /*实时时钟时钟线引脚 */42.sbit I2C_SDA=P3^1; /*实时时钟数据线引脚 */43.sbit k1=P1^7;44.sbit k2=P1^6;45.sbit k3=P1^5;46.sbit k4=P1^4;47./******************************************************** *************/48./******************************************************** ****************/49.sbit ge=P2^3;50.sbit shi=P2^2;51.sbit bai=P2^1;52.sbit qan=P2^0;53.unsigned char tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳54.//0, 1, 2 3 4 5 6 7 8 955./******************************************************** ****************/56.unsigned char radio_write_data[5]={0x2d,0x56,0x20,0x11,0x00}; //初始化写入TEA5767的数据(FM89.8Mhz)57.unsigned char radio_read_data[5];58.unsigned int Pll_Data;59.unsigned long Frequency_Data;60./******************************************************** ***************************/61.void Initialization(void)62.{63.TMOD = 0x11;64.TH0 = 0x5d;65.TL0 = 0x3d;66.TR0 = 0; //25ms67.TH1 = 0x5d;68.TL1 = 0x3d;69.TR1 = 0; //25ms70.T2CON = 0x30;71.T2MOD = 0x00;72.RCAP2H = 0xFE;73.TH2 = RCAP2H;74.RCAP2L = 0xFB;75.TL2 = RCAP2L;76.TR2 = 0; //2400bps77.PCON = 0x00;78.SCON = 0xD0;79.IP = 0x14;80.EX0 = 1;81.IT0 = 1;82.ET0 = 1;83.EX1 = 1;84.IT1 = 1;85.ES = 0;86.EA = 0;87.}88.89./******************************************************** ***************************/90.//读TEA5767状态,并转换成频率91.void Radio_Read(void)92.{93.unsigned char temp_l,temp_h;94.Pll_Data = 0;95.96.ATIICxx_PRead(&radio_read_data[0],5);97.98.temp_l = radio_read_data[1];99.temp_h = radio_read_data[0];100.temp_h &= 0x3f;101.Pll_Data = temp_h*256+temp_l;102.Get_Frequency();103.}104.105./******************************************************** ***************************/106.//由PLL计算频率107.void Get_Frequency(void)108.{109.unsigned char hlsi;110.unsigned int npll = 0;111.112.npll = Pll_Data;113.hlsi = radio_read_data[2]&0x10;114.if (hlsi)115.Frequency_Data = (unsigned long)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25-225); //频率单位:KHz116.else117.Frequency_Data = (unsigned long)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25+225); //频率单位:KHz118.}119.120./******************************************************** ***************************/121.//由频率计算PLL122.void Get_Pll(void)123.{124.unsigned char hlsi;125.126.hlsi = radio_read_data[2]&0x10;127.if (hlsi)128.Pll_Data = (unsigned int)((float)((Frequency_Data+225)*4)/(float)REFERENCE_FREQ); //频率单位:k129.else130.Pll_Data = (unsigned int)((float)((Frequency_Data-225)*4)/(float)REFERENCE_FREQ); //频率单位:k131.}132.133./******************************************************** ***************************/134.//手动设置频率,mode=1,+0.1MHz; mode="0:-0".1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD135.void Search(unsigned char mode)136.{137.Radio_Read();138.139.if(mode)140.{141.Frequency_Data += 100;142.if(Frequency_Data > max_freq)143.Frequency_Data = min_freq;144.}145.else146.{147.Frequency_Data -= 100;148.if(Frequency_Data < min_freq)149.Frequency_Data = max_freq;150.}151.152.Get_Pll();153.radio_write_data[0] = Pll_Data/256;154.radio_write_data[1] = Pll_Data%256;155.radio_write_data[2] = 0x41;156.radio_write_data[3] = 0x11;157.radio_write_data[4] = 0x40;158.ATIICxx_PWrite(&radio_write_data[0],5);159.}160.161./******************************************************** ***************************/162.//自动搜台,mode=1,频率增加搜台; mode="0:频率减小搜台".163.void Auto_Search(unsigned char mode)164.{165.Radio_Read();166.Get_Pll();167.if(mode)168.{169.radio_write_data[2] = 0xb1;170.if(Pll_Data > max_pll)171.{172.Pll_Data = min_pll;173.}174.}175.else176.{177.radio_write_data[2] = 0x41;178.if(Pll_Data < min_pll)179.{180.Pll_Data = max_pll;181.}182.}183.184.radio_write_data[0] = Pll_Data/256+0x40;185.radio_write_data[1] = Pll_Data%256;186.radio_write_data[3] = 0x11;187.radio_write_data[4] = 0x40;188.ATIICxx_PWrite(&radio_write_data[0],5);189.Radio_Read();190.while(!(radio_read_data[0]&0x80)) //RF电台就绪标志191.{192.Radio_Read();193.}194.}195.196./******************************************************** ***************************/197.void main(void)198.{199.//0x2d,0x56,0x20,0x11,0x00200.unsigned long temp;201.Initialization();202.radio_write_data[0] =0x2A;203.radio_write_data[1] =0xB6;204.radio_write_data[2] =0x41;205.radio_write_data[3] =0x11;206.radio_write_data[4] =0x40;207.ATIICxx_PWrite(&radio_write_data[0],5);//初始化TEA5767(89.8Mhz)208.Frequency_Data = 89800;209.210.while(1)211.{ temp= Frequency_Data;212.Led_Display(Frequency_Data);213.214.if( k1 == 0)215.{ DelayD(2);216.while(k1 == 0);//等待键松开217.Search(Add_Freq);218.}219.if( k2 == 0)220.{ DelayD(2);221.while(k2 == 0);//等待键松开222.Search(Dec_Freq);223.}224.if( k3 == 0)225.{ DelayD(2);226.while(k3 == 0);//等待键松开227.Auto_Search(Add_Freq);228.}229.if( k4 == 0)230.{ DelayD(2);231.while(k4 == 0);//等待键松开232.Auto_Search(Dec_Freq);233.}234.235.}236.}237.238./******************************************************** *************/239.struct bytedata_2240.{241.unsigned char ByteH;242.unsigned char ByteL;243.};244.245.union int2byte246.{247.unsigned int IntData;248.struct bytedata_2 ByteData;249.};250./******************************************************** *************/251.//启动I2C总线,退出时SCL为低252.void I2C_Start(void)253.{254.I2C_SDA=1; /*发送起始条件的数据信号*/255._Nop();256.I2C_SCK=1;257._Nop();_Nop();_Nop();_Nop();_Nop();/*起始条件建立时间大于4.7us,延时*/258.I2C_SDA=0; /*发送起始信号*/259._Nop();_Nop();_Nop();_Nop();_Nop(); /* 起始条件锁定时间大于4μs*/260.I2C_SCK=0; /*钳住I2C总线,准备发送或接收数据 */261._Nop();_Nop();_Nop();_Nop();_Nop();/*起始条件建立时间大于4.7us,延时*/262.}263.//*停止I2C总线264.void I2C_Stop(void)265.{266.I2C_SCK=0;267.I2C_SDA=0; /*发送结束条件的数据信号*/268._Nop(); /*发送结束条件的时钟信号*/269.I2C_SCK=1; /*结束条件建立时间大于4μs*/270._Nop();_Nop();_Nop();_Nop();_Nop();271.I2C_SDA=1; /*发送I2C总线结束信号*/272.}273.//MCU等待应答位(返回0表示应答)274.bit I2C_WaitAck(void)275.{276.unsigned char ucErrTime = 200; //因故障接收方无ACK,超时值。

51单片机蜂鸣器音阶所对应频率

51单片机蜂鸣器音阶所对应频率

在51单片机中,蜂鸣器音阶所对应的频率是相当重要的。

通过对频率的设定,可以在实际应用中实现不同的音调和音乐效果。

让我们先来了解一下51单片机蜂鸣器的工作原理。

51单片机蜂鸣器是一种被广泛应用于各种电子设备中的音频输出装置,它通过控制电流的频率和占空比来发出不同音调的声音。

在实际应用中,我们要根据需要来设定蜂鸣器的频率,从而实现不同的音阶和音乐效果。

接下来,让我们来详细探讨一下51单片机蜂鸣器音阶所对应的频率。

在音乐理论中,音阶是由一系列音符按特定的音程组成的音乐音阶体系。

常见的音阶包括C大调、D大调、E大调等,每个音阶都对应着特定的频率。

在51单片机蜂鸣器中,我们可以通过设置不同的频率来模拟出这些音阶,从而实现丰富的音乐效果。

以C大调音阶为例,我们可以将C4音符的频率设定为261.63Hz,D4音符的频率设定为293.66Hz,E4音符的频率设定为329.63Hz,以此类推。

通过逐个设置每个音符的频率,我们就可以在51单片机蜂鸣器上模拟出C大调音阶的音乐效果。

同样的方法也适用于其他音阶,只需要根据对应的频率来进行设置即可。

除了基本的音阶,我们还可以通过设置不同频率的音符来实现和弦、音阶、旋律等更复杂的音乐效果。

在实际应用中,我们可以根据具体的需求来调整蜂鸣器的频率,从而实现丰富多样的音乐效果。

总结回顾:在51单片机中,蜂鸣器的工作原理是通过控制电流的频率和占空比来发出不同音调的声音。

对应频率是实现不同音阶和音乐效果的关键。

通过设置不同频率的音符,我们可以模拟出各种音阶、和弦、旋律等丰富的音乐效果。

在实际应用中,可以根据具体的需求来调整蜂鸣器的频率,从而实现丰富多样的音乐效果。

个人观点:蜂鸣器音阶所对应的频率在51单片机中起着至关重要的作用,它不仅可以用于模拟各种音阶和音乐效果,还可以用于实现各种声音提示和警报。

在实际应用中,充分理解和掌握蜂鸣器频率与音阶的对应关系,可以为我们的电子设备带来更丰富、更灵活的音响功能。

51单片机控制喇叭(蜂鸣器)简单发声,频率可调

51单片机控制喇叭(蜂鸣器)简单发声,频率可调

/*-----------------------------------------------------------------------------------------------------------------------------------*//*--*************************功能:【喇叭发出声音,频率可调】*********************--*//*--*************************芯片:【STC12C5A60S2】******************************--*//*--*************************说明:【频率500Hz,单次发声时长1s】******************--*//*--*************************控制:【每按下P1.0一次,喇叭发声1s,长按一直发声】**--*//*------------------------------------------------------------------------------------------------------------------------------------*//*头文件*/#include <reg52.h>#include <intrins.h>sbitControl_Key = P1^0; //定义控制独立按键P1.0,按下发声。

sbitSpeaker_port = P2^7; //定义喇叭控制端口unsigned intnum = 8; //num = (4 * 1000) / Frequency(500Hz) : 决定喇叭的响应周期,从而决定不同的频率unsigned int counter0 = 0; //T0控制频率unsigned int counter1 = 0; //T1控制时长unsigned char Juge_Start; //判断发声1s是否开始。

RDA5820收音发射一体机论文51单片机汇编

RDA5820收音发射一体机论文51单片机汇编

编号:课程设计(论文)说明书题目:基于RDA5820的数控FM收发一体机院(系):信息通信学院专业:电子信息工程学生姓名:胖子2014 年 1 月 1 日该设计是由STC公司生产的一种低功耗、高性能CMOS8位微控制器 STC89c52单片机作为主控芯片,辅以必要电路,基于RD5820的FM收发一体机。

该收发机通过控制独立按键控制单片机驱动FM收发芯片RDA5820,能接收65M-108M频带的FM信号,也可以发射该频段的FM信号。

使用Nokia5110液晶作为显示模块,显示收发频率,音量,信号强度等。

最终完成了一个具备噪声消除、软静音、低音增强等功能、灵敏度高、噪声小、抗干扰能力强、具备收发频率显示功能的FM收发机。

关键词:RDA5820;FM;收发一体;Nokia5110液晶The design is a kind of low power, high performance CMOS8 manufactured by STC bit micro controller STC89c52 as the master chip, supplemented by the necessary circuit, FM transceiver machine based on RD5820.The transceiver control through independent key control computer to drive the FM transceiver chip RDA5820, FM signal receiving the 65M-108M band, FM signal can also launch the band. Use Nokia5110 LCD as the display module, display transceiver frequency, volume, signal strength etc.. Finally finished with a noise elimination,soft mute, bass boost function, high sensitivity, low noise, strong anti-jamming ability, have the receiving frequency display FM transceiver function.Key words:RDA5820; FM; transceiver ;Nokia5110 LCD目录引言 (1)1 方案选择 (1)2 硬件系统设计 (1)2.1 stc89c51单片机 (2)2.1.1stc89c51管脚说明 (2)2.2 Nokia5110LCD (4)2.3 RDA5820 (5)2.4 功率放大器 (7)2.5 独立按键 (9)2.6 收发机总电路图 (10)3 软件设计 (11)3.1 程序初始化 (11)3.2 按键按下判断及处理 (12)4 实验结论 (13)谢辞 (15)参考文献 (16)附录 (17)引言随着科学技术的发展,FM调频收音机的应用十分广泛,尤其消费类占有相当的市场。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

专业综合课程设计基于单片机控制的FM收音机班级:通信(三)班成绩:基于单片机控制的FM收音机摘要:单片机自20世纪70年代问世以来,以极其高的性能价格比受到人们的重视和关注,所以应用很广,发展很快。

单片机的特点是体积小、集成度高、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。

正因为单片机有如此多的优点,因此其应用领域之广,几乎到了无孔不入的地步。

在我国,单片机已被广泛地应用在工业自动化控制、自动检测、智能仪表、智能化家用电器、航空航天系统和和国防军事、尖端武器等各个方面。

我们可以开发利用单片机系统以获得很高的经济效益。

更重要的意义是单片机的应用改变了控制系统传统的设计思想和方法。

以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。

这种以软件结合硬件或取代硬件并能提高系统性能的控制技术称为微控制技术。

例如,本文所要论述的通过单片机来控制TEA5767HN芯片及驱动LCD1602液晶屏实现FM收音并显示频率。

现在人们常使用的收音机为手动调频收台,使用较为麻烦,而且由于接收灵敏度不高,所接收的频段较窄。

本设计采用的是TEA5767HN芯片,它是由PHILIPS公司推出的针对低电压应用的单芯片数字调谐FM立体声收音机芯片。

TEA5767HN芯片内集成了完整的IF频率选择和鉴频系统,只需很少的低成本外围元件,就可实现FM收音机的全部功能。

另外,它具有高性能的RF AGC电路,其接收灵敏度高;参考频率选择灵活;可实现自动搜台。

关键词:89C52单片机;TEA5767HN芯片;2822功率放大器AbstractThis test constitute with stc89c52 singlechip micyoco, tea5767 model,2822 power amplifier,1602 and peripheral circuit.In the design process,we used modular design for several types,such as searching model,display model,storage model and some ancillary function.STC series singlechip has very good control ability and stable level to meet the requirements.前言:本设计研究FM收音机分为硬件电路和程序设计两个方面。

从硬件电路来说,主要是实现所需电压值、稳压、搜台、控制和频率显示等方面;从系统程序来说,主要是如何将电台频率换算出PLL控制字写入TEA5767HN,以及PLL控制字转换成频率送显示。

意义:随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,TEA5767HN芯片可通过IIC系统总线进行各种功能控制,并通过IIC总线输出7位IF计数值;立体声解调器完全免调,可用软件控制SNC、HCC、暂停和静音功能;具有两个可编程I/O口,可用于系统的其他相关功能,又由于其小尺寸的封装,使得它非常适合用于电路板空间相当有限的设计上。

1课题分析1.1 总体分析课题研究分为两部分:硬件电路和程序。

硬件电路包括主控制器、调频模块、喇叭(耳机)接收和频率显示四部分。

主控制器采用的是单片机AT89S51,调频模块采用的是TEA5767HN芯片,显示电路采用FPB9742芯片和LCD液晶屏直读显示。

程序部分用C语言编写包括设定89.6MHZ电台、TEA5767HN写入和读出、PLL控制字转换为频率送显示和IIC总线操作子程序包。

通过设计电路图和电路焊接,编写程序并调试,使系统达到设计要求。

1.2主要技术分析:1.2.1调频广播收音机的原理:一个典型的调频广播收音机的电路原理图如下:1.2.2 本设计用到的TEA5767HN的功能介绍:(1)具有集成的高灵敏度低噪声射频输入放大器;(2)具有射频自动增益控制电路RF AGC;(3)LC调谐振荡器采用廉价的固定片式电感;(4)具有内部实现的FM中频选择性;(5)具有完全集成的FM鉴频器,无需外部解调;(6)可选择32.768kHZ或13MHZ的晶体参考频率振荡器,也可使用外部6.5MHZ的参考频率;(7)采用PLL合成器调谐系统;(8)引脚BUSMODE可选择IIC和3-wire总线;(9)总线可输出7位中频计数器;(10)总线可输出4位信号电平信息;(11)具有软件静音功能;(12)具有免调整立体声解调功能;(13)具有电台自动搜索功能;1.2.3 TEA5767HN的IIC总线说明:TEA5767HN的IIC总线地址是C0H,是可收发的从器件结构,无内部地址。

最大低电平是0.2VCCD,最大高电平是0.45VCCD。

当使用IIC总线时,引脚BUSMODE必须接地。

因总线的最高时钟频率是400kHZ,故芯片的时钟频率不能高于该值。

当向TEA5767HN写入数据时,地址的最低位是0,即写地址是C0H。

当从TEA5767HN读出数据时,地址的最低位是1,即读地址是C1H。

TEA5767HN遵守通用的IIC总线通信协议,IIC总线的写模式和读模式格式分别为:IIC写模式IIC读模式1.2.4写数据:TEA5767HN内部有一个5字节的控制寄存器,在IIC上电复位后,必须先通过总线接口向其写入适当控制字,TEA5767HN才能正常工作。

写入控制字应按照以下顺序:地址,字节1,字节2,字节3,字节4,字节5 首先发送每个字节的最高位。

在时钟下降沿后写入的数据才有效。

写模式字节1格式写模式字节1各位说明写模式字节2格式写模式字节2各位说明写模式字节3格式写模式字节3各位说明搜索停止电平设置(本设计用的是第三种)1.2.5读数据读地址为C1H。

读模式字节1格式读模式字节1各位说明读模式字节2格式读模式字节2各位说明读模式字节3格式读模式字节3各位说明1.2.6 根据电台频率换算出PLL控制字写入以及根据PLL控制字换算出电台频率读出。

TEA5767HN的中频f固定为225khz,参考频率与所使用的晶振有关,具体数值如下:XTAL是写模式控制字第4字节的位4,PLLREF是写模式控制字第5字节的7位。

FM收音机参考频率1 1 32768HZ 32.768KHZfRF=(NDEC*fREFS)/4-(+)fIF 式中,fRF为收到的电台频率,NDEC为控制字的十进制值,fIF为中频频率,fREFS为参考频率。

当采用高本振时,公式用减号,当采用低本振时,公式用加号。

本设计用的参考频率是32768HZ,低本振,计算公式为:fRF=NDEC*8192+225000(HZ)2 FM收音机流程图:3 FM收音机电路图:器件清单:器件规格件数电解电容1µF 2电解电容1000µF 1电解电容47µF 4普通电容0.1µF 1 电阻10k 2TDA2822 1喇叭 14 FM收音机实物图:5.FM收音机核心程序:#include <reg51.h>#include <string.h>#include <math.h>#include <uart.h>#include <i2c.h>#define max_freq 108000 #define min_freq 87500 sbit KEY11=P3^0;sbit KEY22=P3^1;sbit KEY1=P3^2;sbit KEY2=P3^3;unsigned char radio_write_data[5]={0x2a,0xb6,0x40,0x11,0x40}; //要写入TEA5767的数据unsigned char radio_read_data[5]; //TEA5767读出的状态unsigned int default_pll=0x301d; //0x29f9; //默认存台的pll,95.8MHzunsigned int max_pll=0x339b; //108MHz时的pll,unsigned int min_pll=9000; //70MHz时的pllunsigned long frequency;unsigned int pll;unsigned long FM;/*void delay(unsigned int time){while(time--);}*/void delay1ms (unsigned int b)//1ms{for(b;b>0;b--){unsigned int i;for(i=0;i<300;i++){;}}}#include<intrins.h>sbit RS = P2^4; //定义端口sbit RW = P2^3;sbit EN = P2^2;sbit P20=P2^0;//定义锁存使能端口段锁存sbit P21=P2^1;// 位锁存sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P1/*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------*/ void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/ void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com){while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data){while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/ void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*------------------------------------------------初始化函数------------------------------------------------*/ void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/ }//1602显示void DISP_FM(){unsigned char j;j=(radio_read_data[3]&0xf0)>>4;LCD_Write_Com(0x8e);LCD_Write_Data('0'+(j/10));LCD_Write_Data('0'+(j%10));LCD_Write_Com(0x8c);LCD_Write_Data('S');LCD_Write_Data(':');FM=frequency;LCD_Write_Com(0x80);LCD_Write_Data('F');LCD_Write_Data('M');LCD_Write_Data(' ');LCD_Write_Data('R');LCD_Write_Data('a');LCD_Write_Data('d');LCD_Write_Data('i');LCD_Write_Data('o');LCD_Write_Com(0xc2);if(FM/100000)LCD_Write_Data('0'+FM/100000);else LCD_Write_Data(' ');LCD_Write_Com(0xc3);LCD_Write_Data('0'+(FM%100000)/10000); LCD_Write_Com(0xc4);LCD_Write_Data('0'+(FM%10000/1000)); LCD_Write_Com(0xc5);LCD_Write_Data('.');LCD_Write_Com(0xc6);LCD_Write_Data('0'+(FM%1000)/100); LCD_Write_Com(0xc7);LCD_Write_Data('0'+(FM%100)/10);LCD_Write_Com(0xc8);LCD_Write_Data('0'+(FM%10));LCD_Write_Com(0xc9);LCD_Write_Data(' ');LCD_Write_Com(0xca);LCD_Write_Data('M');LCD_Write_Com(0xcb);LCD_Write_Data('H');LCD_Write_Com(0xcc);LCD_Write_Data('Z');}void radio_write(void){unsigned char i;iic_start();iic_write8bit(0xc0); //TEA5767写地址 if(!iic_testack()){for(i=0;i<5;i++){iic_write8bit(radio_write_data[i]);iic_ack();}}iic_stop();}//由频率计算PLLvoid get_pll(void){unsigned char hlsi;unsigned int twpll=0;hlsi=radio_write_data[2]&0x10; //HLSI位if (hlsi)pll=(unsignedint)((float)((frequency+225)*4)/(float)32.768); //频率单位:kelsepll=(unsignedint)((float)((frequency-225)*4)/(float)32.768); //频率单位:k}//由PLL计算频率void get_frequency(void){unsigned char hlsi;unsigned int npll=0;npll=pll;hlsi=radio_write_data[2]&0x10;if (hlsi)frequency=(unsignedlong)((float)(npll)*(float)8.192-225); //频率单位:KHz elsefrequency=(unsignedlong)((float)(npll)*(float)8.192+225); //频率单位:KHz }void radio_read(void){unsigned char i;unsigned char temp_l,temp_h;pll=0;iic_start();iic_write8bit(0xc1); //TEA5767读地址if(!iic_testack()){for(i=0;i<5;i++){radio_read_data[i]=iic_read8bit();iic_ack();}}iic_stop();temp_l=radio_read_data[1];temp_h=radio_read_data[0];temp_h&=0x3f;pll=temp_h*256+temp_l;get_frequency();}//手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUDvoid search(bit mode){radio_read();if(mode){frequency+=100;if(frequency>max_freq) frequency=min_freq; }else{frequency-=100;if(frequency<min_freq) frequency=max_freq; }get_pll();radio_write_data[0]=pll/256; radio_write_data[1]=pll%256; radio_write_data[2]=0x41;radio_write_data[3]=0x11;radio_write_data[4]=0x40;radio_write();DISP_FM();}//自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台void auto_search(bit mode){bit BLF;radio_read();if(BLF){ if(mode)frequency=min_freq;else frequency=max_freq;}else{if(mode){frequency+=100;if(frequency>max_freq)frequency=min_freq;}else{frequency-=100;if(frequency<min_freq)frequency=max_freq;}}get_pll();if(mode)radio_write_data[2]=0xb1;elseradio_write_data[2]=0x41;radio_write_data[0]=pll/256+0x40; //加0x40是将SM置为1 为自动搜索模式radio_write_data[1]=pll%256;radio_write_data[3]=0x11; //SSL1和SSL0控制搜索停止条件radio_write_data[4]=0x40;radio_write();radio_read();while(!(radio_read_data[0]&0x80)) //搜台成功标志{radio_read();DISP_FM();UART_Put_Num(frequency);}if((radio_read_data[0]&0x40)==0x40)BLF=1;else BLF=0;get_pll();if(radio_read_data[2]&0x80)radio_write_data[2]=0xb1; else radio_write_data[2]=0x41;radio_write_data[0]=pll/256;radio_write_data[1]=pll%256;radio_write_data[3]=0x11;radio_write_data[4]=0x40;radio_write();radio_read();DISP_FM();}void main(void){ P3=0xFF;P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉P20=0; //这是为了关闭开发板上的数码管实际应用去掉P21=0; //这是为了关闭开发板上的数码管实际应用去掉P35=0; //这是为了关闭开发板上的点阵实际应用去掉P1=0xFF;//P1口置1LCD_Init();LCD_Clear();//清屏UART_Init();//串口初始化UART_Send_Str("调频收音机\n");radio_write();while(1){if(KEY1==0){delay1ms(15); //延时15msif(KEY1==0)while(KEY1==0);//等待按键释放search(1);radio_read();UART_Send_Str("目前频率\n");UART_Put_Num(frequency);UART_Send_Str("\n");DISP_FM();}if(KEY2==0){delay1ms(15); //延时15msif(KEY2==0)while(KEY2==0);//等待按键释放 search(0);radio_read();UART_Send_Str("目前频率\n"); UART_Put_Num(frequency);UART_Send_Str("\n");DISP_FM();}if(KEY11==0){delay1ms(15); //延时15msif(KEY11==0)while(KEY11==0);//等待按键释放 auto_search(0);radio_read();UART_Send_Str("目前频率\n"); UART_Put_Num(frequency);UART_Send_Str("\n");DISP_FM();}if(KEY22==0){delay1ms(15); //延时15msif(KEY22==0)while(KEY22==0);//等待按键释放 auto_search(1);radio_read();UART_Send_Str("目前频率\n"); UART_Put_Num(frequency);UART_Send_Str("\n");DISP_FM();}}}6总结经过三天的设计和开发,FM收音机已经做成并能正常工作,通过这次设计实践掌握了基本硬件电路的设计、焊接及故障调试,并学习了keilc编程语言,总之收获颇丰。

相关文档
最新文档