📄 chengxu.c
字号:
#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
#include <string.h>
#include <math.h>
#define UCHAR unsigned char
#define UINT unsigned int
#define ADC XBYTE[0x3FF8]
sbit IGT=P1^3;/*P1.3拉低100ms启动GSM*/
sbit KG=P1^5;/* 下拉启动继电器*/
sbit SYNC=P1^2;
sbit led1=P1^0;
sbit led2=P1^1;
unsigned char idata sen[30];
unsigned char duan=0;
xdata int Max_zhi=255;
xdata int timer0_counter;
xdata int caiji_counter=0; /*通道数*/
xdata int caiji_counter_1=0x3ff8; /*采集数据地址*/
unsigned char xdata caiji[13]={0};
unsigned char xdata temp[18];
unsigned char xdata rec[27];
unsigned char xdata red[87];
unsigned char xdata rec_m[6]={0};
unsigned char code Command_At[3] = "AT\r";/*检测GSM状态*/
/*41 54 0d 回传:41 54 0D 0D 0A 4F 4B 0D 0A
AT
OK
*/
unsigned char code Command_Cmgf[10] = "AT+CMGF=1\r";/*选择消息为TEXT格式*/
/*
发送41 54 2B 43 4D 47 46 3D 31 0D
接收:
41 54 2B 43 4D 47 46 3D 31 0D 0D 0A 4F 4B 0D 0A
AT+CMGF=1
OK
*/
unsigned char code Baojing_Cmgs[23] = "AT+CMGS=+8613473626989\r";/*向管理员报警1*/
unsigned char code Command_Cmgs[23] = "AT+CMGS=+8613473626989\r";/*向监控中心发数据2*/
/*发送 41 54 2B 43 4D 47 53 3D 2B 38 36 31 33 39 33 30 36 32 32 30 36 34 0D
接受 0D 0A 3E 20
*/
unsigned char code Command_CSCA[23] = "AT+CSCA=+8613800311500\r";/*设置短信中心号码*/
/*发送 41 54 2B 43 53 43 41 3D 2B 38 36 31 33 38 30 30 33 31 31 35 30 30 0D
接受 41 54 2B 43 53 43 41 3D 2B 38 36 31 33 38 30 30 33 31 31 35 30 30 0D 0D 0A 4F 4B 0D 0A
*/
unsigned char code Command_110[14] = "ShuJuChaoXian!";
unsigned char code Command_CeShi[14] = "TC35iYiQiDong!";/*测试命令*/
unsigned char code Command_Cnmi[18] = "AT+CNMI=1,1,0,0,1\r";/*收到提醒*/
unsigned char code Command_Cmgd[8]="AT+CMGD=";/*删除*/
unsigned char code Command_Cmgr[8]="AT+CMGR=";/*读短信*/
void Delay10ms(void)
{
UINT idata i;
for(i=0;i<1800;i++);
}
void Delay_1S(void)
{
UINT idata i;
for(i=0;i<100;i++) Delay10ms();
}
void led1_open(void)/*1亮*/
{ led1=0; }
void led1_close(void)/*1灭*/
{ led1=1; }
void led2_open(void)/*2亮*/
{ led2=0; }
void led2_close(void)/*2灭*/
{ led2=1; }
void start_timer0(void) /*开定时器0 */
{ timer0_counter=0;
TR0=0;
TF0=0;
TMOD=0x21;
TH0=0x00;
TL0=0x00;
ET0=1;
TR0=1;
}
void close_timer0(void)/*关闭定时器0*/
{ timer0_counter=0;
TR0=0;
ET0=0;
}
void deal_with_error(void)/*进入错误状态 1 2灯全开*/
{ UINT idata i;
led1_open();
led2_open();
while(1) ; /*/????????????*/
}
void timer0(void) interrupt 1 using 1/*中断1程序*/
{
if(timer0_counter++>500)/*error times over 500*/
deal_with_error();/*1,2灯全亮*/
TH0=0x00;
TL0=0x00;
}
void uart_send(unsigned char *p,unsigned char data_len)/*字符串发送 ??data_len可优化*/
{
unsigned char i;
for(i=0;i<data_len;i++)
sen[i]=*p++;
TI=0; /*清发送标志位*/
for(i=0;i<data_len;i++)
{
SBUF=sen[i];
while(!TI);
TI=0;
}
}
void AT_csca(void) /*设置短信中心号码*/
{ UCHAR idata i;
TI=0;
RI=0;
uart_send(Command_CSCA,23);
for(i=0;i<29;i++)
{ while(!RI) ;
RI=0;
}
RI=0;
TI=0;
}
void AT_cmgf(void)/*设置TEXT格式*/
{
UINT idata i;
TI=0;
RI=0;
uart_send(Command_Cmgf,10);
for(i=0;i<16;i++)
{while(!RI);
RI=0;
}
RI=0;
TI=0;
}
void AT_SEND(void)
{
UINT idata i,error_counter;
error_counter=0;
while(1)
{
TI=0;
RI=0;
start_timer0();
uart_send(Command_At,3);
for(i=0;i<9;i++)
{
while(!RI);
rec[i]=SBUF;
RI=0;
}
close_timer0();
if(rec[5]=='O'&&rec[6]=='K') break;
//else if(error_counter++<10) Delay100ms();
else deal_with_error();
}
}
void start_tc35(void)
{
IGT=0;
Delay_1S();
IGT=1;
}
void start_GSM(void)
{
led2_open();
start_tc35();
Delay_1S();
AT_SEND();
Delay_1S();
AT_cmgf();
Delay_1S();
AT_csca();
Delay_1S();
led2_close();
}
void AT_cmgs(UINT xuanze)
{
UINT idata i;
UCHAR idata error=0;
ES=0;
while(1) /* AT+cmgs*/
{ /*+号码*/
TI=0;
RI=0;
if(xuanze==2)
uart_send(Command_Cmgs,23);
else
uart_send(Baojing_Cmgs,23);
start_timer0();
for(i=0;i<27;i++)
{
while(!RI);
rec[i] = SBUF;
RI = 0;
}
close_timer0();
if(rec[25]== 0x3E&& rec[26]== 0x20)
break;
else if(error++<10)
deal_with_error();
}
Delay10ms(); /*延时一段时间*/
RI=0;
TI=0;
}
void Send_shuju(UCHAR *p,UINT len)
{
UINT idata i;
ES=0;
TI=0;
RI=0;
for(i=0;i<len;i++)
{ SBUF=*p++;
while(!TI);
TI=0;
}
SBUF=0x1a;/*发送信息结束*/
while(!TI);
TI = 0;
RI=0;
Delay10ms();
RI=0;
TI=0;
}
void AT_cnmi(void)
{
UCHAR idata i;
ES=0;
while(1)
{
TI=0;
RI=0;
uart_send(Command_Cnmi,18);
start_timer0();
for(i=0;i<24;i++) /*only receive part data (10)*/
{
while(!RI);
rec[i] = SBUF;
RI = 0;
}
close_timer0();
if(rec[20]== 'O'&& rec[21]== 'K') break;
else deal_with_error();
}
Delay10ms();
RI=0;
TI=0;
ES=0;
}
void AT_cmgr(unsigned char index_high,unsigned char index_low)
{
UINT idata i;
UINT byte_length=0;
TI=0;
RI=0;
if(index_high=='0')
byte_length=86;
else
byte_length=87;
ES=0;
uart_send(Command_Cmgr,8);
if(index_high!='0')
{
SBUF=index_high;
while(!TI);
TI=0;
}
SBUF=index_low;
while(!TI);
TI=0;
SBUF='\r';
while(!TI);
TI=0;
start_timer0();
for(i=0;i<byte_length;i++)
{
while(!RI);
red[i]=SBUF;
RI=0;
}
close_timer0();
if(red[byte_length-2]=='O'&&red[byte_length-1]=='K')
{for(i=0;i<6;i++)
rec_m[i]=red[byte_length-12+i];
}
ES=1;
Delay10ms();
RI=0;
TI=0;
}
void AT_cmgd(unsigned char index_high,unsigned char index_low)
{
unsigned int idata i;
bit high_flag=(index_high!='0');
UINT byte_length=0;
if(high_flag)
byte_length=17;
else
byte_length=16;
while(1)
{
TI=0;
RI=0;
ES=0;
uart_send(Command_Cmgd,8);
if(high_flag)
{
SBUF=index_high;
while(!TI);
TI = 0;
}
SBUF=index_low;
while(!TI);
TI=0;
SBUF='\r';
while(!TI);
TI=0;
start_timer0();
for(i=0;i<byte_length;i++)
{
while(!RI);
rec[i]=SBUF;
RI=0;
}
close_timer0();
if((rec[12]== 'O'&& rec[13]== 'K')||(rec[13]== 'O'&& rec[14]== 'K')) break;
else deal_with_error();
}
Delay10ms();
RI=0;
TI=0;
ES=0;
}
void zhixingmingling(unsigned char len0)
{if(len0=='0')
KG=rec_m[3];
if(len0=='1')
Max_zhi=rec_m[3];
}
void compare_cnmi(void)
{ unsigned char i=0;
UCHAR j,j0;
unsigned char rec_0;
if(temp[i+5]=='T'&&temp[i+6]=='I')
{ if(duan==17)
{ j=temp[14];
AT_cmgr('0',j);
duan=0;
AT_cmgd('0',j);
}
else { j=temp[14];
j0=temp[15];
AT_cmgr(j,j0);
duan=0;
AT_cmgd(j,j0);
}
}
if(rec_m[0]=='%')
// if(rec_m[5]=='%')
{ rec_0=rec_m[2]+rec_m[3];
if(rec_0==rec_m[4])
zhixingmingling(rec_m[2]);
}
}
void shujucaiji(void)
{
caiji[0]='%';
caiji[1]='%';
caiji[12]='%';
EX0=1;
IT0=1;
ADC=0x0;
while(1) ;
}
void main(void)
{
UINT i;
led1_close();
led2_close();
SCON=0x50; /*串口初始化*/
EA=1;
ES=0;
PCON=0x80;
TR1=0;
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
TR1=1; /*开定时器1*/
start_GSM();
for(i=1;i<10;i++)/*删除卡内所有短信*/
AT_cmgd('0','0'+i);
for(i=0;i<10;i++)
AT_cmgd('1','0'+i);
AT_cnmi();/*设置收到短信时发送CMTI*/
Delay_1S();
RI=0;
TI=0;
AT_cmgs(1);
Delay10ms();
Send_shuju(Command_CeShi,14); /*发测试信号*/
led1_open();
Delay_1S();
RI=0;
TI=0;
PS=1;
PX0=0;
ES=1;
shujucaiji();
}
void Int0(void) interrupt 0
{
UINT k0;
UINT k2;
int k1=0;
caiji[caiji_counter+2]=XBYTE[caiji_counter_1];
if(caiji[caiji_counter+2]>Max_zhi)
{AT_cmgs(1);
Send_shuju(Command_110,14);
ES=1;
}
caiji_counter++;
caiji_counter_1++;
Delay_1S();
led2=~led2 ;
if(caiji_counter==8)
{
caiji_counter=0;
caiji_counter_1=0x3FF8;
for(k0=0;k0<8;k0++)
{ k1=k1+caiji[k0+2];
}
k2=k1/0x7f;
k1=k1%0x7f;
caiji[10]=k1;
caiji[11]=k2;
k1=0;
AT_cmgs(1);
Send_shuju(caiji,13);
RI=0;
TI=0;
//Delay_1S();
ES=1;
led1_open();
Delay_1S();
if(duan==17||duan==18)
{ led2_open();
compare_cnmi();
}
else duan=0;
Delay_1S();
led1_close();
}
XBYTE[caiji_counter_1]=0xff;
}
void Serial_Service(void) interrupt 4 using 0
{
if(RI)
{
temp[duan]=SBUF;
duan++;
RI=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -