找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1621|回复: 0
打印 上一主题 下一主题
收起左侧

单片机下位机与上位机程序温度检测程序

[复制链接]
跳转到指定楼层
楼主
1、本实验所用单片机已经将DS18B20的数据脚连接到单片机的P3.7,所以只需要将板子连接到电脑即可,不需要接其他线。

2、打开上位机.exe文件,选择COM3-连接,温度窗口就会有温度输出。

源码:
/*********************************************************************************************
功能:下位机通过串口把DS18B20的监测数据发送到上位机并显示
/**********************************************************************************************/

#include<reg52.h>

#define uint  unsigned int
#define uchar unsigned char

sbit DQ=P3^7;                            // 接DS18B20的数据端

/***********************************
   函数:DelayMs(uint z)
----------------------
   说明:毫秒级的延时
   参数:z 代表要延时的毫秒数
返回值:无
***********************************/
void DelayMs(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}


/***********************************
   void ReSet(void)
------------------
   说明:复位启动DS18B20
   参数:无
返回值:无
***********************************/
void ReSet(void)
{
        uint i;
        DQ=0;
        i=100;
        while(i--);
        DQ=1;
        i=4;
        while(i--);
        while(DQ);
        while(~DQ);
        i=4;
        while(i--);
}



/***********************************
   uchar ReadByte(void)
------------------
   说明:读取DS18B20的一个字节
   参数:无
返回值:返回读取到的字节
***********************************/
uchar ReadByte(void)
{
        uchar i,j,b,dat=0;
        for(j=0;j<8;j++)
        {                                                
                DQ=0;
                i++;
                DQ=1;        
                i=3;                // 延时15us
                while(--i);
                b=DQ;
                i=10;
                while(i--);
                dat=(b<<7)|(dat>>1);
        }
        return(dat);
}


/************************************************
   void WriteByte(uchar b)
------------------
   说明:写数据的一个字节,满足写1和写0的时隙要求
   参数:b代表要写入到DS18B20的内容
返回值:无
************************************************/
void WriteByte(uchar b)
{
        uint i;
        uchar j;
        bit btmp;
        for(j=0;j<8;j++)
        {
                btmp=b&0x01;
                b=b>>1;                         // 取下一位(由低位向高位)
                if(btmp)
                {
                        DQ=0;
                        i++;
                        i++;
                        DQ=1;
                        i=10;
                        while(i--);                // 整个写1时隙不低于60us
                }
                else
                {
                        DQ=0;
                        i=10;
                        while(i--);         // 保持低在60us到120us之间
                        DQ=1;
                        i++;
                        i++;
                }
        }
}




/************************************************
   uint ReadTemp(void)
------------------
   说明:读取温度值
   参数:无
返回值:返回读取到的温度
************************************************/
uint ReadTemp(void)
{
        uchar TempLow,TempHig;         // 温度值低位、高位字节
        float tt;
        uint temp;
        ReSet();                                // 产生复位脉冲,初始化DS18B20
        WriteByte(0xcc);                // skip rom 命令
        WriteByte(0x44);                // convert T 命令
        ReSet();
        WriteByte(0xcc);                // skip rom 命令
        WriteByte(0xbe);                // read 温度命令
        TempLow=ReadByte();                // 温度值低位字节(其中低4位为二进制的"小数"部分)
        TempHig=ReadByte();                // 高位值高位字节(其中高5位为符号位)
        temp=TempHig;
        temp<<=8;
        temp=temp|TempLow;
        tt=temp*0.0625;
        temp=tt*10+0.5;
        return (temp);
}



/***********************************
   函数:void send(uint dat)
---------------------------
   说明:将测得的距离通过串口发送出去
   参数:dat是测得的距离
返回值:无
***********************************/        
void Send(uint dat)
{
        SBUF=(dat/1000)+ 48;                // 发送 千 位
        while(!TI);
        TI=0;
        SBUF=(dat%1000/100)+ 48;        // 发送 百 位
        while(!TI);
        TI=0;
        SBUF=(dat%100/10)+48;                // 发送 十 位
        while(!TI);
        TI=0;
        SBUF=(dat%10)+48;                        // 发送 个 位
        while(!TI);
        TI=0;
}

/***********************************
   函数:void InitUart()
----------------------
   说明:对串口进行初始化
   参数:无
返回值:无
***********************************/
void InitUart()
{
    SCON = 0x50;        //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
        PCON = 0x80;        //波特率倍频(屏蔽本句波特率为2400)
        TMOD = 0x20;        //定时器T/C1工作方式2
        TH1 = 0xF3;        //定时器初值高8位设置
        TL1 = 0xF3;        //定时器初值低8位设置
        EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
        ES = 1; //允许UART串口的中断        
        TR1 = 1;        //定时器启动  
}



/***********************
   函数:void main(void)
----------------------
   说明:主函数
   参数:无
返回值:无
***********************/
void main()
{
        uint temp;                                        // 用来保存读取到的温度值
        InitUart();
        while(1)
        {
                                
                        temp=ReadTemp();
                        Send(temp);
                        DelayMs(200);

        }
}

/*****************************************************************************/
/*****************************************************************************/
篇幅原因只展示部分代码,详细代码以及上位机程序请下载查看。


单片机代码下载: 温度检测系统.zip (59.84 KB, 下载次数: 23)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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