?? ch14-1s.c
字號(hào):
//發(fā)送機(jī)程序
#include <reg51.h>
#define XBYTE ((char *)0x20000L)
bit d_OK,Wait_OK=1,Wait_time=1,Ready_b=1; /* OK 指示燈狀態(tài)標(biāo)志;等待連機(jī)成功時(shí)間標(biāo)志;*/
sbit OK_Led=0x87; /* 按鍵延時(shí)到標(biāo)志;連機(jī)成功標(biāo)志表 */
sbit Ready_Led=0xA7;
bit Begin_Tran;
sbit M7512_AOG=0xb2;
sbit P_D=0x90;
sbit HT9200_CE=0x93;
sbit HT9200_CLK=0x92;
sbit HT9200_DATA=0x91;
sbit M7512_MOD1=0x95;
sbit M7512_MOD2=0x94;
sbit M7512_RS=0x96;
bdata unsigned char my_data,key_data,d_data,times=0,i; /* times 時(shí)間記數(shù)器;*/
data unsigned int data_addr,j;
data unsigned long spe_long;
data unsigned char call_code[10];
code unsigned char disp_list[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};
code unsigned char disp_lisj[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
code struct spe_str
{
unsigned char hi_addr;
unsigned int start_addr;
}spe_str[3]={{0x00,0x0000},{0x05,0xfff1},{0x06,0xfff0}};
void call_number(void); /* 撥號(hào)函數(shù) */
void tran_data(void); /* 鍵盤處理及送顯示 */
void delay(void);
void delay_t(int j);
void f_send(void); /* 發(fā)送有效數(shù)據(jù) */
void f_test(void);
main()
{
M7512_AOG=0;
EA=0;
OK_Led=1;
OK_Led=0;
P0=0x00;
P1=0xff;
P2=P3=0xff;
delay_t(50);
for(i=0;i<30;i++)
{
P0=disp_lisj[i%6];
delay_t(5);
}
P0=0xff;
TMOD=0x21; /* T0 為16位定時(shí)器,T1 波特率1200 */
TL0=0x01;TH0=0x00;
TL1=0xe8;TH1=0xe8;
SCON=0xd8;PCON=0x00;
ET0=1;
TR0=1; /* 啟動(dòng)T0 */
TR1=1; /* 啟動(dòng)T1 */
d_data=1;
P0=disp_list[d_data];
ES=1;
EX0=0;
EA=1;
M7512_MOD1=0;
M7512_MOD2=0; /* M7512 為發(fā)送方式 */
while(1) /* 鍵盤掃描 */
{
key_data=P2;
key_data|=0x80;
if(key_data!=0xff)
{
delay();
key_data=P2;
key_data|=0x80;
if(key_data!=0xff)
{
key_data=P2;
if(!(key_data&0x01)) my_data=1;
if(!(key_data&0x02)) my_data=9;
if(!(key_data&0x04)) my_data=2;
if(!(key_data&0x08)) my_data=4;
if(!(key_data&0x10)) my_data=3;
if(!(key_data&0x20)) my_data=5;
if(!(key_data&0x40)) my_data=8;
}
while(1)
{
key_data=P2;
key_data|=0x80;
if(key_data==0xff) break;
}
delay();
}
key_data=P3;
key_data|=0x07;
if(key_data!=0xff)
{
delay();
key_data=P3;
key_data|=0x07;
if(key_data!=0xff)
{
key_data=P3;
if(!(key_data&0x08)) my_data=11;
if(!(key_data&0x10)) my_data=12;
if(!(key_data&0x20)) my_data=6;
if(!(key_data&0x40)) my_data=10;
if(!(key_data&0x80)) my_data=7;
}
while(1)
{
key_data=P3;
key_data|=0x07;
if(key_data==0xff) break;
}
delay();
}
/* if(Wait_time==0) f_test(); */
tran_data();
}
}
void f_test(void)
{
EA=0;
M7512_RS=0;
while(1)
{
SBUF=0x0f;
while(TI==0);
TI=0;
}
}
void tran_data(void)
{
switch(my_data)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10: /* 按撥號(hào)鍵時(shí) */
if(Ready_b)
{ /* 未連機(jī)時(shí) */
times=0x80; /* 定時(shí)記數(shù)回原點(diǎn) */
P0=disp_list[my_data]; /* 顯示數(shù)據(jù) */
OK_Led=~d_OK;
call_number(); /* 撥號(hào) */
}
else
{ /* 連機(jī)成功時(shí) */
EA=0;
SBUF=0xa5;
while(TI==0);
TI=0;
EA=1;
OK_Led=1;
Ready_Led=1;
d_OK=0;
P_D=~d_OK; /* 切短電話線,關(guān)OK指示燈 */
M7512_MOD1=0;
M7512_MOD2=0; /* M7512 為發(fā)送狀態(tài) */
M7512_RS=1;
Wait_OK=1;
Wait_time=1;
Ready_b=1;
}
my_data=100;
break;
case 11: /* 當(dāng)前數(shù)據(jù)加1 送顯示 */
d_data++;
if (d_data>10) d_data=1;
P0=disp_list[d_data];
OK_Led=~d_OK;
my_data=100;
break;
case 12:
if(~Ready_b) /* 連機(jī)成功時(shí),發(fā)送當(dāng)前數(shù)據(jù) */
{
f_send();
}
else /* 如在未連機(jī)狀態(tài)下,按SEND 鍵在接通和短開電話線之間切換 */
{
OK_Led=d_OK; /* d_OK 當(dāng)前接通電話線狀態(tài) */
d_OK=~d_OK;
P_D=~d_OK;
times=0x70;
}
my_data=100;
default:
break;
}
}
void f_send(void)
{
SBUF=d_data;
}
/*拔號(hào)子程序*/
/*入口參數(shù):my_data。每調(diào)用一次,拔一位數(shù)字,即為my_data代表的數(shù)字*/
void call_number(void)
{
unsigned char j;
HT9200_CE=0; //HT9200A使能
HT9200_CLK=1; //時(shí)鐘信號(hào)高電平
delay_t(3);//延時(shí)3ms
for(j=0;j<5;j++) //待拔數(shù)字的5位編碼串行輸入HT9200A
{
if(my_data&0x01) HT9200_DATA=1;
else HT9200_DATA=0;
HT9200_CLK=0;
delay();
HT9200_CLK=1;
my_data=my_data>>1; //串行數(shù)據(jù)右移一位
}
delay_t(15);
HT9200_CE=1;
}
void series_int(void) interrupt 4 using 2
{
unsigned char data_temp;
TI=0;
if (RI==1)
{
data_temp=SBUF;
RI=0;
if((data_temp==0xa5)&&(Wait_time==0))
{
Ready_b=0;
Ready_Led=0;
M7512_MOD1=0; /* 接收到連機(jī)信號(hào),轉(zhuǎn)發(fā)送狀態(tài) */
M7512_MOD2=0;
M7512_RS=0;
delay();
SBUF=d_data;
Wait_OK=0;
times=0xff;
}
}
}
void time_int(void) interrupt 1 using 3
{
TH0=0x00;
TL0=0x01;
TR0=1;
times--;
if((times==0x00)&&(d_OK==1))
{
if(Wait_time)
{
Wait_time=0;
M7512_MOD1=1; /* 撥號(hào)完成置于接收狀態(tài) */
M7512_MOD2=0;
times=0xf0;
}
else
{
if(Wait_OK) /* 長(zhǎng)時(shí)間無連機(jī)信號(hào),則掛機(jī) */
{
OK_Led=1;
Ready_Led=1;
d_OK=0;
P_D=~d_OK; /* 切短電話線,關(guān)OK指示燈 */
M7512_MOD1=0;
M7512_MOD2=0; /* M7512 為發(fā)送狀態(tài) */
M7512_RS=1;
Wait_OK=1;
Wait_time=1;
Ready_b=1;
}
}
}
}
void delay(void)
{
idata int i;
for(i=0;i<1000;i++)
{}
}
void delay_t(int j)
{
idata int i;
while(j>0)
{
for(i=0;i<1000;i++)
{}
j--;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -