51单片机,18B20,1602温度计+串口通信

发布者:gamma14最新更新时间:2020-11-21 来源: 51hei关键字:51单片机  18B20  温度计  串口通信 手机看文章 扫描二维码
随时随地手机看文章

制作出来的实物图如下:
 



仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


上位机:
  

安装程序解压到同一目录下。再运行setup安装。。。。

温度计.exe
编写环境Win10 x64.     VS2010 x86  C++ MFC
测试环境Win10 x64.   

在32位系统上,能不能正常使用还不清楚。
所以公布了源代码文件,如果在32位系统上,不能正常使用。
请使用源代码文件,在32位系统上重新生成一下应用程序。。。

单片机源程序如下:

#include

#include "math.h"


bit flag1s = 0, _up = 0;          //1s定时标志

unsigned char T0RH = 0;  //T0重载值的高字节

unsigned char T0RL = 0;  //T0重载值的低字节


void ConfigTimer0(unsigned int ms);

unsigned char IntToString(unsigned char *str, int dat);

extern bit Start18B20();

extern bit Get18B20Temp(int *temp);

extern void InitLcd1602();

extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);


//串口初始化函数

void InitUART()

{

                //IP = 0x10;

                TMOD &= 0x0F;

    TMOD |= 0x20;

    SCON = 0x50;

    TH1 = 0xF3;

    TL1 = TH1;

    PCON = 0x00;

    EA = 1;

    ES = 1;

    TR1 = 1;

}


//串口发送1字节数据

void SendOneByte(unsigned char c)

{

    SBUF = c;

    while(!TI);

    TI = 0;

}

void main()

{

    bit res;

    int temp, former=0xffff;        //读取到的当前温度值

    int intT, decT;  //温度值的整数和小数部分

    unsigned char len;

    unsigned char str[12];

               

                IP = 0x10;

                InitUART();

    // EA = 1;            //开总中断

    ConfigTimer0(10);  //T0定时10ms

    Start18B20();      //启动DS18B20

    InitLcd1602();     //初始化液晶

   

    while (1)

    {

        if (flag1s || _up)  //每秒更新一次温度

        {

            flag1s = 0;

            res = Get18B20Temp(&temp);  //读取当前温度

            if (res && ((abs(temp-former) >= 4)||_up))                 //读取成功时,刷新当前温度显示

            {

                                                                former = temp;                                                                //记录新的温度

                                                                _up = 0;

                                                                SendOneByte((unsigned char) (temp/256));

                                                                SendOneByte((unsigned char) (temp%256));

                intT = temp >> 4;             //分离出温度值整数部分

                decT = temp & 0xF;            //分离出温度值小数部分

                len = IntToString(str, intT); //整数部分转换为字符串

                str[len++] = '.';             //添加小数点

                decT = (int)((decT*100) * 0.0625 + 0.5);        //二进制的小数部分转换为1位十进制位

                str[len++] = decT/10 + '0';      //十进制小数位再转换为ASCII字符

                                                                str[len++] = decT%10 + '0';

                                                                str[len++] = 'C';

                while (len < 7)               //用空格补齐到6个字符长度

                {

                    str[len++] = ' ';

                }

                str[len] = '';              //添加字符串结束符

                LcdShowStr(0, 0, str);        //显示到液晶屏上

            }

            else                        //读取失败时,提示错误信息

            {

                                                                if(!res)

                                                                        LcdShowStr(0, 0, "error!");

            }

            Start18B20();               //重新启动下一次转换

        }

    }

}

/* 整型数转换为字符串,str-字符串指针,dat-待转换数,返回值-字符串长度 */

unsigned char IntToString(unsigned char *str, int dat)

{

    signed char i = 0;

    unsigned char len = 0;

    unsigned char buf[6];

   

    if (dat < 0)  //如果为负数,首先取绝对值,并在指针上添加负号

    {

        dat = -dat;

        *str++ = '-';

        len++;

    }

    do {          //先转换为低位在前的十进制数组

        buf[i++] = dat % 10;

        dat /= 10;

    } while (dat > 0);

    len += i;     //i最后的值就是有效字符的个数

    while (i-- > 0)   //将数组值转换为ASCII码反向拷贝到接收指针上

    {

        *str++ = buf[i] + '0';

    }

    *str = '';  //添加字符串结束符

   

    return len;   //返回字符串长度

}

/* 配置并启动T0,ms-T0定时时间 */

void ConfigTimer0(unsigned int ms)

{

    unsigned long tmp;  //临时变量

   

    tmp = 12000000 / 12;      //定时器计数频率

    tmp = (tmp * ms) / 1000;  //计算所需的计数值

    tmp = 65536 - tmp;        //计算定时器重载值

    tmp = tmp + 15;           //补偿中断响应延时造成的误差

    T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节

    T0RL = (unsigned char)tmp;

    TMOD &= 0xF0;   //清零T0的控制位

    TMOD |= 0x01;   //配置T0为模式1

    TH0 = T0RH;     //加载T0重载值

    TL0 = T0RL;

    ET0 = 1;        //使能T0中断

    TR0 = 1;        //启动T0

}

/* T0中断服务函数,完成1秒定时 */

void InterruptTimer0() interrupt 1

{

    static unsigned char tmr1s = 0;

   

    TH0 = T0RH;  //重新加载重载值

    TL0 = T0RL;

    tmr1s++;

    if (tmr1s >= 100)  //定时1s

    {

        tmr1s = 0;

                                if(!flag1s)

                                        flag1s = 1;

    }

}


//串口中断服务函数,

void UARTInterrupt(void) interrupt 4

{

                char ch=0;

    if(RI)

    {

        RI = 0;

                                ch = SBUF;

                                if((ch=='1') && !_up)

                                        _up = 1;

        //add your code here!

    }/*

    else

        TI = 0;*/

}



关键字:51单片机  18B20  温度计  串口通信 引用地址:51单片机,18B20,1602温度计+串口通信

上一篇:单片机交通灯PCB板图与仿真源码(MAX7219+数码管显示)
下一篇:单片机电子密码锁仿真 可修改密码

推荐阅读最新更新时间:2024-11-16 19:55

8051单片机(STC89C52)之改变蜂鸣器发声频率
由于定时器0的中断处理程序为50ms触发一次, 故改变tcount归零时的临界值即可改变蜂鸣器发声的频率. 当tcount = 40 进行电平翻转时, 发出的声音类似于公交车转向灯开启时的效果声音. 当tcount = 10 进行电平翻转时, 发出的声音类似于倒计时秒表的哒哒声. 当tcount = 5 进行电平翻转时, 发出的声音比tcount = 10进行翻转时更加急促. #include STC89C5xRC.H int tcount = 0; sbit beep = P1 ^ 5;// P1 xor 0000 0101 void TO_EXT() interrupt 1//50ms触发一次 {
[单片机]
51单片机-指向数组的指针
在串口章节和液晶屏章节的部分代码中总是看到“ *str!='' ”和“ *str++ ”却一时难以理解意思,本节我们将简要讲解这两部分代码的含义,但前提需要大家有对指针方面的知识基础,建议先了解《手把手教你学51单片机》文档12.1节知识内容先。 1.代码解析 我们先定义一个数组“u8 LEDSET ={0x7E,0xBD,0xDB,0xE7};” 假设这四个元素的内存排布如下,5,6,7,8代表的是指向元素的指针。 每个数组初始化之后都会在最后那个元素内存的下一个内存分配有一个结束符的数据,“‘’”的ASCII码值就是0。 接着我们先把下面代码下载进开发板中观察现象 #include reg52.h #
[单片机]
<font color='red'>51单片机</font>-指向数组的指针
基于TMS320F2812集中供电系统的串口通信设计
引言 集中供电系统是电量的自动计量及管理的发展趋势,它将促进电力系统的潜能得到最大限度的发挥。 本集中供电系统利用RS-485通信,网络应用计算机、通信技术等,以DSP为核心、将智能计量与通信控制单元有机结合起来。 TMS320F2812串行通信接口概述 TMS320F2812串行通信接口(SCI)是一个双线通信异步串行通信接口,为减少串口通信时CPU的开销,F2812的串口支持16级接收和发送FIFO。串行通信接口支持与CPU以及其他使用费归零格式的异步外设之间的异步串行数字通信,它的接收器和发送器都是双级缓冲器,有各自独立的控制位与中断位,都可以同时工作在全双工模式下,为保证数据的完整性,串行通信接口对接收的数据进行间
[工业控制]
51单片机实现独立按键控制LED灯
3-1独立按键控制LED亮灭 本段代码主要使用了if...else...语句实现按下按下灯亮,松开按键时灯灭 #include REGX51.H void main() { while(1) { if(P3_1==0&&P3_0==0) { P2_0=0; } else { P2_0=1; } } } 3-2独立按键控制LED状态 首先使用较为灵活的延时函数生成代码,进行修改后如下 void Delay(unsigned int xms) { unsigned char i, j; while(xms) { i = 2; j = 2
[单片机]
89C51单片机的步进电动机控制系统设计
本文为大家带来两个89C51单片机的步进电动机控制系统设计。 89C51单片机的步进电动机控制系统设计一 系统整图如图1所示,本系统采用外部中断方式,p0口作为信号的输入部分,p1口为发光二极管显示部分,p2口作为电机的驱动部分。 图1 系统整图 电源部分 利用LM7812和LM7805芯片得到12V和5V的电压,它们的应用要注意以下几点: (1)输入输出压差不能太大,太大则转换效率急速降低,而且容易击穿损坏; (2)输出电流不能太大,1.5A 是其极限值。大电流的输出,散热片的尺寸要足够大,否则会导致高温保护或热击穿; (3)输入输出压差也不能太小,大小效率很差。 其中12V电压给步进电机供电,5V电压则给单片机供电。分
[单片机]
89C<font color='red'>51单片机</font>的步进电动机控制系统设计
基于AT89S52的串口通信控制LCM显示
1 引言 计算机带来的革命性进步渗透到各个行业,传统意义上计算机的定义也发生大的变化.单片机简称Micro-Controller/Embedded -Controller,以其高性价比,备受工业控制,电子消费领域重视.单片机串口通信是很多系统集成用到的方式。在一些复杂的控制系统中,单片机和 PC机互联成为一种系统解决方案。单片机和PC机互联,利用PC机的强大运算决策能力,单片机作为特殊环境的数据采集和执行单元,越来越多地被利用到工业控制领域,这样可以大幅度地节约系统成本。 2 总体解决方案 单片机选用Atmel89S52,通过DB9串口线连接到计算机,串口通信采用RS232标准。单片机和计算机之间通信采用一定
[单片机]
基于AT89S52的<font color='red'>串口通信</font>控制LCM显示
51单片机多路独立按键开关程序
每一个按键对应一个led灯,实现独立开关灯。 源程序: ** #include reg51.h #define uint unsigned int #define uchar unsigned char //定义按键端口 sbit key1 = P1^0;//定义按键端口1 sbit key2 = P1^1; sbit key3 = P1^2; sbit key4 = P1^3;//定义按键端口4 sbit key5 = P1^4; sbit key6 = P1^5; sbit key7 = P1^6; sbit key8 = P1^7; sbit led1 = P2^0; //定义LED灯1 sbit led2 = P
[单片机]
51单片机使用DAC0832编程输出方波,锯齿波,三角波,正弦波
#include reg51.h #include math.h #define uchar unsigned char #define uint unsigned int #define PI 3.1415925 float alph; void delayms(uint x) { uchar i; while(x--); { for(i=0;i 123;i++); } } main() { uchar i; while(1) { for(alph=0;alph 2*PI;alph+=0.1) { P2=1
[单片机]
<font color='red'>51单片机</font>使用DAC0832编程输出方波,锯齿波,三角波,正弦波
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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