單片機(Microcontrollers)是一種集成電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU、隨機存儲器RAM、只讀存儲器ROM、多種I/O口和中斷系統(tǒng)、定時器/計數(shù)器等功能(可能還包括顯示驅(qū)動電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個小而完善的微型計算機系統(tǒng),在工業(yè)控制領(lǐng)域廣泛應(yīng)用。從上世紀(jì)80年代,由當(dāng)時的4位、8位單片機,發(fā)展到現(xiàn)在的300M的高速單片機。
單片機接受指定短信內(nèi)容,1602顯示短信內(nèi)容,單片機對短信內(nèi)容作判斷,若為所要求的內(nèi)容,則返回一條短信。
? ? ? ?單片機控制sim900a收發(fā)短信
#include 《reg52.h》 //單片機頭文件
#include 《string.h》
#include “l(fā)cd1602_drv.h”
#define uchar unsigned char
#define uint unsigned int
#define Rx_data_length 110
uchar Admin_num[11]=“xxxxxxxxxxx”;
//手機號碼 uchar i,j;
bit Response_receive_SMS_flag=0;
sbit RS_1602=P2^6; //1602數(shù)據(jù)/命令選擇引腳
sbit LCD_RW=P2^5; //1602讀寫引腳
sbit E_1602=P2^7; //1602使能引腳
uchar Rx_bit,i;
uchar xdata Rx_data[Rx_data_length];
void Response_receive_SMS(void);
void Uart_SendString(uchar *String);
void uart_init(void);
void Clear_Rxdata(uchar length);
void delay(uint xms)
{
uint i,j; for(i=xms;i》0;i--)
for(j=100;j》0;j--);
}
void main(void)
{
uint aa=0; EA=1; //開總中斷
LCD_RW=0; //LCD RW 主程序接地一直等于0
uart_init(); //串口初始化
lcd_init(); //液晶屏顯示初始化
Rx_bit=0;
Uart_SendString(“AT+CLIP=1\r\n”);
delay(500);
Uart_SendString(“AT+CMGF=1\r\n”); //設(shè)置sim900模塊為英文方式發(fā)送短信
delay(500);
Uart_SendString(“AT+CMGD=1\r\n”); //清除所有短信
delay(500);
Uart_SendString(“AT+CSCS=\”GSM\“\r”); //設(shè)置sim900模塊GSM字符集
delay(500);
Uart_SendString(“AT+CMGF=1\r”); //設(shè)置sim900模塊為英文方式發(fā)送短信
delay(500);
Clear_Rxdata(Rx_data_length);
delay(500);
memset(Rx_data,‘ ’,sizeof(Rx_data)); //Rx_data數(shù)組中元素都為空格
write_1602com(one);
for(i=0;i《16;i++)
{
while(1)
{
EA=1;
EX0=1; //開外部中斷0
IT0=0; //脈沖觸發(fā)方式
Response_receive_SMS(); //循環(huán)檢測是否收到短信,若收到短信則 Response_receive_SMS_flag==1
delay(100);
Rx_bit=0;
if(Response_receive_SMS_flag==1)
{
Uart_SendString(“AT+CMGR=1\r\n”); //短信讀取
delay(2000);
write_1602com(one);
for(i=0;i《16;i++)
{
write_1602dat(Rx_data[69+i]);
}
if(Rx_data[69]==‘x’&&Rx_data[70]==‘x’&&Rx_data[71]==‘a(chǎn)x’&&Rx_data[72]==‘x’&&Rx_data[73]==‘x’) //判斷的短信內(nèi)容,可以不止5位
{
aa=1;
}
Response_receive_SMS_flag=0;
Clear_Rxdata(Rx_data_length);
delay(100);
Uart_SendString(“AT+CMGD=1\r\n”); //清除所有短信
delay(100);
}
delay(1000);
if(aa==1)
{
delay(1000);
Uart_SendString(“AT+CMGS=\”“);
for(j=0;j《11;j++)
{
SBUF=Admin_num[j];
while(TI==0);
TI=0;
}
Uart_SendString(“\”\r“);
delay(200);
Uart_SendString(”xxx“); //返回的短信內(nèi)容
delay(300);
Uart_SendChar(0x1a);
delay(1000);
aa=0;}
}
}
void uart() interrupt 4
{
ES=0;
if(RI==1) //當(dāng)硬件接 收到一個數(shù)據(jù)時,RI會置位
{
if(SBUF!=0x0d&&SBUF!=0x0a&&SBUF!=‘ ’) //去除所有的空格
{
Rx_data[Rx_bit]=SBUF;
Rx_bit++;
}
if(Rx_bit==Rx_data_length)
{
Rx_bit=0;
}
RI=0;
}
ES=1;
}
uchar i=0;
for(i=0;i《=Rx_data_length;i++)
{
if(Rx_data[i] ==‘+’
&&Rx_data[i+1]==‘C’
&&Rx_data[i+2]==‘M’
&&Rx_data[i+3]==‘T’
&&Rx_data[i+4]==‘I’
&&Rx_data[i+5]==‘:’)
{
Response_receive_SMS_flag=1;
return;
}
}
Response_receive_SMS_flag=0;
}
/********************************************************************
* 名稱 : Uart_SendChar(uchar ch)
* 功能 : 向串口發(fā)送一個字符
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Uart_SendChar(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
void Response_receive_SMS(void)
{
/********************************************************************
* 名稱 : Uart_SendChar(uchar ch)
* 功能 : 向串口發(fā)送一個字符串
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Uart_SendString(uchar *String)
{
while (*String !=‘\0’) //字符串結(jié)束標(biāo)志 \0
{
Uart_SendChar(*String); String++;
}
}
/********************************************************************
* 名稱 : uart_init(void)
* 功能 : 串口初始化程序
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void uart_init(void) //初始化uart
{
TMOD = 0x20; //定時器1工作模式2,8位可自動重載初值,常把定時1以模式2作為串行口波特率發(fā)生器
SCON = 0x50; //串口選擇工作模式1使能接收,允許發(fā)送,允許接收
TH1 = 0xFD; //用11.0592 MHz波特率 9600
TL1 = 0xFD;
TR1 = 1; //打開中時器
ES=1; //打開串口中斷
}
/********************************************************************
* 名稱 : Clear_Rxdata(uchar length)
* 功能 : 清空接收緩存數(shù)組
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Clear_Rxdata(uchar length) //清空接收緩存數(shù)組
{
uchar Bit;
for(Bit=0;Bit《length;Bit++)
{
Rx_data[Bit]=0x30; // ascii碼表中十進(jìn)制48對應(yīng)的字符為0
delay(50);
}
Rx_bit=0;
}
1602.c程序
#include《reg52.h》
#include “l(fā)cd1602_drv.h”
sbit RS_1602=P2^6;
sbit LCD_RW=P2^5; //LCD RW 主程序接地一直等于0
sbit E_1602=P2^7;
uchar aa,jj;
//①寫命令子程序
void write_1602com(uchar com) //液晶寫入指令函數(shù)
{
RS_1602=0; //置為寫入命令
P0=com; //送入數(shù)據(jù)
delay(1);
E_1602=1;
delay(1);
E_1602=0;
}
//②寫數(shù)據(jù)子程序
void write_1602dat(uchar dat)
{
RS_1602=1; //置為寫數(shù)據(jù)
P0=dat; //送入數(shù)據(jù)
delay(1);
E_1602=1;
delay(1);
E_1602=0;
}
void lcd_init(void)
{
write_1602com(0x38); //16*2 5*7點陣 8位數(shù)據(jù)線
delay(5);
write_1602com(0x38);
delay(5);
write_1602com(0x38);
delay(5);
write_1602com(0x08);
write_1602com(0x0c); //開顯示 不顯示光標(biāo) 不閃爍
write_1602com(0x06); //顯示不移動 光標(biāo)右移
write_1602com(0x01); // 清屏
}
lcd1602_drv.h部分
#ifndef __LCD1602_DRV_H__
#define __LCD1602_DRV_H__
#define uchar unsigned char
#define uint unsigned int #define one 0x80 //第一行的初始位置
#define two 0x80+0x40
void write_1602com(uchar com);
void write_1602dat(uchar dat);
void lcd_init();
#endif
評論
查看更多