?? c51jh.c
字號:
/* 現(xiàn)代交換綜合實驗c51程序v.08*/
/*此程序完成4路用戶話機的摘掛機檢測、號碼接收、顯示及各種信號音的輸出。*/
#include <Absacc.h>
#include <reg51.h>
#define uchar unsigned char
#define NUMLONG 0x07 /*定義號碼長度為7*/
/*
uchar xdata NUM2、1 _at_ 0xdfff;
uchar xdata NUM4、3 _at_ 0xbfff;
uchar xdata TONE _at_ 0xefff;
uchar xdata DTMF2、1 _at_ 0x7F01(8155PA);
uchar xdata DTMF4、3 _at_ 0x7F02(8155PB);
uchar xdata cid(4) _at_ 0x7F03(8155PC);
sub1~4 _at_ 89c51-P1.0~P1.3);*/
uchar code TAB[]={0x05,0x03,0x09,0x13,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x09,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x09,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,
0x05,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03,0x01,0x03};
uchar bdata busytab=0x00,toneword=0x00,cid=0x00;
uchar bdata num1=0x0f,num2=0xf0,num3=0x0f,num4=0xf0,num=0x0f;
uchar bdata buf;
uchar data m;
/* busytab :用戶忙閑表,低4位存儲,每路占一位,第0位對應第一路用戶。1-用戶忙,0-用戶閑;
toneword :信號音控制字,低4位存儲,每路占一位,第0位對應第一路用戶。1-送信號音,0-停送信號音;
cid:低4位存儲4路用戶的CID值,每路占一位,第0位對應第一路用戶;
num1~num4:4個數(shù)碼管數(shù)據(jù)顯示存儲單元
buf:緩沖單元
m:0x01*/
struct subscrib {
uchar status;
uchar timer;
uchar dailed;
uchar dail[NUMLONG];
}subs[4]={
{0x00,0x00,0x00,{0x0f}},
{0x00,0x00,0x00,{0x0f}},
{0x00,0x00,0x00,{0x0f}},
{0x00,0x00,0x00,{0x0f}}};
/* status:摘掛機狀態(tài)存儲單元。0—空閑;1—剛剛摘機,未撥號,送撥號音;2—收號。撥首位號后,停送撥號音;3—摘機,在規(guī)定的時間內(nèi)(4s),不撥號,送催掛音;4—號碼收全,不再收號,送回鈴音;5—剛剛掛機。
timer:時間計數(shù)器,一次記錄時間為16ms。用于記錄摘機后不撥號的持續(xù)時間。規(guī)定超過4s(255x16=4s)時送催掛音,此處用忙音替代催掛音。
dailed:收號位數(shù)計數(shù)器, <NUMLONG。
dail[NUMLONG]:號碼存儲單元組。*/
struct subscrib *p;
void run16ms();
void run96ms() ;
void run350ms();
void run1s();
void display();
void main()
{
TMOD=0x01;
TL0=0xc0;
TH0=0xe0;
TR0=1;
ET0=1;
EA=1;
SP=0x60;
XBYTE[0xdfff]=0xff;
XBYTE[0xbfff]=0xff;
P1=0x0f;
while(1);
}
/*---------------------------------------------------------------------------*/
void run16ms() /*狀態(tài)1:收號并顯示;2:收號停送撥號音并顯示;5:掛機,復位;無新號碼時計時;設置狀態(tài)2、3、4。信號音部分放到了其他函數(shù)中了*/
{
uchar i;
cid=(cid<<4)|(XBYTE[0x7F03]&0x0f);
for(p=subs,buf=cid,i=1;p<subs+4;p++,buf>>=1,i++)
{
switch(buf&0x11)
{
case 0x00:
{
switch(p->status)
{
case 1:
case 2: {
if(++(p->timer)==250)
{
p->status=3;
}
}break;
case 5: p->status=0;
switch(i)
{
case 1: num1=0x0f; break;
case 2: num2=0xf0; break;
case 3: num3=0x0f; break;
case 4: num4=0xf0; break;
}
}
}break;
case 0x01:
{
switch(p->status)
{
case 1: p->status=2;
case 2: p->timer=0;
switch(i)
{
case 1: p->dail[p->dailed++]=XBYTE[0x7F01]&0x0f; num1=XBYTE[0x7F01]&0x0f; break;
case 2: p->dail[p->dailed++]=(XBYTE[0x7F01]>>4)&0x0f; num2=XBYTE[0x7F01]&0xf0; break;
case 3: p->dail[p->dailed++]=XBYTE[0x7F02]&0x0f; num3=XBYTE[0x7F02]&0x0f; break;
case 4: p->dail[p->dailed++]=(XBYTE[0x7F02]>>4)&0x0f; num4=XBYTE[0x7F02]&0xf0; break;
}
}
}break; /*cid上跳沿收號*/
case 0x10:
{
if(p->dailed==NUMLONG)p->status=4;
}break;
default: ;
}
}
display();
}
void run96ms() /*4路用戶的摘掛機檢測。讀P1口,修改busytab、status單元(設置0,1,5狀態(tài))。*/
{
busytab=(busytab<<4)|(~P1&0x0f); /*1摘機,0掛機*/
P1=~(P1<<4)|0x0f;
for(p=subs,buf=busytab;p<subs+4;p++,buf>>=1)
{
switch(buf&0x11)
{
case 0x00: p->status=0x00; break; /* 00 */
case 0x01: p->status=0x01; break; /* 01,摘機,送撥號音*/
case 0x10: p->status=0x05;
p->dailed=0;
p->timer=0;
break; /* 10 ,掛機 ,復位*/
default: ; /* 11, 保持原狀態(tài) */
}
}
}
void run350ms() /*狀態(tài)1:送撥號音 2:停送撥號音 3:送催掛音(此處用忙音替代):350MS送,350MS斷*/
{
m=0x01;
buf=toneword; /* 入口參數(shù) */
for(p=&subs[0];p<=subs+3;p++)
{ switch(p->status)
{ case 0x01: buf=buf|m; break; /* 狀態(tài)01:送撥號音(置1)*/
case 0x02: buf=buf&~m; break; /* 狀態(tài)02:已撥號,停撥號音(清0)*/
case 0x03: buf=(buf&~m)|(~buf&m); break; /* 狀態(tài)03:久不撥號,送催掛音 (取反)*/
default: break; /* 其它:保持原狀態(tài) */
}
m=m<<1;
}
toneword=buf;
XBYTE[0xefff]=toneword;
}
uchar j=0;
void run1s() /*狀態(tài)4送回鈴音,1S送,4S斷*/
{
m=0x01;
buf=toneword; /* 入口參數(shù) */
for(p=&subs[0];p<=subs+3;p++)
{ if(p->status==4) /* 狀態(tài)04: 撥號位數(shù)已夠,送回鈴音*/
{ if (j==0) buf=buf|m; /*(置1)*/
else buf=buf&~m; /* (清0)*/
}
m=m<<1;
}
toneword=buf;
XBYTE[0xefff]=toneword;
j++;
if (j==5) {j=0;}
}
int1() interrupt 1
{
static uchar TAB_i=0;
TL0=0xc0;
TH0=0xe0;
if (TAB[TAB_i]&0x02)
run16ms();
if (TAB[TAB_i]&0x04)
run96ms();
if (TAB[TAB_i]&0x08)
run350ms();
if (TAB[TAB_i]&0x10)
run1s();
TAB_i++;
if (TAB_i==108)
TAB_i=0x00;
}
void display() /*顯示用戶號碼*/
{
XBYTE[0xdfff]=num2|num1;
XBYTE[0xbfff]=num4|num3;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -