基于TEA5767的数字式收音机设计报告

合集下载

单片机控制的TEA5767高性能FM收音机DIY

单片机控制的TEA5767高性能FM收音机DIY

[分享]单片机控制的TEA5767高性能FM收音机DIY(含原理图,源代码)Post By:2007-10-10 11:41:57本帖向大家介绍新型FM收音机的设计及制作。

想想当年我们是什么做收音机的。

高放混频,解调,立体声解码,锁相等好几个芯片,线路焊好了,但痛苦才开始。

有设备还好些,没有更苦。

为了找谐振点,不停的调电容电感,不停的换电容电感······终于有声音,但始终都没那么好。

现在,痛苦终于过去。

因为有了新一代的芯片TEA5767。

TEA5767 ,零调整。

线路又极其简单。

一个晶振,一个电感,几个电容完了。

通过I2C 接口送几个字节的数据进去就ok。

此主题相关图片如下:此主题相关图片如下:源代码:可以存台的版本。

本文用到的收音模块可到:/参考// WINAVR GCC// ATmega8// clock: internal 1Mhz#include <avr/io.h>#include <avr/interrupt.h>#include <avr/signal.h>#include <avr/delay.h>#include <avr/eeprom.h>#include '3310LCD_function.c'#define uchar uint8_t#define uint uint16_t#define SLA_W 0b11000000 #define SLA_R 0b11000001uchar senddata[5] ;uchar readdata[5] ;uchar search = 0;uchar search_up = 0;uchar mode = 1;uchar station = 0;uint pll = 0x29da; // 88Mhz uint fre = 8750;//-------------------------------// 延时void delay_ms(uint ms){uint i;for(i=0;i<ms;i++)_delay_loop_2(250);}//I2C主机模式输出void set5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL while (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG//if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_W; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));//if ((TWSR & 0xF8) !=MT_SLA_ACK) ERROR();for ( i = 0; i < 5; i++ ){TWDR = senddata;TWCR = (1<<TWINT) | (1<<TWEN); // send datawhile (!(TWCR & (1<<TWINT)));// if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL//LCD_write_english_string(60,3,'sOK');}//I2C主机模式输入void read5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL while (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG//if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_R; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));for ( i = 0; i < 5; i++ ){TWCR = (1<<TWINT) | (1<<TWEN); // read datawhile (!(TWCR & (1<<TWINT)));readdata = TWDR ;// if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL//LCD_write_english_string(10,3,'rOK');}void show_frequency(void){uint32_t nPLL =0; //Decuint32_t frequency = 0; //Khzuchar display_bit[5];uchar tbTmp1=readdata[1];uchar tbTmp2=readdata[0];tbTmp2&=0x3f;nPLL=pll ;//tbTmp2*256+tbTmp1;// calculate searched station frequencyif(senddata[2]&0x10)frequency =(unsigned long)(nPLL*82/10-225);elsefrequency =(unsigned long)(nPLL*82/10+225);display_bit[0] = frequency / 100000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20;else display_bit[0] += 0x30;display_bit[1] = (frequency / 10000)%10 +0x30;display_bit[2] = (frequency / 1000)%10 +0x30;display_bit[3] = (frequency / 100)%10 +0x30; display_bit[4] = (frequency / 10)%10 +0x30; LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]);LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' MHz' );}void show_frequency2(void){uchar display_bit[5];display_bit[0] = fre / 10000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20; else display_bit[0] += 0x30;display_bit[1] = (fre / 1000)%10 +0x30; display_bit[2] = (fre / 100)%10 +0x30;display_bit[3] = (fre/10) %10 +0x30;display_bit[4] = fre%10+0x30;LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]);LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' MHz' );}void show_rx_power(void){uchar temp;temp = (readdata[3]>>4);LCD_write_english_string(60,0,' ');LCD_write_char((temp/10)%10 + 0x30 ); LCD_write_char(temp%10 + 0x30 );}void show_rx_power_blank(void){LCD_write_english_string(60,0,' ');}void calculate_pll(void){uint32_t temp;temp = fre;pll = (uint)( ( (temp*10-225)*4000)/32768);}void init(void){DDRB = 0XFF;PORTB = 0XFF;DDRD = 0B11100000;PORTD = 0XFF;DDRC = 0B00000000;PORTC = 0Xff; // IO initdelay_nms(250);delay_nms(250);delay_nms(250);delay_nms(250);//TWITWBR = 12;TWCR = (1<<TWEN); //SEND STOP SIGNALOSCCAL=0x9d; // 8M系统内部时钟校准//设置MCU的I/O口DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI | SPI_CLK;SPSR |= (1<<SPI2X); // 设置SPI时钟倍速SPCR |= (1<<SPE)|(1<<MSTR); // 使能SPI接口,主机模式,4M时钟LCD_init(); //初始化液晶}//////////////////////////////////////////////////////////////////int main(void){init();uint x;senddata[0] = pll/256; //load 100MHz pllsenddata[1] = pll%256; // away's low side injection senddata[2] = 0b00100000;senddata[3] = 0b10010000;senddata[4] = 0b01000000;readdata[0] = senddata[0];readdata[1] = senddata[1];LCD_write_english_string(0,0,'FM STEREO' );//LCD_write_english_string(0,5,' stereo' );//LCD_write_english_string(0,2,' 99.1Mhz' );show_frequency();LCD_write_inverse_string(0,5,' UP ');LCD_write_inverse_string(48,5,' DOWN ');station = eeprom_read_byte(22);fre = eeprom_read_word( station *2);calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);//delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);while(1){start:if ( (PIND&0x0c) == 0x04){delay_nms(50);if ( (PIND&0x0c) == 0x04){LCD_write_english_string(48,5,' DOWN ' );delay_nms(200);x= 0;while(bit_is_clear(PIND, 3)){x++;if ( x > 65530 ) //判断是否长按{if ( mode ){mode = 0; //改变模式LCD_write_english_string(0,4,'SET CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{mode = 1; //改变模式LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);LCD_write_english_string(24,4,' ' );eeprom_write_word(station*2,fre);}loop_until_bit_is_set(PIND, 3);LCD_write_inverse_string(48,5,' DOWN '); goto start;}}//LCD_write_english_string(0,4,'KEY1 press' ); LCD_write_inverse_string(48,5,' DOWN ');if ( mode ){station --;if ( station < 1 ) station = 10; eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2); calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' ); LCD_write_char(station/10 +0x30); LCD_write_char(station%10 +0x30); }else{fre -=5;if ( fre <= 8750 ) fre = 10800;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();}}if ( (PIND&0x0c) == 0x08){delay_nms(50);if ( (PIND&0x0c) == 0x08){LCD_write_english_string(0,5,' UP ');delay_nms(200);if ( mode ){loop_until_bit_is_set(PIND, 2);LCD_write_inverse_string(0,5,' UP ');station ++;if ( station >= 11 ) station = 1;eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2); calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' ); LCD_write_char(station/10 +0x30); LCD_write_char(station%10 +0x30); }else{fre +=5;if ( fre >= 10800 ) fre = 8750;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();//loop_until_bit_is_set(PIND, 2);LCD_write_inverse_string(0,5,' UP ');}}}}}。

基于TEA5767数字调频收音机(主讲:程匹克)

基于TEA5767数字调频收音机(主讲:程匹克)

BTL(Bridged-Tied-Load)和SE(Single-Ended) 输出模式
在相同的VDD条件下,BTL模式相对于SE模式有许多有点:
1、BTL模式可以输出更高的电压VOBTL=2VOSE; 2、相同负载下可以输出更大的功率; 3、BTL模式可以有效的抑制共模噪声,这是因为相同的冲击会同时出现在BTL的 “+”,“-”两端,通过负载后会相互抵消,不对扬声器做功;
硬件及原理分析介绍
合理布局是使作品美观漂亮的关键!!!
手工版
PCB成品版
TEA5767模块电路
模块引脚
引脚 符号 功能 引脚 符号 功能
总线数据输入 输出
总线时钟 总线模式选择 总线读写控制 电源正
电源地
右声道输出 左声道输出 解调信号输出 信号(天线)
模块应用说明
①1、2脚为I2C总线的数据线和时钟线必须通过10K电阻上拉; ②3脚BUSMOD这里我们使用的是I2C总线驱动所以将其接地; ③4脚为SPI总线驱动时的读写控制,这里使用的是I2C总线驱 动,所以将其悬空; ④5脚VCC 最好通过磁珠及电容进行干扰抑制。100uF 的电容 选用电解电容,0.1uF 的电容可以选用介电常数高,高频性 能好的陶瓷电容, 以保证整个收音模块的电源系统更加稳 定; (这里我们选用的是104贴片电容,没有磁珠选用的 是10uH电感); ⑤7、8脚左右声道输出脚必须通过电容耦合输出,以滤除直 流成分信号;
TDA2822功放电路
双联电位器
双声道音频接口
TDA2822应用说明
① TDA2822 DATASHEET ; ②TDA2822在5 V供电时可以在8负载上得到大约0.25 W 的功 率。由于TEA5767输出信号为7 5 mV左右,而 T DA2 8 2 2 增益GV约为39dB,在5 V供电时输入 3 0 mV即达到最大功率 输出,所以,另加了 33K和15K电阻对 TEA5767输出的信号进 行衰减以避免输出失真过大; ③C9,R18和C15,R25组成高次谐波抑制电路,用于防止电路 振荡 ,必须加上; ④C12和C13为输出耦合电容,TDA2822输出脚输出存在2.5V 的直流信号,我们要得到的是交流的声音信号,所以必须 利用耦合电容将直流信号隔离并将交流声音信号耦合输出。 当我们需要对音频信号进行采样的时候可以借助这个2.5V 的直流电平将音频信号抬高方便MCU采样。因为我们这里 选择TDA2822为SE模式输出,如果BTL模式输出就不用输 出耦合电容了;

基于TEA5765收音模块制作可显示频率的FM收音机相关文件

基于TEA5765收音模块制作可显示频率的FM收音机相关文件

TEA5767的总线接口和控制寄存器可编程芯片必须要由单片机通过控制总线向芯片内的寄存器写入控制字才能正常工作。

TEA5767的控制总线有I2C和3-wire两种,引脚BUSMODE为低时选用I2C总线,引脚BUSMODE 为高时选用3-wire总线。

这里以I2C总线为例说明控制字的写入和读出。

1.TEA5767的I2C总线TEA5767 I2C总线的地址是CO,是可收发的从器件结构,无内部地址。

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

向TEA5767 写入数据时,地址的最低位是0,即写地址是C0。

读出数据时地址的最低位是1,即读地址是C1。

TEA5767的控制寄存器要写入5个字节,每次写入数据时必须严格按照下列顺序进行:地址、字节1、字节2、字节3、字节4、字节5。

每个字节的最高位首先发送。

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

上电复位后,设置为静音,所有其它位均被置低,必须写入控制字初始化芯片。

表1 I2C写模式TEA5767遵守通用的I2C总线通信协议,写模式和读模式的格式分别见表1和表2。

2.写数据TEA5767内部有一个5个字节的控制寄存器,在IC上电复位后必须通过总线接口向其中写入适当的控制字,它才能够正常工作。

每个数据字节各位的功能含义见表4到表14。

表3 写模式数据序列表4 数据字节1的格式表5 数据字节1各位的说明表6 数据字节2的格式表7 数据字节2各位的说明表10 搜索停止电平设定3.读数据和写数据类似,从TEA5767 读出数据时,也要按照“地址、字节1、字节2、字节3、字节4、字节5”这样的顺序读出,读地址是C1。

读出的5个字节的含义见表16到表25中的说明。

表15 读模式表16 字节1的格式表17 字节1的说明表19 字节2的说明表20 字节3的格式下面是用来计算PLL控制字的C语言程序:static void AssembleFrequencyWord(void){UINT16 twPLL =0; //DecUINT32 tdwPresetVCO =gdwPresetVCO; //KhzBYTE tbTmp1;BYTE tbTmp2;// calcu1ate frequency dataword bits from given station frequency BCD:if(FlagHighInjection)twPLL =(unsigned int)((float)((tdwPresetVCO+225)*4)/(float)REFERENCE_FREQ);elsetwPLL=(unsigned int)((float)((tdwPresetVCO -225)*4)/(float)REFERENCE_FREQ);//convert word to byte f.tbTmp1 =(unsigned char)(twPLL%256); //6789=Hex1A85 -->133=Hex85tbTmp2 =(unsigned char)(twPLL/256); // -->26=Hex1AWriteDataWord[0]=tbTmp2; //high block WriteDataWord[1]=tbTmp1;}其中频率的单位均为KHz,计算的结果是2字节的二进制数。

单片机控制的TEA5767高性能FM收音机DIY

单片机控制的TEA5767高性能FM收音机DIY

[分享]单片机控制的 TEA5767高性能FM 收音机 DIY (含原理图,源代码 ) Post By : 2007-10-10 11:41:57本文用到的收音模块可到: / 参考本帖向大家介绍新型 FM 收音机的设计及制作。

想想当年我们是什么做收音机的。

高放混频,解调,立体声解码,锁相等好几个芯片,线路焊好了,但痛苦才开始。

有设备还好些,没有更苦。

为了找谐振点,不 停的调电容电感,不停的换电容电感••…终于有声音,但始终都没那么好。

现在,痛苦终于过去。

因为有了新一代的芯片 TEA5767。

TEA5767 ,零调整。

线路又极其简单。

一个晶振,一个电感,几个电容完了。

通过 接口送几个字节的数据进去就ok 。

I 弓此主题相关图片如下:电子・CNC 爱好看源动力|二1此主题相关图片如下: 电子・CNC 爱好者■源动力源代码:可以存台的版本。

I2C 磁动力论坛bbs 磁动力论坛bbs.cdle. net// WINAVR GCC// ATmega8// clock: internal 1Mhz#include <avr/io.h>#include <avr/interrupt.h>#include <avr/signal.h>#include <avr/delay.h>#include <avr/eeprom.h>#include '3310LCD_function.c'#define uchar uint8_t#define uint uint16_t#define SLA_W 0b11000000 #define SLA_R 0b11000001uchar senddata[5] ;uchar readdata[5] ;uchar search = 0;uchar search_up = 0;uchar mode = 1;uchar station = 0;uint pll = 0x29da; // 88Mhzuint fre = 8750;//// 延时void delay_ms(uint ms){uint i;for(i=0;i<ms;i++)_delay_loop_2(250);}//I2C 主机模式输出void set5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START whileSIGNAL (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG //if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_W; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));//if ((TWSR & 0xF8) !=MT_SLA_ACK) ERROR();for ( i = 0; i < 5; i++ ){TWDR = senddata;TWCR = (1<<TWINT) | (1<<TWEN); // send datawhile (!(TWCR & (1<<TWINT)));// if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL // if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}//LCD_write_english_string(60,3,'sOK');}//I2C 主机模式 输入void read5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START while (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG //if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_R; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));for ( i = 0; i < 5; i++ ){TWCR = (1<<TWINT) | (1<<TWEN); // read datawhile (!(TWCR & (1<<TWINT)));readdata = TWDR ;SIGNALTWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL//LCD_write_english_string(10,3,'rOK');}void show_frequency(void){uint32_t nPLL =0; //Decuint32_t frequency = 0; //Khzuchar display_bit[5];uchar tbTmp1=readdata[1];uchar tbTmp2=readdata[0];tbTmp2&=0x3f;nPLL=pll ;//tbTmp2*256+tbTmp1;// calculate searched station frequency if(senddata[2]&0x10)frequency =(unsigned long)(nPLL*82/10-225); elsefrequency =(unsigned long)(nPLL*82/10+225);display_bit[0] = frequency / 100000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20; else display_bit[0] += 0x30;display_bit[1] = (frequency / 10000)%10 +0x30;display_bit[2] = (frequency / 1000)%10 +0x30;display_bit[3] = (frequency / 100)%10 +0x30;display_bit[4] = (frequency / 10)%10 +0x30;LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]);LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' MHz' );}void show_frequency2(void){uchar display_bit[5];display_bit[0] = fre / 10000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20;else display_bit[0] += 0x30;display_bit[1] = (fre / 1000)%10 +0x30; display_bit[2] = (fre / 100)%10 +0x30; display_bit[3] = (fre/10) %10 +0x30;display_bit[4] = fre%10+0x30;LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]); LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' }void show_rx_power(void){uchar temp;temp = (readdata[3]>>4);LCD_write_english_string(60,0,'LCD_write_char((temp/10)%10 LCD_write_char(temp%10 + } void show_rx_power_blank(void) {LCD_write_english_string(60,0,' }void calculate_pll(void){uint32_t temp;temp = fre;MHz' );');+ 0x30 ); 0x30 );');pll = (uint)( ( (temp*10-225)*4000)/32768);void init(void){DDRB = 0XFF;PORTB = 0XFF;DDRD = 0B11100000;PORTD = 0XFF;DDRC = 0B00000000;PORTC = 0Xff; // IO initdelay_nms(250);delay_nms(250);delay_nms(250);delay_nms(250);//TWITWBR = 12;TWCR = (1<<TWEN); //SEND STOP SIGNALOSCCAL=0x9d; // 8M 系统内部时钟校准// 设置MCU 的I/O 口DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI| SPI_CLK;SPSR |= (1<<SPI2X); // 设置SPI 时钟倍速SPCR |= (1<<SPE)|(1<<MSTR); // 使能SPI 接口,主机模式,4M 时钟LCD_init(); // 初始化液晶////////////////////////////////////////////////////////////////// int main(void){init();uint x;senddata[0] = pll/256; //load 100MHz pllsenddata[1] = pll%256; // away's low side senddata[2] = 0b00100000;senddata[3] = 0b10010000;senddata[4] = 0b01000000;readdata[0] = senddata[0];readdata[1] = senddata[1];LCD_write_english_string(0,0,'FM STEREO' //LCD_write_english_string(0,5,' stereo' );//LCD_write_english_string(0,2,' 99.1Mhz' ); show_frequency();LCD_write_inverse_string(0,5,' UP ');LCD_write_inverse_string(48,5,' DOWN '); station = eeprom_read_byte(22);injection );fre = eeprom_read_word( station *2); calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);//delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);while(1){start:if ( (PIND&0x0c) == 0x04){delay_nms(50);if ( (PIND&0x0c) == 0x04){LCD_write_english_string(48,5,' DOWN ' );delay_nms(200);x= 0;while(bit_is_clear(PIND, 3))x++;if ( x > 65530 ) //判断是否长按{if ( mode ){mode = 0; // 改变模式LCD_write_english_string(0,4,'SET CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{mode = 1; // 改变模式LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);LCD_write_english_string(24,4,' ' );eeprom_write_word(station*2,fre);loop_until_bit_is_set(PIND,3);LCD_write_inverse_string(48,5,' DOWN '); goto start;}//LCD_write_english_string(0,4,'KEY1 press' );LCD_write_inverse_string(48,5,' DOWN ');if ( mode ){station --;if ( station < 1 ) station = 10;eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2); calculate_pll(); show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{fre -=5;if ( fre <= 8750 ) fre = 10800;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();}}if ( (PIND&0x0c) == 0x08){delay_nms(50);if ( (PIND&0x0c) == 0x08){LCD_write_english_string(0,5,'delay_nms(200);UP ');if ( mode ){loop_until_bit_is_set(PIND, LCD_write_inverse_string(0,5,' station ++;if ( station >= 11 ) station 2);UP '); = 1;eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2);calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{fre +=5;if ( fre >= 10800 ) fre = 8750;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767(); show_frequency2(); show_rx_power();} }//loop_until_bit_is_set(PIND,LCD_write_inverse_string(0,5,' UP ');2);。

《网络与信息》基于TEA5767的数字收音机设计

《网络与信息》基于TEA5767的数字收音机设计

一、总体方案设计 1、FM接收频率范围:88MHz~108MHz。

2、设计硬件控制电路和单片机控制程序完成对FM收音模块的操作。

3、有电台自动搜索功能,能够控制电台搜索方向,搜索到电台信号后即可收听电台播音。

4、有电台频率显示功能,电台存储功能二、软硬件的系统设计(一)、硬件结构及各部分功能:单片机根据键盘输入,通过I2C对5767模块的控制寄存器进行读写操作,以实现5767模块的自动手动搜索功能,音频信号经过由TDA2822构成的功放电路放大处理由扬声器输出。

并将从5767模块中读取的频率字换算后显示在LCD上。

按存储键时,单片机将频率字写入24c02实现存台功能,按读取键即可收听所存电台。

总体框图:(二)、软件流程图三、测试给收音机上电后频率跳到初始设定值(91.8MHz),按手动搜索(上、下),可实现0.1MHz步进;按自动搜索键(上、下),可搜出最近的符合设定信号清晰度的频道;按存台键,可以将即时频率存入24c02中;按读取键即可调出该频率所对应的电台。

手动搜索时,从低端频率88MHz(PLL控制字是2A11H),每按一次手动搜索按钮,频率增加100kHz,读搜到电台标志位RF(读模式字节1的B7)为1时搜到电台,否则未搜到。

当搜索到波段尽头时,BLF(读模式字节1的B6)为1,如果再按手动搜索按钮,则从低端频率重新开始搜索。

自动搜索时,可以用静音搜索模式,搜索开始前静音位(写模式字节1的B7)置1,若从波段的低端频率88MHz开始搜索,采用向上搜索方式(写模式字节3的B7=1),反复读取控制字的RF标志位,若RF=1,则表明搜到电台。

接着检测STEREO位(读字节3的B7)为1,说明是立体声信号。

再检测BLF标志位,若BLF=1,说明已经搜到波段尽头,这时需将搜索的起始频率设为高端频率108MHz(PLL控制字是339BH),搜索方向设为向下搜索。

若BLF=0,说明未搜索到波段尽头,这时注意再按下自动搜索按钮时,应将当前停止位置的频率增加100kHz,然后继续搜索,否则程序可能停留在第一个搜到的电台频率上。

基于TEA5767的数字式收音机设计

基于TEA5767的数字式收音机设计

可剪辑修改河南大学物理与电子学院开放实验室单片机设计报告基于TEA5767的数字调频收音机设计人:开放实验室入室人员可剪辑修改目录0 前言 (1)1主要器材介绍 (2)1.1 STC89C52单片机 (2)1.2 TEA5767收音模块儿 (2)1.3 X9511数字电位器 (3)1.4 四位共阴数码管 (4)1.5 2822集成功放................................................................... (4)2系统原理及功能介绍 (5)2.1数字FM收音机基本原理 (5)2.2 基本原理仿真图 (5)2.3 拓展仿真图 (6)2.4 系统功能介绍 (6)3 程序 (7)3.1 程序流程图 (7)3.2 核心程序(部分) (7)4 制作过程 (10)4.1 前期准备 (10)4.2 焊接过程(附图) (10)4.3焊接过程中遇到的问题和注意事项 (12)5 器材清单 (13)6 其他实现方案的探讨 (13)6.1 可编程数字电位器介绍 (13)6.2 方案讨论 (14)7 结论 (14)参考文献 (15)可剪辑修改基于TEA5767的数字调频收音机开放实验室入室人员(河南大学物理与电子学院,河南开封,475004)0 前言十九世纪无线电通讯技术的发明,使通信摆脱了依赖导线的传统方式,是通信技术上的一次飞跃,也是人类科技史上的一个重要成就。

作为无线电通信的的杰出成果,收音机的发明极大地改变了人们的生活方式,给人们的生活带来了无穷的乐趣。

随着科技的发展,技术不断地更新换代,收音机也沿着矿石收音机、电子管收音机、晶体管收音机、集成电路收音机的轨道不断进步着。

近年来,随着DSP技术的发展,采用DSP技术研发的收音机芯片的出现,“硬件无线电”由“软件无线电”代替,大大降低了收音机制造业的门槛。

2006年深圳凯隆电子有限公司与美国芯科实验室合作,开发出世界上第一台数字收音机。

调频收音机设计论文

调频收音机设计论文

调频收音机设计论文摘要:TEA5767音频输出具有立体声方式,也可以采用单声道输出,具体方式可以通过编程设定,为简化设计,本设计功放部分采用TDA2030单声道A类音频放大芯片,功放芯片使用TDA2030,供电采用±5V供电。

TEA5767系列单片数字收音机就被广泛地应用在数字音响,便携式CD、VCD、DVD、MP3、MP4、手机、PDA等数字消费电子系统中。

但是该数字收音机芯片与传统的超外差式收音机的调谐原理不太相同,传统的超外差式收音机的固定频率为10.7MZ,而TEA5767系列数字收音机的固定中频为225KHz,由于固定中频不同,锁相环系统的软件控制就有很大的差别。

一、设计方案本设计是一个数字调频收音机,就是接收这些频率调制的无线电信号,经过解调还原成原信号的电子设备。

FM Radio电路一般主要由接收天线、振荡器、混频器、AGC(自动增益控制)、中频放大器、中频限幅器、中频滤波器、鉴频器、低频静噪电路、搜索调谐电路、信号检测电路及频率锁定环路、音频输出电路等组成。

本设计就是用单片机控制集成了上述所有FM功能的专用芯片,设计一个数字FM收音机系统。

本设计采用模块化设计,整个系统由控制模块、FM音频模块、电源模块和功放模块组成,系统的整体方案框图如下图1:二、电路设计(1)控制模块。

控制模块是本设计的核心,通过外围电路和向TEA5767芯片写入相关程序,控制部分要实现能够改变收音机的接收频率、工作模式、音量等各项参数的功能。

因此必须需要一个微控制器才能达到要求,本设计采用STC89C52单片机作为系统的控制核心。

微控制器部分以STC89C52为核心,包括复位电路,晶振电路和按键控制电路。

时钟电路是计算机的心脏,它控制着计算机的工作节奏。

单片机允许的时钟频率是因型号而异的,STC89C52典型值为1105926MHZ,本设计采用的就是典型值。

单片机STC89C52内部都有一个反相放大器,XTAL1、XTAL2分别为反相放大器输入和输出端,外接定时反馈元件以后就组成振荡器,产生时钟送至单片机内部的各个部件。

大学生毕业设计 基于TEA5767和单片机的数字FM收音机设计

大学生毕业设计 基于TEA5767和单片机的数字FM收音机设计

摘要本设计是一个数字调频收音机(FM),就是接受频率调制的无线电信号,经过解调还原成原信号的电子设备,利用单片机控制有FM功能的专用芯片,设计一个基于TEA5767模块的数字FM收音机。

本设计采用模块化设计,整个系统由控制模块,FM音频模块和功放模块组成。

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

TEA5767芯片内集成了完整的IF频率选择和鉴频系统,就可实现FM收音机的全部功能。

采用的是Lcd1602液晶显示屏,实现单片机的频率值与模块内部的寄存器(PLL值)之间的相互转换,从而带动功放的工作。

功能:自动收台,手动收台,液晶显示。

采用主要模块有:(1)STC89C52单片机模块。

(2)Lcd1602显示模块。

(3)TEA5767收音机模块。

关键词:STC89C52 Lcd1602 TEA5767模块目录摘要 (2)1.绪论 (5)1.1 课题背景 (5)1.2 课题概述 (5)2.设计要求与思路 (5)2.1 收音机的设计要求 (5)2.2 系统设计整体思路 (5)3.主要电路模块的实现方案比较及选择 (6)3.1 控制模块方案选择 (7)3.2 液晶显示模块方案选择 (7)3.3 无线芯片方案选择 (7)4.系统电路图 (8)4.1 微控制器模块 (8)4.2 FM模块 (9)4.2.1 FM模块介绍 (9)4.3 工作原理 (10)4.3.1串行总线工作模式 (10)4.3.2 串行总线基本操作 (10)4.3.3数据传送 (12)4.3.4、三线总线工作模式 (12)5.系统软件设计 (13)5.1 主程序设计 (13)5.2 流程图 (14)6.硬件电路测试与检测 (14)6.1 硬件装配 (14)6.2 系统测试 (14)7.结束语 (15)8.参考文献 (15)9.致谢 (15)10.附录 (16)10.1 电路原理图 (16)10.2 电路PCB图 (16)10.3 电路实物图 (17)10.3 元器件清单 (18)11.操作框图 (19)程序框图 (20)12.程序 (21)12.1 主程序 (21)12.2 I2C总线 (26)12.3 Lcd1602程序 (29)基于TEA5767模块的数字FM收音机设计一.绪论1.1课题背景随着科学技术的不断发展,新颖的调频收音机的不断出现,技术不断的提高,设计出来的收音机外型精致和小巧。

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

. .大学物理与电子学院课程设计报告基于TEA5767的数字调频收音机报告人:王世威专业:通信工程设计小组成员:王世威、何康. . .. .目录前言 (3)一、主要器材介绍 (4)1.1 STC89C52单片机 (4)1.2 TEA5767收音模块儿 (4)1.3 1602LCD显示屏......................................................... (5)1.4 LM386音频功率放大器......................................................... (6)二、系统原理及功能介绍 (7)2.1数字FM收音机基本原理 (7)2.2系统功能介绍 (7)三、元件清单......................................................... (9)四、制作过程 (10)4.1 前期准备 (10)4.2 实物图 (10)4.3焊接过程中遇到的问题和注意事项 (12)五、程序......................................................... .. (13)六、结论 (23). . .. .前言十九世纪无线电通讯技术的发明,使通信摆脱了依赖导线的传统方式,是通信技术上的一次飞跃,也是人类科技史上的一个重要成就。

作为无线电通信的的杰出成果,收音机的发明极改变了人们的生活方式,给人们的生活带来了无穷的乐趣。

随着科技的发展,技术不断地更新换代,收音机也沿着矿石收音机、电子管收音机、晶体管收音机、集成电路收音机的轨道不断进步着。

近年来,随着DSP技术的发展,采用DSP技术研发的收音机芯片的出现,“硬件无线电”由“软件无线电”代替,大大降低了收音机制造业的门槛。

2006年凯隆电子与美国芯科实验室合作,开发出世界上第一台数字收音机。

数字技术收音机的问世,标志着传统模拟收音机将逐渐退出历史舞台。

收音机的数字时代已经到来。

数字调频收音机就是无线电模拟信号由天线感应后接收后,在同一块儿芯片里放大,然后转化为数字信号,再对数字信号进行处理,然后还原成模拟音频信号输出。

数字调频收音机体积小、重量轻、寿命长、频率稳定、操作简便等优点,使其在市场上越来越受欢迎。

本次项目设计,我们对数字调频收音机的原理在理论上进行了充分的了解,基于其基本理论,我们制作了一台数字调频收音机。

. . .. .一、主要器材介绍本系统主要由STC89C52单片机、1602LCD显示屏、LM386音频功率放大器、TEA5767收音模块儿、电阻电容等组成。

1.1STC89C52单片机STC89C52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

具有以下标准功能: 8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,置4KB EEPROM,MAX810复位电路,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口。

另外STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

最高运作频率35Mhz,6T/12T可选。

引脚如右图所示。

1.2 TEA5767收音模块儿TEA5767是飞利浦公司生产的一款收音机芯片,很多手机,MP3、MP4里的收音机功能都是基于它实现的。

TEA5767置了主频高达75MHZ的数字信号处理器,实现384KBPS/48KHZ的MD级高品质MP3音乐文件回放,加上拥有一般MP3播放器难以企及的高保真回放线路(信噪比高达95DB,THD总谐波失真率〈0.05%〉同时非常省电。

FM收音功能,这个功能主要是有FM 收音模块来完成。

其中FM收音模块的核心就是下面的Philips(飞利浦)TEA5767。

这是一块性能比较良好的FM收音芯片,很多的MP3都是用这个. . .... . .型号来实现FM 收音功能。

其引脚如下图所示。

TEA5767模块儿引脚图1.3 1602液晶屏1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM ,显示效果也不好)。

1602LCD 是指显示的容为16X2,即可以显示两行,每行16个字符液晶模块(显. .示字符和数字)。

市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

1.4 LM386音频功率放大器LM386是一种音频集成功放,具有自身功耗低、更新链增益可调整、电源电压围大、外接元件少和总谐波失真小等优点的功率放大器,广泛应用于录音机和收音机之中。

LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。

为使外围元件最少,电压增益置为20。

但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。

输入端以地为参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。

. . .. .二、系统原理及功能介绍2.1 数字FM收音机基本原理FM型的收音机电路可用如下图所示的方框图来表示。

收音机通过调谐回路选出所需的电台,送到变频器与本振电路送出的本振信号进行混频,产生中频输出(我国规定的FM中频为10.7MHZ),中频信号将检波器检波后输出调制信号,调制信号经低放、功放放大电压和功率,推动喇叭发出声音。

2..2系统功能介绍本项目设计的目的,就是设计制作出一个数字调频收音机。

所以,本系统所实现的主要功能就是收音功能。

通过单片机外接三个按键,分别控制复位,向上手动搜台,向下手动搜台。

同时,所搜到的频道的频率由1602LCD显示。

天线接到信号后,由tea5767芯片进行处理,在单片机的控制下,再通过LM386功放芯片,最终通过喇叭播出广播。

电路原理图如下:. . .. .. . .. .三、元件清单. . .. .四、制作过程3.1 前期准备项目设计之初,我们通过查阅各种资料,对数字调频收音机的原理的进行了充分了解,以便有一个理论上的认识和把握。

之后,通过对原理的了解和制作要求,进行了电烙铁、焊锡、导线、电路板、单片机、液晶屏、收音模块儿等器材的选购与借取,为硬件的制作奠定了基础。

软件方面,通过Keil软件用C语言编程,利用Proteus软件对部分电路进行仿真。

程序调试无误之后,用单片机开发板将程序烧进STC89C52单片机,控制本系统工作。

3.2 实物图经过认真考虑,拟定本系统的焊接主要分为最小系统、显示模块、TEA5767收音模块儿及周围电路、功放其周围电路、按键五个部分分步进行,既保证了焊接可以有条不紊的进行,又保证了焊接的准确性和完整性。

由于本项目的器件较多,电路错综复杂,故焊接颇为费力。

下附焊接完的几实物图,以供参考。

正面:. . .... . .背面:工作状态:... . .左边两个旋钮分别用来调整音量和显示屏亮度。

可以正常工作3.3 制作过程中遇到的问题和注意事项在焊接的过程中,遇到了一些问题,给顺利焊接造成了一定的困难。

主要问. .题有以下几个方面。

一是元件布局和布线的问题。

由于电子元件比较多,如何布局直接影响到电路的焊接。

刚开始我们只是按照原理图上画的进行布局,结果在背面进行焊接的时候给布线造成了很大的困难,不得不采用大量的飞线。

所以汲取这个教训,在以后的焊接中,之前都要进行认真地元件布局和布线,尽量减少飞线的使用,使整个板子显得更加漂亮,焊接更加容易,同时尽量减小对电路的影响。

二是个别元件的的焊前测试和其特性的掌握。

比较典型的就是按键和杜邦线,在焊接过程中,有时候出问题一直找不到原因,最后发现是按键坏了或者杜邦线有问题。

所以在使用之前应首先测试其良好与否。

还有就是稳压管的特性,由于没有反接,造成电路无常工作,这也是一个教训。

三是要注意特殊器件的焊接。

本设计主要是TEA5767收音模块儿的焊接。

由于该模块儿上面的焊接点太小,稍不注意就容易焊接坏,所以在焊接的时候需要格外小心,最好借助一个小基台。

五、程序#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DELAY5US _nop_();_nop_();_nop_();_nop_();_nop_();//**************TEA5767模块接线方法********************sbit SDA=P2^6;sbit SCL=P2^7;//*************频率调节按键接线************************sbit Key1=P3^2;sbit Key2=P3^3;//==============LCD1602接口连接方法=====================/*-----------------------------------------------------|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 ||DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 ||DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 ||DB3-----P0.3 | DB7-----P0.7 |---------------------------------------------------*///================================================*/#define LCM_Data P0 //LCD1602数据接口. . .. .#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCM_RW = P2^3; //读写控制输入端,LCD1602的第五脚sbit LCM_RS = P2^4; //寄存器选择输入端,LCD1602的第四脚sbit LCM_E = P2^2; //使能信号输入端,LCD1602的第6脚//*****************参数定义*****************************unsigned long int FM_FREQ; //频率unsigned short int FM_PLL; //PLLuchar idata sbuf[5]; // 数据发送缓冲区uchar idata numbyte;uchar idata numbyte_AMP;uchar idata ADDRESS_AMP;uchar idata ADDRESS_SEND; //TEA5767发送地址uchar idata ADDRESS_RECEIVE; //TEA5767接收地址uchar idata rbuf[5]; // 数据接收缓冲区uchar idata ampint[5];uchar bdata PLL_HIGH;uchar bdata PLL_LOW; //设定用于搜索和预设的可编程频率合成器uchar bdata I2C_byte1;//发送的五字节TEA5767可位寻址的设置值uchar bdata I2C_byte2;uchar bdata I2C_byte3;uchar bdata I2C_byte4;uchar bdata I2C_byte5;sbit MUTE =I2C_byte1^7;//如果MUTE=1,则左右声道被静音;MUTE=0,左右声道正常工作sbit SM = I2C_byte1^6; //SM=1,则处于搜索模式;SM=0,不处于搜索模式sbit SUD=I2C_byte3^7; //SUD=1,增加频率搜索;SUD=0,减小频率搜索uchar byte1;uchar byte2;uchar byte3;uchar byte4;uchar byte5;uchar num1,num2,num3,num4;uchartab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};bit bdata NACK; // 错误标志位//**********相关函数声明**************************************void init(void); //TEA5767初始化void delay600ms(void); //延迟600msvoid delay100ms(void); //延迟100msvoid delay10ms();void delay1ms(void); //延迟1msvoid sendnbyte(uchar idata *sla, uchar n);//与sendbyte函数构成I2C 数据发送函数. . .. .void I2C_start(void); //I2C 传输开始void sendbyte(uchar idata *ch);void checkack(void); //检查应答讯号void stop(void); //I2C传输结束void AMP_sendnbyte(uchar idata *sla,uchar numbyte_AMP);void key_scan(void); //键扫描void search_up(void); //接收频率向上加void search_down(void); //接收频率向下减void setByte1Byte2(void); //设置第一第二字节频率void LCMInit(void);//LCD初始void DelayMs(uint Ms);//1MS基准延时程序void WriteDataLCM (uchar WDLCM);//LCD模块写数据void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模块写指令uchar ReadStatusLCM(void);//读LCD模块的忙标void DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符void LCDshow(void);void DelayMs(uint Ms);//*****************主程序******************************void main(void){numbyte = 5;numbyte_AMP=5;ADDRESS_SEND = 0xC0;// TEA5767写地址 1100 0000ADDRESS_RECEIVE=0XC1;//TEA5767读地址 1100 0001ADDRESS_AMP=0X8E;init(); // 初始化TEA5767LCMInit();//LCD初始LCDshow();while(1){key_scan(); //键扫描}}//**************按键扫描程序**************************void key_scan(void){if(Key1==0){delay10ms();if(Key1==0){. . .. .while(Key1==0);search_up(); //频率向上LCDshow();delay600ms();}}if(Key2==0){delay10ms();if(Key2==0){while(Key2==0);search_down(); //频率向下LCDshow();delay600ms();}}}//*********************LCD1602显示程序*********************void LCDshow(void){num1=FM_FREQ/100000000;num2=(FM_FREQ%100000000)/10000000;num3=(FM_FREQ%10000000)/1000000;num4=(FM_FREQ%1000000)/100000;DisplayOneChar(0, 4,'F');//DisplayOneChar(0, 5,'M');//DisplayOneChar(0, 6,'R');//DisplayOneChar(0, 7,'a');//DisplayOneChar(0, 8,'d');//DisplayOneChar(0, 9,'i');//DisplayOneChar(0, 10,'o');//DisplayOneChar(1, 4, tab1[num1]);DisplayOneChar(1, 5, tab1[num2]);DisplayOneChar(1, 6, tab1[num3]);DisplayOneChar(1, 7, '.');DisplayOneChar(1, 8, tab1[num4]);DisplayOneChar(1, 9,'M');//DisplayOneChar(1, 10,'H');//DisplayOneChar(1, 11,'Z');//}/*====================================================================== LCM初始化. . .. .======================================================================*/void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,0);DelayMs(5);WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置DelayMs(100);}//==============================LCD1602显示子程序================================================// 写数据函数: E =高脉冲 RS=1 RW=0//======================================================================*/ void WriteDataLCM(uchar WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/*====================================================================写指令函数: E=高脉冲 RS=0 RW=0======================================================================*/void WriteCommandLCM(uchar WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;. . .. .}/*==================================================================== 正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;DB7: 0 LCD控制器空闲,1 LCD控制器忙。

相关文档
最新文档