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); }
}