3460|2

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机控制tc35发送短信的问题 [复制链接]

各位大侠你们,最近在研究用单片机控制TC35模块发送短信的东西,自己在万能板上都焊接好了,用超级终端可以正常发送短信,但是我想通过单片机直接发送短信,就是程序弄不好,希望的大侠指点下,下面是我的程序。
#include
//#include
#include
#include
#define uchar unsigned char
#define uint unsigned int


sbit bCancel=P1^0;        //取消
sbit bCall=P1^6;        //拨号/接听
sbit bLed=P1^4;                //LED指示
sbit bPro=P1^5;                //编程指示
sbit bStart=P1^2;   //启动GSM
sbit bMusic=P2^1;        //提示音控制
sbit bScl=P1^0;          //24c08 SCL
sbit bSda=P1^1;          //24c08 SDA
sbit tmp=ACC^0;                //

bit startflag=0,flag1=0,flag2=0,flag3=0,buttonflag=0;
bit rwFlag=0,rFlag=0,wFlag,smsFlag=0;
uchar input=0x0f,output=0x0f;
uchar temp;
uchar bufP0=0,bufP1H=0,buf=0;//保存数据
uchar idata rsBuf[]="abcdef";
uchar  sbuf,rsPoint;
uint time=0;
uchar idata rIndex=0,wIndex=0;
/******************** Function DefInition 函数定义 *************************/
//AT24C08读写
void delay1(uchar x)
{
   uint i;
   for(i=0;i }
void Nops()
{
   uchar u=4;
   while(u--);
}
void I2C_Init()
{
   bScl=1;
   Nops();
   bSda=1;
   Nops();
}
void I2C_Start()
{
   bSda=1;
   Nops();
   bScl=1;
   Nops();
   bSda=0;
   Nops();
   bScl=0;
   Nops();
}
void I2C_Stop()
{
   bSda=0;
   Nops();
   bScl=1;
   Nops();
   bSda=1;
   Nops();
}
void Writex(uchar j)
{
   uchar i,temp;
   temp=j;
   for (i=0;i<8;i++)
   {
      temp=temp<<1;
          bScl=0;
          Nops();
          bSda=CY;
          Nops();
          bScl=1;
          Nops();
   }
   bScl=0;
   Nops();
   bSda=1;
   Nops();
}
uchar Readx()
{
        uchar i,j,k=0;
        bScl=0;
        Nops();
        bSda=1;
        for (i=0;i<8;i++)
        {
                   Nops();
                bScl=1;
                   Nops();
            if (bSda==1) j=1;
            else j=0;
            k=(k<<1)|j;
                bScl=0;
        }
        Nops();
    return(k);
}
void ACK()
{
   uchar i=0;
   bScl=1;
   Nops();
   while ((bSda==1)&&(i<255))i++;
   bScl=0;
   Nops();
}
uchar I2C_ReadOneByte(uchar addr,uchar address)
{
          uchar i;
           I2C_Start();
        Writex(addr-1);
           ACK();
        Writex(address);
           ACK();
        I2C_Start();
           Writex(addr);
        ACK();
           i=Readx();
        I2C_Stop();
           delay1(10);
           return(i);
}
void  I2C_ReadNByte(uchar addr,uchar address,uchar *buf,uchar num)
{
        uchar i;
           I2C_Start();
        Writex(addr-1);
           ACK();
        Writex(address);
           ACK();
        I2C_Start();
           Writex(addr);
        ACK();
        *buf=Readx();
        buf++;
        I2C_Stop();
           for(i=1;i         {
                I2C_Start();
                Writex(addr);
                ACK();
                *buf=Readx();
                buf++;
                I2C_Stop(); //主应答
        }
           delay1(10);
}

/*void I2C_WriteOneByte(uchar addr,uchar address,uchar info)
{
   EA=0;
   I2C_Start();
   Writex(addr);
   ACK();
   Writex(address);
   ACK();
   Writex(info);
   ACK();
   I2C_Stop();
   EA=1;
   delay1(50);
}*/
//连续写
//num不大于16
void I2C_WriteNByte(uchar addr,uchar address,uchar *buf,uchar num)
{
        uchar i;
           EA=0;
           I2C_Start();
           Writex(addr);
           ACK();
           Writex(address);
           ACK();
           for(i=0;i         {
                Writex(*buf); //发送数据*buf
                buf++;
                ACK();
        }
   I2C_Stop();
   EA=1;
   delay1(50);
}
/****************************************************************************/
void SyStem_Init()
{
        uchar i;
        I2C_Init();
        //加载短消息和对方号码
        for(i=0;i<12;i++)
        {
                smsCenter_pdu=I2C_ReadOneByte(0xa3,64+i);
        }for(i=0;i<12;i++)
        {
                Phone_pdu=I2C_ReadOneByte(0xa3,76+i);
        }
        for(i=0;i<11;i++)
        {       
                Phone=I2C_ReadOneByte(0xa3,107+i);
        }

        input=I2C_ReadOneByte(0xa3,118);//加载默认输入值
        output=I2C_ReadOneByte(0xa3,119);//加载默认输出值

}
/****************************************************************************/
//延迟函数
void Delay(uchar n)
{
        uchar i=204;
        while(n--)
        {
                while(i--);
        }
}
/****************************************************************************/
//启动GSM模块即使GSM的IGT保持100ms以上的低电平
void Start_GSM()
{
        bStart=0;
        Delay(120);
        bStart=1;
}
/****************************************************************************/
//发送一个ASCII
void SendASC(uchar ASC)
{
        bit es;
        es=ES;//
        ES=0;//关闭串行中断
        TI=0;
        SBUF=ASC;
        while(!TI);
        TI=0;
        ES=es;
}
/****************************************************************************/
//发送AT命令到TC35I
void SendCmdToTc35i(uchar *p)
{
        uchar len;
        len=strlen(p);
        while(len--)
        {
                SendASC(*p++);
        }
}

/****************************************************************************/
//向电脑发送34个字节的字符串
//连机时使用
Send_TO_PC(uchar i)
{
        uchar j;
        if(i<8)
        {
                I2C_ReadNByte(0xa1,i*32,rsBuf+1,32);
        }
        if(i>=8)
        {
                I2C_ReadNByte(0xa3,(i-8)*32,rsBuf+1,32);               
        }
        for(j=0;j<33;j++)
        {
                SBUF=rsBuf[j];
                while(!TI);
                TI=0;
                Nops();
        }
}       
/****************************************************************************/
//将
//连机时使用
Write_To_2408(uchar i)
{
        if(i<8)
        {
                I2C_WriteNByte(0xa0,i*32,rsBuf+1,16);
                I2C_WriteNByte(0xa0,i*32+16,rsBuf+17,16);
        }
        if(i>=8)
        {
                I2C_WriteNByte(0xa2,(i-8)*32,rsBuf+1,16);
                I2C_WriteNByte(0xa2,(i-8)*32+16,rsBuf+17,16);
        }
}

//发送短消息
void Send_SMS(uchar *p)
{

        uchar tmp=0;
        ES=0;
        SendCmdToTc35i("AT+CMGF=0\r");
        Delay(50);
        SendCmdToTc35i("AT+CMGS=19\r");
        TH0=0x4C;
        TL0=0;
        time=0;
        TR0=1;
        while(1)
        {
                tmp=SBUF;
                RI=0;
                if(tmp==0x3e||tmp==0x41)
                        break;
                if(time>100)
                {
                        time=0;
                        TR0=0;
                        break;
                }
        }
        SendCmdToTc35i("0011000D9168");
   
        SendCmdToTc35i(smsCenter_pdu);
        SendCmdToTc35i("0008AA04");
        SendCmdToTc35i(Phone_pdu);
        SendCmdToTc35i("4F60597D");
        SendCmdToTc35i(p);
        SendASC(0X1A);
}
/****************************************************************************/
//读取P1口的低四位
//将P1口的低四位存入buf
void ReadP1(void)
{
        uchar t;
        t=P1;
        t=t&0xF0;
        t=_cror_(t,4);
        buf=t;
}
/****************************************************************************/
//串口初始化
//89C51在11.0592MHz下以9600Bs的波特率工作*/
void uart_init(void)
{
        SCON=0x50;                //SM1=1,REN=1.UART工作于模式1,并允许接收
        TMOD=0x21;                //TIMER1工作于模式2,TIMER0工作于模式1,
        PCON&=0x7f;                //SMOD=0;
        TH1=0xFD;                //9600bs
        TR1=1;                        //开定时器1
}
/****************************************************************************/
//LED闪烁
void Led_SS(uchar n)
{
        n=n*2;
        while(n--)
        {
                bLed=!bLed;
                Delay(100);
           }
}
/****************************************************************************/
void Music(uchar n)
{
        bMusic=0;
        while(n--)
        {       
                Delay(64);//Delay(64);
        }
        bMusic=1;
}
/****************************************************************************/
//外部中断0处理函数
void Intr0_int(void) interrupt 0
{
        uchar i,n=0;
        EX0=0;
        Delay(10);
        ReadP1();
        if(buf==4)
        {
                Music(4);
                startflag=1;
                flag2=0;
                flag3=0;
                bufP1H=0;       
        }
        else if(buf==2)
        {
                Music(1);
                startflag=0;
                flag2=0;
                flag3=0;
                bufP1H=0;       
        }
        else
        {
                if(buf==bufP1H)
                {
                        flag2=0;
                }
                else
                {
                        flag2=1;
                        bufP1H=buf;
                }
                if(flag2)
                {
                        switch (buf)
                        {
                                case 3:{n=0;        break;}
                                case 5:{n=1;        break;}
                                case 7:{n=2;        break;}       
                                case 9:        {n=3;        break;}       
                                case 10:{n=4;        break;}       
                                case 11:{n=5;        break;}
                                case 12:{n=6;        break;}       
                                case 13:{n=7;        break;}       
                                case 14:{n=8;        break;}
                                case 15:{n=9;        break;}
                                default:{n=9;         break;}
                   }
                        if(n<8)
                        {
                                for(i=0;i<32;i++)
                                {
                                        pdu2=I2C_ReadOneByte(0xa1,n*32+i);       
                                }
                        }
                        else
                        {
                                for(i=0;i<32;i++)
                                {
                                        pdu2=I2C_ReadOneByte(0xa3,(n-8)*32+i);       
                                }
                        }
                        flag3=1;
                        flag2=0;
                }               
               
        }
        EX0=1;
}
/****************************************************************************/
void T0_intsvr(void)  interrupt 1
{
        TH0=0x4C;                //Timer0产生50ms的中断
        TL0=0;
        time++;
}
/****************************************************************************/
void serial_int()interrupt 4
{
        if(RI)
        {
                sbuf=SBUF;
                RI=0;
                if(bPro)
                {
        /*        rsBuf[rsPoint++]=sbuf;   
                if (rsPoint >100)
                {               
                    rsPoint=0;
                }    //数据处理*/
                       
                }
                else
                {
                        if(rwFlag)
                        {
                                if(rFlag)//读标志
                                {
                                        if(sbuf<15)
                                        {       
                                                rIndex=sbuf;
                                                rsBuf[0]=sbuf;
                                                Send_TO_PC(rIndex);
                                        }
                                        rFlag=0;
                                        rwFlag=0;
                                }
                                if(wFlag)//写标志
                                {
                                        rsBuf[rsPoint++]=sbuf;
                                        if(rsPoint>33)
                                        {       
                                                wIndex=rsBuf[0];
                                                if(wIndex<15)
                                                {
                                                        Write_To_2408(wIndex);//        Write_To_2408(rsBuf[0]-0x30);
                                                        SBUF=wIndex;
                                                        while(!TI);
                                                        TI=0;
                                                        rsPoint=0;
                                                        rwFlag=0;
                                                        wFlag=0;
                                                }
                                        }
                                }
                        }
                        else
                        {
                                if(sbuf==0xAA)
                                {
                                        rwFlag=1;
                                        wFlag=1;
                                        rsPoint=0;
                                        I2C_ReadNByte(0xa1,0,rsBuf,1);
                                }
                                if(sbuf==0xBB)
                                {
                                        rwFlag=1;
                                        rFlag=1;
                                }
                        }
                }
       
        }
        if(TI)
        {
                TI=0;
        }
}
       
void main(void)
{
  
        //uchar i;//*p;
        Led_SS(5);
        Start_GSM();//启动GSM模块
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
    Delay(2000);
        Delay(2000);
        uart_init();
        SyStem_Init();
    bLed=0;
        Delay(2000);
        Delay(2000);
        //Send_AT();//发送AT连机命令

        SendCmdToTc35i("AT\n");
    bLed=1;
    Delay(2000);
    Delay(2000);
    SendCmdToTc35i("AT+CMGF=0\r");
    bLed=0;
    Delay(2000);
    Delay(2000);
    SendCmdToTc35i("AT+CMGS=19\r");
    SendCmdToTc35i("089168");
    SendCmdToTc35i("3108502105F0");
    SendCmdToTc35i("0011000D9168");
    SendCmdToTc35i("3107518457F4");
        SendCmdToTc35i("0008AA04");
        SendCmdToTc35i("4F60597D");
        SendASC(0x1a);
    Delay(2000);
    bLed=1;
}

最新回复

控制发送短信,只是串口发送命令啊,怎么程序那么多 你可以先用单片机和PC通信,用PC上的串口调试工具看看,发出来的命令对不?然后再接上手机模块 也要注意串口的连接,直连,交叉?  详情 回复 发表于 2010-4-12 14:30
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
楼主可以一步一步的调试的,这样就知道该怎么写了,你一下写了这么多,问题肯定是很多的
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
控制发送短信,只是串口发送命令啊,怎么程序那么多

你可以先用单片机和PC通信,用PC上的串口调试工具看看,发出来的命令对不?然后再接上手机模块


也要注意串口的连接,直连,交叉?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表