基于TDA简易数控功放.docx
《基于TDA简易数控功放.docx》由会员分享,可在线阅读,更多相关《基于TDA简易数控功放.docx(17页珍藏版)》请在冰豆网上搜索。
基于TDA简易数控功放
简易功率放大器
摘要
本电路设计采用一块功率放大器芯片作为核心,加上其他外围电路而成。
通过单片机控制和显示放大量的大小。
本设计的主要特点有:
结构简单,容易控制,显示准确,具有一定的功率放大能能力。
简易功率放大器
本系统主要由功率放大模块、显示模块、控制模块和单片机模块组成,下面分别论证这几个模块的选择。
1.1功率放大的论证与选择
方案一:
用分立元件搭建一个功率放大模块。
分立元件搭建的功率放大模块,效率高,失真小,但制作和调试都比较麻烦。
方案二:
使用TDA2030功率放大芯片。
使用TDA2030功放芯片的电路简单,调试容易,有一定的功率放大能力。
综合以上两种方案,选择方案二。
1.2显示的论证与选择
方案一:
1602LCD。
1602液晶显示,操作简单,容易控制,但不能显示中文字符。
方案二:
12864LCD。
12864液晶显示,能够显示中文字符,但占用的IO口较多。
综合以两种方案,选择方案一。
1.3控制系统的论证与选择
方案一:
MSP430。
TI公司的MSP430,功耗小,IO口多,但操作较复杂。
方案二:
51单片机。
51,操作简单,容易控制。
综合考虑采用51单片机做为控制系统。
2系统理论分析与计算
DAC0832控制音量大小的理论分析
单片机同归IO口给DAC0832赋不同的值,得到不同的电压,从而达到调节音量大小的作用。
把八位二进制的数分成八份每份值为256/8=32,逐加并赋值给IO口。
3电路与程序设计
3.1电路的设计
3.1.1系统总体框图
系统总体框图如图1所示
图1
3.1.2单片机子系统框图与电路原理图
单片机子系统框图
图2
3.1.4电源
电路电源由外部设备提供,+5V电源供给单片机及相关部分,+12、-12电源供给功放主体和运放。
3.2程序的设计
3.2.1程序功能描述与设计思路
1602显示“yinlian”提示,当按键按下,出现0到8的音量等级的显示。
当按键按下,音量将超出所限等级范围时,蜂鸣器发声提示。
3.2.2程序流程图
1、主程序流程图
附录:
电路原理图
功放主体
51单片机
DAC0832
程序代码
#include//包含单片机寄存器的头文件
#include//包含_nop_()函数定义的头文件
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeyinliang[]={"0012345678"};
ucharcodeyinliang0[]={0x00,0x00,0x1f,0x3f,0x5f,0x7f,0x9f,0xbf,0xdf,0xff};
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,将BF位定义为P0.7引脚
sbitjia=P1^0;
sbitjian=P1^4;
sbitfmq=P2^5;
unsignedcharcodestring[]={"YINLIANG:
"};
unsignedcharcodestring1[]={"NOWLOWEST!
"};
unsignedcharcodestring2[]={"NOWHIGHEST!
"};
unsignedcharcodestring3[]={"NOWNORMAL!
"};
/*****************************************************
函数功能:
延时1ms
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelay(unsignedintn)
{
unsignedinti;
for(i=0;idelay1ms();
}
/*****************************************************
函数功能:
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;result=0,不忙
***************************************************/
bitBusyTest(void)
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=BF;//将忙碌标志电平赋给result
E=0;
returnresult;
}
/*****************************************************
函数功能:
将模式设置指令或显示地址写入液晶模块
入口参数:
dictate
***************************************************/
voidWrite_com(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(写指令时,
//就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
指定字符显示的实际地址
入口参数:
x
***************************************************/
voidWriteAddress(unsignedcharx)
{
Write_com(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:
将数据(字符的标准ASCII码)写入液晶模块
入口参数:
y(为字符常量)
***************************************************/
voidWriteData(unsignedchary)
{
while(BusyTest()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;//E置低电平(写指令时,,
//就是让E从0到1发生正跳变,所以应先置"0"
P0=y;//将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
对LCD的显示模式进行初始化设置
***************************************************/
voidLcdInt(void)
{
delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
Write_com(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delay(5);//延时5ms
Write_com(0x38);
delay(5);
Write_com(0x38);//3次写设置模式
delay(5);
Write_com(0x0C);//显示模式设置:
显示开,有光标,光标闪烁
delay(5);
Write_com(0x06);//显示模式设置:
光标右移,字符不移
delay(5);
Write_com(0x01);//清屏幕指令,将以前的显示内容清除
delay(5);
}
//蜂鸣器
voidbeep()
{
unsignedintt;
for(t=0;t<200;t++)
{
fmq=0;
delay
(1);
fmq=1;
delay
(1);
}
fmq=1;
delay(1000);
}
voidmain(void)//主函数
{
uintb=0;
uinta=0;
unsignedchari,j;
LcdInt();//调用LCD初始化函数
delay(10);
Write_com(0x01);//清显示:
清屏幕指令
i=0;
j=0;
while
(1)
{
WriteAddress(0x00);//设置显示位置为第一行的第1个字
delay(5);
while(string[i]!
='\0')//'\0'是数组结束标志
{
WriteData(string[i]);
i++;
delay(10);
}
WriteAddress(0x09);
delay(5);
if(jia==0)
{
delay(20);
if(jia==0)
{
delay(20);
while(!
jia);
a=a+1;
if(a==10)
{a=9;beep();}
WriteData(yinliang[a]);
P3=yinliang0[a];
}
}
if(jian==0)
{
delay(20);
if(jian==0)
{
delay(20);
while(!
jian);
a=a-1;
if(a==0)
{a=1;beep();}
WriteData(yinliang[a]);
P3=yinliang0[a];
}
}
WriteAddress(0x40);//设置显示位置为第二行的第1个字
delay(5);
if(a==1)
{
j=0;
while(string1[j]!
='\0')//'\0'是数组结束标志
{
WriteData(string1[j]);
j++;
delay(10);
}
}
if(a==9)
{
j=0;
while(string2[j]!
='\0')//'\0'是数组结束标志
{
WriteData(string2[j]);
j++;
delay(10);
}
}
if(a>1&&a<9)
{
j=0;
while(string3[j]!
='\0')//'\0'是数组结束标志
{
WriteData(string3[j]);
j++;
delay(10);
}
}
}
}