最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

单片机与gsm模块通讯

来源:动视网 责编:小OO 时间:2025-09-24 07:18:28
文档

单片机与gsm模块通讯

#include#include#include#include#defineuintunsignedint#defineucharunsignedcharsbitB2=P1^0;sbitB1=P1^1;sbitA1=P1^2;sbitA2=P1^3;sbitRED=P3^3;/*//开发板这三个引脚参考资料sbitE=P2^7;//1602使能引脚sbitRW=P2^6;//1602读写引脚sbitRS=P2^5;//1602数据/命令选择引脚*///这三个引脚参考资料sbitE=P0^5;
推荐度:
导读#include#include#include#include#defineuintunsignedint#defineucharunsignedcharsbitB2=P1^0;sbitB1=P1^1;sbitA1=P1^2;sbitA2=P1^3;sbitRED=P3^3;/*//开发板这三个引脚参考资料sbitE=P2^7;//1602使能引脚sbitRW=P2^6;//1602读写引脚sbitRS=P2^5;//1602数据/命令选择引脚*///这三个引脚参考资料sbitE=P0^5;
#include

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit B2=P1^0;

sbit B1=P1^1;

sbit A1=P1^2;

sbit A2=P1^3;

sbit RED=P3^3;

/*

//开发板这三个引脚参考资料

sbit E=P2^7;        //1602使能引脚

sbit RW=P2^6;        //1602读写引脚    

sbit RS=P2^5;        //1602数据/命令选择引脚

*/

//这三个引脚参考资料

sbit E=P0^5;        //1602使能引脚

sbit RW=P0^6;        //1602读写引脚    

sbit RS=P0^7;        //1602数据/命令选择引脚

uchar i_TC35_RECE;

uchar i_receive,  TC35_MAX;

uchar  TC35_RE[50];

uchar TC35_CON, ch;

uchar read_flag;

uchar i_TC35;

uchar flag_TC35_RE;      //标志 TC35_RE[50]接收几次数据,为1时表示接收的数据量小于50个,为2时,表示接收数据量大于50,小于100

uchar RED_flag;

    uint b,RED_long;

uchar code TC_MDSJ[]={"AT+CMGS=15256006305"};   //目的手机地址,

uchar code TC_ZXH[]={"AT+CSCA=+8613010305500"}; //本地中心号。

////////其他地方不要乱动////////////////////////////////////////////////////////

uchar code TC_FSNR1[]={"I AM OK1"};                //发送短信内容。

uchar code TC_WLZT[]={"AT+CREG?"};                //网络状态查询

uchar code TC_MSXZ[]={"AT+CMGF=1"};                //发送模式选择。

uchar code TC_DQML[]={"AT+CMGR=1"};                //短信读取命令。

uchar code TC_SCML[]={"AT+CMGD=1"};               //短信删除命令。

uchar code TC_ATF[]={"AT&F"};                    //格式化命令。

uchar code TC_BEGINE[]={"AT"};

void delay(uint);

void init_serialcom( void );

void send_uart( unsigned char);

void ATNAME(void);

void AT_CMGS(void);

void AT_CSCA(void);

void AT_RST(void);

void AT_CREG(void);

void AT_CMGF(void);

void AT_CMGR(void);

void AT_CMGD(void);

void KEY_TEST(void);     //按键测试

/********************************************************************

* 名称 : delay5us()

* 功能 : 延时,延时时间大概为5US。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay5us()

{

    _nop_();

    _nop_();

    _nop_();

    _nop_();

    _nop_();

}

/********************************************************************

* 名称 : bit Busy(void)

* 功能 : 这个是一个读状态函数,读出函数是否处在忙状态

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

bit Busy(void)

{

    bit busy_flag = 0;

    RS = 0;

    RW = 1;

    E = 1;

    delay(1);

    busy_flag = (bit)(P0 & 0x80);

    E = 0;

    return busy_flag;

}

/********************************************************************

* 名称 : wcmd(uchar del)

* 功能 : 1602命令函数

* 输入 : 输入的命令值

* 输出 : 无

***********************************************************************/

void wcmd(uchar del)

{

    while(Busy());

    RS = 0;

    RW = 0;

    E = 0;

    delay(1);

    P2= del;

    delay(1);

    E = 1;

    delay(1);

    E = 0;

}

/********************************************************************

* 名称 : wdata(uchar del)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

void wdata(uchar del)

{

    while(Busy());

    RS = 1;

    RW = 0;

    E = 0;

    delay(1);

    P2= del;

    delay(1);

    E = 1;

    delay(1);

    E = 0;

}

/********************************************************************

* 名称 : L1602_init()

* 功能 : 1602初始化,请参考1602的资料

* 输入 : 无

* 输出 : 无

***********************************************************************/

void L1602_init(void)

{

    wcmd(0x38);

    wcmd(0x0c);

    wcmd(0x06);

    wcmd(0x01);

}

/********************************************************************

* 名称 : L1602_char(uchar hang,uchar lie,char sign)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下

         L1602_char(1,5,'b')

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_char(uchar hang,uchar lie,char sign)

{

    uchar a;

    if(hang == 1) a = 0x80;

    if(hang == 2) a = 0xc0;

    a = a + lie - 1;

    wcmd(a);

    wdata(sign);

}

/********************************************************************

* 名称 : L1602_string(uchar hang,uchar lie,uchar *p)

* 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下

          L1602_string(1,5,"ab cd ef;")

* 输入 : 行,列,需要输入1602的数据

* 输出 : 无

***********************************************************************/

void L1602_string(uchar hang,uchar lie,uchar *p)

{

    uchar a,b=0;

    if(hang == 1) a = 0x80;

    if(hang == 2) a = 0xc0;

    a = a + lie - 1;

    while(1)

    {

        wcmd(a++);

        b++;

        if((*p == '\\0')||(b==16)) break;

        wdata(*p);

        p++;

    }

}

void delay(uint i)

{

    unsigned int i_delay,j_delay;

for(i_delay=0;i_delay    {

     for(j_delay=0;j_delay<100;j_delay++)

        {;}

    }

}

void init_serialcom( void ) 

     SCON = 0x50 ; //UART为模式1,8位数据,允许接收

     TMOD = 0x20 ; //定时器1为模式2,8位自动重装

     PCON |= 0x80 ; //SMOD=1; 

     TH1 = 0xFD ;   //Baud:19200 fosc="11".0592MHz 

     TL1=0;

     //  IE  = 0x90 ;     //Enable Serial Interrupt 

    IE = 0x94;                 //允许总中断中断,使能 INT1 外部中断

    TCON = 0x10;               //触发方式为脉冲负边沿触发

   

     REN=1; //允许串口接收数据

     EA=1;//打开全局中断

     ES=1;//打开串口中断

       EX1 = 0; 

     TR1 = 1 ;       // timer 1 run 

     TI=1; 

//向串口发送一个字符 

void send_uart( unsigned char ch) 

{    

        ES=0; 

     while (TI==0);

     TI= 0 ; 

     SBUF=ch; 

}

 

//串口接收中断函数 ,

void serial () interrupt 4

{          

    ES=0;

    if(RI==1)

    {

        RI = 0 ; 

        TC35_RE[i_TC35_RECE++]=SBUF;  // 表示接受了多少个字符

     }

    if(i_TC35_RECE==50)

    {

         flag_TC35_RE=2;

         i_TC35_RECE=0;     

    }        

    ES=1;

}            

//AT测试指令

void AT_TEST()

{

    uchar i;

for(i=0;i      {    send_uart(TC_BEGINE[i]);}

    send_uart(0X0D); 

    send_uart(0X0A);

}

void ATNAME1()              ///// //I AM OK1

{

    uchar i;

for(i=0;i        {send_uart(TC_FSNR1[i]);} 

    send_uart(0X1A); 

    send_uart(0X0D); 

    send_uart(0X0A);

//    TC35_CON=ATDAT;

}

//写目的手机的

void AT_CMGS()

{//AT+CMGS=131********

    uchar i;

for(i=0;i        {send_uart(TC_MDSJ[i]);} 

    send_uart(0X0D); 

//    send_uart(0X0D);

    send_uart(0X0A);

//    TC35_CON=CMGS;

}

//写信息中心号

void AT_CSCA()

{//AT+CSCA=+86130********

    uchar i;

for(i=0;i        {send_uart(TC_ZXH[i]);} 

    send_uart(0X0D); 

//    send_uart(0X0D);

    send_uart(0X0A);

//    TC35_CON=CSCA;

}

//AT复位指令

void AT_RST()

{

    uchar i;

for(i=0;i        {send_uart(TC_ATF[i]);} 

    send_uart(0X0D); 

//    send_uart(0X0D);

    send_uart(0X0A);

//    TC35_CON=RST;

}

//AT网络状态查询指令

void AT_CREG()

{

    uchar i;

    delay(500);

for(i=0;i    {send_uart(TC_WLZT[i]);} 

    send_uart(0X0D); 

//    send_uart(0X0D);

    send_uart(0X0A);

//    TC35_CON=CREG;

}

//AT接收格式指令

void AT_CMGF()

{//AT+CMGF=1

    uchar i;

for(i=0;i        {send_uart(TC_MSXZ[i]);}

    send_uart(0X0D); 

//    send_uart(0X0D); 

    send_uart(0X0A);

//    TC35_CON=CMGF;

}

//AT短消息读取指令

void AT_CMGR()

{//AT+CMGR=1

    uchar i;

for(i=0;i        {send_uart(TC_DQML[i]);}

    send_uart(0X0D); 

    send_uart(0X0D);

    send_uart(0X0A);

//    TC35_CON=CMGR;

}

//AT短消息删除指令

void AT_CMGD()

{//AT+CMGD=1

    uchar i;

for(i=0;i        {send_uart(TC_SCML[i]);} 

    send_uart(0X0D); 

//    send_uart(0X0D);

    send_uart(0X0A);

//    TC35_CON=CMGD;

}

void init_devices1()                  //向目的手机发送“I AM OK1”

{

     i_TC35_RECE=0;

     AT_TEST();                          //发送“AT”指令

     ES=1;

     L1602_string(1,1,TC_BEGINE);

     L1602_string(2,1,TC35_RE);

    

     i_TC35_RECE=0;

     AT_CMGF();                          //发送“AT+CMGF=1”指令,选择text发送模式

     ES=1;

     L1602_string(1,1,TC_MSXZ);

     L1602_string(2,1,TC35_RE);

     i_TC35_RECE=0;

     AT_CSCA();                            //发送手机中心号

     ES=1;

     L1602_string(1,1,TC_ZXH) ;

     L1602_string(2,1,TC35_RE);

     i_TC35_RECE=0;

     AT_CMGS();                            //发送目的手机号

     ES=1;

     L1602_string(1,1,TC_MDSJ);

     L1602_string(2,1,TC35_RE);

     i_TC35_RECE=0;

     ATNAME1();                              //发送短信内容

     ES=1;

     L1602_string(1,1,TC_FSNR1);

       L1602_string(2,1,TC35_RE);    

}

/*

void KEY_TEST()

{

        if(s19==0)

        {

            delay(10);

            if(s19==0)

            {

                while(!s19);

                 init_devices1();           //向目的手机发送“I AM OK1”

             }

        }           

          if(s18==0)

        {

            delay(10);

            if(s18==0)

            {

                while(!s18);

                i_TC35_RECE=0;

                AT_CMGR(); 

                ES=1;

                delay(100);

                i_TC35_RECE=0;

                AT_CMGR(); 

                ES=1;

                L1602_string(1,1,TC_DQML);

                 L1602_string(2,1,TC35_RE+19);

                L1602_char(2,15,flag_TC35_RE+0x30);

            }

        }

        if(s17==0)                           //删除短信

        {                                

            delay(10);

            if(s17==0)

            {

                while(!s17);

                i_TC35_RECE=0;

                AT_CMGD();

                ES=1;

                L1602_string(1,1,TC_SCML);

                 L1602_string(2,1,TC35_RE);

    

             }

        }    

    

}           */

 void main( )

 {

    L1602_init();  //LCD初始化

    init_serialcom(); //初始化串口 

    delay(10);

     flag_TC35_RE=1;

    RED=1;                    //I/O口初始化

    RED_flag=0;

    RED_long=0;

    while(1)

    {

    //    KEY_TEST();    

        i_TC35_RECE=0;

        AT_CMGF(); 

        ES=1;

        delay(30);      

        i_TC35_RECE=0;

        AT_CMGR(); 

        ES=1;

        delay(30);

        i_TC35_RECE=0;

        AT_CMGR(); 

        ES=1;

        delay(30);

        while(!((TC35_RE[19]=='1')||(TC35_RE[19]=='2')||(TC35_RE[19]=='3')||(TC35_RE[19]=='4')||(TC35_RE[19]=='5')))

         {

             i_TC35_RECE=0;

            AT_CMGR(); 

            ES=1;

            L1602_string(1,1,TC_DQML);

             L1602_string(2,1,TC35_RE+19);

            L1602_char(1,15,flag_TC35_RE+0x30);

         }

        

        RED_long=TC35_RE[19];

        L1602_char(1,16,RED_long);

        RED_long=(TC35_RE[19]-48 )*100;   //1米到9米 ,转换成厘米

            

        if(flag_TC35_RE==2)

         {

               flag_TC35_RE=1;

                A1=1;

                A2=0;

                B1=1;

                B2=0;

        

                i_TC35_RECE=0;

                AT_CMGD();

                ES=1;

                L1602_string(1,1,TC_SCML);

                 L1602_string(2,1,TC35_RE);    

        

                 EX1 = 1; 

            }     

    }

 

 }

void IR_IN() interrupt 2 using 0

{

    float a;

    EX1 = 0; 

    a=3.3;  //两个白线 距离约为3厘米

    ES=0;

         while(!RED);

        RED_flag++;

        b=(uint)RED_flag*a;

     if(b        {

                   A1=1;

                A2=0;

                B1=1;

                B2=0;

        }

        else

        {

                   A1=0;

                A2=0;

                B1=0;

                B2=0;

                b=0;

                RED_long=0;

         }

         EX1 = 1; 

文档

单片机与gsm模块通讯

#include#include#include#include#defineuintunsignedint#defineucharunsignedcharsbitB2=P1^0;sbitB1=P1^1;sbitA1=P1^2;sbitA2=P1^3;sbitRED=P3^3;/*//开发板这三个引脚参考资料sbitE=P2^7;//1602使能引脚sbitRW=P2^6;//1602读写引脚sbitRS=P2^5;//1602数据/命令选择引脚*///这三个引脚参考资料sbitE=P0^5;
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top