📄 gsm主控板.c
字号:
#include<reg52.h>
//#include<stdio.h>
#include<string.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit bCancel=P1^0; //取消
sbit bCall=P1^1; //拨号/接听
sbit bLed=P1^2; //LED指示
sbit bPro=P1^3; //编程指示
sbit bStart=P3^4; //启动GSM
sbit bMusic=P3^5; //提示音控制
sbit bScl=P3^6; //24c08 SCL
sbit bSda=P3^7; //24c08 SDA
sbit tmp=ACC^0; //
//uchar idata RsBuf[10];
//uchar idata RsPoint=0;
//uchar code AT_Tc35[]="AT+"; //连机
//uchar code Text_Tc35[]="CMGF=1"; //文本模式
//uchar code Read_Tc35[]="CMGR="; //读信息
//uchar code Erase_Tc35[]="CMGD="; //删除信息
//uchar code Send_Tc35[]="CMGS="; //发送信息
//uchar code OVER[]=0x1a;//成组发送结束
//uchar code YinHao[]=22;
//uchar code AT_Code[]="OK";
//uchar code SK[]=">";
//uchar code Ask_No[]="+CMGR: 0,,0";
//uchar code ERROR[]="ERROR";
//uchar code Ask_Tc35[]="/";
//uchar code Creg_Tc35[]="CREG?"; //注册
bit startflag=0,flag1=0,flag2=0,flag3=0,buttonflag=0;
bit rwFlag=0,rFlag=0,wFlag,smsFlag=0;
uchar input=0x0f,output=0x0f;
uchar temp;
uchar bufP0=0,bufP1H=0,buf=0;//保存数据
uchar idata pdu2[]="5BA2538567094EBA975E6CD58FDB5165";
//12345678901234567890123456789012
uchar idata pdu3[]="003053F7673A51FA73B04EE559160021";
uchar idata smsCenter_pdu[]="3108701905F0";
uchar idata Phone_pdu[]="3178603180F4";
uchar idata Phone[]="13870613084;\r";
//uchar smsAddr,smsAddress;
uchar idata rsBuf[]="abcdef";
uchar sbuf,rsPoint;
uint time=0;
uchar idata rIndex=0,wIndex=0;
/******************** Function DefInition 函数定义 *************************/
//AT24C08读写
void delay1(uchar x)
{
uint i;
for(i=0;i<x;i++);
}
void Nops()
{
uchar u=4;
while(u--);
}
void I2C_Init()
{
bScl=1;
Nops();
bSda=1;
Nops();
}
void I2C_Start()
{
bSda=1;
Nops();
bScl=1;
Nops();
bSda=0;
Nops();
bScl=0;
Nops();
}
void I2C_Stop()
{
bSda=0;
Nops();
bScl=1;
Nops();
bSda=1;
Nops();
}
void Writex(uchar j)
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
bScl=0;
Nops();
bSda=CY;
Nops();
bScl=1;
Nops();
}
bScl=0;
Nops();
bSda=1;
Nops();
}
uchar Readx()
{
uchar i,j,k=0;
bScl=0;
Nops();
bSda=1;
for (i=0;i<8;i++)
{
Nops();
bScl=1;
Nops();
if (bSda==1) j=1;
else j=0;
k=(k<<1)|j;
bScl=0;
}
Nops();
return(k);
}
void ACK()
{
uchar i=0;
bScl=1;
Nops();
while ((bSda==1)&&(i<255))i++;
bScl=0;
Nops();
}
uchar I2C_ReadOneByte(uchar addr,uchar address)
{
uchar i;
I2C_Start();
Writex(addr-1);
ACK();
Writex(address);
ACK();
I2C_Start();
Writex(addr);
ACK();
i=Readx();
I2C_Stop();
delay1(10);
return(i);
}
void I2C_ReadNByte(uchar addr,uchar address,uchar *buf,uchar num)
{
uchar i;
I2C_Start();
Writex(addr-1);
ACK();
Writex(address);
ACK();
I2C_Start();
Writex(addr);
ACK();
*buf=Readx();
buf++;
I2C_Stop();
for(i=1;i<num;i++)
{
I2C_Start();
Writex(addr);
ACK();
*buf=Readx();
buf++;
I2C_Stop(); //主应答<ack=1>
}
delay1(10);
}
/*void I2C_WriteOneByte(uchar addr,uchar address,uchar info)
{
EA=0;
I2C_Start();
Writex(addr);
ACK();
Writex(address);
ACK();
Writex(info);
ACK();
I2C_Stop();
EA=1;
delay1(50);
}*/
//连续写
//num不大于16
void I2C_WriteNByte(uchar addr,uchar address,uchar *buf,uchar num)
{
uchar i;
EA=0;
I2C_Start();
Writex(addr);
ACK();
Writex(address);
ACK();
for(i=0;i<num;i++)
{
Writex(*buf); //发送数据*buf
buf++;
ACK();
}
I2C_Stop();
EA=1;
delay1(50);
}
/****************************************************************************/
void SyStem_Init()
{
uchar i;
I2C_Init();
//加载短消息和对方号码
for(i=0;i<12;i++)
{
smsCenter_pdu[i]=I2C_ReadOneByte(0xa3,64+i);
}for(i=0;i<12;i++)
{
Phone_pdu[i]=I2C_ReadOneByte(0xa3,76+i);
}
for(i=0;i<11;i++)
{
Phone[i]=I2C_ReadOneByte(0xa3,107+i);
}
input=I2C_ReadOneByte(0xa3,118);//加载默认输入值
output=I2C_ReadOneByte(0xa3,119);//加载默认输出值
}
/****************************************************************************/
//延迟函数
void Delay(uchar n)
{
uchar i=204;
while(n--)
{
while(i--);
}
}
/****************************************************************************/
//启动GSM模块即使GSM的IGT保持100ms以上的低电平
void Start_GSM()
{
bStart=0;
Delay(120);
bStart=1;
}
/****************************************************************************/
//发送一个ASCII
void SendASC(uchar ASC)
{
bit es;
es=ES;//
ES=0;//关闭串行中断
TI=0;
SBUF=ASC;
while(!TI);
TI=0;
ES=es;
}
/****************************************************************************/
//发送AT命令到TC35I
void SendCmdToTc35i(uchar *p)
{
uchar len;
len=strlen(p);
while(len--)
{
SendASC(*p++);
}
}
/****************************************************************************/
//向电脑发送34个字节的字符串
//连机时使用
Send_TO_PC(uchar i)
{
uchar j;
if(i<8)
{
I2C_ReadNByte(0xa1,i*32,rsBuf+1,32);
}
if(i>=8)
{
I2C_ReadNByte(0xa3,(i-8)*32,rsBuf+1,32);
}
for(j=0;j<33;j++)
{
SBUF=rsBuf[j];
while(!TI);
TI=0;
Nops();
}
}
/****************************************************************************/
//将
//连机时使用
Write_To_2408(uchar i)
{
if(i<8)
{
I2C_WriteNByte(0xa0,i*32,rsBuf+1,16);
I2C_WriteNByte(0xa0,i*32+16,rsBuf+17,16);
}
if(i>=8)
{
I2C_WriteNByte(0xa2,(i-8)*32,rsBuf+1,16);
I2C_WriteNByte(0xa2,(i-8)*32+16,rsBuf+17,16);
}
}
/****************************************************************************/
//删除接收缓冲区RsBuf内的信息
/*void ClrStr(uchar *p)
{
uchar len,i;
len=strlen(p);
for(i=0;i<len;i++)
{
*p++=0;
}
}
/****************************************************************************/
//删除sim卡内短信息
/*void EraseMsg(uchar index)
{
SendCmdToTc35i("AT+CMGD=");
SendASC(index);//指出第几个
SendASC(0x0d);
ES=1;
}
/****************************************************************************/
//读取短信息
/*uchar ReadMsg(uchar index)
{
uchar *p,i;
uchar Buf[40];
SendCmdToTc35i("AT+CMGF=1\r");
Delay(10);
SendCmdToTc35i("AT+CMGR=");
SendASC(index);//指出第几个
SendASC(0x0d);
ES=1; //必须中断
Delay(200);
//-----------------------------
p=strstr(rsBuf,"ERROR");
if (p !=NULL) return 0;
//-----------------------------
p=strstr(rsBuf,"+CMGR:0,,0");//无信息
if (p !=NULL) return 0;
//--------------------------
p=strstr(rsBuf,"/");//20个字节后是MSG
if (p ==NULL) return 0;
//---------------------------------------
p=p+21;
//-----------------------------------
for (i=0;i<strlen(Buf);i++)
{
Buf[i]=*p++;
}
//-----------------------------------
p=strcpy(rsBuf,Buf); //放回RsBuf
return 1;
}
/****************************************************************************/
//发送短消息
void Send_SMS(uchar *p)
{
uchar tmp=0;
ES=0;
SendCmdToTc35i("AT+CMGF=0\r");
Delay(50);
SendCmdToTc35i("AT+CMGS=38\r");
TH0=0x4C;
TL0=0;
time=0;
TR0=1;
while(1)
{
tmp=SBUF;
RI=0;
if(tmp==0x3e||tmp==0x41)
break;
if(time>100)
{
time=0;
TR0=0;
break;
}
}
SendCmdToTc35i("089168");
SendCmdToTc35i(smsCenter_pdu);
SendCmdToTc35i("11000B81");
SendCmdToTc35i(Phone_pdu);
SendCmdToTc35i("0008A7188BF76CE8610FFF1A");
SendCmdToTc35i(p);
SendASC(0X1A);
}
/****************************************************************************/
//读取P1口的低四位
//将P1口的低四位存入buf
void ReadP1(void)
{
uchar t;
t=P1;
t=t&0xF0;
t=_cror_(t,4);
buf=t;
}
/****************************************************************************/
//串口初始化
//89C51在11.0592MHz下以9600Bs的波特率工作*/
void uart_init(void)
{
SCON=0x50; //SM1=1,REN=1.UART工作于模式1,并允许接收
TMOD=0x21; //TIMER1工作于模式2,TIMER0工作于模式1,
PCON&=0x7f; //SMOD=0;
TH1=0xFD; //9600bs
TR1=1; //开定时器1
}
/****************************************************************************/
//LED闪烁
void Led_SS(uchar n)
{
n=n*2;
while(n--)
{
bLed=!bLed;
Delay(100);
}
}
/****************************************************************************/
void Music(uchar n)
{
bMusic=0;
while(n--)
{
Delay(64);//Delay(64);
}
bMusic=1;
}
/****************************************************************************/
//外部中断0处理函数
void Intr0_int(void) interrupt 0
{
uchar i,n=0;
EX0=0;
Delay(10);
ReadP1();
if(buf==4)
{
Music(4);
startflag=1;
flag2=0;
flag3=0;
bufP1H=0;
}
else if(buf==2)
{
Music(1);
startflag=0;
flag2=0;
flag3=0;
bufP1H=0;
}
else
{
if(buf==bufP1H)
{
flag2=0;
}
else
{
flag2=1;
bufP1H=buf;
}
if(flag2)
{
switch (buf)
{
case 3:{n=0; break;}
case 5:{n=1; break;}
case 7:{n=2; break;}
case 9: {n=3; break;}
case 10:{n=4; break;}
case 11:{n=5; break;}
case 12:{n=6; break;}
case 13:{n=7; break;}
case 14:{n=8; break;}
case 15:{n=9; break;}
default:{n=9; break;}
}
if(n<8)
{
for(i=0;i<32;i++)
{
pdu2[i]=I2C_ReadOneByte(0xa1,n*32+i);
}
}
else
{
for(i=0;i<32;i++)
{
pdu2[i]=I2C_ReadOneByte(0xa3,(n-8)*32+i);
}
}
flag3=1;
flag2=0;
}
}
EX0=1;
}
/****************************************************************************/
void T0_intsvr(void) interrupt 1
{
TH0=0x4C; //Timer0产生50ms的中断
TL0=0;
time++;
}
/****************************************************************************/
void serial_int()interrupt 4
{
if(RI)
{
sbuf=SBUF;
RI=0;
if(bPro)
{
/* rsBuf[rsPoint++]=sbuf;
if (rsPoint >100)
{
rsPoint=0;
} //数据处理*/
}
else
{
if(rwFlag)
{
if(rFlag)//读标志
{
if(sbuf<15)
{
rIndex=sbuf;
rsBuf[0]=sbuf;
Send_TO_PC(rIndex);
}
rFlag=0;
rwFlag=0;
}
if(wFlag)//写标志
{
rsBuf[rsPoint++]=sbuf;
if(rsPoint>33)
{
wIndex=rsBuf[0];
if(wIndex<15)
{
Write_To_2408(wIndex);// Write_To_2408(rsBuf[0]-0x30);
SBUF=wIndex;
while(!TI);
TI=0;
rsPoint=0;
rwFlag=0;
wFlag=0;
}
}
}
}
else
{
if(sbuf==0xAA)
{
rwFlag=1;
wFlag=1;
rsPoint=0;
I2C_ReadNByte(0xa1,0,rsBuf,1);
}
if(sbuf==0xBB)
{
rwFlag=1;
rFlag=1;
}
}
}
}
if(TI)
{
TI=0;
}
}
void main(void)
{
uchar i;//*p;
P2=0x00;
EA=0;
bMusic=1;
startflag=0;
Led_SS(5);
Start_GSM();//启动GSM模块
uart_init();
SyStem_Init();
P2=output;
ES=1;
EX0=1;
EX1=1;
TI=1;
Delay(200);
Delay(200);
//Send_AT();//发送AT连机命令
SendCmdToTc35i("ATE\n");
EA=1;
Music(2);
// EraseMsg(1);
while(1)
{
EX0=1;
temp=P0;
if(startflag)//
{
if(flag3)
{
Music(2);
Send_SMS(pdu2);
Music(2);
flag2=0;
flag3=0;
}
if(temp!=input)
{
temp=temp^input;
if(temp==bufP0)
{
flag1=0;
}
else
{
flag1=1;
bufP0=temp;
}
if(flag1)
{
Music(2);
for(i=0;i<8;i++)
{
ACC=temp;
if(tmp)
{
pdu3[3]=i+0x31;
}
temp=_cror_(temp,1);
}
Send_SMS(pdu3);
Music(3);
}
}
}
if(!bCancel)
{
Delay(50);
if(!bCancel)
{
SendCmdToTc35i("ATH\r");
Delay(200);
}
}
if(!bCall)
{
Delay(50);
if(!bCall)
{
SendCmdToTc35i("ATD");
SendCmdToTc35i(Phone);
Delay(200);
}
}
/* if(smsFlag)
{
ReadMsg(1);
}
if(rsPoint>7)
{
p=strstr(rsBuf,"RING");
if(p!=NULL)
{
ClrStr(rsBuf);
rsPoint=0;
bLed=0;
}
p=strstr(rsBuf,"NO CARRIER");
if(p!=NULL)
{
ClrStr(rsBuf);
rsPoint=0;
bLed=1;
}
p=strstr(rsBuf,"+CMTI:");
if(p!=NULL)
{
ClrStr(rsBuf);
rsPoint=0;
bLed=1;
}*/
//}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -