51单片机温度传感器ds18b20、lcd1602液晶C程序

stc89c52 答案满意的话再加50分,谢谢

/*
必要操作:连接传感器DS18B20到U6
*/
#pragma db code
#include<AT89X52.H>
#include "INTRINS.H"
#define BUSY1 (DQ1==0) //定义busy信号
sbit LED_0=P1^0; //定义数码管控制脚为P1口的0-3脚
sbit LED_1=P1^1;
sbit LED_2=P1^2;
sbit LED_3=P1^3;
sbit DQ1=P3^5; //定义18B20单总线引脚

void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);//声明显示函数
void ds_reset_1(void); //声明18B20复位函数
void wr_ds18_1(char dat); //声明18B20写入函数
void time_delay(unsigned char time);//声明延时函数
int get_temp_1(void); //声明18B20读入温度函数
void delay(unsigned int x); //声明延时函数
void read_ROM(void); //声明18B20读ROM函数
int get_temp_d(void); //声明获取温度函数
void ds_init(void); //声明18B20初始化函数
void ds_getT(void); //声明18B20获得温度显示值函数
/*定义数码管段码=====0-9=====A-G=====*/
unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F
/****************以下定义各种变量********************/
unsigned char ResultSignal;
int ResultTemperatureLH,ResultTemperatureLL,ResultTemperatureH;
unsigned char ROM[8];
unsigned char idata TMP;
unsigned char idata TMP_d;
unsigned char f;
unsigned char rd_ds18_1();
unsigned int TemH,TemL; //温度的整数部分和小数部分
unsigned int count; //定义小数计算部分
void main()
{

ds_init(); //18B20初始化
while(1)
{
ds_getT(); //使用该函数获得温度,整数部分存储到TemH,小数部分存储到count的低8位
display((TemH/10)%10,TemH%10,((count/10)%10),(count%10));
//温度发送到数码管显示
}
}
/***************18B20初始化函数***********************/
void ds_init(void)
{
unsigned int k=0;
ds_reset_1();
ds_reset_1(); //reset
wr_ds18_1(0xcc); //skip rom
_nop_();
wr_ds18_1(0x7f);
ds_reset_1();
wr_ds18_1(0xcc);
_nop_();
wr_ds18_1(0x44);
for(k=0;k<11000;k++)
time_delay(255);
ds_reset_1();
}
void ds_getT(void)
{
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);
TemH=get_temp_1();
TemL=get_temp_d();
TemH&=0x00ff;
TemL&=0x00ff;
count=(TemH*256+TemL)*6.25;
}
/***************延时程序,单位us,大于10us*************/
void time_delay(unsigned char time)
{

time=time-10;
time=time/6;
while(time!=0)time--;
}

/*****************************************************/
/* reset ds18b20 */
/*****************************************************/
void ds_reset_1(void)
{
unsigned char idata count=0;
DQ1=0;
time_delay(240);
time_delay(240);
DQ1=1;
return;
}

void check_pre_1(void)
{
while(DQ1);
while(~DQ1);

time_delay(30);
}

void read_ROM(void)
{
int n;
ds_reset_1();
check_pre_1();
wr_ds18_1(0x33);
for(n=0;n<8;n++){ROM[n]=rd_ds18_1();}
}

/*****************************************************/
/* Read a bit from 1820 位读取 */
/*****************************************************/
bit tmrbit_1(void)
{
idata char i=0;
bit dat;

DQ1=0;_nop_();

DQ1=1;

_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

dat = DQ1;

time_delay(50);

return dat;
}

/*****************************************************/
/* read a bety from ds18b20 字节读取 */
/*****************************************************/
unsigned char rd_ds18_1()
{
unsigned char idata i,j,dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit_1();
dat=(j<<(i-1))|dat;
}
return dat;
}

/*****************************************************/
/* write a bety from ds18b20 写字节 */
/****************************************************/
void wr_ds18_1(char dat)
{
signed char idata i=0;
unsigned char idata j;
bit testb;

for(j=1;j<=8;j++)
{
testb=dat & 0x01;
dat = dat>>1;
if(testb)
{
DQ1=0;
_nop_();
_nop_();
DQ1=1;
time_delay(60);
}

else
{
DQ1=0;
time_delay(50);

DQ1=1;
_nop_();
_nop_();
}
}
}

int get_temp_1(void)
{
unsigned char idata a=0,b=0;
unsigned char idata i;
EA=0;

ds_reset_1();
check_pre_1();

wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);

ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);

a=rd_ds18_1();
b=rd_ds18_1();

i=b; /*若b为1则为负温 */
i=(i>>4);
if(i==0)
{
f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
if (a>8)
{
TMP=(TMP+1);
}
}
else
{
f=1;
a=a>>4;
b=b<<4;

TMP=(a|b);

TMP=~TMP;
TMP=(TMP+1);
}
EA=1;
return(TMP);
}

int get_temp_d(void)
{
unsigned char idata a=0,b=0;
unsigned char idata i,m;
EA=0;

ds_reset_1();//复位
check_pre_1();

wr_ds18_1(0xcc);
wr_ds18_1(0x44);
while(BUSY1);

ds_reset_1();
check_pre_1();
wr_ds18_1(0xcc);
wr_ds18_1(0xbe);

a=rd_ds18_1();
b=rd_ds18_1();

i=b; /*若b为1则为负温 */
i=(i>>4);

if(i==0)
{
f=0;
TMP=((a>>4)|(b<<4));
a=(a&0x0f);
TMP_d=a;
}
else
{
f=1;
a=~a;
a=(a+1);
b=~b;
b=(b+1);

m=a;
a=a>>4;
b=b<<4;

TMP=(a|b);
m=(m&0x0f);
TMP_d=m;
}

EA=1;
return(TMP_d);
}void delay(unsigned int x)
{
unsigned int i;
for(i=0;i<x;i++);
}
void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)
{
P0=a[d1];
LED_0=0;
delay(100);
LED_0=1;

P0=a[d2] & 0x7f;
LED_1=0;
delay(100);
LED_1=1;

P0=a[d3];
LED_2=0;
delay(100);
LED_2=1;

P0=a[d4];
LED_3=0;
delay(100);
LED_3=1;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-24
LCD1602驱动程序

void delayms(uchar x)

{ uchar j;

    while((x--)!=0)

    {

     for(j=0;j<125;j++)            ;

    }

}


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

/*                                                           */

/*检查LCD忙状态                                              */

/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */

/*                                                           */

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

static bit lcd_busy()

{                          

    bit result;     

    LCD_RS = 0;

    LCD_RW = 1;

    LCD_EN = 1;

    delayNOP();

    result = (bit)(LCD_DB_Port&0x80);

    LCD_EN = 0;

    return(result); 

}

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

/*                                                                 */

/*写指令数据到LCD                                                  */

/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */

/*                                                                 */

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

void lcd_wcmd(uchar cmd)

{                          

   while(lcd_busy());

    LCD_RS = 0;

    LCD_RW = 0;

    LCD_EN = 0;

    _nop_();

    _nop_(); 


    LCD_DB_Port = cmd;


delayNOP();

    LCD_EN = 1;         //上跳沿时输入数据

    delayNOP();

    LCD_EN = 0; 

}

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

/*                                                                 */

/*写显示数据到LCD                                                  */

/*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */

/*                                                                 */

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

void lcd_wdat(uchar dat)

{                          

   while(lcd_busy());

    LCD_RS = 1;

    LCD_RW = 0;

    LCD_EN = 0;


    LCD_DB_Port = dat;


delayNOP();

    LCD_EN = 1;

    delayNOP();         //上跳沿时输入数据

    LCD_EN = 0; 

}

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

/*                                                           */

/* LCD初始化设定                                             */

/*                                                           */

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

void lcd_init()

    delayms(15);                //等待电源稳定    

    lcd_wcmd(LCD_MODE);      //设置显示模式

    delayms(5);

    lcd_wcmd(LCD_MODE);         

    delayms(5);

    lcd_wcmd(LCD_MODE);         

    delayms(5);

    lcd_wcmd(0x0c);      //显示开,关光标

    delayms(5);

    lcd_wcmd(0x06);      //移动光标

    delayms(5);

    lcd_wcmd(0x01);      //清除LCD的显示内容

    delayms(5);

}

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

/*                                                           */

/* 设定显示位置                                              */

/*                                                           */

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

void lcd_PrPos(uchar row,uchar col)

{                          

if(row == 0)

       lcd_wcmd(col | 0x80);     //数据指针=80+地址变量

    if(row == 1)

       lcd_wcmd(col | 0x80 | 0x40); 

}

本回答被网友采纳
第2个回答  2013-08-24

说明一下,这里的18B20加数码管的温度仿真,要是1602需要改一下

第3个回答  2013-08-24

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit leden=P3^4;
sbit ledrs=P3^5;
sbit ledrw=P3^6;
sbit dual=P2^6;
sbit weal=P2^7;
uchar table[]="I Love You!";
uchar table1[]="Believe Me!";
void delay(uchar z)
{
 uchar i,j;
 for(i=z;i>0;i--)
  for(j=110;j>0;j--);
}
void write_com(uchar com)
{
 ledrs=0;
 P0=com;
 delay(5);
 leden=1;
 delay(5);
 leden=0; 
}
void write_date(uchar date)
{
 ledrs=1;
 P0=date;
 delay(5);
 leden=1;
 delay(5);
 leden=0; 
}
void init()
{
 ledrw=0;
 dual=0;
 weal=0;
 leden=0;
 write_com(0x38); //   初始化显示模式
 write_com(0x0f); //   开显示,显示光标并闪烁
 write_com(0x06); //  光标自动移位
 write_com(0x01); //   显示清屏 
}
void main()
{ uint num=0;
 init();
 for(num=0;num<11;num++)
 {
  write_date(table[num]);
  delay(200);
 }
 write_com(0x80+0x40);
 for(num=0;num<11;num++)
 {
  write_date(table1[num]);
  delay(200);
 }

 while(1);
}

相似回答