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

📄 text1.c

📁 这是一个温度采集试验
💻 C
字号:
#include"reg51.h"

//*******************LCD模块

#define LCD_DATA P1        //LCD的数据口

sbit LCD_BUSY=LCD_DATA^7;  //LCD忙信号位

sbit LCD_RS=P0^0;          //LCD寄存器选择
sbit LCD_RW=P0^1;          //LCD读写控制
sbit LCD_EN=P0^2;          //LCD使能信号


void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢
{
 while(1)
  {
   LCD_EN=0;
   LCD_RS=0; //指令寄存器通信
   LCD_RW=1;  //read data
   LCD_DATA=0xff;
   LCD_EN=1;
   if(!LCD_BUSY)break;
  }
 LCD_EN=0;
}

void LCD_cls(void)          //LCD清屏
{
 
 LCD_check_busy();
 LCD_RS=0;
 LCD_RW=0;
 LCD_DATA=1;
 LCD_EN=1;
 LCD_EN=0;
 
}

void LCD_write_instruction(unsigned char LCD_instruction)   //写指令到LCD
{
 LCD_check_busy();
 LCD_RS=0;
 LCD_RW=0;	//写数据
 
 LCD_DATA=LCD_instruction;
 LCD_EN=1;
 LCD_EN=0;
 }

void LCD_write_data(unsigned char LCD_data)      //输出一个字节数据到LCD
{
 LCD_check_busy();
 LCD_RS=1;
 LCD_RW=0;
 
 LCD_DATA=LCD_data;
 LCD_EN=1;
 LCD_EN=0;
 }
 
void LCD_set_position(unsigned char x)            //LCD光标定位到x处
{
LCD_write_instruction(0x80+x);
}





void LCD_printc(unsigned char lcd_data)          //输出一个字符到LCD
{
 LCD_write_data(lcd_data);
}

void LCD_prints(unsigned char *lcd_string)       //输出一个字符串到LCD
{
 unsigned char i=0;
 while(lcd_string[i]!=0x00)
  {
   LCD_write_data(lcd_string[i]);
   i++;
  } 
}

void LCD_initial(void)                        //初始化LCD
{
 LCD_write_instruction(0x3c);
 LCD_write_instruction(0x0c);
 LCD_write_instruction(0x06);//显示屏一定要不移动。
 LCD_cls();
}
//*************************LCD模块结束

 //*******************************ds18b20
unsigned char ds18b20_num1[8]={0x8e,0x00,0x00,0x00,0xb8,0xc5,0x30,0x28};
unsigned char ds18b20_num2[8]={0xb9,0X00,0X00,0x00,0xb8,0Xc5,0X31,0X28};
unsigned char ds18b20_num3[8]={0xe0,0x00,0x00,0x00,0xb8,0xc5,0x32,0x28};
sbit DQ =P3^6;   //定义通信端口

//延时函数

void delay(unsigned int i)
{
 while(i--);
}

//初始化函数
 unsigned char Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(14);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(20);
 return (x);
}

//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(4);
 }
 return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }
//delay(4);
}
unsigned char * read_rom(void)
{
	unsigned char rom[8],i;
	Init_DS18B20();
	WriteOneChar(0x33);
	for(i=8;i>0;i--)
	{
		rom[i-1]=ReadOneChar();
	}
	return &rom[0];
}
bit match_rom(unsigned char *rom)
{
	unsigned char i;
	//Init_DS18B20();
	WriteOneChar(0x55);
	for(i=8;i>0;i--)
	{
		WriteOneChar(*(rom+i-1));
	//	rom++;
	}
	return 1;
}		

//读取温度
ReadTemperature(unsigned char n)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
//WriteOneChar(0xCC); //跳过读序号列号的操作
//if (n==1)  match_rom(ds18b20_num1);
//else if (n==2)  match_rom(ds18b20_num2);
//else if (n==3)  match_rom(ds18b20_num3);
//.......................
//else if (n==0) 
WriteOneChar(0xCC); //跳过读序号列号的操作 
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入---此行没用
return(t);
}
 //****************************************ds18b20结束
 unsigned char TempBuffer[5];
void IntToStr(unsigned int t, unsigned char *str, unsigned char n) 
{
	unsigned char a[5]; char i, j;    //取得整数值到数组                                 	
	a[0]=t/100;   //百位         	
	a[1]=(t/10)%10;//十位                                     	
	a[2]=t%10;    //个位                           	
	                                     	
                                                      
	for(i=0; i<3; i++)         //转成ASCII码              	
		a[i]=a[i]+'0';                                    	
	for(i=0; a[i]=='0' && i<=3; i++);                     	
	for(j=3-n; j<i; j++)       //填充空格                 	
		{ *str=' ';  str++; }                             	
	for(; i<3; i++)                                       	
		{ *str=a[i]; str++; }  //加入有效的数字           	
	*str='\0'; 
} 




main()
{ 
//==读取序列号操作。在1602上显示。
 /*unsigned char i; 
unsigned char *ds1820rom;
  ds1820rom=read_rom();
  LCD_initial();
  LCD_set_position(0);
  for(i=0;i<8;i++)
  {unsigned char a;
   a=(*ds1820rom)/16;
  if(a>=0&&a<=9) a=a+'0';
  else if(a>=0x0a &&a<= 0x0f) a=a-10+'a';
  LCD_printc(a);
  a=(*ds1820rom)%16;
  if(a>=0&&a<=9) a=a+'0';
  else if(a>=0x0a &&a<= 0x0f) a=a-10+'a';
  LCD_printc(a);
  ds1820rom++;
  }
  while(1);*/


unsigned int i,a;
    i=ReadTemperature(3); //读温度

    a=i;
    IntToStr(i,&TempBuffer[0],3);
    LCD_initial();
    LCD_set_position(0);
    LCD_prints("temperature :");
    LCD_set_position(0x40);
    LCD_printc(TempBuffer[0]); 
	LCD_printc(TempBuffer[1]);
	LCD_printc('.');
	LCD_printc(TempBuffer[2]);
	LCD_printc(' ');
	LCD_printc(0xDF);
	LCD_printc('C');
while(1)
 {	i=ReadTemperature(3); 
    if (i!=a )	  //如果有变化
	 {	 a=i;
  	IntToStr(i,&TempBuffer[0],3);
    LCD_initial();
    LCD_set_position(0);
    LCD_prints("temperature :");
    LCD_set_position(0x40);
    LCD_printc(TempBuffer[0]); 
	LCD_printc(TempBuffer[1]);
	LCD_printc('.');
	LCD_printc(TempBuffer[2]);
	LCD_printc(' ');
	LCD_printc(0xDF);
	LCD_printc('C');


	 }
} 	

}
  

⌨️ 快捷键说明

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