📄 410rt.c
字号:
#include <c8051F410.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define buf_len 120
#define SYSCLK 24500000
#define uart_rate 9600
#define C_TMR1 -((SYSCLK/48)/2)/uart_rate
#define C_TMR0 -((SYSCLK/48)/1000)*20
/*
struct location
{
uchar high;
uchar low;
}location;
*/
sbit TC35_IGT = P1^6;
sbit TC35_PD = P1^5;
sbit PC_using=P2^6;
void ENA_WDT (void);
void SYSCLK_Init (void);
void GSM_PORT_Init (void);
void CKCON_Init (void);
void Uart0_Init (void);
void Port_Init (void);
void GSM_Init (void);
void delay_20ms (void);
void transmitte (void); //send information
void Read_sms(void); //read a message
void Process_sms(void); //process a message;
void Send_sms(void); //send a message;
void Del_sms(void); //delete a message
void ini_buf(void); //initial rec_buff put_buf=get_buff;
void addbuffer(void); //add buffer;
uchar getbuffer(void); //get from buffer;
uchar code tr_buf[] = {"atd13488716723;\r\0"};
//uchar code del_msm[]={"AT+CMGD=10\r\0"}; //删短信
uchar code sd_ms[]={"AT+CMGS=\""}; //发信息
uchar code pho[]={"13488716723"}; //管理员号码
uchar data loca[12]={"AT+CMGR="}; //接信息
uchar xdata rec_buf[buf_len]; //循环数组
uchar xdata *get_pt=rec_buf; //循环数组操作指针
uchar xdata *put_pt=rec_buf; //循环数组加数值指针
uchar *data tr_point; //发送指针
uchar xdata privacy[]={"123456 \0"}; //校验密码
uchar xdata content[30]; //存储管理员发来的信息
//uchar xdata content1[]=""; //存储管理员发来的信息
uchar data alarms[32]=""; //要发的警报信息
uchar data send_buff[25]="AT+CMGS=\""; //发送缓冲区
bit TRANS_NEXT_BYTE_OK=0;
bit Recving_SMS=0; //正在接受短信
bit SMS_EN=0; //来短信头已接完;
bit IS_sending=0; //正在发送信息
bit SMS_OK=0; //消息内容已接完
bit CM_CMD=0; //content已接到管理员的信息,通知主机取值
bit DEL_MS=0; //删除短信
bit ALARM=0; //有报警
bit CSD=0; //标记 发送AT+CMGS="13488716723"<cr>后 接受到'>'
uint Rec_status=0; //switch 接收状态
unsigned int num=0; //接受消息头+CMTI: ,"SM",1的计数;
uchar temp; //接收媒介;
void main (void)
{
ENA_WDT ();
GSM_PORT_Init ();
SYSCLK_Init ();
CKCON_Init ();
Uart0_Init ();
Port_Init ();
GSM_Init ();
// tr_point = tr_buf;
// TRANS_NEXT_BYTE_OK = 1;
ES0 = 1;
EA = 1;
// loca[0]='1';
// loca[1]='9';
// test
// DEL_MS=1;
IS_sending=0;
PC_using=0;
/// ALARM=1;
while (1)
{
if(!PC_using)
{
if (TRANS_NEXT_BYTE_OK) transmitte ();
if (SMS_EN) Read_sms(); //read a message
if (SMS_OK) Process_sms();
// if (CM_CMD) ; //加主机调用函数;
if (DEL_MS) Del_sms(); //del a message
if(! Recving_SMS&&ALARM)Send_sms();
}
}
}
void GSM_Init (void)
{
uchar data i;
TMOD |= 0x01; //定时器0为模式1,16位
TC35_IGT = 0;
delay_20ms ();
TC35_IGT = 1;
delay_20ms ();
TC35_IGT = 0;
for (i=0;i<6;i++) delay_20ms ();
TC35_IGT = 1;
TR0 = 0;
while (!TC35_PD);
while (TC35_PD);
while (!TC35_PD);
}
void delay_20ms (void)
{
TR0 = 0;
TH0 = C_TMR0 >> 8; //设置定时器0的初始值,
TL0 = C_TMR0;
TR0 = 1; //启动定时器0
TF0 = 0;
while (!TF0);
}
void SYSCLK_Init (void)
{
OSCICN |= 0x07; //24500000hz
}
void GSM_PORT_Init (void)
{
XBR1 |= 0x80; //关闭弱上拉
}
void Port_Init (void)
{
XBR1 |= 0x40; //使能交叉矩阵,弱上拉
}
void ENA_WDT (void)
{
PCA0MD &= ~0x40;
}
void CKCON_Init (void)
{
CKCON |= 0x02; //定时器1和2的触发时钟为 sysclk/48
}
void Uart0_Init (void)
{
SCON0 = 0x50; //8位数据,允许接收
XBR0 |= 0x01; //uart的tx,rx分配至p0.4及p0.5
P0MDOUT |= 0x10; //uart的tx为推挽输出
TMOD |= 0x20; //定时器1为模式2,8位自动重装
TH1 = C_TMR1; //设置定时器1的重装值,
TL1 = C_TMR1;
TR1 = 1; //启动定时器1
ES0 = 1; //允许UART中断
}
void Uart0_ISR (void) interrupt 4
{
if (RI0)
{
RI0 = 0;
switch(Rec_status)
{
case 0:
temp=SBUF0;
switch(num)
{
case 0:
if(temp=='+')
{
++num;
Recving_SMS=1; //index receiving a message
}else
num=0;
break;
case 1:
num=(temp=='C') ? ++num : 0;break;
case 2:
num=(temp=='M') ? ++num : 0;break;
case 3:
num=(temp=='T') ? ++num : 0;break;
case 4:
num=(temp=='I') ? ++num : 0;break;
case 5:
num=(temp==':') ? ++num : 0;break;
case 6:
if(temp==',')
++num ;
break;
case 7:
num++;
loca[8]=temp;
break;
case 8:
if(temp!=0x0d)
{
loca[9]=temp;
loca[10]='\r';
loca[11]='\0';
}
else
{
loca[9]='\r';
loca[10]='\0';
}
num++;
break;
case 9:
if(temp==0x0a)
SMS_EN=1; //标识有信息,通知接收
break;
} // the end of inner switch
break;
case 1: break;
case 2:
addbuffer();
if( (*(rec_buf+(put_pt - rec_buf + buf_len)%buf_len)=='\x0a')&&
(*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='\x0d')&&
(*(rec_buf+(put_pt - 2 - rec_buf + buf_len)%buf_len)=='K')&&
(*(rec_buf+(put_pt - 3 - rec_buf + buf_len)%buf_len)=='O'))
{
//SMS_EN=0; //不再调用 Read_sms();
SMS_OK=1;
Recving_SMS=0;
Rec_status=0;
}
break;
case 3:
break;
case 4:
addbuffer();
if( (*(rec_buf+(put_pt - rec_buf + buf_len)%buf_len)=='\x0a')&&
(*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='\x0d')&&
(*(rec_buf+(put_pt - 2 - rec_buf + buf_len)%buf_len)=='K')&&
(*(rec_buf+(put_pt - 3 - rec_buf + buf_len)%buf_len)=='O'))
{
Rec_status=0;
}
break;
case 5:
addbuffer();
if((*(&rec_buf+(put_pt - &rec_buf + buf_len)%buf_len)=='\x20')&&(*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='>'))
{
ALARM=1;
CSD=1;
Rec_status=0;
}
break;
case 6:
addbuffer();
if( (*(rec_buf+(put_pt - rec_buf + buf_len)%buf_len)=='\x0a')&&
(*(rec_buf+(put_pt - 1 - rec_buf + buf_len)%buf_len)=='\x0d')&&
(*(rec_buf+(put_pt - 2 - rec_buf + buf_len)%buf_len)=='K')&&
(*(rec_buf+(put_pt - 3 - rec_buf + buf_len)%buf_len)=='O'))
{
Rec_status=0;
}
break;
} // the end of outer switch
}
if (TI0)
{
TI0 = 0;
TRANS_NEXT_BYTE_OK = 1;
}
}
//read a message to buffer;
void Read_sms()
{
if(!IS_sending)
{
SMS_EN=0;
ini_buf(); //初始化buffer
// SMS_EN=0; // 在读完数据再 清零
Rec_status=2;
//loca[6]='R';
tr_point=loca;
TRANS_NEXT_BYTE_OK = 1;
}
}
void Process_sms()
{
unsigned char rr;
unsigned int i=0;
SMS_OK=0;
getbuffer();
getbuffer();
do
{
rr=getbuffer();
}while(getbuffer()!='\x0a' || rr!='\x0d');
for(i=0;i<6;i++)
{
if(getbuffer()!=privacy[i])
break;
}
if(i==6)
{
strcpy(content,""); //清空
i=0;
rr=getbuffer();
while(rr!=0x0d)
{
content[i++]=rr;
rr=getbuffer();
}
CM_CMD=1;
}
DEL_MS=1;
}
//delete a message
void Del_sms(void)
{
/*
loca[8]='2';
loca[9]='5';
loca[10]='\r';
loca[11]='\0';
*/
if(!IS_sending)
{
DEL_MS=0;
ini_buf(); //clear buffer;
Rec_status=4;
loca[6]='D';
tr_point=loca;
TRANS_NEXT_BYTE_OK = 1;
}
}
void Send_sms()
{
if(!IS_sending)
{
ini_buf();
if(!CSD)
{
ALARM=0;
Rec_status=5;
// tr_point="AT+CMGS=\"13488716723\"\r";
strcat(send_buff,pho);
strcat(send_buff,"\"\r");
tr_point=send_buff;
TRANS_NEXT_BYTE_OK = 1;
}else
{
CSD=0;
ALARM=0; //清零
Rec_status=6;
ini_buf();
//tr_point="abcdefg\x1a";
strcat(alarms,"\x1a");
tr_point=alarms;
TRANS_NEXT_BYTE_OK = 1;
}
}
/*
ALARM=0;
tr_point="AT+CMGS=\"13488716723\"\rabcdefghijk\x1a\0";
TRANS_NEXT_BYTE_OK = 1;
*/
}
//发送信息
void transmitte (void)
{
IS_sending=1;
TRANS_NEXT_BYTE_OK = 0;
if (*tr_point != '\0')
{
SBUF0 = *tr_point;
tr_point++;
}
else
IS_sending=0;
}
void ini_buf()
{
get_pt=rec_buf;
put_pt=rec_buf;
}
void addbuffer()
{
put_pt++;
put_pt=rec_buf+(put_pt-rec_buf)%buf_len;
if(put_pt!=get_pt)
*put_pt=SBUF0;
else
{
put_pt--;
put_pt=rec_buf + (put_pt + buf_len - rec_buf) % buf_len;
}
}
uchar getbuffer()
{
if(get_pt!=put_pt)
{
get_pt++;
get_pt=rec_buf + (get_pt - rec_buf) % buf_len;
return *get_pt;
}
else
return '@';
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -