单片机实时温度采集并通过串口通信上传电脑显示

发布者:chaxue1987最新更新时间:2018-06-20 来源: eefocus关键字:单片机  实时温度采集  串口通信  电脑显示 手机看文章 扫描二维码
随时随地手机看文章

首先说下我所用到的主要器件器件:STC89C52,AT24C08,DS18B20,MAX232


实验源代码:

//接上18B20温度传感器(另购)后数码管显示出当前温度  

#include  

#include  

#include  

#define uchar unsigned char  

#define uint unsigned int  

sbit DS=P1^0;           //define interface  

uint temp;             // variable of temperature  

uchar flag,dat1;            // sign of the result positive or negative  

uchar code table[]={  

0xC0,0xF9,0xA4,0xB0,  

0x99,0x92,0x82,0xF8,  

0x80,0x90,0x88,0x83,  

0xC6,0xA1,0x86,0x8E};  

/*uchar code table1[]={  

0x40,0x79,0x24,0x30,  

0x19,0x12,0x02,0xF8,  

0x80,0x90,0x88,0x83,  

0xC6,0xA1,0x86,0x8E};*/  

sbit wela1 = P1^4;  

sbit wela2 = P1^5;  

sbit wela3 = P1^6;  

/*unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,  

                        0x87,0xff,0xef};  

 */  

/*********************************************  

                 串口通信部分  

*********************************************/  

void RS232_Init()  

{        

    TMOD=0x20;//设置定时器1为工作方式2  

    TH1=0xfd;  

    TL1=0xfd;  

    TR1=1;  

    REN=1;  

    SM0=0;  

    SM1=1;  

    EA=1;  

    ES=1;  

}  

/*-----------------------发送数据函数----------------------------*/  

void USART_Transmit(unsigned char buf)  

{      

       SBUF=buf;                  //发送数据  

       while(TI==0);                //等待发送结束  

       TI=0;                           //清除发送结束标志  

}  

/*********************************************  

                    AT24C08读写部分  

********************************************/  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Delay1ms(uint x)  

 函数功能: 延时1ms  

 入口参数: x  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_Delay1ms(uint x)  

{  

 uint i;  

 while(x--)  

 for(i=0;i<165;i++);  

}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Start()  

 函数功能: 起始函数  

 入口参数: 无  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_Start()  

{AT24C08_SDA_1();AT24C08_SCL_1();NOP();AT24C08_SDA_0();NOP();AT24C08_SCL_0();}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Stop()  

 函数功能: 停止函数  

 入口参数: 无  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_Stop()  

{AT24C08_SDA_0();AT24C08_SCL_1();NOP();AT24C08_SDA_1();NOP();AT24C08_SCL_0();}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Ack()  

 函数功能: 应答函数  

 入口参数: 无  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_Ack()  

{AT24C08_SDA_0();NOP();AT24C08_SCL_1();NOP();AT24C08_SCL_0();}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_NO_Ack()  

 函数功能: 无应答函数  

 入口参数: 无  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_NO_Ack()  

{AT24C08_SDA_1();AT24C08_SCL_1();NOP();AT24C08_SCL_0();}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Writ_Byte(uchar dat)  

 函数功能: 写函数  

 入口参数: dat  

 返回参数:t  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

uchar AT24C08_Writ_Byte(uchar dat)  

{  

 uchar i;  

 uchar t;  

 AT24C08_SDA_1();AT24C08_SCL_0();  

 for(i=0;i<8;i++)  

 {  

  if(dat&0x80)AT24C08_SDA_1();  

  else AT24C08_SDA_0();  

  AT24C08_SCL_1();NOP();  

  AT24C08_SCL_0();  

  dat<<=1;   

 }  

 NOP();  

 AT24C08_SDA_1();NOP();  

 AT24C08_SCL_1();NOP();  

 t=(AT24C08_CONT & (1<

 AT24C08_SCL_0();  

 return t;  

}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Read_Byte()  

 函数功能: 读函数  

 入口参数: 无  

 返回参数:dat  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

uchar AT24C08_Read_Byte()  

{  

   uchar i,dat;  

   AT24C08_SDA_1();AT24C08_SCL_1();  

   for(i=0;i<8;i++)  

   {  

     dat<<=1;  

     AT24C08_SCL_1();  

  if((AT24C08_CONT & (1<

  AT24C08_SCL_0();  

   }  

   AT24C08_Ack();  

   return dat;  

}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Write_One_Dat(uchar add,uchar dat)  

 函数功能: 写一字节函数  

 入口参数: add,dat  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

int AT24C08_Write_One_Dat(uchar add,uchar dat)  

{  

 EA=0;  

 AT24C08_Start();  

 if(AT24C08_Writ_Byte(sla))return 0;  

 if(AT24C08_Writ_Byte(add))return 0;  

 if(AT24C08_Writ_Byte(dat))return 0;  

 AT24C08_Stop();  

 AT24C08_Delay1ms(10);  

 EA=1;  

 return 1;  

}   

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Write_Mul_Dat(uchar add,uchar dat)  

 函数功能: 写多字节函数  

 入口参数: add,dat  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_Write_Mul_Dat(uchar add,uchar *s,uchar n)  

{  

 uchar i;  

 EA=0;  

 for(i=0;i

 {while(!AT24C08_Write_One_Dat(add+i,s[i]));  

 }  

  EA=1;  

}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Read_One_Dat(uchar add)  

 函数功能: 读一字节函数  

 入口参数: add,dat  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

int AT24C08_Read_One_Dat(uchar add)  

{   

 EA=0;  

 AT24C08_Start();  

 if(AT24C08_Writ_Byte(sla))return 0;  

 if(AT24C08_Writ_Byte(add))return 0;  

 AT24C08_Start();  

 if(AT24C08_Writ_Byte(sla|0x01))return 0;  

 dat1=AT24C08_Read_Byte();AT24C08_NO_Ack();  

 AT24C08_Stop();  

 EA=1;  

 return 1;   

}   

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Read_Mul_Dat(uchar add)  

 函数功能: 读多字节函数  

 入口参数: add,s,n  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_Read_Mul_Dat(uchar add,uchar *s,uchar n)  

{  

 uchar i;  

 EA=0;  

 for(i=0;i

 {  

  while(!AT24C08_Read_One_Dat(add+i));  

  s[i]=dat1;  

 }  

 EA=1;  

}  

/**************************************************************  

 隶属模块:AT24C08存储模块  

 函数名称:AT24C08_Clear()  

 函数功能: 清空  

 入口参数: 无  

 返回参数:无  

 修改时间: 2011-7-10  

 修改者:  彭瑞  

***************************************************************/  

void AT24C08_Clear()  

{  

 uchar i;  

 EA=0;  

 for(i=0;i<256;i++)  

 {  

  AT24C08_Write_One_Dat(i,0xff);  

 }  

 EA=1;  

}  

/*********************************************  

                    温度采集部分  

*********************************************/  

void delay(uint count)      //delay  

{  

  uint i;  

  while(count)  

  {  

    i=200;  

    while(i>0)  

    i--;  

    count--;  

  }  

}  

void dsreset(void)       //send reset and initialization command  

{  

  uint i;  

  DS=0;  

  i=103;  

  while(i>0)i--;  

  DS=1;  

  i=4;  

  while(i>0)i--;  

}  

  

bit tmpreadbit(void)       //read a bit  

{  

   uint i;  

   bit dat;  

   DS=0;i++;          //i++ for delay  

   DS=1;i++;i++;  

   dat=DS;  

   i=8;while(i>0)i--;  

   return (dat);  

}  

  

uchar tmpread(void)   //read a byte date  

{  

  uchar i,j,dat;  

  dat=0;  

  for(i=1;i<=8;i++)  

  {  

    j=tmpreadbit();  

    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里  

  }  

  return(dat);  

}  

  

void tmpwritebyte(uchar dat)   //write a byte to ds18b20  

{  

  uint i;  

  uchar j;  

  bit testb;  

  for(j=1;j<=8;j++)  

  {  

    testb=dat&0x01;  

    dat=dat>>1;  

    if(testb)     //write 1  

    {  

      DS=0;  

      i++;i++;  

      DS=1;  

      i=8;while(i>0)i--;  

    }  

    else  

    {  

      DS=0;       //write 0  

      i=8;while(i>0)i--;  

      DS=1;  

      i++;i++;  

    }  

  

  }  

}  

  

void tmpchange(void)  //DS18B20 begin change  

{  

  dsreset();  

  delay(1);  

  tmpwritebyte(0xcc);  // address all drivers on bus  

  tmpwritebyte(0x44);  //  initiates a single temperature conversion  

}  

  

uint tmp()               //get the temperature  

{  

  float tt;  

  uchar a,b;  

  dsreset();  

  delay(1);  

  tmpwritebyte(0xcc);//访问总线上的器件  

  tmpwritebyte(0xbe);//从器件上读取值  

  a=tmpread();  

  b=tmpread();  

  temp=b;  

  temp<<=8;             //two byte  compose a int variable  

  temp=temp|a;  

  tt=temp*0.0625;  

  temp=tt*10+0.5;//四舍五入  

  return temp;  

}  

  

void readrom()          //read the serial  

{  

  uchar sn1,sn2;  

  dsreset();  

  delay(1);  

  tmpwritebyte(0x33);  

  sn1=tmpread();  

  sn2=tmpread();  

}  

  

  

void delay10ms()            //delay  

  {  

    uchar a,b;  

    for(a=10;a>0;a--)  

      for(b=60;b>0;b--);  

   }  

  

void display(uint temp)         //显示程序  

{  

   uchar A1,A2,A2t,A3;  

   A1=temp/100;  

   A2t=temp%100;  

   A2=A2t/10;  

   A3=A2t%10;  

  

   wela3=1;  

   P2=table[A1];        //显示百位  

   delay(1);  

   wela3=0;  

  

   wela2=1;  

   P2=table[A2]-0x80;       //显示十位  

   delay(1);  

   wela2=0;  

  

   wela1=1;  

   P2=table[A3];        //显示个位  

   delay(1);  

   wela1=0;  

}  

  

  

void main()  

{  

    uint i;  

    uchar a,dat;  

    RS232_Init();     

    tmpchange();  

    // delay(200);  

    //for(a=10;a>0;a--)  

    //{           

        //display(tmp());  

    //}   

    for(i=0;i<1024;i++){  

        tmpchange();  

        dat=400-tmp();  

        AT24C08_Write_One_Dat(i,dat);  

        for(a=20;a>0;a--)  

            display(400-dat);  

    }  

    do{  

        display(888);  

        if(flag==1)  

        {  

            ES=0;  

            flag=0;  

            for(i=0;i<1024;i++){  

                AT24C08_Read_One_Dat(i);  

                USART_Transmit(dat1);  

            }  

            ES=1;  

        }  

    }while(1);  

}  

/*---------------------发送字符串函数--------------------------*/  

void USART_Transmit_str() interrupt 4  

{  

    uchar a;  

    RI=0;  

//  P1=SBUF;  

    a=SBUF;  

    flag=1;  

}  

AT24C08.h源代码:

#ifndef _short_type_H_  

#define _short_type_H_  

#define uchar unsigned char  

#define uint  unsigned int  

#endif  

  

#define sla 0xa0  

#define NOP()  _nop_();_nop_();_nop_();_nop_();_nop_()  

  

#define AT24C08_CONT P1  

  

#define AT24C08_SDA 2  

#define AT24C08_SCL 1  

  

  

#define AT24C08_SDA_1() AT24C08_CONT |= (1<

#define AT24C08_SDA_0() AT24C08_CONT &=~(1<

#define AT24C08_SCL_1() AT24C08_CONT |= (1<

#define AT24C08_SCL_0() AT24C08_CONT &=~(1<

  

/*unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,  

                        0x87,0xff,0xef};  

*/  

void AT24C08_Start();//开始  

void AT24C08_Stop();//结束  

void AT24C08_Ack();//应答  

void AT24C08_NO_Ack();//无应答  

  

uchar AT24C08_Writ_Byte(uchar dat);//写数据  

uchar AT24C08_Read_Byte();//读数据  

  

int AT24C08_Write_One_Dat(uchar add,uchar dat);//写一字节数据  

void AT24C08_Write_Mul_Dat(uchar add,uchar *s,uchar n);//写多字节数据  

int AT24C08_Read_One_Dat(uchar add);//读一字节数据  

void AT24C08_Read_Mul_Dat(uchar add,uchar *s,uchar n);//读多字节数据  

  

void AT24C08_Clear();//清存储空间数据  

void AT24C08_Delay1ms(uint x);//延时1ms  

/****************串口通信*********************/  

void RS232_Init();  

void USART_Transmit(unsigned char buf);  

void delay(uint count);  

void display(uint temp);//数码管先显示  

#endif  



关键字:单片机  实时温度采集  串口通信  电脑显示 引用地址:单片机实时温度采集并通过串口通信上传电脑显示

上一篇:STC89C52串口应用实例
下一篇:单片机利用串口通信传送温度

推荐阅读最新更新时间:2024-03-16 16:06

基于赛灵思FPGA和MCU结构的线性调频高度表
1 前言 本文介绍了一种新型调频连续波高度表,主要创新点在于:采用了 FPGA / 单片机 的硬件平台,通用性强,并具备现场软件升级能力;通过软件算法实现了高度搜索、高度跟踪、STC、 AGC 等功能,改变信号处理算法和控制软件能实现多种功能,满足更多应用场合的需要;采用恒定差拍结构,抗干扰能力强,并具有频谱前沿跟踪能力;具有1500m 的大范围测高能 力,在低高度上具有1m 的测高精度。 无线电 高度表不仅可以精确测量飞行器与地面或海面的相对高度,而且还可以测量地表粗糙度、海洋波浪高度等多种参数,在飞机的自动着陆、自动导航、地形匹配等领域得到了广泛的应用。无线电高度表主要分为调频连续波体制和脉冲体制两种,调频连续波体制适合 1
[单片机]
基于赛灵思FPGA和<font color='red'>MCU</font>结构的线性调频高度表
ST推M4 MCU,据称全球性能最强
  “全球每交付2个Cortex-M系列微控制器,其中1个就是STM32,” ST(意法半导体) 微控制器全球市场部总监Daniel Colonna自豪地告诉EEWORLD。 意法半导体微控制器全球市场部总监Daniel Colonna   为了进一步扩大ST Cortex-M微控制器产品阵营,近日,ST宣布STM32 F4系列微控制器产品上市,至此,ST共有超过250种相互兼容的M内核产品的型号。新推出的F4系列产品基于最新的ARM Cortex-M4内核,在现有STM32微控制器产品组合中新增了信号处理功能,并提高了运行速度。新产品继续沿用STM32的蝴蝶logo,昭示着新的F4系列的产品将继续在STM32 Cortex-
[单片机]
单片机的内存分配详解
对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM、RAM启动,首先 需要对 链接器 Linker 如何分配内存有一定的了解。 通常,对于栈生长方向向下的单片机,其内存一般模型是: 一个进程运行时,所占用的内存,可以分为如下几个部分: 1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。 2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。 3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程
[单片机]
C51单片机P4口使用
C51单片机(STC11L32/48XE)的P4可以像其他IO可以作为正常的IO来使用。 如图:
[单片机]
C51<font color='red'>单片机</font>P4口使用
单片机有源蜂鸣器驱动之效率编程
蜂鸣器是很常见的设备,分为无源和有源两种。根据项目需求选择不同类型的蜂鸣器。最近的项目里有用到有源蜂鸣器对有源蜂鸣器。还是老一套,把电路板画完,接着编程。 在项目中原理图如下: 如果不能保证I/O的输出性能可以根据情况增加上拉或者下拉电阻。 切入正题:在程序里面这个蜂鸣器的驱动就是个高低电平驱动。高电平三极管导通、蜂鸣器发声,低电平三极管关断、蜂鸣器不发声。这的确很简单,程序上最开始我是这样写的: 当然,如果单片机没有很好的I/O跳变函数也可以这样修改: 这里稍作解释: 1) 函数功能:蜂鸣器发声驱动 传入参数:蜂鸣器发声的次数 2) 传入的次数cnt需要再函数内翻倍。这是因为传入的
[单片机]
<font color='red'>单片机</font>有源蜂鸣器驱动之效率编程
SPI总线在51单片机系统中的实现
1 引言 SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI
[单片机]
SPI总线在51<font color='red'>单片机</font>系统中的实现
基于单片机的超声波测距系统的研究与设计
电子科技 南京工程学院通信工程学院 沙爱军   在日常生产生活中,很多场合如汽车倒车、机器人避障、工业测井、水库液位测量等需要自动进行非接触测距。超声波是指频率大于20 kHz的在弹性介质中产生的机械震荡波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点,因此常被用于非接触测距。由于超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格也能得到很好的折衷。   为此,文中尝试以单片机AT89S52为核心,利用一对40 kHz压电超声传感器设计一款体积较小、价格低廉、精度较高、具有温度补偿、实时LCD显示和报警的超声波测距仪。   1 超声波测距原理   超声波传感器
[单片机]
基于<font color='red'>单片机</font>的超声波测距系统的研究与设计
采用单片机和CPLD器件实现仿人手臂形假肢控制系统的设计
假肢是人体缺损肢体的替代物,用以弥补缺损肢体的形状和功能。本文针对失去整个手臂的情况,设计出一种仿人手臂形假肢的控制系统。使用者可以补偿部分缺失的功能,达到生活自理甚至于可以从事基本劳动,减少身心痛苦,同时也相应地解放了护理工作用。在设计中,采用C8051F020单片机作为主控制器,并通过CPLD(Complex Programmable Logic Device)完成对各个关节控制量的检测以及凌阳61单片机实现语音控制功能。 1、 机器人假肢结构 多自由度机器人型假肢(上肢)拥有6个自由度,其结构原理图如图1所示。 2、 假肢控制系统的硬件设计 2.1 控制器的工作原理 控制系统原理框图如图2所示,主要由控制、驱动、被控
[单片机]
采用<font color='red'>单片机</font>和CPLD器件实现仿人手臂形假肢控制系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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