⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch14-1s.c

📁 单片机接口技术(C51版)例程源代码
💻 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 + -