(3)音调调节电路的功能是降低高频信号的幅值,对低频信号几乎是原样输出,实验对声波的过滤。
(4)单片机控制电路,基本实现了对音量的调节,声道的转换,四音源的选择并由液晶把当前的功能状态显示出来。音量分八段调节,可从1—8自由调节。声道可以选左声道导通,右声道导通和双声道全导通。四音源可以自由切换。 参考文献:
[1]魏涛. 一款为书架箱设计的“胆味”晶体管功放.无线电 2009年第2期 [2]童诗白 华成英. 模拟电子技术基础. 高等教育出版社 [3]闫石. 数字电子技术基础. 高等教育出版社
[4]张迎新. 单片微型计算机原理、应用及接口技术(第2版). 国防工业出版社
河北科技大学第二届电子设计大赛
附图1
河北科技大学第二届电子设计大赛
附图2
附3《单片机程序》
/******************************************************************************
***
名称:功放控制程序
功能:实现声道切换,音量加减,音源切换
*******************************************************************************
**/
#include<reg52.h> #include<intrins.h>
#define uchar unsigned char #define uint unsigned int
#define LCD_Data P0 //代表向LCD输入的数据 #define Busy 0x80 //用于检测LCD状态字中的Busy标识
sbit Vol_p = P1^0; sbit Vol_m = P1^1; sbit Key_track = P1^4;
sbit Relay_U = P1^2; sbit Relay_D = P1^3; sbit Relay1 sbit Relay2 sbit Relay3 sbit Relay4
sbit A sbit M sbit C
= P2^1; = P2^2; = P2^3; = P2^4; = P1^5; = P1^6; = P1^7;
sbit Enable1 = P3^0; sbit Enable2 = P3^1;
sbit LCD_RS = P2^7; sbit LCD_RW = P2^6; sbit LCD_E = P2^5;
uchar code table[]=" 12 3 4";
uchar code dis_num[]="0123456789";
uchar volume=0; uchar relay=0x01; uchar temprelay; uchar track=1;
void Delay5Ms(void) {
unsigned int TempCyc = 5552; while(TempCyc--); }
//读状态
unsigned char ReadStatusLCD(void) {
LCD_Data = 0xFF; LCD_RS = 0; LCD_RW = 1; LCD_E = 0;
LCD_E = 0; LCD_E = 1;
while (LCD_Data & Busy); //检测忙信号 return(LCD_Data); }
//********* LCD1602驱动程序 *************** //写数据
void WriteDataLCD(unsigned char WDLCD) {
ReadStatusLCD(); //检测忙 LCD_Data = WDLCD; LCD_RS = 1;
LCD_RW = 0;
LCD_E = 0; //若晶振速度太高可以在这后加小的延时 LCD_E = 0; //延时
LCD_E = 1; }
//写指令
void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测 {
if (BuysC)
ReadStatusLCD(); //根据需要检测忙 LCD_Data = WCLCD; LCD_RS = 0; LCD_RW = 0; LCD_E = 0; LCD_E = 0; LCD_E = 1; }
//LCD初始化
void LCDInit(void) {
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号 Delay5Ms();
WriteCommandLCD(0x38,0); Delay5Ms();
WriteCommandLCD(0x38,0);
Delay5Ms();
WriteCommandLCD(0x38,1); //显示模式设置,开始要求每次检测忙信号 WriteCommandLCD(0x08,1); //关闭显示 WriteCommandLCD(0x01,1); //显示清屏
WriteCommandLCD(0x06,1); // 显示光标移动设置 WriteCommandLCD(0x0C,1); // 显示开及光标设置 }
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1 if(Y)
X |= 0x40; //当要显示第二行时地址码+0x40; X |= 0x80; //算出指令码
WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码 WriteDataLCD(DData); }
void main() {
A=0x00; M=0x00; C=0x00; Enable1=0; Enable2=0;
/* P0=0xfe;
relay=0x01;*/ Relay1=0; Relay2=1; Relay3=1;
LCDInit();
DisplayOneChar(0,0,'S'); DisplayOneChar(1,0,'R'); DisplayOneChar(2,0,'C'); DisplayOneChar(4,0,'1'); DisplayOneChar(7,0,'T'); DisplayOneChar(8,0,'R'); DisplayOneChar(9,0,'A'); DisplayOneChar(10,0,'C'); DisplayOneChar(11,0,'K'); DisplayOneChar(13,0,'A'); DisplayOneChar(0,1,'V'); DisplayOneChar(1,1,'O'); DisplayOneChar(2,1,'L'); DisplayOneChar(4,1,'1'); DisplayOneChar(5,1,'|'); while(1) { if(!Vol_p) { } if(!Vol_m) {
Delay5Ms(); if(!Vol_m)
Delay5Ms(); if(!Vol_p) {
if(volume<7) { }
volume++; C=volume/4; M=(volume%4)/2; A=volume%2;
DisplayOneChar(volume+5,1,'|');
DisplayOneChar(4,1,dis_num[volume+1]);
}
while(!Vol_p);
if(volume>0) { volume--; C=volume/4; M=(volume%4)/2; A=volume%2;
DisplayOneChar(volume+6,1,' ');
DisplayOneChar(4,1,dis_num[volume+1]);
}
}
while(!Vol_m);
}
if(!Relay_U) { Delay5Ms(); if(!Relay_U) { if(relay<8) { relay*=2;
Relay1=(~(relay&0x01))&0x01;
Relay2=(~((relay&0x02)>>1))&0x01; Relay3=(~((relay&0x04)>>2))&0x01; Relay4=(~((relay&0x08)>>3))&0x01;
}
temprelay=relay;
DisplayOneChar(4,0,table[temprelay]);
}
while(!Relay_U);
}
if(!Relay_D) { Delay5Ms(); if(!Relay_D) {
if(relay>1) { relay/=2;