📄 短信家电程序.c
字号:
#include <reg51.h>
#include "string.h"
#define uchar unsigned char
sfr RH= 0x0CB; //定义波特率参数9600
sfr RL =0x0CA;
sfr T2C= 0x0C8;
sbit P10= P1^0; //输出口
sbit P11= P1^1;
sbit P12= P1^2;
sbit P13= P1^3;
sbit P14= P1^4;
sbit P15= P1^5;
sbit P20= P2^0; //键盘口
sbit P21= P2^1;
sbit P22= P2^2;
sbit P23= P2^3;
sbit P24= P2^4;
sbit P25= P2^5;
uchar j,i=0,k,*p;
uchar xdata jia[2]={0}; //状态缓冲区
uchar xdata neirong[12]={0}; //发送缓冲区
uchar resbuf[52]={0}; //中断接受缓冲区
uchar xdata C_MGS[19]="AT+CMGS=15979042724"; //目标手机
uchar xdata A_T[2]="AT";
uchar xdata C_MT[4]="+CMT"; //
uchar xdata O_K[2]="OK";
uchar xdata H_UICHE[1]="/";
// uchar flag=0,a=0,b=0,c=0,d=0,f=0;
// uchar t=0;fangdao=0;
bit flag=0; //主函数执行标志位
bit a=0; //控制开关1
bit b=0; // 2
bit c=0; // 3
bit d=0; // 4
bit f=0; //返回状态
bit t=0; //防盗标志
bit fangdao=0;
void delay(uchar gg) //延时1毫秒函数
{
uchar i,j,k;
for(k=0;k<5;k++)
for(i=0;i<gg;i++)
for(j=0;j<245;j++);
}
void sendchar(uchar ascll) //发送单个字符
{
TI=0;
SBUF=ascll;
while(!TI);
TI=0;
}
void sendmany(uchar *ll,uchar lnng) //发送字符串
{while(lnng--)
sendchar(*ll++);
}
void atinit(void) //AT联机初始化
{
// while(1)
// {
sendmany(A_T,2);
sendchar(0x0d); //0D为回车,0A为换行,1A为发送
// for(i=0;i<9;i++)
// {
// RI=0;
// while(!RI);
// resbuf[i]=SBUF;
// RI=0;
// }
// if((resbuf[5]==0x4f)&&(resbuf[6]==0x4b)) break;
// }
}
void allinit(void) //gsm初始化
{
uchar xdata C_NMI[17]="AT+CNMI=2,2,0,0,1";
uchar xdata C_MGF[9]="AT+CMGF=1";
uchar xdata C_SCA[22]="AT+CSCA=+8613800791500";
uchar xdata A_TE0[4]="ATE0";
sendmany(C_MGF,9);
sendchar(0x0d);
sendchar(0x0a);
delay(20);
sendmany(A_TE0,4);
sendchar(0x0d);
sendchar(0x0a);
delay(20);
sendmany(C_NMI,17);
sendchar(0x0d);
sendchar(0x0a);
delay(20);
sendmany(C_SCA,22);
sendchar(0x0d);
sendchar(0x0a);
delay(20);
}
void utar(void) //串口初始化9600波特率
{EA=1;
RH=0x0ff;
RL=0x0d9;
SCON=0x50;
T2C=0x34;
}
uchar getkey(void) //获得键值函数
{ uchar PIC=10;
if(!(P20&P21&P22&P23&P24&P25))
delay(10);
if(!(P20&P21&P22&P23&P24&P25))
{ if(P20==0) PIC=0;
if(P21==0) PIC=1;
if(P22==0) PIC=2;
if(P23==0) PIC=3;
if(P24==0) PIC=4;
if(P25==0) PIC=5;
}
while(!(P20&P21&P22&P23&P24&P25)); //等待键释放
return (PIC);
}
void zhuangtai(void) //读状态子程序
{
if(P10==0) strcpy(neirong,"A1"); //A\B\C\D为四个电器,0\1表示状态
if(P10==1) strcpy(neirong,"A0");
if(P11==0) {strcpy(jia,"B1");strcat(neirong,jia); }
if(P11==1) {strcpy(jia,"B0");strcat(neirong,jia); }
if(P12==0) {strcpy(jia,"C1");strcat(neirong,jia); }
if(P12==1) {strcpy(jia,"C0");strcat(neirong,jia); }
if(P13==0) {strcpy(jia,"D1");strcat(neirong,jia); }
if(P13==1) {strcpy(jia,"D0");strcat(neirong,jia); }
}
//由GSM向手机发送短信,8个字节
void huifu(uchar *sss,uchar lo)
{ uchar n;
sendmany(C_MGS,19); //发送AT+CMGS=15979042724 目标手机
sendchar(0x0D); //发送回车
for(n=0;n<20;n++) // 等待>符号
{delay(125);}
sendmany(sss,lo); //发送数组SSS的内容
sendchar(0x1A); //发送发送符号
for(n=0;n<20;n++)
{delay(125);}
atinit(); //重新发送AT指令,不可少
}
void rezhongduan(void) interrupt 4 //中断接收
{ if(RI==1) //由接收引起的中断才有效
{RI=0;
if((SBUF=='C')&&(!flag)) //当首字母为C时开始接收
{flag=1;
i=0;
}
if(flag==1)
{
resbuf[i++]=SBUF;
if(resbuf[47]=='A') {a=1;resbuf[47]=0; } //命令1,2,3,4,5,6
if(resbuf[47]=='B') {b=1;resbuf[47]=0; }
if(resbuf[47]=='C') {c=1;resbuf[47]=0; }
if(resbuf[47]=='D') {d=1;resbuf[47]=0; }
if(resbuf[47]=='F') {f=1;resbuf[47]=0; }
if(resbuf[47]=='T') {t=1;resbuf[47]=0; }
if(resbuf[48]=='B') {b=1;resbuf[48]=0; }
if(resbuf[49]=='C') {c=1;resbuf[49]=0; }
if(resbuf[50]=='D') {d=1;resbuf[50]=0; }
if(i==51)
{flag=0;
i=0;
}
}
}
}
/*主程序暗暗暗暗暗暗暗暗暗暗******************/
main()
{ uchar key,gong=0;
P1=0XFF;
utar();
atinit();
allinit();
delay(100);
P15=0;
EA=1;
ES=1;
while(1)
{ /****************手机控制部分**********/
if(a==1) {P10=~P10;delay(200);}// zhuangtai(); huifu(neirong,8);} //开关状态取反
if(b==1) {P11=~P11;delay(200);}//zhuangtai(); huifu(neirong,8);}
if(c==1) {P12=~P12;delay(200);}// zhuangtai(); huifu(neirong,8);}
if(d==1) {P13=~P13;delay(200);}// zhuangtai(); huifu(neirong,8);}
if((a|b|c|d)) {a=0;b=0;c=0;d=0;zhuangtai(); huifu(neirong,8);} //自动短信返回状态
if(f==1) { f=0; zhuangtai(); huifu(neirong,8);} //发送F返回状态
if(t==1) {t=0;fangdao=1;P1=0x0f;P14=0;} //发送T,关闭所有电器,启动防盗
if((fangdao==1)&&(P1!=0x0f))
{fangdao=0;zhuangtai();huifu(neirong,8);P14=1;}
/*****************键盘控制部分**********************/
key=getkey();
switch(key)
{//case 5:P15=~P15;delay(500); break; //初始化成功指示
case 0:P10=~P10;delay(200); break;
case 1:P11=~P11;delay(200); break;
case 2:P12=~P12;delay(200); break;
case 3:P13=~P13;delay(200); break;
// case 4:P14=~P14;delay(500); break; //返回信息指示
// case 6:gong=~gong; break;
//case 6:P15=~P15; break;
// case 0x30:P17=~P17; break;
default:break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -