?? tc35h.c
字號:
#include "string.h"
#define enAT 1
#define enBPs 1
#define TRUE 1
#define FALSE 0
sbit IGT = P1^7; sbit RING = P3^4;
//AT指令的定義
char code AT_Tc35[]="AT+"; //連機
char code Bps_Tc35[]="IPR=19200"; //波特率
char code Text_Tc35[]="CMGF=0"; //文本模式
char code Read_Tc35[]="CMGR="; //讀信息
char code Erase_Tc35[]="CMGD="; //刪除信息
char code Send_Tc35[]="CMGS="; //發送信息
char code Creg_Tc35[]="CSQ"; //"CREG?"; //注冊
unsigned char RsPoint=0,timer1;
unsigned char pdata RsBuf[156];
//發送-個ASCII
void SendASC(unsigned char ASC)
{
bit es;
es=ES;
ES=0;//關閉中斷
TI=0; SBUF=ASC; while(!TI); TI=0;
ES=es;
}
//發送命令到TC35
void SendToTc35(unsigned char* p,unsigned char Long)
{
while(Long)
{
SendASC(*p++); Long--;
}
}
void ClrRsBuf(unsigned char *p,unsigned char Long){
while(Long--){*p=0; p++;}
RsPoint=0;
}
void enter(void){
SendASC(0x0d); //SendASC(0x0a);
}
//*********** 延時 X ms ****************
void Delay(int x){
timer0=0;
while(timer0<x);
}
// 發送AT連機命令
char code AT_OK[]="OK";
#ifdef enAT
void Send_AT(void)
{
unsigned char *p; //U8 ct=0;
while(1)
{
ClrRsBuf(RsBuf,sizeof(RsBuf)-1);
SendToTc35(AT_Tc35,2); //"AT"
enter();
//************等待應答“ok"
ES=1; //必須中斷
Delay(50);
p=strstr(RsBuf,AT_OK);
if(p!=NULL) break;
//if(++ct==20)RST;
}
}
#endif
//發送CREG命令
#ifndef enAT
void Send_CREG(void)
{
SendToTc35(AT_Tc35,3); //"AT+"
SendToTc35(Creg_Tc35,sizeof(Creg_Tc35)-1);//"IPR=19200"
enter(); Delay(100);
}
#endif
//設置文本
void SetPDU(void)
{
SendToTc35(AT_Tc35,3); //"AT+"
SendToTc35(Text_Tc35,sizeof(Text_Tc35)-1);//"IPR=19200"
enter();
Delay(100);
}
//*
//刪除短信息
unsigned char EraseMsg(unsigned char index)
{
unsigned char *p,i=20;
SendToTc35(AT_Tc35,3); //"AT+"
SendToTc35(Erase_Tc35,sizeof(Erase_Tc35)-1);//"IPR=19200"
SendASC(index);
enter();
ES=1;
while(i--)
{
Delay(200);
p=strstr(RsBuf,AT_OK);
if(p!=NULL) {return TRUE;}
}
return FALSE;
}
//*讀取短信息
char code Ask_No[]="+CMGR:0,,0";
char code ERROR[]="ERROR";
char code Ask_Tc35[]="/";
unsigned char ReadMsg(unsigned char index)
{
unsigned char *p;
//unsigned char Buf[40];
SendToTc35(AT_Tc35,3); //"AT+"
SendToTc35(Read_Tc35,sizeof(Read_Tc35)-1);
SendASC(index);
enter();
ES=1; //必須中斷
Delay(600);
//-------
// ES=0:
// SendToTc35(RsBuf,99);
// ES=1;
p=strstr(RsBuf,ERROR);
if(p!=NULL)
{
Send_AT();return 0;
p=strstr(RsBuf,Ask_No);//無信息
if(p!=NULL)return 0;
}
return TRUE;
}
//*/
//發送AT+CSCA?查詢短信中心號碼子程序
#define zxhmHead 128 // 12 bytes
char at_csca(){ char *p;
char i,Send_Cmd[]="CSCA?"; //發送Command
SendToTc35(AT_Tc35,3); //"AT+"
SendToTc35(Send_Cmd,sizeof(Send_Cmd)-1);
enter();
RsPoint=timer1=0; while(timer1<20);//等待手機回答
if (RsPoint<24) return FALSE;
p=zxhmHead;
for (i=0; i<6; i++){
*p=RsBuf[14+i+i+1]; p +=2;
}
p=zxhmHead+1;
for (i=0; i<6; i++){
*p=RsBuf[13+i+i]; p +=2;
}
p=zxhmHead+10; *p='F';
}
//發送短信息
unsigned char code hex2ch[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
unsigned char SendMsg(unsigned char *p,unsigned char Long){
unsigned char *p1;
char Send_Cmd[]="CMGS=037"; //發送Command
//發送AT+CMGS=150
SendToTc35(AT_Tc35,3); //"AT+"
SendToTc35(Send_Cmd,sizeof(Send_Cmd)-1);
enter();
RsPoint=timer1=0; while(timer1<20);//等待手機回答">"
p1=strstr(RsBuf,AT_OK);
if(p1==NULL) return 0;
//發固定的短信字頭089168子程序
//strcpy(Send_Cmd,"089168");
SendToTc35("089168",6);
//發送短信中心號碼子程序13800412500
// p1=zxhmHead;
// strncpy(Send_Cmd,p1,12);
// strcpy(Send_Cmd,"3108402105F0");
SendToTc35("3108402105F0",12);
//短信中部固定數據11000B81
// strcpy(Send_Cmd,"11000D81");
SendToTc35("11000D81",8);
//發送短信接收方手機號碼子程序 13050009330
// strcpy(Send_Cmd,"683116902807F0");
// strcpy(Send_Cmd,"683150009033F0");
// SendToTc35("683116902807F0",14);
SendToTc35("683150009033F0",14);
//下部固定數據0008A9 Or 000800
// strcpy(Send_Cmd,"0008A9");
SendToTc35("000800",6);
//發送漢字的字數*2
Send_Cmd[0]=hex2ch[Long>>4]; Send_Cmd[1]=hex2ch[Long&0xf];
SendToTc35(Send_Cmd,2);
//發送漢字
// strncpy(Send_Cmd,p,Long*2);
SendToTc35(p,Long*2);
SendASC(0x1a);
}
//發送ATD,撥打電話136
void atd(){
char Send_Cmd[]="ATD13050009330;"; //發送ATD
SendToTc35(Send_Cmd,sizeof(Send_Cmd)-1);
enter();
}
//發送ATA,應答電話136
void ATA(){
char Send_Cmd[]="ATA"; //發送ATA
SendToTc35(Send_Cmd,sizeof(Send_Cmd)-1);
enter();
}
// 通訊中斷接收程序
void Rs232(void) interrupt 4 using 1
{
if(RI)
{
RI=0;
RsBuf[RsPoint++]=SBUF; timer1=0;
}
}
// T0中斷計時程序
void timer(void) interrupt 1 using 2
{
timer0++; timer1++;
if((RsPoint)&&(timer1>20))R232=1;
}
//有人動您的車,請察看!16
unsigned char code DC[]={
0x36,0x37,0x30,0x39,0x34,0x45,0x42,0x41, //67094EBA
0x35,0x32,0x41,0x38,0x36,0x30,0x41,0x38, //52A860A8
0x37,0x36,0x38,0x34,0x38,0x46,0x36,0x36, //76848F66
0x30,0x30,0x32,0x43,0x38,0x42,0x46,0x37, //002C8BF7
0x35,0x42,0x44,0x46,0x37,0x37,0x30,0x42, //5BDF770B
0x30,0x30,0x32,0x31 //0021
};
//數據搬家
void BeiFen(U16 addr,U8 Long){
int i;
flash_erase(1);
for(i=0; i< 512; i++)if((i<addr)&&(i>=(addr+Long)))write_EE(i+512,read_EE(i));
}
//數據考回
void KaoHui(U16 addr,U8 Long){
int i;
flash_erase(0);
for(i=0; i< 512; i++)if((i<addr)&&(i>=(addr+Long)))write_EE(i,read_EE(i+512));
}
// Store Datas To Flash addr:Flash begin-addr p:datas point Long:Data Length
void Save(U16 addr,U8 *p,U8 Long){
while(Long--){write_EE(addr,*p); addr++; p++;}
}
//處理消息
U8 *PDcmd0(){
U8 *p,i;U8 pdata buf[24+12]="012345678901234567891111547D4EE40030"; //命令0: 547D4EE40030
for(i=0; i<24; i++)buf[i]=read_EE(i); //Read PassWord
p=strstr(RsBuf,buf);
return p;
}
U8 *PDcmd1(){
U8 *p,i;U8 pdata buf[24+12]="012345678901234567891111547D4EE40031"; //命令1: 547D4EE40030
for(i=0; i<24; i++)buf[i]=read_EE(i); //Read PassWord
p=strstr(RsBuf,buf);
return p;
}
void SaveTel(U8 *p){
U8 pdata buf[11],type[4]; U8 i;
for(i=0;i<4;i++){type[i]=*p; p++;} //Read BaoJing Type
for(i=0;i<11;i++){buf[i]=*p; p++;} //Read Tel_NO
if(read_EE(60)==0xff){
Save(60,type,4); Save(64,buf,11);
}
else if(read_EE(60+16)==0xff){
Save(60+16,type,4); Save(64+16,buf,11);
}
else if(read_EE(60+32)==0xff){
Save(60+32,type,4); Save(64+32,buf,11);
}
else {
}
}
void cmd0ok(){
U8 pdata buf[]="65B05BC67801662F003A012345678901234567891111"; //新密碼是:
U8 i;
for (i=0;i<24;i++)buf[20+i]=read_EE(i); //Read New PassWord 24 Bytes
SendMsg(buf,22);
}
//**************************************
// PassWord=24 JianTingTel.1=12
// Baojing Type.1=4 Baojing tel.1=12
//**************************************
void Onmsg(){
unsigned char *p,i,pw[6],buf[12];
p=strstr(RsBuf,"RING");
if(p!=NULL){ //監聽
while(pw[0]<3){
for(i=0;i<12;i++)buf[i]=read_EE(6*4+pw[0]*i+i); //Read Tel-No
p=strstr(RsBuf,buf);
if(p!=NULL){ATA(); break;}
pw[0]++;
}
R232=0; RsPoint=0; return;
}
if(ReadMsg(0)==TRUE){
p=PDcmd0();
if(p!=NULL){BeiFen(0,24); Save(0,p,24); KaoHui(0,24);
if(EraseMsg(0)==FALSE) EraseMsg(0); //不成功再刪
cmd0ok(); Delay(100);
ClrRsBuf(RsBuf,sizeof(RsBuf)-1); R232=0; return;
}
p=PDcmd1();
if(p!=NULL){ SaveTel(p);
if(EraseMsg(0)==FALSE) EraseMsg(0); //不成功再刪
Delay(100);
ClrRsBuf(RsBuf,sizeof(RsBuf)-1); R232=0; return;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -