单片机入门

当前位置:首页>文章中心>单片机入门
全部 352 技术分享 332 单片机入门 20

单片机与GSM短信模块(TC35i)串口通信1

作者:电子开发网   来源:本站   时间:2009-10-19   访问量:1041

在DS18B20数字温度测量实验中,将采集的温度值编写成短信通过串口、GSM模块传递给指定的手机,时间间隔5秒。
数据格式:文本,比如:“现在温度是25度”(或英文)。

1664848905102420.jpg

1664848919717347.jpg

/******************************************************************
** 单片机与控制TC35I发短信
** 晶 振  频 率:11.0592M
** 线路->单片机实验开发板B
******************************************************************/
    #include  
    #include

    sbit PS0=P2^4;//数码管小数点后第1位    
    sbit PS1=P2^5;//数码管个位    
    sbit PS2=P2^6;//数码管十位   
    sbit PS3=P2^7;//数码管百位
    sfr  P_data=0x80;//P0口为显示数据输出口

    sbit P_K_L=P2^2;//键盘列

    sbit DQ=P3^6;//DS18B20数据接口
sbit P_L=P0^0;//测量指示

  
unsigned char *send_data;

void delay(unsigned int);//延时函数
    void DS18B20_init(void);   //DS18B20初始化
unsigned int get_temper(void);    //读取温度程序
void DS18B20_write(unsigned char in_data); //DS18B20写数据函数
unsigned char DS18B20_read(void);////读取数据程序
unsigned int htd(unsigned int a); //进制转换函数
void display(unsigned int a);//显示函数
void send_ascii(unsigned char *b);//发送ascii数据
void send_hex(unsigned char b);//发送hex数据

float temp;//温度寄存器
bit DS18B20; // 18B20存在标志,1---存在 0---不存在
    
unsigned char tab[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//字段转换表
    
void main(void)
    {
    unsigned int a,temp,c=0;                                                        
        TMOD=0x20;           //定时器1--方式2
        TL1=0xfa;            
        TH1=0xfa;            //11.0592MHZ晶振,波特率为4800
        SCON=0x50;           //方式1
        TR1=1;               //启动定时

temp=get_temper();//这段程序用于避开刚上电时显示85的问题
for(a=0;a<2000;a++)
        delay(500);

while(1)
{
    int a;
    temp=get_temper();//测量温度
    for(a=0;a<600;a++)//显示,兼有延时的作用
    display(htd(temp));
if(c>5)
{
    send_ascii("at+cmgf=1");//以文本的形式发送
    send_hex(0x0d);
        for(a=0;a<600;a++)//显示,兼有延时的作用
        display(htd(temp));
    send_ascii("at+cmgs="139********"");//发送到指定号码
    send_hex(0x0d); ;
    for(a=0;a<600;a++)//显示,兼有延时的作用
        display(htd(temp));   
    send_ascii("The temperture is ");//发送短信
    send_hex(0x30+((htd(temp)>>8)&0x0f));
    send_hex(0x30+((htd(temp)>>4)&0x0f));
    send_ascii(".");
    send_hex(0x30+(htd(temp)&0x0f));
    send_ascii(" degree now.");
    send_hex(0x1a);
    send_hex(0x0d);
    c=0;
    }
c++;
}
    }

/****************************DS18B20读取温度函数**************************/
/*函数原型:void get_temper(void)
/*函数功能:DS18B20读取温度
/*输入参数:无
/*输出参数:无
/*调用模块:
/**********************************************************************/
unsigned int get_temper(void)
{
    unsigned char k,T_sign,T_L,T_H;
DS18B20_init();   //DS18B20初始化
    if(DS18B20)    //判断DS1820是否存在?若DS18B20不存在则返回
{
            DS18B20_write(0xcc);    // 跳过ROM匹配
            DS18B20_write(0x44);  //发出温度转换命令
    DS18B20_init();   //DS18B20初始化
        if(DS18B20)    //判断DS1820是否存在?若DS18B20不存在则返回
    {
                DS18B20_write(0xcc);//跳过ROM匹配
                DS18B20_write(0xbe);//发出读温度命令
T_L=DS18B20_read();//数据读出
T_H=DS18B20_read();
k=T_H&0xf8;  
                if(k==0xf8)
                    T_sign=1;   //温度是负数
                else
                    T_sign=0;  //温度是正数

                T_H=T_H&0x07;
                temp=(T_H*256+T_L)*10*0.0625;  //温度转换常数 乘以10 是因为要保留1位小数
return (temp);
            }
        }


}

/****************************DS18B20写数据函数**************************/
/*函数原型:void DS18B20_write(uchar in_data)
/*函数功能:DS18B20写数据
/*输入参数:要发送写入的数据
/*输出参数:无
/*调用模块:_cror_()
/**********************************************************************/
    void DS18B20_write(unsigned char in_data) //写DS18B20的子程序(有具体的时序要求)
    {  
        unsigned char i,out_data,k;
        out_data=in_data;
        for(i=1;i<9;i++)  //串行发送数据
        {
            DQ=0;
        DQ=1;
        _nop_();
            _nop_();
            k=out_data&0x01;
        if(k==0x01)  //判断数据  写1
        {
            DQ=1;
            }
        else   //写0
            {
            DQ=0;
        }
        delay(4); //延时62us
        DQ=1;
            out_data=_cror_(out_data,1);  //循环左移1位
        }
    }

/**************************DS18B20读函数**************************/
/*函数原型:void DS18B20_read()
/*函数功能:DS18B20读数据
/*输入参数:无
/*输出参数:读到的一字节内容
/*调用模块:delay()
/******************************************************************/
    unsigned char DS18B20_read()
    {
        unsigned char i,in_data,k;
        in_data=0;
        for(i=1;i<9;i++)  //串行发送数据
        {
            DQ=0;
        DQ=1;
        _nop_();
        _nop_();
            k=DQ; //读DQ端
        if(k==1)  //读到的数据是1
        {
            in_data=in_data|0x01;
        }
        else
        {
            in_data=in_data|0x00;
        }
        delay(3);  //延时51us
        DQ=1;
        in_data=_cror_(in_data,1); //循环右移1位
        }
        return(in_data);
    }

/**************************DS18B20初始化函数**************************/
/*函数原型:void DS18B20_init(void)
/*函数功能:DS18B20初始化
/*输入参数:无
/*输出参数:无
/*调用模块:delay()
/******************************************************************/  
   void DS18B20_init(void)
    {
    unsigned char a;
       DQ=1;//主机发出复位低脉冲
DQ=0;
delay(44); //延时540US
DQ=1;
for(a=0;a<0x36&&DQ==1;a++)
{
    a++;
    a--; //等待DS18B20回应
}
if(DQ)
DS18B20=0;  //18B20不存在
else
{  
DS18B20=1;  // 18B20存在
delay(120); //复位成功!延时240US
}
    }


/**************************数码管显示函数**************************/
/*函数原型:void display(void)
/*函数功能:数码管显示
/*输入参数:无
/*输出参数:无
/*调用模块:delay()
/******************************************************************/
    void display(unsigned int a)
    {
    bit b=P_K_L;
P_K_L=1;//防止按键干扰显示
        P_data=tab[a&0x0f];//显示小数点后第1位
        PS0=0;
    PS1=1;
PS2=1;
PS3=1;
    delay(200);
        P_data=tab[(a>>4)&0x0f]|0x01; //显示个位
        PS0=1;
    PS1=0;
    delay(200);
        P_data=tab[(a>>8)&0x0f];//显示十位
        PS1=1;
PS2=0;
    delay(200);
P_data=tab[(a>>12)&0x0f];//显示百位
        PS2=1;
//PS3=0;
    //delay(200);
//PS3=1;*/


P_K_L=b;//恢复按键
    P_data=0xff;//恢复数据口
    }

/**************************发送字符(ASCII码)函数*********************/
/*函数原型:void send_ascii(unsigned char *b)
/*函数功能:发送字符(ASCII码)
/*输入参数:unsigned char *b
/*输出参数:无
/*调用模块:无
/******************************************************************/
void send_ascii(unsigned char *b)        
{
    for (b; *b!='�';b++)
    {
        SBUF=*b;
        while(TI!=1)
    ;
TI=0;
}
}


/**************************发送字符(十六进制)函数*********************/
/*函数原型:void send_ascii(unsigned char b)
/*函数功能:发送字符(十六进制)
/*输入参数:unsigned char b
/*输出参数:无
/*调用模块:无
/******************************************************************/
void send_hex(unsigned char b)        
{
    SBUF=b;
    while(TI!=1)
        ;
    TI=0;
}

/**************************十六进制转十进制函数**************************/
/*函数原型:uint htd(uint a)
/*函数功能:十六进制转十进制
/*输入参数:要转换的数据
/*输出参数:转换后的数据
/*调用模块:无
/******************************************************************/
unsigned int htd(unsigned int a)
    {
    unsigned int b,c;
b=a%10;
c=b;
a=a/10;
b=a%10;
c=c+(b<<4);
a=a/10;
b=a%10;
c=c+(b<<8);
a=a/10;
b=a%10;
c=c+(b<<12);
    return c;
    }


/*******************************延时函数*********************************/
/*函数原型:delay(unsigned int delay_time)
/*函数功能:延时函数
/*输入参数:delay_time (输入要延时的时间)
/*输出参数:无
/*调用模块:无
/**********************************************************************/
void delay(unsigned int delay_time)   //延时子程序
{for(;delay_time>0;delay_time--)
{}
  }

上一篇:单片机与PC串口通信2

下一篇:NOKIA5110LCD液晶屏的驱动实验

发表评论:

评论记录:

未查询到任何数据!

在线咨询

点击这里给我发消息 咨询专员

在线咨询

咨询电话

18906103328

电话咨询

微信扫一扫

微信联系
返回顶部