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

首先说下我所用到的主要器件器件: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<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<

由于最近时间比较忙,这里过多的话就不说了。

你可能感兴趣的:(linux内核及驱动开发)