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

📄 1602lcm.c

📁 麦迪工作室51开发板温度显示的驱动代码
💻 C
字号:
/**********************************************************************************
名称:    DS18B20+1602LCD温度计
显示器件:1602LCD
分辨率:  0.125摄氏度
测温范围:0~125摄氏度

知识重点:1。1-wire的驱动(18B20的读写)
           2。16进制数到10进制数的转换
          3。1602LCD显示 自定义字符

 >>>>>>>>>这是个简单的程序,没有设计零下温度的转换和显示,等日后再完善
*******************************************************************************/
#include <at89x51.h>
//#include <reg51.h>
#include <string.h>

sbit DQ =P1^4;
typedef int byte;
typedef unsigned int  word;
void Read_Temp(void);
void mychar(char,char);

#define LED_SET P2
//#define LED_OE	P3_6
#define LED_ON 0
#define LED_OFF 1
#define LED_DAT P0

void Delay5Ms(void);
void Delay400Ms(void);
byte read_byte(void);
void delay(word useconds);
void write_byte(char val);
unsigned char Tc[2] = {0x63,0x39};
unsigned play_bit[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //0~~9段码  //0~~9段码
//unsigned char seg1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //加点的 //0~~9段码  //0~~9段码
unsigned char ct[8];
union{byte c[8]; int x;} temp;


led_disp(unsigned char num,unsigned char vdata,unsigned char on_switch) //on_switch = 0 ,开,on_switch = 1,关
{
		P2 = ~play_bit[num-1];
		if(on_switch)
			P0 = 0;
		else
			P0 = vdata;
		delay(200);
		P0 =0x0;
}


void main(void)
{ 
	int i;
//	LED_OE = LED_ON;
	while(1)
 	{
		Read_Temp();

		for(i=0;i<500;i++)
		{
			led_disp(6,seg[ct[4]],0);
			led_disp(5,seg[ct[3]] | 0x80 ,0);
			led_disp(4,seg[ct[2]],0);
			led_disp(3,seg[ct[1]],0);
			led_disp(2,Tc[0],0);
			led_disp(1,Tc[1],0);
		}
	}
}


//***************** 18B20驱动程序 ******************
//延时
void delay(word useconds)
{
  for(;useconds>0;useconds--);
}

//复位
byte ow_reset(void)
{
  byte presence;
  DQ = 0; //拉低总线
  delay(35); // 保持低电平 480us
  DQ = 1; // 释放总线
  delay(3); // 等待应答
  do{
  presence = DQ; // 读取总线状态
  }while(presence);
  delay(25); // 
  return(presence); // 返回状态标志 0:18B20正常存在 1:不正常
}    
//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
  byte i;
  byte value = 0;
  for (i=8;i>0;i--)
  {
    value>>=1;
    DQ = 0; 
    DQ = 1;
//    delay(1);   
    if(DQ)value|=0x80;
    delay(6); 
  }
  return(value);
}

//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
  byte i;
  for (i=8; i>0; i--) 
  {
    DQ = 0; 
    DQ = val&0x01;
    delay(5); 
    DQ = 1;
    val=val/2;
  }
  delay(5);
}

//读取温度
void Read_Temp(void)
{
  unsigned char i;
  unsigned int x;


  //以下这段程序可以改变18B20的分辨率 
  ow_reset();        //复位
  write_byte(0xcc);  //跳过Rom
  write_byte(0x4e);  //写暂存器
  write_byte(0x02);  //写TH 
  write_byte(0x01);  //写TL
  write_byte(0x1f);  //写结构寄存器
  ow_reset();       //复位
  write_byte(0xcc); //跳过Rom 
  write_byte(0x48); //把暂存器内容写到EPRam中


  ow_reset();
  write_byte(0xCC); // Skip ROM
  write_byte(0x44); // 启动18B20开始转换温度,结果存入暂存器中
  Delay400Ms(); //Delay400Ms();
  
  ow_reset();
  write_byte(0xCC); //Skip ROM
  write_byte(0xbe); // 读取暂存器的内容
  temp.c[1]=read_byte(); //低8位
  temp.c[0]=read_byte(); //高8位
  //ctemp=(temp.c[1]>>4)|(temp.c[0]<<4);
  //temp.c[2]=read_byte(); 
  //temp.c[3]=read_byte(); 
  //temp.c[4]=read_byte(); 
  //temp.c[5]=read_byte(); 
  //temp.c[6]=read_byte(); 
  //temp.c[7]=read_byte(); 
  x=(temp.c[0]*256+temp.c[1])*62.5; 
  for(i=0;i<8;i++)
       {
         ct[i]=0;
       }
  i=0;
  while(x/10)
   {
    ct[i]=x%10;
    x=x/10;
    i++;
   }
  ct[i]=x;
}






//5ms延时
void Delay5Ms(void)
{
 unsigned int TempCyc = 5552;
 while(TempCyc--);
}

//400ms延时
void Delay400Ms(void)
{
 unsigned char TempCycA = 5;
 unsigned int TempCycB;
 while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
};
}

⌨️ 快捷键说明

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