📄 ch14-1s.c
字号:
//发送机程序
#include <reg51.h>
#define XBYTE ((char *)0x20000L)
bit d_OK,Wait_OK=1,Wait_time=1,Ready_b=1; /* OK 指示灯状态标志;等待连机成功时间标志;*/
sbit OK_Led=0x87; /* 按键延时到标志;连机成功标志表 */
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 时间记数器;*/
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); /* 拨号函数 */
void tran_data(void); /* 键盘处理及送显示 */
void delay(void);
void delay_t(int j);
void f_send(void); /* 发送有效数据 */
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位定时器,T1 波特率1200 */
TL0=0x01;TH0=0x00;
TL1=0xe8;TH1=0xe8;
SCON=0xd8;PCON=0x00;
ET0=1;
TR0=1; /* 启动T0 */
TR1=1; /* 启动T1 */
d_data=1;
P0=disp_list[d_data];
ES=1;
EX0=0;
EA=1;
M7512_MOD1=0;
M7512_MOD2=0; /* M7512 为发送方式 */
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: /* 按拨号键时 */
if(Ready_b)
{ /* 未连机时 */
times=0x80; /* 定时记数回原点 */
P0=disp_list[my_data]; /* 显示数据 */
OK_Led=~d_OK;
call_number(); /* 拨号 */
}
else
{ /* 连机成功时 */
EA=0;
SBUF=0xa5;
while(TI==0);
TI=0;
EA=1;
OK_Led=1;
Ready_Led=1;
d_OK=0;
P_D=~d_OK; /* 切短电话线,关OK指示灯 */
M7512_MOD1=0;
M7512_MOD2=0; /* M7512 为发送状态 */
M7512_RS=1;
Wait_OK=1;
Wait_time=1;
Ready_b=1;
}
my_data=100;
break;
case 11: /* 当前数据加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) /* 连机成功时,发送当前数据 */
{
f_send();
}
else /* 如在未连机状态下,按SEND 键在接通和短开电话线之间切换 */
{
OK_Led=d_OK; /* d_OK 当前接通电话线状态 */
d_OK=~d_OK;
P_D=~d_OK;
times=0x70;
}
my_data=100;
default:
break;
}
}
void f_send(void)
{
SBUF=d_data;
}
/*拔号子程序*/
/*入口参数:my_data。每调用一次,拔一位数字,即为my_data代表的数字*/
void call_number(void)
{
unsigned char j;
HT9200_CE=0; //HT9200A使能
HT9200_CLK=1; //时钟信号高电平
delay_t(3);//延时3ms
for(j=0;j<5;j++) //待拔数字的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; //串行数据右移一位
}
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; /* 接收到连机信号,转发送状态 */
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; /* 拨号完成置于接收状态 */
M7512_MOD2=0;
times=0xf0;
}
else
{
if(Wait_OK) /* 长时间无连机信号,则挂机 */
{
OK_Led=1;
Ready_Led=1;
d_OK=0;
P_D=~d_OK; /* 切短电话线,关OK指示灯 */
M7512_MOD1=0;
M7512_MOD2=0; /* M7512 为发送状态 */
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--;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -