OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4439|回复: 2

关于51单片机控制TC35I的问题

[复制链接]

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-9-29
在线时间
16 小时
发表于 2014-3-23 17:51:36 | 显示全部楼层 |阅读模式
  #include<reg52.h>
#include<intrins.h>

#include<string.h>
#define uint unsigned int 
#define uchar unsigned char
uchar code num[]="1xxxxxxxxx3";(电话号码)
uchar code table[]="Temperature:";


#define Buf_Max 200

uchar Rec_Buf[Buf_Max];    //定义缓存数组
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit LED4 = P1^4;
sbit LED5 = P1^5;
sbit LED6 = P1^6;
sbit LED7 = P1^7;
sbit dq=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
uchar q = 0;  //定义缓存指针
uint number=12;
uint wd;
void Serial_Init(void);
void Send_ASCII(unsigned char *b);
void delayMs(uint a);
void CLR_Buf(void);
void Send_Hex(unsigned char c);
bit Hand(unsigned char *a);
void delayMs(uint a)
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
 }

void delay_15us(uchar temp)
{
for(temp;temp>0;temp--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
}
void delayUs()
{
    _nop_();
}

 
bit init_ds18b20()//温度初始化
{
bit ret=1;
dq=0;
delay_15us(39);
dq=1;
delay_15us(4);
ret=dq;
delay_15us(27);
dq=1;
return ret;
}
void wbyte_ds18b20(unsigned char dat)
{
    unsigned int i;
    unsigned char j;
    bit b;
    for(j = 0; j < 8; j++)
    {
        b = dat & 0x01;
        dat >>= 1;
    
        if(b)   
        {
           dq = 0;          i++; i++;  
            dq = 1;    
            i = 8; while(i>0) i--;  
        }
        else  
        {
            dq = 0;
          i = 8; while(i>0) i--;  
            dq = 1;
           i++; i++;
        }
   }
}
bit rbit_ds18b20()//读位
{
uint i;
bit data_bit;
dq=0;
i++;
dq=1;
i++;
i++;
data_bit=dq;
i = 8; 
    while(i>0) i--;

return data_bit;
}
uchar rbyte_ds18b20()//读字节
{
uchar i,j;
uchar data_byte=0;
for(i=0;i<8;i++)
{
j=rbit_ds18b20();

data_byte=(j<<7)|(data_byte>>1);

}
return data_byte;
}
void start_ds18b20()//温度转换
{
init_ds18b20();
delayMs(1);
wbyte_ds18b20(0xcc);
wbyte_ds18b20(0x44);
}
uint read_tem()//得到温度值
{
init_ds18b20();
delayMs(1);
wbyte_ds18b20(0xcc);
wbyte_ds18b20(0xbe);
wd=rbyte_ds18b20();
wd=wd|(rbyte_ds18b20()<<8);
wd=wd*0.0625;
wd=wd*10;
return wd;
}
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--); 
}

void delay1(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--); 
}

void write_com(uchar com)//写1602指令
{
P0=com;
rs=0;
lcden=1;
delayUs();
lcden=0;
delayMs(1);

}

void write_date(uchar date)//写1602数据
{
P0=date;
rs=1;
lcden=1;
delayUs();
lcden=0;
delayMs(1);
}

void init()//1602初始化
{
dula=0;
wela=0;
write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

}
void diplay_temp(void)
{
char shi,ge;
shi=read_tem()/100;
ge=read_tem()%100/10;
write_com(0x80+0x40+3);
write_date(0x30+shi);
write_date(0x30+ge);
write_com(0x80+0x40+5);
write_date('C');
}
void display(void)
{
start_ds18b20();
delayMs(1000);
init();
write_com(0x80);
for(number=0;number<12;number++)
{
write_date(table[number]);

}
diplay_temp();
}

void Serial_Init(void)//串口初始化函数
{
 SCON = 0x50;//串口:方式1,允许发送和接收
 TMOD = 0x20;//定时器1:模式2,8位自动重装模式,用于产生波特率    
 TH1 = 0xFD; //11.0592MHZ晶振,波特率为9600
 TL1 = 0xFD;   
 TR1 = 1;    //开启定时器1   
 ES = 1;     //开启串口中断
 EA = 1;     //开启全局中断
}








void Serial_Int() interrupt 4 
{
ES = 0; //关串口中断,防止中断嵌套
if(TI) //如果是发送中断,则不做任何处理
{
TI = 0;  //清除发送中断标志位
}
if(RI) //如果是接送中断,则进行处理
{
RI = 0; //清除接收中断标志位
Rec_Buf[q] = SBUF; //将接收到的字符串存到缓存中
q++;               //缓存指针向后移动
if(q>200)          //如果缓存满,将缓存指针指向缓存的首地址
{
q = 0;
}
}
ES = 1; //开启串口中断
}

/**********************************************************************/
void Send_ASCII(unsigned char *b)         
{
    ES = 0;                   //关串口中断
    for (b; *b!='\0';b++)
    {
        SBUF = *b;
        while(TI!=1);     //等待发送完成
TI = 0;           //清除发送中断标志位
}   
ES = 1;                   //开串口中断
}

void CLR_Buf(void)
{
unsigned char k;
    for(k=0;k<Buf_Max;k++)    //将缓存内容清零
   {
Rec_Buf[k] = 0;
}
    q = 0;                    //接收字符串的起始存储位置
}


/*函数功能:发送字符(十六进制)
/*输入参数:unsigned char c

/******************************************************************/ 
void Send_Hex(unsigned char c)         
{
    ES = 0;               //关串口中断
    SBUF = c;
    while(TI!=1);         //等待发送完成
    TI = 0;               //清除发送中断标志位
ES = 1;               //开串口中断
}


/*函数功能:判断缓存中是否含有指定的字符串
/*输入参数:unsigned char *a 指定的字符串
/*输出参数:bit 1---含有    0---不含有
/*调用模块:无
/*******************************************************************/
uchar Hand(unsigned char *a)
    if(strstr(Rec_Buf,a)!=NULL)
   return 1;
else
return 0;
}


void main()
{

LED0=0; 
LED1=0; 
LED2=0; 
LED3=0; 
LED4=0; 
LED5=0; 
LED6=0;
LED7=0; 

Serial_Init();  //调用串口初始化函数
CLR_Buf();
 //while(!Hand("OK"))     //判断是否握手成功,如果不成功延时一会,再发送AT握手指令
//{
Send_ASCII("AT"); //发送联机指令 
               Send_Hex(0x0d);   //发送回车符    
Send_Hex(0x0a);   //发送换行符
delayMs(3000);   //延时
// }
CLR_Buf(); 
delayMs(3000);     //延时
   //Send_ASCII("AT+CPMS=\"MT\",\"MT\",\"MT\"");//?所有操作都在MT(模块终端)中进行
//Send_Hex(0x0d);           //发送回车符
  //Send_Hex(0x0a);           //发送换行符
//delayMs(Delay_Time);     //延时
// while(!Hand("OK"));       //等待设置成功
CLR_Buf();                //清除缓存内容
// delayMs(Delay_Time);     //延时
Send_ASCII("AT+CNMI=2,1");//设置当有新短信到来时提示 
Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
delayMs(3000);     //延时
// while(!Hand("OK"));       //等待设置成功
CLR_Buf();      
delayMs(3000);     //延时
Send_ASCII("AT+CMGF=1");  //文本(TEXT)模式 
Send_Hex(0x0d);           //发送回车符
Send_Hex(0x0a);           //发送换行符
delayMs(3000);     //延时
// while(!Hand("OK"));      //等待设置成功
CLR_Buf();                //清除缓存内容
//LED4 = 0;                 //点亮设置成功指示灯
delayMs(3000);     //延时
Send_ASCII("AT+CMGD=1");  //删除第一条信息
Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
delayMs(3000);     //延时
// while(!Hand("OK"));      //等待设置成功
CLR_Buf();                //清除缓存内容
  
while(1)
display();
if(wd>28)
{
                    Send_ASCII("AT"); //发送联机指令 
               Send_Hex(0x0d);   //发送回车符    
Send_Hex(0x0a);   //发送换行符
delayMs(3000);     //延时
// while(!Hand("OK"));       //等待设置成功
CLR_Buf();                //清除缓存内容
delayMs(3000);     //延时
Send_ASCII("ATD15322374613;"); 
Send_Hex(0x0d);           //发送回车符
  Send_Hex(0x0a);           //发送换行符
delayMs(3000);     //延时
      //等待设置成功
CLR_Buf();      
}
    if(strstr(Rec_Buf,"+CMTI")!=NULL)    //?若缓存字符串中含有"+CMTI"就表示有新的短信
        {
CLR_Buf();                   //清除缓存内容
delayMs(3000);        //延时
Send_ASCII("AT+CMGR=1");     //发送读取信息指令
    Send_Hex(0x0d);              //发送回车符
  Send_Hex(0x0a);              //发送换行符
delayMs(3000);        //延时
            // while(!Hand("OK"));          //等待设置成功
//LED2 = 0;                    //点亮设置成功指示灯

        if(strstr(Rec_Buf,"close")!=NULL)       //如果信息内容是"open1"
            LED0= 1; 
LED1=1; 
LED2=1; 
LED3=1; 
LED4=1; 
LED5=1; 
LED6=1;
LED7=1; 
                 
           
CLR_Buf();                              //清除缓存内容
 
delayMs(3000);                   //延时
Send_ASCII("AT+CMGD=1");                //删除读取后的信息
Send_Hex(0x0d);                         //发送回车符
  Send_Hex(0x0a);                         //发送换行符
delayMs(3000);                   //延时
// while(!Hand("OK"));                    //等待设置成功
CLR_Buf();                              //清除缓存内容
}
               }
}

我的程序主要实现的功能是温度传感器实时测周围环境的温度,当温度(wd)大于28度时向一个手机打电话,然后手机发送close信息给GSM模块关闭LED灯,温度传感器的显示没问题,单片机的发送串口也没问题,就是就收不到TC35I反馈的信息,,,我觉得主要是黄色部分问题    请大侠们帮我查找问题,谢谢了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-3-24 00:14:05 | 显示全部楼层
表示爱莫能助...
楼主先调通和GSM模块的通信再去加其它功能吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-9-29
在线时间
16 小时
 楼主| 发表于 2014-3-24 11:16:58 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,你好:
   我已经用串口助手调通了,没有问题,单片机也没问题,就是这个程序有问题呢。。

         前面显示可以忽略,您能帮我看看黄色部分程序吗??
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-13 10:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表