⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARM7 lpc2148通过DS18B20温度采集并通过1602显示
💻 C
字号:
//#include <iolpc2138.h>
#include "config.h"
#include "lcmdrv.h"

#include <math.h> 
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
/*
********************************************************************************
*程序内容:DS18B20温度数据采集程序,通过LPC2148 CPU的P0.0引脚可以控制并读取数字
*          温度传寒气内的温度值;DS18B20与ARM连及时,注意:DS18B20采用三线连接方式!
*          即:VCC接+5V,GND接”地“,DQ接P0.0引脚,并且此引脚上还应并有4.7K电阻,
*          此电阻接+5V电源
*完成日期:07-08-23
*作    者:BEAR19
*联系方式:tjrfyty@163.com
*注    意:此程序源代码系MSC-8052单片机移植而成!
********************************************************************************
*/
/*
********************************************************************************
*模块名称:变量宏定义
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
#define uchar unsigned char
#define uint unsigned int
#define DAOUT_1 IO0SET|=0x00010000; 
#define DAOUT_0 IO0CLR|=0x00010000; 
#define DAIN    IO0PIN
uchar TEMP;							// 温度值的变量;
uchar flag1;							// 结果为负和正的标志位
//unsigned char uctech[] = {"welcome!"};
char uctech[15]={0,};
/*
********************************************************************************
*模块名称:头函数声明
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
void delay (unsigned int count);
void tmreset (void);
int tmpread (void);
unsigned char tmpread2 (void);
void tmpwrite (unsigned char dat);
void tmpchange(void);
void tmp (void);
void Inittmp (void);
/*
*********************************************************************************************************
** 函数名称 :DelayNS()
** 函数功能 :长软件延时。
** 入口参数 :dly	延时参数,值越大,延时越久
** 出口参数 :无
*********************************************************************************************************
*/
void DelayNS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<50000; i++);
}
#define	UART_BPS	9600				// 串口通讯波特率
/*
*********************************************************************************************************
** 函数名称 :UART0_Init()
** 函数功能 :串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率115200。
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_Init (void)
{
	uint16 Fdiv;
	
	U0LCR = 0x83;						// DLAB=1,允许设置波特率
	Fdiv  = (Fpclk / 16) / UART_BPS;	// 设置波特率
	U0DLM = Fdiv / 256;
	U0DLL = Fdiv % 256;
	U0LCR = 0x03;
}
/*
*********************************************************************************************************
** 函数名称 :UART0_GetByte()
** 函数功能 :从串口接收1字节数据,使用查询方式接收。
** 入口参数 :无
** 出口参数 :接收到的数据
*********************************************************************************************************
*/
uint8 UART0_GetByte (void)
{
	uint8 rcv_dat;
	
	while ((U0LSR & 0x01) == 0);
	rcv_dat = U0RBR;
	
	return (rcv_dat);	
}
/*
*********************************************************************************************************
** 函数名称 :UART0_GetStr()
** 函数功能 :从串口接收
** 入口参数 :	s	指向接收数据数组的指针
**				n	接收的个数
** 出口参数 :	无
*********************************************************************************************************
*/
void UART0_GetStr (uint8 *s, uint32 n)
{
	for ( ; n>0; n--)
	{
		*s++ = UART0_GetByte();
	}
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendByte()
** 函数功能 :向串口发送字节数据,并等待发送完毕,查询方式。
** 入口参数 :dat	要发送的数据
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendByte (uint8 dat)
{
	U0THR = dat;
	while ((U0LSR & 0x40) == 0);		// 等待数据发送完毕
}
/*
*********************************************************************************************************
** 函数名称 :UART0_SendStr()
** 函数功能 :向串口发送一字符串
** 入口参数 :str	要发送的字符串的指针
** 出口参数 :无
*********************************************************************************************************
*/
void UART0_SendStr (uint8 const *str)
{
	while (1)
	{
		if (*str == '\0')	break;		// 遇到结束符,退出
		UART0_SendByte(*str++);			// 发送数据
	}
}

#define MAX_TBUF	1000
static char tbuf[MAX_TBUF]= {0, };
/*
*********************************************************************************************************
** 函数名称 :UART0_Printf()
** 函数功能 :
** 入口参数 :
** 出口参数 :
*********************************************************************************************************
*/
void UART0_Printf(char *fmt,...)
{
	/*
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(string);
    va_end(ap);
    */
    
    va_list v_list;
	char *ptr;
	int i= 0;


	va_start(v_list, fmt);     // Initialize variable arguments. 
	vsprintf(tbuf, fmt, v_list ); 
	va_end(v_list);


	ptr= tbuf;
	while( (*ptr) && i<MAX_TBUF) {
		UART0_SendByte(*ptr);
		ptr++;	i++;
	}//while
}
/*
********************************************************************************
*模块名称:主函数
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
int main(void)
{
 // char nu;
  float i=12.34;
  PINSEL0 =PINSEL0|0x00000005;				// 设置I/O连接到UART0
  UART0_Init();						// 串口初始化
  LCM_DispIni();
 // delay(10000000);
//  Inittmp();
//  delay(10000000);
   while(1)
  {	
  //   sprintf(uctech,"%.2f",i);
  //   LCM_WriteString(1,0,uctech);
     
 //    nu=UART0_GetByte();
  //  LCM_WriteString(1,0,uctech);
     UART0_Printf("Begin....");
     delay(1000000);
     tmpchange();						// 开始温度转换
     delay(1000000);						// 读取延时
     tmp();						    //读取温度
    

   }
 	
  return 0;
}
/*
********************************************************************************
*模块名称:delay
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
void delay (unsigned int count)
{									
  unsigned int i;	
  while (count)	
  {
   for(i=0;i<9;i++);
    count--;
    }
  }
/*
********************************************************************************
*模块名称:DS18B20复位初始化函数
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
void tmreset (void)						// 发送复位和初始化
{
 // unsigned int i;
  IO0DIR|=0x00010000;                                            //I/O口P0.10引脚为输出引脚
  DAOUT_0;	
  delay(500);         					// 延时
  
  DAOUT_1;
  delay(100);
  IO0DIR=IO0DIR&(~0x00010000); 
  while(IO0PIN&0x00010000);
  
  delay(500);	
  }
/*
********************************************************************************
*模块名称:DS18B20数据采集函数1
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/

int tmpread (void)						// 读取数据的一位
{ 
 // unsigned int i=0;
  int dat;
   IO0DIR|=0x00010000;  
                                            //I/O口P0.10引脚为输出引脚
  DAOUT_0;
  delay(2);
  
  DAOUT_1;
  delay(15);						        //延时
  
  IO0DIR=IO0DIR&(~0x00010000);                   //I/O口P0.10引脚为输入引脚
  dat = DAIN;	
   delay(80);
  return (dat);
  }
/*
********************************************************************************
*模块名称:DS18B20数据采集函数1
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
unsigned char tmpread2 (void) 			 		//读一个字节
{
  unsigned char i,dat;	
  
  dat = 0;	
  for (i=0;i<8;i++)
  {    
    if(tmpread()&0x00010000)
    	dat|=(1<<i);
  //  UART0_Printf("\ndat=0x%x\n",dat);	
    
    }
  return (dat);
  }	
/*
********************************************************************************
*模块名称:DS18B20写入数据函数
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
void tmpwrite (unsigned char dat)				//写一个字节
{   
 
  unsigned char j;

  IO0DIR|=0x00010000;	
  for (j=0;j<8;j++)
   {	       
         DAOUT_0;			
         delay(5);
         if((dat & (1<<j)))	
         	DAOUT_1;
         delay(80);
         
         DAOUT_1;
         delay(20);
                  
    }
  }
/*
********************************************************************************
*模块名称:DS18B20数据转换函数
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
void tmpchange(void)						// ds1820 开始转换
{  
  tmreset ();							// 复位

  delay (10);							// 延时
  tmpwrite (0xcc);						// 跳过序列号命令
  delay(10000);
  tmpwrite (0x44); 						// 发转换命令 44H,	
   delay(10000);
  }
/*
********************************************************************************
*模块名称:DS18B20温度值读取函数
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
void tmp (void)							// 读取温度
{ 
  unsigned char a,b,c,d,e;
  unsigned int t1=0;
  float t;
  tmreset ();							// 复位
 
  tmpwrite (0xcc); 						// 跳过序列号命令
 delay(10000);
  tmpwrite (0xbe); 						// 发送读取命令
 delay(10000);
  a = tmpread2();						// 读取低位温度	
  b = tmpread2();  					//读取高位温度	
   c = tmpread2();
    d = tmpread2();
    e= tmpread2();
//  UART0_Printf("\na=0x%x--b=0x%x--c=0x%x--d=0x%x--e=0x%x\n",a,b,c,d,e);
           t1=b<<4;
          t1= a|(t1<<4);
         // UART0_Printf("\nt1=0x%x",t1);
          t=t1*0.0625;
          
          sprintf(uctech,"%.4f",t);
               LCM_WriteString(1,0,uctech);
               
                   //  tmreset ();
    //  tmpwrite(0xCC);
    //  tmpwrite(0x48);
  }
/*
********************************************************************************
*模块名称:DS18B20 ROM器件序列号读取函数
*完成日期:07-08-23
*修改内容:none
********************************************************************************
*/
void rom(void)							// 读取器件序列号子程序
{
  tmreset ();							//复位

  tmpwrite(0x33);						//发送读序列号子程序
  }     

void Inittmp (void)
{
 tmreset ();
  tmpwrite(0xCC);	

   tmpwrite(0x4E);

    tmpwrite(0x64);	

    tmpwrite(0x8A);	

      tmpwrite(0x3F);
      
	tmpwrite(0x48);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -