2012电子设计竞赛"电子产品设计与制作"技术说明书

2012年海南省职业院校技能大赛

高职组“电子产品设计及制作”

(低功耗高效率的小功率音频放大器)

2012年4月25日

摘要

本设计为低功耗高效率小功率音频放大器,主要由LF353集成运算,STC89C52单片机,TDA2030集成音频放大器构成。具有保护电路,红外遥控,多路切换功能,液晶显示功能,频率检测功能。

关键字:LF353集成运算、STC89C52单片机,TDA2030集成音频放大器。

Abstract

The design for low power high efficiency audio power amplifier, is mainly composed of a LF353 integrated operational, STC89C52 chip, TDA2030 integrated audio amplifier.A protection circuit, infrared remote control, switching function, the liquid crystal display function, frequencydetection function.

Keyword: LF353 integrated operation, STC89C52 MCU, TDA2030 integrated audio amplifier.

目 录

一、功能要求与技术指标.............................................. 1

二、电路原理图...................................................... 1

三、方案设计........................................................ 2

3.1 前置放大 .................................................... 2

3.2 音调调节控制电路1.......................... 错误!未定义书签。

3.3 反相电路 .................................................... 3

3.4 音量音调调节2............................................... 4

3.5 音频功率放大器 .............................................. 5

3.6 电源模块 .................................................... 6

四、拓展部分........................................................ 7

4.1 音乐盒 ...................................................... 7

4.2 单片机控制输入信号 .......................................... 8

4.3 频率检测 .................................................... 9

4.4 保护电路 .................................................... 9

五、程序部分....................................................... 11

5.1 功能框图 ................................................... 11

5.2 主程序框图 ................................................. 11

5.3 液晶1602................................................... 12

5.4 频率检测 ................................................... 12

5.5 红外遥控 ................................................... 13

5.6 键盘检测 ................................................... 13

六、总程序......................................................... 13

一、任务分析

1.1 技术指标要求

1. 当输入正弦信号电压有效值为500mV时,在8Ω负载下输出功率≥3W,输出波形无明显失真;

2. 效率>70%;

3. 频率响应:100Hz~15KHz;

4. 失真≤1% ;

5. 较高的性价比;

6 其他发挥功能,如:保护电路、高低音调整、音量控制、程控及显示、遥控、无线输入、多路输入切换等。

1.2 设计要求

1、 设计前置放大器、音调音量控制级、功率放大级和供电电源;

2、 选定参数与设计电路原理图;

3、 电路的安装于调试;

4、 测试输入阻抗、输出阻抗;

二、电路原理图

音频功率放大器主要由前置放大电路,音调级电路,功率放大电路三部分组成。前置放大电路要求输入阻抗高,输出阻抗低,频带宽,噪声小,主要承担控制任务,对各种生源信号进行选择和处理;音调控制级对输入信号主要起提升、衰减作用,它将微弱信号进行放大,进行各种音质控制,美化音色;功率放大级是音频功放电路中最重要的部分,它决定输出功率的大小,效率的大小,它所承担的放大任务是将前面的音频信号进行功率放大,以推动扬声器发声。对整机的要求是失真小,噪声低,有较好的扩音效果,根据技术指标要求与设计指标要求,设计各级方案,增益分配。

图2-1 总功能电路框图

三、方案设计

3.1 前置放大

前置放大在音频放大电路中起着承前启后的作用,又由电路对频率响应及零输入(即输入短入)时的噪声、电流、电压的要求,前置放大选LF353集成双运放,LF353是一种双路运算放大器,属于高输入阻抗低噪声的集成运放,前置放大由两级放大组成。

图 3-1 前置放大电路

图3-2

元器件参数:第一级放大A1=0~10,((1+R4)/RV1)=0~10,A2=((1+R12/RV2)=0~10,R2==R4=R5=R12=100K, R13=22K,RV1=RV2=100K,C11=C13=C15=10uF,C14= C15=100uF以保证扩声电路的低频响应,C12=100Pf。

由元器件参数的前置放大最大放大倍数为100倍,最小时起衰减信号作用。

3.2 反相电路

由音调调节输出的波形与原来信号频率相同但相位相差180度,所以用一个反相器把信号的相位反相回来。R17=R18=10K,R19=R17//R18.

图3-3 反相器

3.3 音量音调调节

此电路是高低音分别控制衰减式音调控制电路。

R8=10K,RV6=1M,R24=1.5K,C1=C2=33nF组成低音控制电路,C3=2.2nF,

C4=33nF,RV7=1M组成高音控制电路,R5为隔离电阻,RV5=1M为音量调节。C28为隔直电容为防止后级放大器直流信号对前级控制器的影响。

音频放大器的性能主要是由音调控制器与功率放大器决定的。音调控制器的作用是控制、调节音响放大器输出频率的高低。

音量调节只对低音与高音的增益进行提升与衰减,中音频增益保持不变。所以音调调节控制器的电路由低通和高通滤波器共同组成。

图3-4

图3-5 音调音量调节电路

3.4 音频功率放大器

由功放设计有5类:A类功放效率低最高效率只有50%;B类功放效率可达78.5%但输出信号会有交越失真;AB类功放相当于A类B类功放相结合,高效率低失真,C类功放效率达78.5%以上当C类功放只用于特殊领域不适合用于音频功放;D类功放理想效率可达100%但成本高。所以综合考虑采用AB类功放.

由技术指标与设计指标,音频功率放大电路采用音频集成芯片CM20381A,此芯片优点是外接元件非常少,输出功率Po>=3W(RL=8Ω),开机冲击极小。内含各种保护电路,因此工作安全可靠。主要保护电路有:短路保护、热保护、地线偶然开路、电源极性反接(Vsmax=5V)以及负载泄放电压反冲

等,CM20381A能在8Ω阻抗时能够输出>=3W的有效功率,THD≤1%。

3-6

图3-7 音频功率放大电路

3.5 电源模块

电源模块主要由电源变压器、桥式整流电路、滤波电路、稳压电路,稳压电路主要由LM7805,LML7812,M7912三个三端稳压芯片组成。确保电路的正常稳定

工作。这部分电路比较简单,都采用三端稳压管实现,故不作详述。

图3-8

图3-9 电源模块

四、拓展部分

4.1 音乐盒

音乐盒由51单片机产生16首不同的歌曲用矩阵键盘控制。

4-1

图4-2 音乐盒

4.2 单片机控制输入信号

由单片机输入音频信号,在由单片机控制输入信号幅度

8

图4-3 单片机控制输入信号 4.3 频率检测与液晶显示

频率检测由NE555组成的施密特触发器组成,将正弦波变换成矩形波 通过1602液晶显示当前频率。

图4-4 频率检测电路 4.4 保护电路

此电路在扬声器引脚上取检测信号,通过桥式整流电路变成直流信号,当扬声器上电流超过额定值时使Q1导通-Q2饱和-Q3深度饱和,使继电器导通,断

9

开继电器常闭,短开扬声器与功率放大器的接线。

4-5

图4-6 保护电路

10

五、程序部分

5.1 功能框图

图5-1 总功能电路框图 5.2 主程序框图

图5-2 主程序框图

11

5.3 液晶

1602

5.4 频率检测

图5-3 液晶1602

图5-4 频率检测

12

5.5 红外遥控 --

图5-5 红外遥控

5.6 键盘检测

图5-6 键盘检测

六、总程序

#include //包含头文件

sbit IR=P3^2; //红外接口标志

13

sbit key1 = P1^6 ; sbit key2 = P1^7 ; sbit sw=P3^6; sbit swp1=P1^3; sbit swp2=P1^4; sbit swp3=P1^5;

/*********************************** 名称:声明函数

内容:对函数进行声明,为全局服务 ************************************/ #include

/*********************************** 类型宏定义的声明

**********************************/ #define uchar8 unsigned char #define uint16 unsigned int sbit RS = P1^0 ; sbit RW = P1^1 ; sbit EN = P1^2 ;

uchar8 code begin[ ] = " Link: 0Hz" ; uchar8 code table[ ]= " The voice: 00" ;

/********************************* 延时函数的声明

*********************************/ void delay( uint16 t ) ;

/********************************* 1602函数的声明

/* 寄存器选择:为1时选择数据寄存器,为0时选择指令寄存器 */ /* 为读信号线 */ /* 为使能端 */

14

*********************************/ void lcd_clr( void ) ; void lcd_init( void ) ; void write_cmd( uchar8 cmd ) ; void write_data( uchar8 dat ) ; void key();

//void display( uchar8 addr,uchar8 *p ) ; /********************************* 按键函数的声明

*********************************/ /********************************* 全局变量的声明

*********************************/ int Voice,num1;

/*------------------------------------------------ 全局变量声明

------------------------------------------------*/

unsigned char irtime,Hztime,Hzgeshu,Hzflag=0,swflag;//红外用全局变量 unsigned int Hznum=0;

bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char irdata[33];

/*------------------------------------------------ 函数声明

------------------------------------------------*/

15

void Ir_work(void); void Ircordpro(void);

/*------------------------------------------------ 定时器0中断处理

------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1 {

irtime++; //用于计数2个下降沿之间的时间 }

/*------------------------------------------------ 定时器1中断处理

------------------------------------------------*/

void tim1_Hz (void) interrupt 3 {

uchar8 Hzbai,Hzshi,Hzge,Hzqian,Hzkqian,Hzkflag=1; //

float Hzkshi,Hzkge,Hzkfen,Hzknum;

TR1=0;

TH1=(65535-50000)/256;

TL1=(65535-50000)%256;

Hzgeshu++;

if(Hzgeshu==20)

{ Hzgeshu=0; //

Hznum=Hznum-5;

Hzkqian=Hznum/10000;

16

定时器重新赋值

//计数1S时间 //时间到

赋值用于LCD显示

//

//

Hzqian=Hznum%10000/1000; Hzbai=Hznum%1000/100; Hzshi=Hznum%100/10; Hzge=Hznum%10; Hzflag=1;

}

if(Hzflag) {

Hzflag=0; if(Hznum

{ Hznum=0; if(Hzbai)

{ write_cmd(0x80+11); write_data(0x30+Hzbai);

} else { write_cmd(0x80+11); write_data(' '); }

if(Hzbai||Hzshi) { write_cmd(0x80+12); write_data(0x30+Hzshi); } else {

write_cmd(0x80+12); 17

//在1S的时候处理

//如果小于1000的频率//不显示K

write_data(' ');

}

write_cmd(0x80+13);

write_data(0x30+Hzge);

}

if(Hznum>=1000) { if(Hznum%1000!=0) { if(Hzkqian) { write_cmd(0x80+9); write_data(0x30+Hzkqian);

} else { write_cmd(0x80+9); write_data(' ');

}

if(Hzkqian||Hzqian) { write_cmd(0x80+10); write_data(0x30+Hzqian);

} else { write_cmd(0x80+10); write_data(' '); }

if(Hzqian||Hzkqian)

//大于1000显示小数点

//不为整数时显示小数点

{ write_cmd(0x80+11); write_data('.');

} else { write_cmd(0x80+11); write_data(' '); }

write_cmd(0x80+12); write_data(0x30+Hzbai); if(Hzqian) { write_cmd(0x80+13); write_data('k'); }

}

else { write_cmd(0x80+11); write_data(0x30+Hzkqian); write_cmd(0x80+12); write_data(0x30+Hzqian); if(Hzkqian||Hzqian) { write_cmd(0x80+13); write_data('k');

}

} Hznum=0;

//否则显示整数

// }

}

} write_cmd(0x80+14); write_data('H'); write_cmd(0x80+15); write_data('z');

TR1=1;

}

/*------------------------------------------------ 延时子程序

------------------------------------------------*/ void delay( uint16 t )

{

while( t-- ) ; }

/*------------------------------------------------ 键盘扫描

------------------------------------------------*/ void key( ) {

if( key1==0 )

{ delay( 100 ) ; if( key1==0 ) {

while(!key1);

按下键盘1放大增大

//

Voice += 200 ; num1+=51; if(num1>=255) num1=255; P2=num1; if( Voice>900 ) { Voice = 1000 ; P2 = 0xff ; }

} }

if( key2==0 ) { delay( 100 ) ; if( key2==0 ) { while(!key2); Voice -= 200 ; num1-=51; if(num1

}

} //按下键盘2放大减小

// P2=0xff; // return Voice ;

}

/*------------------------------------------------ 按键选择音乐

------------------------------------------------*/ void sw_music(void) {

if(sw==0) { delay(100); if(sw==0) { while(!sw); swflag++; if(swflag==4)

swflag=0;

}

}

if(swflag==1)

swp1=1; else

swp1=0;

if(swflag==2)

swp2=1;

else

swp2=0;

if(swflag==3) swp3=1;

按键选择音乐播放线路

//

else

swp3=0;

write_cmd( 0x86 ); write_data(0x30+swflag); }

/*------------------------------------------------ 外部中断0中断处理

------------------------------------------------*/ void EX0_ISR (void) interrupt 0 //外部中断0服务函数 {

static unsigned char i; //接收红外信号处理 static bit startflag; //是否开始处理标志位

if(startflag) {

if(irtime=33)//引导码 TC9012的头码,9ms+4.5ms i=0;

irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++;

if(i==33)

{

irok=1; i=0; }

} else {

irtime=0;

}

}

/*------------------------------------------------ 外部中断1中断处理

------------------------------------------------*/ void EX1_ISR (void) interrupt 2 { Hznum++; }

/*------------------------------------------------ 定时器0初始化

------------------------------------------------*/ void TIM0init(void)//定时器0初始化 {

TMOD=0x12;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 TH1=(65535-50000)/256; TL1=(65535-50000)%256; ET1=1; //开中断 TR1=1;

ET0=1; //开中断 TR0=1; }

/*------------------------------------------------ 外部中断0初始化

------------------------------------------------*/ void EX0init(void) {

IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; //使能外部中断 IT1=1; EX1=1;

EA = 1; //开总中断 }

/*------------------------------------------------ 键值处理

------------------------------------------------*/

void Ir_work(void)//红外键值散转程序 {

switch(IRcord[2])//判断第三个数码值 { case 0x15: Voice += 200 ;

num1+=51; if(num1>=255) num1=255;

P2=num1; if( Voice>900 )

{

//按下‘+’放大增大按下‘-’放大减小

//

Voice = 1000 ; P2 = 0xff ;

};

break;//+ case 0x07: Voice -= 200 ; num1-=51; if(num1

}; break;//- case 0x16: swflag=0; sw_music(); break; case 0x0c: swflag=1; sw_music(); break; case 0x18: swflag=2; sw_music(); break; case 0x5e: swflag=3;

sw_music(); break;

default:break; }

/*------------------------------------------------ 红外码值处理

------------------------------------------------*/ void Ircordpro(void)//红外码值处理函数 {

unsigned char i, j, k; unsigned char cord,value; k=1;

for(i=0;i

for(j=1;j

cord=irdata[k];

if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

value|=0x80; if(j

{

value>>=1; }

irpro_ok=0;//处理完成标志

}

k++;

IRcord[i]=value;

value=0;

}

irpro_ok=1;//处理完毕标志位置1

}

/**************************************

函数功能:1602写命令程序

入口参数:dat

出口参数: 无

**************************************/

void write_cmd( uchar8 cmd )

{

RS = 0 ;

RW = 0 ;

P0 = cmd ;

EN = 1;

delay( 10 ) ;

EN = 0 ;

}

/*************************************

函数功能:1602写数据程序

入口参数:dat

出口参数: 无

*************************************/

void write_data( uchar8 dat )

{

RS = 1 ;

P0 = dat ;

EN = 1 ;

delay( 20 ) ;

EN = 0 ;

}

/**************************************

函数功能:1602初始化程序

入口参数:无

出口参数: 无

**************************************/

void lcd_init( void )

{

write_cmd( 0x38 ) ;

write_cmd( 0x06 ) ;

write_cmd( 0x0c ) ;

// write_cmd( 0x01 ) ;

delay( 100 ) ;

}

/**************************************

函数功能:1602清屏程序

入口参数:无

出口参数: 无

**************************************/

void lcd_clr( void )

{

write_cmd( 0x01 ) ;

delay( 100 ) ;

}

/*------------------------------------------------

主函数

------------------------------------------------*/

void main(void)

{

uchar8 num,shi,ge,bai,qian;

int temp;

EX0init();

TIM0init();

lcd_init( );

lcd_clr( ) ;

swp1=swp2=swp3=0;

Voice = 0x00 ;

P2 = 0x00 ;

write_cmd( 0x80 ) ;

for(num=0;num

{

write_data(begin[num]);

}

write_cmd( 0xc0 );

for(num=0;num

{

write_data(table[num]);

}

while(1)//主循环

{

sw_music();

if(irok) //

{

Ircordpro(); 如果接收好了进行红外处理

} irok=0;

if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

{

Ir_work();

}

key();

temp=Voice;

qian=temp/1000;

bai=temp%1000/100;

shi=temp%100/10;

ge=temp%10;

if(temp==1000)

{

write_cmd( 0xcc );

write_data(0x30+qian);

}

else

{

write_cmd( 0xcc );

write_data(' ');

}

if(bai||qian)

{

write_cmd( 0xcd );

write_data(0x30+bai);

}

else

{

write_cmd( 0xcd ); write_data(' '); }

write_cmd(0xce);

write_data(0x30+shi); write_cmd(0xcf);

write_data(0x30+ge); }

}

2012年海南省职业院校技能大赛

高职组“电子产品设计及制作”

(低功耗高效率的小功率音频放大器)

2012年4月25日

摘要

本设计为低功耗高效率小功率音频放大器,主要由LF353集成运算,STC89C52单片机,TDA2030集成音频放大器构成。具有保护电路,红外遥控,多路切换功能,液晶显示功能,频率检测功能。

关键字:LF353集成运算、STC89C52单片机,TDA2030集成音频放大器。

Abstract

The design for low power high efficiency audio power amplifier, is mainly composed of a LF353 integrated operational, STC89C52 chip, TDA2030 integrated audio amplifier.A protection circuit, infrared remote control, switching function, the liquid crystal display function, frequencydetection function.

Keyword: LF353 integrated operation, STC89C52 MCU, TDA2030 integrated audio amplifier.

目 录

一、功能要求与技术指标.............................................. 1

二、电路原理图...................................................... 1

三、方案设计........................................................ 2

3.1 前置放大 .................................................... 2

3.2 音调调节控制电路1.......................... 错误!未定义书签。

3.3 反相电路 .................................................... 3

3.4 音量音调调节2............................................... 4

3.5 音频功率放大器 .............................................. 5

3.6 电源模块 .................................................... 6

四、拓展部分........................................................ 7

4.1 音乐盒 ...................................................... 7

4.2 单片机控制输入信号 .......................................... 8

4.3 频率检测 .................................................... 9

4.4 保护电路 .................................................... 9

五、程序部分....................................................... 11

5.1 功能框图 ................................................... 11

5.2 主程序框图 ................................................. 11

5.3 液晶1602................................................... 12

5.4 频率检测 ................................................... 12

5.5 红外遥控 ................................................... 13

5.6 键盘检测 ................................................... 13

六、总程序......................................................... 13

一、任务分析

1.1 技术指标要求

1. 当输入正弦信号电压有效值为500mV时,在8Ω负载下输出功率≥3W,输出波形无明显失真;

2. 效率>70%;

3. 频率响应:100Hz~15KHz;

4. 失真≤1% ;

5. 较高的性价比;

6 其他发挥功能,如:保护电路、高低音调整、音量控制、程控及显示、遥控、无线输入、多路输入切换等。

1.2 设计要求

1、 设计前置放大器、音调音量控制级、功率放大级和供电电源;

2、 选定参数与设计电路原理图;

3、 电路的安装于调试;

4、 测试输入阻抗、输出阻抗;

二、电路原理图

音频功率放大器主要由前置放大电路,音调级电路,功率放大电路三部分组成。前置放大电路要求输入阻抗高,输出阻抗低,频带宽,噪声小,主要承担控制任务,对各种生源信号进行选择和处理;音调控制级对输入信号主要起提升、衰减作用,它将微弱信号进行放大,进行各种音质控制,美化音色;功率放大级是音频功放电路中最重要的部分,它决定输出功率的大小,效率的大小,它所承担的放大任务是将前面的音频信号进行功率放大,以推动扬声器发声。对整机的要求是失真小,噪声低,有较好的扩音效果,根据技术指标要求与设计指标要求,设计各级方案,增益分配。

图2-1 总功能电路框图

三、方案设计

3.1 前置放大

前置放大在音频放大电路中起着承前启后的作用,又由电路对频率响应及零输入(即输入短入)时的噪声、电流、电压的要求,前置放大选LF353集成双运放,LF353是一种双路运算放大器,属于高输入阻抗低噪声的集成运放,前置放大由两级放大组成。

图 3-1 前置放大电路

图3-2

元器件参数:第一级放大A1=0~10,((1+R4)/RV1)=0~10,A2=((1+R12/RV2)=0~10,R2==R4=R5=R12=100K, R13=22K,RV1=RV2=100K,C11=C13=C15=10uF,C14= C15=100uF以保证扩声电路的低频响应,C12=100Pf。

由元器件参数的前置放大最大放大倍数为100倍,最小时起衰减信号作用。

3.2 反相电路

由音调调节输出的波形与原来信号频率相同但相位相差180度,所以用一个反相器把信号的相位反相回来。R17=R18=10K,R19=R17//R18.

图3-3 反相器

3.3 音量音调调节

此电路是高低音分别控制衰减式音调控制电路。

R8=10K,RV6=1M,R24=1.5K,C1=C2=33nF组成低音控制电路,C3=2.2nF,

C4=33nF,RV7=1M组成高音控制电路,R5为隔离电阻,RV5=1M为音量调节。C28为隔直电容为防止后级放大器直流信号对前级控制器的影响。

音频放大器的性能主要是由音调控制器与功率放大器决定的。音调控制器的作用是控制、调节音响放大器输出频率的高低。

音量调节只对低音与高音的增益进行提升与衰减,中音频增益保持不变。所以音调调节控制器的电路由低通和高通滤波器共同组成。

图3-4

图3-5 音调音量调节电路

3.4 音频功率放大器

由功放设计有5类:A类功放效率低最高效率只有50%;B类功放效率可达78.5%但输出信号会有交越失真;AB类功放相当于A类B类功放相结合,高效率低失真,C类功放效率达78.5%以上当C类功放只用于特殊领域不适合用于音频功放;D类功放理想效率可达100%但成本高。所以综合考虑采用AB类功放.

由技术指标与设计指标,音频功率放大电路采用音频集成芯片CM20381A,此芯片优点是外接元件非常少,输出功率Po>=3W(RL=8Ω),开机冲击极小。内含各种保护电路,因此工作安全可靠。主要保护电路有:短路保护、热保护、地线偶然开路、电源极性反接(Vsmax=5V)以及负载泄放电压反冲

等,CM20381A能在8Ω阻抗时能够输出>=3W的有效功率,THD≤1%。

3-6

图3-7 音频功率放大电路

3.5 电源模块

电源模块主要由电源变压器、桥式整流电路、滤波电路、稳压电路,稳压电路主要由LM7805,LML7812,M7912三个三端稳压芯片组成。确保电路的正常稳定

工作。这部分电路比较简单,都采用三端稳压管实现,故不作详述。

图3-8

图3-9 电源模块

四、拓展部分

4.1 音乐盒

音乐盒由51单片机产生16首不同的歌曲用矩阵键盘控制。

4-1

图4-2 音乐盒

4.2 单片机控制输入信号

由单片机输入音频信号,在由单片机控制输入信号幅度

8

图4-3 单片机控制输入信号 4.3 频率检测与液晶显示

频率检测由NE555组成的施密特触发器组成,将正弦波变换成矩形波 通过1602液晶显示当前频率。

图4-4 频率检测电路 4.4 保护电路

此电路在扬声器引脚上取检测信号,通过桥式整流电路变成直流信号,当扬声器上电流超过额定值时使Q1导通-Q2饱和-Q3深度饱和,使继电器导通,断

9

开继电器常闭,短开扬声器与功率放大器的接线。

4-5

图4-6 保护电路

10

五、程序部分

5.1 功能框图

图5-1 总功能电路框图 5.2 主程序框图

图5-2 主程序框图

11

5.3 液晶

1602

5.4 频率检测

图5-3 液晶1602

图5-4 频率检测

12

5.5 红外遥控 --

图5-5 红外遥控

5.6 键盘检测

图5-6 键盘检测

六、总程序

#include //包含头文件

sbit IR=P3^2; //红外接口标志

13

sbit key1 = P1^6 ; sbit key2 = P1^7 ; sbit sw=P3^6; sbit swp1=P1^3; sbit swp2=P1^4; sbit swp3=P1^5;

/*********************************** 名称:声明函数

内容:对函数进行声明,为全局服务 ************************************/ #include

/*********************************** 类型宏定义的声明

**********************************/ #define uchar8 unsigned char #define uint16 unsigned int sbit RS = P1^0 ; sbit RW = P1^1 ; sbit EN = P1^2 ;

uchar8 code begin[ ] = " Link: 0Hz" ; uchar8 code table[ ]= " The voice: 00" ;

/********************************* 延时函数的声明

*********************************/ void delay( uint16 t ) ;

/********************************* 1602函数的声明

/* 寄存器选择:为1时选择数据寄存器,为0时选择指令寄存器 */ /* 为读信号线 */ /* 为使能端 */

14

*********************************/ void lcd_clr( void ) ; void lcd_init( void ) ; void write_cmd( uchar8 cmd ) ; void write_data( uchar8 dat ) ; void key();

//void display( uchar8 addr,uchar8 *p ) ; /********************************* 按键函数的声明

*********************************/ /********************************* 全局变量的声明

*********************************/ int Voice,num1;

/*------------------------------------------------ 全局变量声明

------------------------------------------------*/

unsigned char irtime,Hztime,Hzgeshu,Hzflag=0,swflag;//红外用全局变量 unsigned int Hznum=0;

bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char irdata[33];

/*------------------------------------------------ 函数声明

------------------------------------------------*/

15

void Ir_work(void); void Ircordpro(void);

/*------------------------------------------------ 定时器0中断处理

------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1 {

irtime++; //用于计数2个下降沿之间的时间 }

/*------------------------------------------------ 定时器1中断处理

------------------------------------------------*/

void tim1_Hz (void) interrupt 3 {

uchar8 Hzbai,Hzshi,Hzge,Hzqian,Hzkqian,Hzkflag=1; //

float Hzkshi,Hzkge,Hzkfen,Hzknum;

TR1=0;

TH1=(65535-50000)/256;

TL1=(65535-50000)%256;

Hzgeshu++;

if(Hzgeshu==20)

{ Hzgeshu=0; //

Hznum=Hznum-5;

Hzkqian=Hznum/10000;

16

定时器重新赋值

//计数1S时间 //时间到

赋值用于LCD显示

//

//

Hzqian=Hznum%10000/1000; Hzbai=Hznum%1000/100; Hzshi=Hznum%100/10; Hzge=Hznum%10; Hzflag=1;

}

if(Hzflag) {

Hzflag=0; if(Hznum

{ Hznum=0; if(Hzbai)

{ write_cmd(0x80+11); write_data(0x30+Hzbai);

} else { write_cmd(0x80+11); write_data(' '); }

if(Hzbai||Hzshi) { write_cmd(0x80+12); write_data(0x30+Hzshi); } else {

write_cmd(0x80+12); 17

//在1S的时候处理

//如果小于1000的频率//不显示K

write_data(' ');

}

write_cmd(0x80+13);

write_data(0x30+Hzge);

}

if(Hznum>=1000) { if(Hznum%1000!=0) { if(Hzkqian) { write_cmd(0x80+9); write_data(0x30+Hzkqian);

} else { write_cmd(0x80+9); write_data(' ');

}

if(Hzkqian||Hzqian) { write_cmd(0x80+10); write_data(0x30+Hzqian);

} else { write_cmd(0x80+10); write_data(' '); }

if(Hzqian||Hzkqian)

//大于1000显示小数点

//不为整数时显示小数点

{ write_cmd(0x80+11); write_data('.');

} else { write_cmd(0x80+11); write_data(' '); }

write_cmd(0x80+12); write_data(0x30+Hzbai); if(Hzqian) { write_cmd(0x80+13); write_data('k'); }

}

else { write_cmd(0x80+11); write_data(0x30+Hzkqian); write_cmd(0x80+12); write_data(0x30+Hzqian); if(Hzkqian||Hzqian) { write_cmd(0x80+13); write_data('k');

}

} Hznum=0;

//否则显示整数

// }

}

} write_cmd(0x80+14); write_data('H'); write_cmd(0x80+15); write_data('z');

TR1=1;

}

/*------------------------------------------------ 延时子程序

------------------------------------------------*/ void delay( uint16 t )

{

while( t-- ) ; }

/*------------------------------------------------ 键盘扫描

------------------------------------------------*/ void key( ) {

if( key1==0 )

{ delay( 100 ) ; if( key1==0 ) {

while(!key1);

按下键盘1放大增大

//

Voice += 200 ; num1+=51; if(num1>=255) num1=255; P2=num1; if( Voice>900 ) { Voice = 1000 ; P2 = 0xff ; }

} }

if( key2==0 ) { delay( 100 ) ; if( key2==0 ) { while(!key2); Voice -= 200 ; num1-=51; if(num1

}

} //按下键盘2放大减小

// P2=0xff; // return Voice ;

}

/*------------------------------------------------ 按键选择音乐

------------------------------------------------*/ void sw_music(void) {

if(sw==0) { delay(100); if(sw==0) { while(!sw); swflag++; if(swflag==4)

swflag=0;

}

}

if(swflag==1)

swp1=1; else

swp1=0;

if(swflag==2)

swp2=1;

else

swp2=0;

if(swflag==3) swp3=1;

按键选择音乐播放线路

//

else

swp3=0;

write_cmd( 0x86 ); write_data(0x30+swflag); }

/*------------------------------------------------ 外部中断0中断处理

------------------------------------------------*/ void EX0_ISR (void) interrupt 0 //外部中断0服务函数 {

static unsigned char i; //接收红外信号处理 static bit startflag; //是否开始处理标志位

if(startflag) {

if(irtime=33)//引导码 TC9012的头码,9ms+4.5ms i=0;

irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++;

if(i==33)

{

irok=1; i=0; }

} else {

irtime=0;

}

}

/*------------------------------------------------ 外部中断1中断处理

------------------------------------------------*/ void EX1_ISR (void) interrupt 2 { Hznum++; }

/*------------------------------------------------ 定时器0初始化

------------------------------------------------*/ void TIM0init(void)//定时器0初始化 {

TMOD=0x12;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 TH1=(65535-50000)/256; TL1=(65535-50000)%256; ET1=1; //开中断 TR1=1;

ET0=1; //开中断 TR0=1; }

/*------------------------------------------------ 外部中断0初始化

------------------------------------------------*/ void EX0init(void) {

IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; //使能外部中断 IT1=1; EX1=1;

EA = 1; //开总中断 }

/*------------------------------------------------ 键值处理

------------------------------------------------*/

void Ir_work(void)//红外键值散转程序 {

switch(IRcord[2])//判断第三个数码值 { case 0x15: Voice += 200 ;

num1+=51; if(num1>=255) num1=255;

P2=num1; if( Voice>900 )

{

//按下‘+’放大增大按下‘-’放大减小

//

Voice = 1000 ; P2 = 0xff ;

};

break;//+ case 0x07: Voice -= 200 ; num1-=51; if(num1

}; break;//- case 0x16: swflag=0; sw_music(); break; case 0x0c: swflag=1; sw_music(); break; case 0x18: swflag=2; sw_music(); break; case 0x5e: swflag=3;

sw_music(); break;

default:break; }

/*------------------------------------------------ 红外码值处理

------------------------------------------------*/ void Ircordpro(void)//红外码值处理函数 {

unsigned char i, j, k; unsigned char cord,value; k=1;

for(i=0;i

for(j=1;j

cord=irdata[k];

if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

value|=0x80; if(j

{

value>>=1; }

irpro_ok=0;//处理完成标志

}

k++;

IRcord[i]=value;

value=0;

}

irpro_ok=1;//处理完毕标志位置1

}

/**************************************

函数功能:1602写命令程序

入口参数:dat

出口参数: 无

**************************************/

void write_cmd( uchar8 cmd )

{

RS = 0 ;

RW = 0 ;

P0 = cmd ;

EN = 1;

delay( 10 ) ;

EN = 0 ;

}

/*************************************

函数功能:1602写数据程序

入口参数:dat

出口参数: 无

*************************************/

void write_data( uchar8 dat )

{

RS = 1 ;

P0 = dat ;

EN = 1 ;

delay( 20 ) ;

EN = 0 ;

}

/**************************************

函数功能:1602初始化程序

入口参数:无

出口参数: 无

**************************************/

void lcd_init( void )

{

write_cmd( 0x38 ) ;

write_cmd( 0x06 ) ;

write_cmd( 0x0c ) ;

// write_cmd( 0x01 ) ;

delay( 100 ) ;

}

/**************************************

函数功能:1602清屏程序

入口参数:无

出口参数: 无

**************************************/

void lcd_clr( void )

{

write_cmd( 0x01 ) ;

delay( 100 ) ;

}

/*------------------------------------------------

主函数

------------------------------------------------*/

void main(void)

{

uchar8 num,shi,ge,bai,qian;

int temp;

EX0init();

TIM0init();

lcd_init( );

lcd_clr( ) ;

swp1=swp2=swp3=0;

Voice = 0x00 ;

P2 = 0x00 ;

write_cmd( 0x80 ) ;

for(num=0;num

{

write_data(begin[num]);

}

write_cmd( 0xc0 );

for(num=0;num

{

write_data(table[num]);

}

while(1)//主循环

{

sw_music();

if(irok) //

{

Ircordpro(); 如果接收好了进行红外处理

} irok=0;

if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

{

Ir_work();

}

key();

temp=Voice;

qian=temp/1000;

bai=temp%1000/100;

shi=temp%100/10;

ge=temp%10;

if(temp==1000)

{

write_cmd( 0xcc );

write_data(0x30+qian);

}

else

{

write_cmd( 0xcc );

write_data(' ');

}

if(bai||qian)

{

write_cmd( 0xcd );

write_data(0x30+bai);

}

else

{

write_cmd( 0xcd ); write_data(' '); }

write_cmd(0xce);

write_data(0x30+shi); write_cmd(0xcf);

write_data(0x30+ge); }

}


相关文章

  • 信息技术类项目竞赛实施方案
  • 2016年江苏省职业学校技能大赛 信息技术类项目竞赛实施方案 一.竞赛项目及内容 (一)竞赛项目 本次竞赛设物联网技术应用与维护.网络组建与管理.网络综合布线技术.电子商务技术.计算机硬件检测.动画片制作.计算机辅助设计(工业产品CAD). ...查看


  • 大学生创业计划竞赛1
  • 邮团学联字[2012]02号 关于举办武汉工程大学邮电与信息工程学院 大学生创业计划竞赛的通知 各团总支: 为培养大学生创业意识和实践能力,激发大学生创新创业.实践成才的热情,经研究决定:举办大学生创业计划竞赛活动.现将有关事宜通知如下,请 ...查看


  • 第十届校大学生创业计划竞赛策划书
  • 第十届校大学生创业计划竞赛活动方案 现在全国大学生就业压力都很大,如何才能使大学生能够更好的就业成为社会性的问题.大学生不仅仅要学习到课本的知识,更要更多的了解到技能知识,有更多的创业经历,这才是解决问题的最好办法.创业设计大赛已引起全国大 ...查看


  • 大学生学科竞赛简版
  • 相关的国家级大学生学科竞赛介绍 历史最悠久的全国大学生科技学术竞赛是"挑战杯"全国大学生课外学术实践竞赛.根据<教育部 财政部关于实施高等学校本科教学质量与教学改革工程的通知>(教高[2007]1号)的总体安 ...查看


  • 电子设计竞赛研究与实践
  • 电子设计竞赛的研究与实践 赵升,吴桂初 (温州大学物理与电子信息学院, 浙江 温州 325027) 摘要:本文介绍了全国大学生电子设计竞赛的赛前组织工作和辅导工作,并以"基于单片机和CPLD的数字频率计"为例说明学生进行 ...查看


  • 毕业设计说明书模板 1
  • 分类号: 无锡职业技术学院 毕业设计(论文) 题 目 基于.... 的研制 英文并列题目 院 系 控制技术学院 班 级 机电21132 学生姓名 学 号 所在团队 指导老师(1) 职 称 指导老师(2) 职 称 答辩委员会主任 主答辩人 二 ...查看


  • 2012年度电子产品维修协会工作计划
  • 安徽工贸职业技术学院电子产品协2011~2012学 年第二学期工作计划 冬去春来,转眼之间一个学期过去了,我们即将迎来2012年的第一学期.本学期,我们电子产品维修协会将继承往届的优良传统,本着"培养兴趣,增强技能,发挥特长,服务 ...查看


  • 高校创客空间商业计划书
  • 电子科大创客空间商业计划书 目 录 说明 .......................................................................... 错误!未定义书签. 目 录 .......... ...查看


  • 关于印发2013年安徽省职业院校技能大赛方案的通知
  • 本站首页>>正文内容 关于印发2013年安徽省职业院校技能大赛方案的通知 作者: 管理员 发布日期:2012-12-28 皖教秘职成[2012]101号 关于印发2013年安徽省职业院校技能大赛方案的通知 各市教育局.经信委.财 ...查看


热门内容