📄 voice.c
字号:
//******************************
//名称:音箱控制
//作者:田武平
//时间:08.4.27
//******************************
#include <at892051.h>
#include <I2C.H>
#include <LED.H>
//#include <infrared.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit MUTE = P3^2;
sbit INFR = P1^1; //红外输入
uchar flag,flag2,count = 0,slave_count;
uchar str1[4];
//infrared(); //红外解码
lead(); //起始码
void basic_unit(); //基本时钟单元
uchar code volume[15] = {0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c,0x20,0x24,0x28,0x2c,0x30,0x34,0x38}; //0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70
uchar code disvolume[15] = {0x00,0x05,0x0a,0x0f,0x14,0x19,0x1e,0x23,0x28,0x2d,0x32,0x37,0x3c,0x41,0x46}; //0,-5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70
uchar code treble[2] = {0x40,0x44}; //LOUDNESS开,LOUDNESS关
uchar code bassme[6] = {0x6f,0x6e,0x6d,0x6c,0x6b,0x6a};
uchar code disbassme[6] = {0x00,0x02,0x04,0x06,0x08,0x0a};
uchar code trebleme[11] = {0x7f,0x7e,0x7d,0x7c,0x7b,0x7a};
uchar code distrebleme[6] = {0x00,0x02,0x04,0x06,0x08,0x0a};
uchar strfull[4];
//uchar bassvol = 0;
//uchar treblevol = 0;
uchar voice = 8; //音量变量
uchar treblenum = 1;
uchar bassnum = 1;
uchar loudnessnum = 0;
uchar temp = 0;
uchar ledcove = 1;
uchar twpnum = 0;
//uchar keycount0 = 0;
uchar keycount1 = 0;
uchar keycount2 = 0;
uchar keycount3 = 0;
uchar keycount4 = 0;
uchar readcode = 0 ;
//uchar keycount6 = 0;
uchar twp = 0;
void Init(); //初始化
void fun_ledshow(uchar n,uchar m);
void fun_lednum(uchar number);
void fun_send();
void work();
void keywork();
void ledview(uchar t);
void WrToPT(uchar Data[],uchar Num);
void intime1(void) interrupt 3 using 0 //当k=20时,延时0.2秒子程序
{
TR1 =0;
if ((leddisplay != 0) || (twp == 5))
{
ledview(twp);
if (leddisplay)
leddisplay -= 1 ;
}
if ((leddisnum != 0) || (leddisplay == 0 && (twp == 1 || twp == 2 || twp == 3|| twp == 4 || twp == 15 || twp == 10
|| twp == 11 || twp == 12 || twp == 16 || twp == 17 || twp == 18 || twp == 19)))
{
if (leddisplay == 0 && (twp == 1 || twp == 2 || twp == 3))
twpnum = disvolume[8] ;
if (twp == 4 || twp == 15 || twp == 10|| twp == 11 || twp == 12)
twpnum = disvolume[voice] ;
if (twp == 16 || twp == 17 )
twpnum = disbassme[bassnum] ;
if (twp == 18 || twp == 19 )
twpnum = distrebleme[treblenum] ;
fun_lednum(twpnum);
if (leddisnum)
leddisnum -= 1;
}
TH1 = 0xf9;
TL1 = 0x7d;
TR1 = 1;
ledcove += 1;
if (ledcove == 4)
ledcove = 1;
}
void main()
{
// uchar ii;
Init();
while(1)
{
// readcode = 0;
lead();
/* if(flag == 1) //flag起始码标志位
{
readcode =1; //readcode是有红外输入标志
}
else
readcode = 0;
*/
// infrared();
if(flag == 1) //有红外数据输入
{
work();
}
else
keywork();
}
}
void keywork()
{
key1 = 1;
key2 = 1;
if (!key1) {
str1[0] = 0x00;
str1[1] = 0xdf;
str1[2] = 0x10;
work();
}
if (!key2) {
str1[0] = 0x00;
str1[1] = 0xdf;
str1[2] = 0x30;
work();
}
}
void work()
{
if((str1[0] == 0x00)&&(str1[1] == 0xdf)) //0x00df表示系统码
{ // fun_lednum((voice*9),100);
twp = 0;
switch(str1[2])
{
case 0x00:
{ //d1
leddisplay = 200;
twp = 1;
voice = 8;
strfull[0] = treble[1];
strfull[1] = volume[voice];
// strfull[2] = bassme[bassnum];
// strfull[3] = trebleme[treblenum];
WrToPT(strfull,2);
break;
}
case 0x20:
{
twp = 2; //d2
leddisplay = 200;
voice = 8;
strfull[0] = 0x45;
strfull[1] = volume[voice];
// strfull[2] = bassme[bassnum];
// strfull[3] = trebleme[treblenum];
WrToPT(strfull,2);
break;
}
case 0x80:
{
twp = 4; //on
leddisplay = 200;
// strfull[0] = treble[0];
// WrToPT(strfull,1);
break;
}
case 0xa0:
{
twp = 3; //off
leddisplay = 200;
voice = 8;
strfull[0] = treble[1];
strfull[1] = volume[voice];
WrToPT(strfull,2);
break;
}
case 0x40:
{
twp = 5; //mute
keycount1 = ~keycount1 ;
if (keycount1)
MUTE = 1; //静音
else
{
twp = 10;
MUTE = 0; //no 静音
}
// leddisplay = 200;
// strfull[0] = 0xff ;
// strfull[1] = 0xdf ;
// WrToPT(strfull,2);
break;
}
case 0x60:
{ // loudness
twp = 15;
keycount2 = ~keycount2 ;
if (keycount2)
strfull[0] = treble[0];
else
strfull[0] = treble[1];
WrToPT(strfull,1);
// twpnum = volume[voice] ;
// leddisnum = 200 ;
break;
}
case 0x90:
{ //bass+
if (bassnum != 6)
bassnum++;
twp = 16 ;
strfull[0] = bassme[bassnum] ;
WrToPT(strfull,1);
break;
}
case 0xb0:
{ //bass-
if (bassnum != 0)
bassnum-- ;
twp = 17 ;
strfull[0] = bassme[bassnum] ;
WrToPT(strfull,1);
break;
}
case 0x10:
{ //volu+
if (voice != 15)
voice++;
twp = 11 ;
strfull[0] = volume[voice] ;
WrToPT(strfull,1);
break;
}
case 0x30:
{ //volu-
if(voice != 0)
voice--;
twp = 12 ;
strfull[0] = volume[voice] ;
WrToPT(strfull,1);
break;
}
case 0x50:
{ //tre +
if (treblenum != 6)
treblenum++;
twp = 18 ;
strfull[0] = trebleme[treblenum] ;
WrToPT(strfull,1);
break;
}
case 0x70: //tre -
{
if (treblenum != 0)
treblenum--;
twp = 19 ;
strfull[0] = trebleme[treblenum] ;
WrToPT(strfull,1);
break;
}
default: break;
}
}
}
void Init()
{
strfull[0] = treble[1];
strfull[1] = volume[voice];
strfull[2] = bassme[bassnum];
strfull[3] = trebleme[treblenum];
MUTE = 0;
key1 = 1;
key2 = 1;
INFR = 1;
treblenum = 0;
bassnum = 0;
loudnessnum = 1;
voice = 8;
TMOD = 0x11 ;
TH1 = 0xf9;
TL1 = 0x7d;
TR1 =1 ;
EA =1 ;
ET1 = 1;
leddisplay = 250;
twp = 6;
// fun_ledfunction(6,80); //延时使其显示1.5秒
// fun_ledfunction(1,60); //d1显示1秒
while (twp == 6 && leddisplay != 0);
// fun_ledfunction(1,60); //d1显示1秒
leddisplay = 200;
twp = 1;
WrToPT(strfull,4); //初始化数据
}
void ledview(uchar t)
{
switch(t)
{
case 1:
{
fun_ledshow(10,1); //d1
break;
}
case 2:
{
fun_ledshow(10,2); //d2
break;
}
case 3: {
fun_ledshow(0,12); //of
break;
}
case 4: {
fun_ledshow(0,11); //on
break;
}
case 5: {
fun_ledshow(15,15); //--
break;
}
case 6: {
fun_ledshow(13,13); //全亮
break;
}
case 7: {
fun_ledshow(14,14); //全灭
break;
}
default:
break;
}
}
void fun_ledshow(uchar n,uchar m)
{
if (ledcove == 1)
{
LED2 = 0;
LED1 = 1;
senddata = str[n];
fun_send();
}
else if (ledcove == 3)
{
LED2 = 1;
LED1 = 0;
senddata = str[m];
fun_send();
}
else
{
LED2 = 0;
LED1 = 0;
}
}
void fun_lednum(uchar number ) //数字
{
uchar lednum1,lednum2;
lednum1 = number/10;
lednum2 = number%10;
fun_ledshow(lednum1,lednum2);
}
void fun_send() // 移位传送
{
uchar i;
STA_4094 = 1;
for (i=0; i<=7; i++)
{
CLK_4094 = 1;
if (senddata & 0x80)
DATA_4094 = 1;
else
DATA_4094 = 0;
_nop_ ();
_nop_ ();
senddata <<= 1;
CLK_4094 = 0;
_nop_ ();
_nop_ ();
_nop_ ();
}
STA_4094 = 0;
}
////////////////////////////////////////////
/*infrared( ) //红外解码
{
lead();
if(flag == 1) //flag起始码标志位
{
readcode =1; //readcode是有红外输入标志
}
else
readcode = 0;
}
*/
void basic_unit() //0.5ms//24M时钟 fc18
{
// TMOD = 0x01;
TH0 = 0xff;
TL0 = 0x59;
TR0 = 1;
}
void basic_unit2() //0.1ms//4M时钟 fc18
{
// TMOD = 0x01;
TH0 = 0xff;
TL0 = 0xbd;
TR0 = 1;
}
lead()
{
uchar flag1;
uchar BitCounter ;
uchar i=0;
count = 0;
flag1 = 0;
flag = 0;
ET1 = 0;
begain:
// while(INFR);
if((INFR == 0) && (flag1 == 0))
{
again1:
basic_unit();
while(TF0 != 1);
TF0 = 0;
count++;
if(INFR == 1)
{
slave_count = count;
count = 0;
if((slave_count>14)&&(slave_count<20))
{
flag1 = 1;
}
else
goto begain;
}
else
goto again1;
}
if(flag1 == 1)
{
again2: basic_unit();
while(TF0 != 1);
TF0 = 0;
count++;
if(INFR == 0)
{
slave_count = count;
count = 0;
if(slave_count>6 && slave_count<10)
{ flag = 1;
flag1 = 0;
}
else
{ flag1 = 0;
flag = 0;
goto begain;
}
}
else
goto again2;
}
if (flag == 1) {
for (i = 0; i<4; i++ )
{
for(BitCounter =8;BitCounter>0;BitCounter--)
{
count = 0;
while(INFR == 0);
while(INFR == 1)
{
basic_unit2();
while(TF0 != 1);
TF0 = 0;
TR0 = 0;
count++;
if(INFR == 0)
{
slave_count = count;
count = 0;
if(slave_count>1 && slave_count < 6)
flag2 = 0;
else if(slave_count > 5 && slave_count < 10)
flag2 = 1;
}
}
if(flag2) //如果flag2=1
temp=temp|0x01; //temp的最低位置1
else
temp=temp&0xfe; //否则temp的最低位清0
if(BitCounter-1)
temp=temp<<1;
}
str1[i] = temp;
}
}
ET1 = 1;
}
/*
void delay_bit()
{ uchar i;
for(i=0;i<44;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
*/
void Start(void) /*起始条件*/
{
Sda=1;
_nop_();
Scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
Sda=0;
_nop_();
_nop_();
_nop_();
_nop_();
}
void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/
{
uchar BitCounter=8; /*位数控制*/
uchar temp; /*中间变量控制*/
temp=Data;
do
{
Scl=0;
_nop_();
_nop_();
_nop_();
_nop_();
if((temp&0x80)==0x80) /* 如果最高位是1*/
Sda=1;
else
Sda=0;
_nop_();
_nop_();
Scl=1;
temp=temp<<1; /*RLC*/
// Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
void WrToPT(uchar Data[],uchar Num)
{
uchar i;
uchar *PData;
PData=Data;
Start(); /*发送启动信号*/
Send(Address); /*发送SLA+W*/ /*发送地址*/
Ack();
for(i=0;i<Num;i++)
{
Send(*(PData+i));
Ack();
}
Stop();
_nop_ ();
_nop_ ();
_nop_ ();
// mDelay(80);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -