【微控制器】基於有方GPRS的智慧電梯控制系統
前一篇文章《時鐘及溫度的顯示》中所介紹的作品,是作為一個微控制器新手在暑假學了一個月的微控制器之後,做的第一個綜合性作品,涵蓋了二極體、蜂鳴器、數碼管、液晶屏、按鍵、時鐘晶片、溫度感測器的控制操作。做完這個之後,也沒碰過微控制器了。在大三開始的時候,由於和同學參加了一個由有方公司提供GPRS晶片的比賽,便開始重拾微控制器,完成了下面這個作品,還獲獎了。
基於有方GPRS的智慧電梯控制系統,名字感覺很高階,其實就是噱頭。其功能描述如下(直接複製當初演示用的PPT):
構思背景
目前的很多企業都在很高的樓層辦公,每天上下班高峰期,電梯門口總是會排上很長的隊,為了讓電梯用最快的速度將所有的員工送到指定樓層,需要給出一些改進;下班的時候,由於樓層很高,員工往往需要花費一些時間等待電梯到達自己的樓層,利用一些改進可以讓員工掌握電梯狀態,從而節省一些等電梯的時間。
功能特色
功能一:我們對電梯作出這樣的改進:在上班高峰時段,電梯只能向上執行時開門搭載上朝樓上去的人員,即電梯只會響應朝上行的按鍵,在向下執行的過程中,不會響應任何按鈕。在下班時間段,也可以做相應修改。從而節省大多數人的時間,將人快速送達指定地點。
功能二: 平時,由於工作人員多工作於很高的樓層,而此時的電梯可能處於一樓,所以可以先向控制中心傳送一條簡訊來獲取電梯的實際位置,如果電梯此時距離自己所在的樓層還有一段距離,就可以提前向控制中心傳送一條請求簡訊,這時控制中心會向電梯應用端傳送請求訊號,命令電梯開往指定的樓層,從而減少等待的時間。
具體操作
只需要編輯簡訊XY#到指定的電話號碼就可以遠端控制電梯的執行。其中X代表發信人所在樓層,Y代表發信人將要到達的樓層。電梯也會對發信人的要求進行應答,告訴電梯當前的執行情況,好讓發信人掌握好乘坐電梯的時間。
GPRS的使用
我們主要用到了有方GPRS模組的簡訊收發功能。主要用於在上下班高峰時幫助員工獲得電梯狀態資訊、向電梯傳送停靠指令。命令電梯開往指定的樓層,從而減少等待的時間。電梯應用端使用有方GPRSM660+模組來接收來自控制中心的訊號併發送簡訊作為應答,從而實現使用者與電梯的互動通訊。
硬體電路圖
作品展示
軟體實現
#include<REG52.h>
#include<STRING.h>
#define uint unsigned int
#define uchar unsigned char
#define FLOOR 10
int Con_Floor = 1;//當前的樓層號
int com_dat = 0 ;
int flag2 = 0 ;
int low = 1 ;
int high = 9 ;
int sign_flag = 0 ;
void delayms(uint xms); //延時函式(毫秒級)
uint test(uchar * floor); //測試在幾樓
uint checkinfo();
uchar ReceiveData(uchar* ,uchar*);
void writefloor(int);
void writestate(int);
void up_down_logic(); //電梯的執行邏輯
void com_init(void); //串列埠初始化
void send_uart(uchar ch); //向串列埠傳送單個字元
void send_AT_IPR(void); //設定模組的波特率為9600bps
void send_AT_CMGF(void); //設定發簡訊為文字模式
void send_AT_CSCS(void); //傳送TE的字符集為GSM
void send_AT_CNMI(void); //設定簡訊的提示資訊
void send_AT_CMGR(); //傳送讀取命令
void send_AT_CMGS(uchar *phone_num); //選擇傳送目的手機號
void send_text(uchar *text); //傳送簡訊文字
void init_GPRS(void); //初始化GPRS模組
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3;
sbit rd=P3^7;
sbit dscs=P1^4;
sbit dsas=P1^5;
sbit dsrw=P1^6;
sbit dsds=P1^7;
sbit dsirq=P3^3;
uchar count,s1num,flag,flag1;
uchar miao,shi,fen;
uchar code table[]=" 2012-10-15 MON";
uchar code table1[]=" 00:00:00";
uchar code floor[]="FLOOR: 1";
uchar code state[]="STATE: IDLE";
uchar code welcome[]="WELCOME TO USE!";
uchar code up[]="UP ";
uchar code down[]="DOWN";
uchar code idle[]="IDLE";
void write_date(uchar);
void write_ds(uchar,uchar);
uchar read_ds(uchar); //從ds187讀取時間
void init();
void keyscan();
void write_sfm(uchar add,uchar date);
uchar code *AT_CMGF = "AT+CMGF=1"; //傳送AT+CMGF=1,設定文字模式
uchar code *AT_CSCS = "AT+CSCS="; //選擇TE的字符集(預設是GSM),M580返回資料時緩衝陣列是OK
uchar code *AT_IPR = "AT+IPR=9600"; //設定波特率為9600bps
uchar code *AT_CNMI ="AT+CNMI=2,1,0,0,0" ; //設定收到新簡訊存於SIM卡中併發CMTI通知
uchar code *AT_CMGR="AT+CMGR="; //傳送讀取簡訊的命令
uchar code *AT_CMGS="AT+CMGS=";
uchar xdata buffer[100]={0}; //微控制器用於接收簡訊的緩衝
uchar code tab[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水燈的狀態
uchar code message0[] = "Sorry ,it is busy now ";
uchar code message1[] = "Sorry , we can only reach to ";//指明可以到達的終點
uchar code message2[] = "and now we are moving to ";//指明將要到達的樓層
uchar code message3[] = "Ok , we have accepted your request !";//接受請求後傳送的訊息
/**************************************************************\
*名稱:test(char* )
*功能:判斷電梯的此刻狀態
\**************************************************************/
uint test(uchar * floor)
{
uint i;
for (i = 1 ; i < FLOOR ; i++)//從一樓開始判斷
{
if(floor[i])
{
if(i < Con_Floor)
return 1;//表示電梯正在下降
else
return 0;//表示電梯正在上升
}
}
return 2;//表示此時電梯為空
}
/**************************************************************\
*名稱:up_down_logic()
*功能:電梯的升降邏輯
\**************************************************************/
void up_down_logic()
{
uchar floor_data [FLOOR]={0};//判斷執行方向
uchar buf[FLOOR]={0};
uchar tel[13] ;
uchar temp;
uint i=0;
uchar temp1 ;
while(1)
{
miao=read_ds(0); //沒有響應時,時間可以正確的執行,但是一旦有請求,時間便會出現跳躍情況
fen=read_ds(2);
shi=read_ds(4);
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
delayms(100);
while(checkinfo())
{
/* i = 0;
while(tel[i])
{
tel[i] = 0 ;
i++;
}*/
temp=ReceiveData(&temp1,tel);//temp 表示起點,temp1表示終點
EA=0;//關中斷
//以下是將緩衝區清空
i=0;
while(buffer[i])
{
buffer[i]=0;
i++;
}
com_dat=0;
if (test(floor_data)==1&&temp-'0'>=1&&Con_Floor>=1)//在下降
{
if(temp -'0' < Con_Floor&&!floor_data[temp-'0'])//8點之前為上樓的高峰,所以下樓的請求(在7點半以前)不予響應,電梯直接到達一樓
{
if(temp1-'0' < temp - '0' && temp1 - '0' >= low&&(read_ds(4)>8))//希望到樓下去,即temp1 < temp的且此時電梯所能到的最低點比temp1還小
{
floor_data[temp-'0']=1;
buf[temp-'0'] = temp1-'0';
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message3);
send_text(message2);
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if (temp1 - '0' < temp - '0' && temp1 - '0' < low &&(read_ds(4)>8))//希望到樓下去,即temp1 < temp的且此時電梯所能到的最低點比temp1大
{
if (buf[low] < low)//如果在電梯所能到的最低點處就沒有請求了或有向下的請求
{
floor_data[temp-'0']=1;
buf[temp-'0'] = temp1-'0';
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message3);
send_text(message2);
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message1);
send_uart(low+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
}
else if(temp1 - '0' < temp - '0' && temp1 - '0' < low &&(read_ds(4)<8))
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message0);
send_uart(low+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if (temp1 - '0' > temp - '0'&& temp - '0' < low)//如果希望到樓上去,則僅當到最低點處沒有請求或請求到達的地方小於temp後才可以
{
if ((buf[low] == 0||(buf[low] > temp - '0' && buf[low] < low))&&(read_ds(4)<5))//確保電梯到low層後無請求或有向下的但大於temp的請求
{
floor_data[temp - '0'] = 1 ;
buf[temp - '0'] = temp1 - '0' ;
high = temp1 - '0' ;//在電梯向上執行時所能到達的最高點
low = temp - '0' ;
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message3);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if(buf[low] > low &&(read_ds(4)<5))
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message1);
send_uart(low+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if(buf[low] < temp - '0' &&(read_ds(4)<5))
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message1);
send_uart(buf[low]+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else//不響應會執行下面的語句
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message0);
send_uart(buf[low]+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
}
}
}
else if (!test(floor_data)&&temp-'0'>=1&&Con_Floor>=1)//在上升
{
if(temp-'0' > Con_Floor&&!floor_data[temp-'0'])
{
if(temp1-'0' > temp - '0' && temp1 - '0' <= high &&(read_ds(4)<5))//請求者希望到樓上去,且此時電梯所能到達的最高點比請求temp1還大
{
floor_data[temp-'0']=1;
buf[temp-'0'] = temp1-'0';
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message3);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if (temp1 - '0' > temp - '0' && temp1 - '0' > high &&(read_ds(4)<5))//請求者希望到樓上去,且此時請求的目的地已經超過了電梯所能到達的最高點
{
if (buf[high] > high || buf[high] == 0)//如果電梯到了最高點處還有向上的請求或者到了最高點處就沒有請求了
{
floor_data[temp-'0']=1;
buf[temp-'0'] = temp1-'0';
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message3);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if (buf[high] < high)
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message1);
send_uart(high+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
}
else if(temp1 - '0' > temp - '0' && temp1 - '0' > high &&(read_ds(4)>5))//不響應時執行
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message0);
send_uart(buf[low]+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if (temp1 - '0' < temp - '0' && temp - '0' > high )//請求者希望到樓下去
{
if ((buf[high] == 0||(buf[high] < temp - '0'&&buf[high] > high))&&(read_ds(4)>8))//要確保電梯到達high層後沒有請求或有向上的小於temp的請求
{
floor_data[temp - '0'] = 1 ;
buf[temp-'0'] = temp1 - '0';
low = temp1 - '0';
high = temp - '0';
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message3);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if (buf[high] < high &&(read_ds(4)>8))
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message1);
send_uart(high+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if (buf[high] > temp - '0'&&(read_ds(4)>8))
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message1);
send_uart(buf[high]+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message0);
send_uart(low+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
}
}
}
else if (test(floor_data)==2&&temp-'0'!=Con_Floor&&temp-'0'>=1&&Con_Floor>=1)//電梯未被請求,則響應,但是請求的樓層數就是本層樓則不予響應
{
if (temp - '0' > temp1 - '0'&&(read_ds(4)>8))
{
low = temp1 - '0';
buf[temp - '0'] = temp1 - '0';
floor_data[temp-'0']=1;
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message3);
send_text(message2);
if(temp-'0'>Con_Floor)
send_uart(Con_Floor+1+'0');
else
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if(temp - '0' > temp1 - '0'&&(read_ds(4)<8))
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message0);
send_uart(low+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if(temp - '0' < temp1 - '0'&&(read_ds(4)<5))
{
high = temp1 - '0';
buf[temp - '0'] = temp1 - '0' ;
send_AT_CMGS(tel);//先發號碼
floor_data[temp-'0']=1;
delayms(500);
send_text(message3);
send_text(message2);
if(temp-'0' > Con_Floor)
send_uart(Con_Floor+1+'0');
else
send_uart(Con_Floor-1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
else if(temp - '0' < temp1 - '0'&&(read_ds(4)>5))//不響應時執行
{
send_AT_CMGS(tel);//先發號碼
delayms(500);
send_text(message0);
send_uart(buf[low]+'0');
delayms(10);
send_text(message2);
send_uart(Con_Floor+1+'0');
delayms(10);
send_uart(0x1a);
delayms(10);
}
}
}
if(test(floor_data)==1)//下降
{
writefloor(Con_Floor);
writestate(1);
delayms(3000);
Con_Floor--;
}
else if(!test(floor_data))//上升
{
writefloor(Con_Floor);
writestate(0);
delayms(3000);
Con_Floor++;
}
else if (test(floor_data) == 2)//處於空閒狀態
{
writefloor(Con_Floor);
writestate(2);
high = 9;
low = 1 ;
}
if(floor_data[Con_Floor])//如果之前被請求過,則響應
{
P1=tab[Con_Floor];
delayms(3000);
if (buf[Con_Floor]!=0)
{
floor_data[buf[Con_Floor]] = 1 ;
buf[Con_Floor] = 0;
}
P1=0xff;
floor_data[Con_Floor] = 0 ;
}
EA = 1 ;//開中斷
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
uchar num;
EA=1;
EX0=1;
IT0=1;
dula=0;
wela=0;
lcden=0;
write_ds(0x0B,0x26);
read_ds(0x0c);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
//
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
//
miao=read_ds(0);
fen=read_ds(2);
shi=read_ds(4);
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
delayms(5000);
write_com(0x80);
write_com(0x01);
//
for(num=0;num<15;num++)
{
write_date(welcome[num]);
delay(20);
}
delay(3000);
write_com(0x01);
write_com(0x80+0x10);
for(num=0;num<8;num++)
{
write_date(floor[num]);
delay(20);
}
write_com(0x80+0x50);
for(num=0;num<11;num++)
{
write_date(state[num]);
delay(20);
}
for(num=0;num<16;num++)
{
write_com(0x18);
delay(50);
}
}
void writefloor(int i)
{
write_com(0x80+0x17);
write_date(0x30+i);
}
void writestate(int flaggg)
{
uint i ;
write_com(0x80+0x57);
if(flaggg==1)
{
for(i=0;i<strlen(down);i++)
{
write_date(down[i]);
}
}
if(flaggg==2)
{
for(i=0;i<strlen(idle);i++)
{
write_date(idle[i]);
}
}
if(flaggg==0)
{
for(i=0;i<strlen(up);i++)
{
write_date(up[i]);
}
}
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan()
{
rd=0;
if(flag1==1)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
flag1=0;
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
flag1=0;
}
}
}
if(s4==0)
{
delay(5);
if(s4==0)
{
flag1=0;
miao=read_ds(0);
fen=read_ds(2);
shi=read_ds(4);
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
}
}
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
flag=1;
flag1=0;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
flag=0;
write_ds(0,miao);
write_ds(2,fen);
write_ds(4,shi);
}
}
if(s1num!=0)
{
if(s2==0)
{
delay(1);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(1);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void write_ds(uchar add,uchar date)
{
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=add;
dsas=0;
dsrw=0;
P0=date;
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_ds(uchar add)
{
uchar ds_date;
dsas=1;
dsds=1;
dsrw=1;
dscs=0;
P0=add;
dsas=0;
dsds=0;
P0=0xff;
ds_date=P0;
dsds=1;
dsas=1;
dscs=1;
return ds_date;
}
//
/**************************************************************\
* 名稱: send_uart(unsigned char ch)
* 功能: 向串列埠傳送一個字元
* 輸入: 無
* 輸出: 無
\**************************************************************/
void send_uart(uchar ch)
{
SBUF = ch;
while(0 == TI);//當TI為1時跳出死迴圈(表明資料已從串列埠發出),並進入中斷處理程式,不過在中斷處理程式中並不會對TI進行任何操作,轉而執行下面的清0語句
TI = 0;
}/* end function send_uart */
/**************************************************************\
* 名稱: send_AT_CMGS
* 功能: 傳送AT+CMGS=***********,選擇目的手機號
* 輸入: 無
* 輸出: 無
\**************************************************************/
void send_AT_CMGS(uchar *phone_num)
{
uint i ;
for(i = 0; i < strlen(AT_CMGS); i++)
{
send_uart(AT_CMGS[i]);
delayms(10);
}
delayms(10);
send_uart(0X22); //雙引號
delayms(10);
for(i = 0; i < strlen(phone_num)-1; i++)
{
send_uart(phone_num[i]);
delayms(10);
}
delayms(10);
send_uart(0X22);
delayms(10);
send_uart('\r'); //傳送回車符號
delayms(10);
send_uart('\n'); //傳送換行符號
delayms(100);
}/* end function send_AT_CMGS */
/**************************************************************\
* 名稱: send_text
* 功能: 傳送簡訊內容
* 輸入: 無
* 輸出: 無
\**************************************************************/
void send_text(uchar *text)
{
uint i ;
for(i = 0; i < strlen(text); i++)
{
send_uart(text[i]);
delayms(10);
}
delayms(10);
}/* end function send_text */
/**************************************************************\
* 名稱: send_AT_IPR
* 功能: 設定模組波特率為9600bps
* 輸入: 無
* 輸出: 無
***************************************************************/
void send_AT_IPR(void)//設定波特率9600
{
uint i;
for(i = 0; i < strlen(AT_IPR); i++)
{
send_uart(AT_IPR[i]);
delayms(10);
}
delayms(10);
send_uart('\r'); //傳送回車符號
delayms(10);
send_uart('\n');
delayms(200);
}/* end function send_AT_IPR */
/*************************************************************\
*名稱:send_AT_CNMI()
*功能:傳送CNMI
\*************************************************************/
void send_AT_CNMI(void)//設定簡訊提示方式
{
uint i;
for (i = 0; i < strlen(AT_CNMI) ; i++)
{
send_uart(AT_CNMI[i]);
delayms(10);
}
delayms(10);
send_uart('\r');
delayms(10);
send_uart('\n');
delayms(200);
}
/*************************************************************\
*功能:傳送讀命令
\*************************************************************/
void send_AT_CMGR()
{
uint i;
for (i = 0 ; i < strlen(AT_CMGR) ; i++)
{
send_uart(AT_CMGR[i]);
delayms(10);
}
delayms(10);
}
/**************************************************************\
* 名稱: send_AT_CMGF
* 功能: 簡訊AT指令,傳送AT+CMGF=1,設定文字模式
* 輸入: 無
* 輸出: 無
***************************************************************/
void send_AT_CMGF(void)//設定簡訊的讀模式
{
uint i ;
for(i = 0; i < strlen(AT_CMGF); i++)
{
send_uart(AT_CMGF[i]);
delayms(10);
}
delayms(10);
send_uart('\r'); //傳送回車符號
delayms(10);
send_uart('\n');
delayms(200);
}/* end function send_AT_CMGF */
/**************************************************************\
* 名稱: send_AT_CSCS
* 功能: 傳送AT+CSCS="GSM",選擇TE的字符集
* 輸入: 無
* 輸出: 無
\**************************************************************/
void send_AT_CSCS(void)//設定字符集為"GSM"
{
uint i ;
for(i = 0;i < strlen(AT_CSCS); i++)
{
send_uart(AT_CSCS[i]);
delayms(10);
}
delayms(10);
send_uart(0X22);
相關推薦
【微控制器】基於有方GPRS的智慧電梯控制系統
前一篇文章《時鐘及溫度的顯示》中所介紹的作品,是作為一個微控制器新手在暑假學了一個月的微控制器之後,做的第一個綜合性作品,涵蓋了二極體、蜂鳴器、數碼管、液晶屏、按鍵、時鐘晶片、溫度感測器的控制操作。做完這個之後,也沒碰過微控制器了。在大三開始的時候,由於和同學參
基於微信智慧家居控制系統研究與設計
摘 要 隨著人們物質生活水平的不斷提升,對家電智慧化控制的要求也逐漸提高。 目前的智慧家居系統主要通過家庭閘道器對家電進行室內控制,無法實現遠端遙 控,家電的使用情況也無法聯網查詢。雖然使用者可以使用手機直接控制家中電器, 但是需要安裝眾多的控制軟體,無形中增加了手機的負擔。
【原始碼】基於Android和藍芽的微控制器溫度採集系統
如需轉載請標明出處:http://blog.csdn.net/itas109 QQ技術交流群:129518033STC89C52微控制器通過HC-06藍芽模組與Android手機通訊例項-基於Andro
【Spark深入學習 -10】基於spark構建企業級流處理系統
變現 大內存 空間換時間 detail python 訪問量 新版本 kafak 計算框架 ----本節內容-------
1.流式處理系統背景
1.1 技術背景
1.2 Spark技術很火
2.流式處理技術介紹
2.1流式處理技術概念
2.
【Rpc】基於開源Dubbo分布式RPC服務框架的部署整合
c-s 基於 1.8 git 編譯 handle direct 有著 ride 一、前言
Dubbo 作為SOA服務化治理方案的核心框架,用於提高業務邏輯的復用、整合、集中管理,具有極高的可靠性(HA)和伸縮性,被應用於阿裏巴巴各成員站點,同時在包括JD、當當在內的眾多互
【自動化】基於Spark streaming的SQL服務實時自動化運維
body oop nbsp define mysq tco source font getc 設計背景
spark thriftserver目前線上有10個實例,以往通過監控端口存活的方式很不準確,當出故障時進程不退出情況很多,而手動去查看日誌再重啟處理服務這個過程很低效
【轉】基於Map的簡易記憶化緩存
還在 自己 == map cti extends inter end 參考資料 看到文章後,自己也想寫一些關於這個方面的,但是覺得寫的估計沒有那位博主好,而且又會用到裏面的許多東西,所以幹脆轉載。但是會在文章末尾寫上自己的學習的的東西。
原文出處如下:
http://www
【redis】基於redis實現分布式並發鎖
val 內容 等待隊列 過多 具體實現 exec ret abs con 基於redis實現分布式並發鎖(註解實現)
說明
前提, 應用服務是分布式或多服務, 而這些"多"有共同的"redis";
GitHub: https:
【轉】基於localStorage的資源離線和更新技術
同時 前端 event 原來 read 前端資源 獲取 tex tor
ServiceWorker的資源離線與更新
ServiceWorker是替代Application Cache的機制,目前為止其兼容性很差。
localStorage資源離線緩存與更新
基本思路:將
【docker】基於Dockerfile構建mysqld服務鏡像
mysqld服務鏡像一 創建構建目錄結構 # mkdir -pv docker/mysql# cd docker/mysql/二 寫Dockerfile 文件# vim Dockerfile #此處 sshd:latest 為上篇文章中創建的鏡像#此Dockerfile 「dookerpool」的
【docker】基於Dockerfile構建monogdb服務鏡像
monogdb服務鏡像① 查看內容,包括寫好的Dockerfile和若幹腳本等。從GitHub Dockerpool社區賬戶下載Mongodb鏡像項目:git clone https://github.com/DockerPool/Mongodb.git 並修改文件[root@docker1 Mongodb]
ASP.NET CORE系列【四】基於Claim登錄授權
amp account 技術 time 其他 cookie first arp 好的 介紹
關於什麽是Claim?
可以看看其他大神的文章:
http://www.cnblogs.com/jesse2013/p/aspnet-identity-claims-base
【轉載】基於rasa的對話系統搭建(上)
生成模型 efi 實體類 total ted twisted -m serve feature
文章介紹使用rasa nlu和 rasa core 實現一個電信領域對話系統demo,實現簡單的業務查詢辦理功能,更完善的實現需要
【微控制器】[STM8] - 外部時鐘 + 內部時鐘 的切換
STM8S103K3: 外部時鐘 + 內部時鐘 的切換。
首先看一下 STM8S103K3 的時鐘結構圖,可以幫助你很好的理解。 這裡有幾個時鐘,就是圖中標識的時鐘,需要弄清楚一下:
fHSE: 外部高速晶振時鐘,它是由外部晶振產生,大小由外部晶振大小決定
【微控制器】[stm8] - 使用庫函式時,減少ROM佔用的方法
在使用STM微控制器的官方庫函式程式設計時,微控制器的ROM會額外的佔用很多,我現在使用STM8S103時,使用了庫函式,8K的ROM,寫了幾個自己的驅動和應用程式後,記憶體佔用就到了 7800 bytes。但是還有些東西沒有寫完,需要繼續新增。我使用以下兩種方法,將其ROM減少到了 586
【微控制器】[LED]:LED 不用頻率閃爍的程式
main.c 程式原始碼:
// =========================== main.c ======================
#include "reg51.h"
#define LED_ON 20
#define LED_OFF 0
#define F_1
【Scala】基於8.0版本的jdbc進行資料庫連接出現
下面這個程式碼可以正常執行,沒有問題
import java.sql.{Connection, DriverManager, ResultSet, Statement}
object Main {
def main(args: Array[String]): Unit = {
【Kubernetes】基於角色的許可權控制:RBAC
Kubernetes中所有的API物件,都儲存在Etcd裡,對這些API物件的操作,一定都是通過訪問kube-apiserver實現的,原因是需要APIServer來做授權工作。
在Kubernetes中,負責完成授權(Authorization)工作的機制,就是RBAC:基於角色的訪問控制(Rol
【原始碼】基於IEEE 14匯流排標準的複合微電網SIMULINK模型
本程式設計了一種基於IEEE 14匯流排標準的複合微電網模型,該微電網模型包括柴油發電機、PV模型、電池儲能系統、電弧爐等非線性負載。微電網採用併網執行方式。
本模型的參考文獻:
A new approach for soft synchronization of microgri
【原始碼】基於IAPWS IF-97標準的水蒸汽熱力學性質分析X Steam version 2.6
本MATLAB程式碼實現了“International Association for Properties of Water and Steam Industrial Formulation 1997 (IAPWS IF-97)”標準的研究與分析,水蒸汽特性範圍為0 - 1000 bar