#include "reg52.h"
#include "temp.h"
#include "string.h"
#include "stdlib.h"
#define uint unsigned int
#define uchar unsigned char
#define Buf_Max 80
#define TELL 13778386860
/*sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4; */
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;
sbit led6=P2^5;
sbit led7=P2^6;
sbit led8=P2^7;
sbit duan=P2^6;
sbit wei=P2^7;
sbit key=P3^4;
uchar flag=0,i=0;
uchar Rec_Buf[Buf_Max];
/*char num=0;
uchar DisplayData[8]; */
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*void datapros(int temp) //溫度讀取處理轉換函式
{
float tp;
if(temp< 0) //當溫度值為負數
{
DisplayData[0] = 0x40; // -
//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
DisplayData[0] = 0x00;
tp=temp;//因為資料處理有小數點所以將溫度賦給一個浮點型變數
//如果溫度是正的那么,那么正數的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
}
DisplayData[1] = smgduan[temp / 10000];
DisplayData[2] = smgduan[temp % 10000 / 1000];
DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;
DisplayData[4] = smgduan[temp % 100 / 10];
DisplayData[5] = smgduan[temp % 10];
}
/*void DigDisplay() //數碼管顯示函式
{
uchar q;
for(q=0;q<6;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
}
P0=DisplayData[5-q];//發送資料
delayms(1); //間隔一段時間掃描
P0=0x00;//消隱
}
} */
void sinit () //定時器初始化
{
SCON=0x50; //定時器1 10位UART 可變 允許接收
TMOD=0x20; //八位自動重裝載模式
TH1=0xfd;
TL1=0xfd;
TR1=1; //啟動定時器1
IT1=1; //外部中斷1觸發方式控制允許
EA=1; //打開總中斷
ES=1; //串行口中斷允許
EX1=1; //定時器T1中斷允許
}
void CLR_Buf() //清除快取內容
{
uchar k;
for (k=0;k<Buf_Max;k++)
{
Rec_Buf[k]=0;
}
i=0; //接收字串指標指回起點
}
bit Hand(uchar *a) //判斷快取中是否含有指定的字串函式
{
if (strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
void Send_ASCII(uchar *b) //發送字符(ASCII碼)函式
{
EA=0;
for (b;*b!='\0';b++)
{
SBUF=*b;
while (TI!=1);
TI=0;
}
EA=1;
}
void Send_Hex(uchar c) //發送字符(十六進制)函式
{
EA=0;
SBUF=c;
while(TI!=1);
TI=0;
EA=1;
}
void Send_message()
{
CLR_Buf();
Send_ASCII("AT+CMGF=1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led1=~led1;
Send_ASCII("AT+CMGS=TELL");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand(">"));
led2=~led2;
Send_ASCII("temperature: 28.65");
Send_Hex(0x1a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led4=~led4;
}
void main()
{
int led;
uchar *j, l;
char o[5];
sinit();
while(!Hand("OK"))
{
Send_ASCII("AT");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(2000);
}
CLR_Buf();
led1=0;
delayms(2000);
Send_ASCII("AT+CPMS=\"SM\",\"SM\",\"SM\"");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(2000);
while(!Hand("OK"));
Send_ASCII(Rec_Buf);
CLR_Buf();
led2=0;
delayms(2000);
Send_ASCII("AT+CNMI=2,1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led3=0;
delayms(2000);
Send_ASCII("AT+CMGF=1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led4=0;
delayms(2000);
Send_ASCII("AT+CMGD=1,4");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
led5=0;
while(1)
{
/* datapros(Ds18b20ReadTemp()); //資料處理函式
DigDisplay();//數碼管顯示函式 */
if (strstr(Rec_Buf,"+CMTI")!=NULL)
{
led6=~led6;
delayms(2000);
Send_ASCII("AT+CMGR=1");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
led7=~led7;
if (strstr(Rec_Buf,"open led3")!=NULL)
{
led3=0;
Send_message();
}
else if (strstr(Rec_Buf,"close led3")!=NULL)
led3=1;
else if (strstr(Rec_Buf,"led=")!=NULL)
{
j=strstr(Rec_Buf,"led=");
j+=4;
while(*j!='\0')
{
o[l]=*j;
j++;
l++;
}
o[l]='\0';
led=atoi(o);
j=0;
l=0;
P0=0xff;
wei=1;
P0=0x00;
wei=0;
P0=0xff;
duan=1;
P0=smgduan[led];
duan=0;
}
CLR_Buf();
delayms(2000);
Send_ASCII("AT+CMGD=1,4");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!Hand("OK"));
CLR_Buf();
}
if(flag==1)
{
flag=0;
delayms(2000);
Send_ASCII("ATDTELL");
Send_Hex(0x0d);
Send_Hex(0x0a);
delayms(1000);
while(!(Hand("NO")||Hand("BUSY")));
CLR_Buf();
}
led8=1;
delayms(1000);
led8=0;
delayms(1000);
}
}
void sint () interrupt 4
{
ES=0;
if(TI)
{
TI=0;
}
if(RI)
{
RI=0;
Rec_Buf[i]=SBUF;
i++;
if(i>80)
{
i=0;
}
}
ES=1;
}
void int1() interrupt 2
{
EX1=0;
delayms(100);
if(key==0);
{
led1=~led1;
flag=1;
}
while(key==0);
delayms(100);
while(key==0);
EX1=1;
}
uj5u.com熱心網友回復:
這種與硬體有關的問題,光看代碼也很難看出問題的。建議樓主,先確定硬體作業正常先。
1. GSM模塊可以用ttl轉usb或者轉232接到PC上,用串口除錯工具發AT指令,確定是可以作業
2. 把單片機板上的uart介面也用ttl轉usb/232接到pc上測驗,確定接收/發送都是正常的
如果都正常,再檢查代碼了
uj5u.com熱心網友回復:
這樓主,誰沒事看你這么長的代碼轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/137349.html
標籤:單片機/工控
