📄 allsubfun.c
字号:
#include <allseting.h>
/*******************全局变量*************************/
uint count ; /*全局计数变量*/
uchar mimasave[5] ={0,0,0,0,0}; /*密码最大为10位*/
uchar mimain[5] ={0,0,0,0,0};
uchar mimatemp[5] = {0,0,0,0,0};
uchar lingcount ; /*铃声次数*/
static uchar isd[16] = {ISD0,ISD1,ISD2,ISD3,ISD4,ISD5,
ISD6,ISD7,ISD8,ISD9,ISD10,ISD11,ISD12,ISD13,ISD14,ISD15}; /*isd语音段*/
uint jiadian[3] = {0,0,0}; /*家电定时计数*/
uchar flagding[3] = {0,0,0};
/****************中断设置***************************/
void intset()
{
TMOD = 0x21 ; /*定时器0方式1 定时器1方式2*/
TH0 = 0x3C ; /*定时器0 50MS定时*/
TL0 = 0xB0 ;
TH1 = 0xF3 ; /*红外线载波*/
TL1 = 0xF3 ;
EA = 1 ; /*开全局中断*/
ET1 = 1 ; /*开定时器1中断*/
ET0 = 1 ; /*开定时器0中断*/
TR0 = 1 ; /*启动T0 */
EX1 = 1 ; /*开外部中断1*/
IT1 = 1 ; /*下跳沿中断*/
PT0 = 1 ; /*定时0 高优先级*/
}
/********************delay**************************/
void delay(uint time) /*延时程序*/
{
while(time--)
_nop_();
}
/***********************红外发射********************/
void basesend(void) interrupt 3
{
REDSEND = ~REDSEND;
}
void sendcode(uchar redcode)
{
uchar i ;
for (i = 0 ; i < 8 ; i++)
{
TH0 = 0 ;
TL0 = 0 ;
TR1 = 1 ;
while(!(TH0 >= 0x02 && TL0 >= 0x30)) /*0.56ms*/
;
TR1 = 0 ;
REDSEND = 0 ;
if( (redcode>>i) & 0x01 )
{
while(!(TH0 >= 0x08 && TL0 >=0xCA )); /*再等到2.25ms*/
}
else
{
while(!(TH0 >= 0x04 && TL0 >= 0x65)); /*再等到1.125ms*/
}
}
}
void hongsend(uchar reddata)
{
ET0 = 0 ;
EX1 = 0 ;
TH0 = 0 ;
TL0 = 0 ;
TR0 = 1 ;
TR1 = 1;
/************引导码**********************/
while(!(TH0 >=0x23 && TL0 >= 0x28)) ; /*9ms*/
TR1 = 0 ;
REDSEND = 0 ;
while(!(TH0 >= 0x34 && TL0 >= 0xBC )); /*再过4.5ms*/
/*****************送码*******************/
sendcode(REDUSER);
sendcode(~REDUSER);
sendcode(reddata);
sendcode(~reddata);
TH0 = 0 ;
TL0 = 0 ;
TR1 = 1 ;
while(!(TH0 >= 0x02 && TL0 >= 0x30)) /*0.56ms结束脉冲*/
;
TR1 = 0 ;
TH0 = 0x3C ; /*定时器0 50MS定时*/
TL0 = 0xB0 ;
TR0 = 1;
ET0 = 1;
EX1 = 1;
REDSEND = 0 ;
delay(10000);
}
/******************* 全局时钟 **********************/
void resettime(void)
{
EA = 1 ; /*开全局中断*/
count = 0 ;
TMOD = 0x21 ; /*定时器0方式1 定时器1方式2*/
TH0 = 0x3C ; /*定时器0 50MS定时*/
TL0 = 0xB0 ;
ET0 = 1 ; /*开定时器0中断*/
TR0 = 1 ; /*启动T0 */
PT0 = 1 ; /*定时0 高优先级*/
}
void stoptime(void)
{
TR0 = 0 ;
}
void int50ms(void) interrupt 1
{
uchar i ;
TH0 = 0x3C ;
TL0 = 0xB0 ;
count++ ;
for(i = 0 ; i < 3 ; i++) /*检测家电定时时间到*/
{
if(jiadian[i] == 0xffff ) continue;
if(jiadian[i] == 0)
{
if(flagding[i] == 0 ) continue;
switch(i)
{
case 0 : CONTROL0 = 0;
hongsend(3);
break;
case 1 : CONTROL1 = 0;
hongsend(4);
break;
case 2 : CONTROL2 = 0;
hongsend(5);
break;
}
flagding[i] = 0 ;
}
else jiadian[i] = jiadian[i] - 1 ;
}
}
/*******************系统初始化**********************/
void systeminit(void)
{
GETCALL = 0 ; /*挂机*/
isdinit(); /*语音芯片初始化*/
intset(); /*中断初始化*/
MTTEST = 1 ; /*等待8870输入*/
KEYOK; /*等待本地键盘*/
LEDCON = 0; /*关LED*/
REDSEND = 0 ; /*关红外*/
r24c01(0x06,&lingcount,1); /*取振铃次数*/
inithome(); /*家电初始化*/
}
/******************* 铃声检测 **********************/
void waitring(void) /*等待振铃*/
{
uchar ling ;
ling = 0 ;
RINGTEST = 1 ;
resettime();
while(ling < lingcount) /*n次铃声*/
{
while(RINGTEST == 1 ) /*4s断*/
{
if(count > 400 ) /*未达到要求次数用户已挂机*/
{
resettime();
ling = 0 ;
}
}
delay(1000);
if(RINGTEST == 0 )
ling++;
while(RINGTEST == 0 ); /*1s通*/
resettime();
}
GETCALL = 1 ; /*摘机*/
}
/********************铃声次数*********************/
uchar lingchang(void)
{
uchar temp;
uchar temp2;
temp2 = 0 ;
while( (temp = get8870()) != MTJ )
{
if(temp == 16)
return 3;
if(temp == MT0)
temp = 0 ;
if(temp > 10)
{
isdplay(14, 1);
return 0;
}
temp2 = temp2*10 + temp;
if( temp2 > 20 )
{
isdplay(14, 1);
return 0 ;
}
}
lingcount = temp2;
w24c01(0x06,&lingcount,1);
isdplay(13,1);
return 1 ;
}
/******************* 8870 捕获*********************/
uchar get8870(void)
{
bit flag ;
flag = 0 ;
MTTEST = 1 ;
resettime();
/*检测上升沿*/
SETMTDATAPORT ;
while(MTTEST == 1 )
;
while(MTTEST == 0 )
{
if(count > 400 )
{ flag = 1 ; /*20s超时挂机*/
break ;
}
}
if(flag) return 16 ;
return MTDATA;
}
uchar isdwait8870()
{
uchar temp ;
temp = get8870();
stopisd();
return temp;
}
/******************* ISD 2560 *********************/
void isdinit(void)
{
ISDCE = 1 ;
ISDPR = 1 ;
ISDEOM = 1 ;
ISDPD = 1 ; /*不启动*/
return ;
}
void isdplay(uchar num,bit wait)
{
ISDPD = 0 ;
ISDPR = 1 ;
ISDCE = 1 ;
ISDSEND(isd[num]);
delay(5);
ISDCE = 0 ;
delay(50000);
ISDCE = 1 ;
ISDEOM = 1 ;
if(wait)
{
while(ISDEOM == 1 )
;
while(ISDEOM == 0 )
;
}
return ;
}
void isdrecord(void)
{
bit over;
over = 0 ;
ISDPD = 1 ;
delay(10000); /*10ms复位*/
ISDPD = 0 ;
ISDCE = 1 ;
ISDSEND(ISD15);
ISDPR = 0 ;
delay(5);
ISDCE = 0 ;
resettime();
SETMTDATAPORT;
for(;;) /*按0#结束录音*/
{
if(MTDATA == MT0 )
{
while(MTDATA == MT0 )
{
if(count > 300)
goto end;
}
if( count > 40 || count < 3 )
{
break;
}
else
{
if(MTDATA == MTJ)
goto end;
}
}
if(count > 300)
break;
}
end:ISDCE = 1 ;
ISDPR = 1 ;
ISDPD = 1 ;
delay(10000); /*10ms复位*/
ISDPD = 0 ;
}
void stoprecord()
{
ISDCE = 1 ;
ISDPR = 1 ;
}
void stopisd(void)
{
ISDPD = 1 ;
delay(1000); /*1ms*/
}
/******************* 24C01读写**********************/
void w24c01(uchar adress,uchar * byte,uchar num) /*写入多个字节*/
{
while(num--)
{
Start_I2c();
SendByte(AT24C01A);
SendByte(adress);
SendByte(*byte);
Stop_I2c();
delay(10000);
byte++;
adress++ ;
}
}
void r24c01(uchar adress,uchar * byte,uchar num) /*读入多个字节*/
{
while(num--)
{
Start_I2c();
SendByte(AT24C01A);
SendByte(adress);
Start_I2c();
SendByte(AT24C01A+1);
*(byte) = RcvByte();
Ack_I2c(1);
Stop_I2c();
byte++ ;
adress++ ;
}
}
/************************密码检查***********************/
bit getmima(uchar * where) /*获取密码输入*/
{
uchar i,j,temp;
bit flag ;
flag = 1 ;
i = 10 ;
j = 0 ;
temp =0 ;
where[0] = 0;
where[1] = 0;
where[2] = 0;
where[3] = 0;
where[4] = 0;
while( ( (temp = get8870()) != MTJ ) && (i != 0) )
{
if(temp == 16)
return 0 ;
if(flag)
{
where[j] = (temp << 4) & 0xf0 ;
flag = 0 ;
}
else
{
where[j] = ( where[j] & 0xf0 ) | ( temp & 0x0f) ;
flag = 1 ;
j++ ;
}
i-- ;
}
return 1 ;
}
uchar mimatest(void) /*密码检查*/
{
uchar j ;
if(getmima(mimain) == 0)
return 3;
r24c01(0x00,mimasave,5);
for(j = 0 ; j < 5; j++)
{
if(mimain[j] != mimasave[j])
return 0 ;
}
return 1 ;
}
uchar mimachang(void) /*密码输入两次确认*/
{
uchar j;
if( getmima(mimatemp) == 0 )
return 3;
isdplay(10,1);
if(getmima(mimain) == 0 )
return 3;
for(j = 0 ; j < 5 ; j++ )
{
if(mimatemp[j] != mimain[j])
{
return 0 ;
}
}
w24c01(0x00,mimain,5);
return 1 ;
}
/******************* 远程菜单 **************************/
void telnetmenu(void)
{
uchar what;
uchar temp;
for(;;)
{
isdplay(3,0);
switch(isdwait8870())
{
/*************家电控制**********************************/
case MT1 :
isdplay(4,0);
switch(isdwait8870())
{
case MT1: what = 0 ;
break ;
case MT2: what = 1 ;
break ;
case MT3: what = 2 ;
break;
case 16 :return;
default : goto error;
}
isdplay(5,0);
switch(isdwait8870())
{
case MT1:sethome(what,0xffff);
goto show;
case MT2:sethome(what, 0);
goto show;
case MT3: if( dingshi(what) == 3)
return;
case MT4:
show: if( jiadian[what] == 0 )
isdplay(7,1);
else if( jiadian[what] == 0xffff )
isdplay(6,1);
else isdplay(8,1);
break;
case 16: return;
default : goto error;
}
delay(10000);
break ;
/***************留言 听留言*******************************/
case MT2:
isdplay(12,1);
isdrecord();
break ;
case MT3:
isdplay(15,1);
break ;
/**************系统设置*************************************/
case MT4:
isdplay(9,0);
switch(isdwait8870())
{
case MT1 :
isdplay(11,1);
if(lingchang() == 3)
return;
break;
case MT2:
isdplay(1,1);
temp = mimachang();
if( temp == 1)
isdplay(13,1);
else if(temp == 0 )
isdplay(14,1);
else return ;
break;
case 16 :
return ;
default : goto error;
}
break ;
/**************退出系统***********************************/
case MT5:
return ;
/**************重新提示***********************************/
case MTJ:
break ;
/**************超时退出**********************************/
case 16 :
return;
default:
error: isdplay(14,1);
break;
}
}
}
/*******************家电设置 **********************/
void inithome(void)
{
CONTROL0 = 0 ; /*全关 暂时用高电平开*/
CONTROL1 = 0 ;
CONTROL2 = 0 ;
jiadian[0] = 0 ;
jiadian[1] = 0 ;
jiadian[2] = 0 ;
flagding[0] = 0 ;
flagding[1] = 0 ;
flagding[2] = 0 ;
hongsend(3);
hongsend(4);
hongsend(5);
}
void sethome(uchar what, uint time)
{
jiadian[what] = time ;
if(time != 0)
{
switch(what)
{
case 0 : CONTROL0 = 1;
hongsend(0);
break;
case 1 : CONTROL1 = 1;
hongsend(1);
break;
case 2 : CONTROL2 = 1;
hongsend(2);
break;
}
}
else
{
switch(what)
{
case 0 : CONTROL0 = 0;
hongsend(3);
break;
case 1 : CONTROL1 = 0;
hongsend(4);
break;
case 2 : CONTROL2 = 0;
hongsend(5);
break;
}
}
}
uchar dingshi(uchar what) /*定时设置*/
{
uint time;
uchar temp ;
time = 0 ;
isdplay(11,0);
while( (temp = isdwait8870()) != MTJ )
{
if(temp == 16)
return 3;
if(temp == MT0)
temp = 0 ;
if(temp > 10)
{
isdplay(14, 1);
sethome(what,0);
return 0;
}
time = time*10 + temp;
if( time > 50 )
{
isdplay(14, 1);
sethome(what,0);
return 0 ;
}
}
time = time * 1200;
if(time == 0 )
{
isdplay(14, 1);
sethome(what,0);
return 0;
}
sethome(what,time);
flagding[what] = 1 ;
return 1;
}
/*********************本地键盘 *********************/
void keyuse(void) interrupt 2
{
uchar temp ;
stoprecord();
stopisd();
temp = KEYDATA ;
delay(10000);
if(temp == KEYDATA)
{
GETCALL = 1 ;
switch(temp)
{
case 0x0E: /*本地菜单*/
telnetmenu();
break;
case 0x0D: /*重设密码*/
resettime();
while(KEYDATA == 0x0D)
{
if(count > 30) /*按键1.5S设置密码及振铃次数*/
{
mimasave[0] = 0x12;
mimasave[1] = 0x34;
mimasave[2] = 0x56;
mimasave[3] = 0;
mimasave[4] = 0;
lingcount = 6 ;
w24c01(0x00,mimasave,5);
w24c01(0x06,&lingcount,1);
isdplay(13,1);
}
}
break;
case 0x0B:
isdplay(15,1); /*播放留言*/
break;
case 0x07:
isdplay(12,1); /*本地留言*/
isdrecord();
isdplay(13,1);
break;
}
GETCALL = 0 ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -