问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-25 18:29

我来回答

4个回答

热心网友 时间:2023-09-25 08:47

/*
必要操作:连接传感器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;
}

热心网友 时间:2023-09-25 08:48

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); 

}

热心网友 时间:2023-09-25 08:48

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

热心网友 时间:2023-09-25 08:49

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit leden=P3^4;
sbit ledrs=P3^5;
sbit ledrw=P3^6;
sbit al=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;
 al=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);
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
狗患肠炎怎么治 狗狗结肠炎症状及治疗(便秘性结肠炎的症状及治疗) 【干货】如何翻译商务英语中的数词 一年级数量词组成的短语 abs和pp材质食用哪个好 abs塑料是食品级的吗 食品级abs塑料宝宝可以用吗 把实际长度扩大400倍后画在图纸上,比例尺是400:1.___(判断对错) 原来图纸的比例尺是1:1000000,把图纸放大16倍新图的比例尺是多少? 把实际长度扩达400倍后画在图纸上,比例尺是1:400? ( ) 对或错 把实际距离缩小500倍后画在图纸上,比例尺为500:1.___.(判断对错) DS18B20 与51单片机 怎么用 ? 51单片机驱动1602 程序 51单片机液晶高手进 谁有51单片机彩色液晶程序的详解啊??? 51单片机连接LCD 51单片机LCD显示 鸿蒙系统怎么读取u盘,华为Mate20? 怎么能让电脑读取U盘系统 求51单片机程序 51单片机水滴 51单片机怎么休眠 单片机液位控制 怎么用1.5v的电池给51单片机供电(单片机上有液晶)? 51单片机的 怎么学 最快 深入学习51单片机 51单片机该怎么学? 我想用51系列单片机显示水压,谁能帮帮我 在下想做一个基于51单片机的液位监测系统。但情况比较特殊在下又才疏学浅,故来请教各位高手。 51单片机连接两个液位传感器需要一块还是两块AD转换器 基于51单片机的红外感应泵液器的设计 奥尔良鸡丁的做法,奥尔良鸡丁怎么做好吃,奥尔 有没有功能强大的PDF编辑器,要能编辑文字,图片,表格的,最好是中文的? pdf格式的图片怎么编辑要用什么软件才能编辑 用什么软件能修改PDF图片 有什么pdf阅读软件可以直接修改图片内容呢 把图片转换成PDF,用什么软件可以编辑转好的PDF文件? 用什么软件可以编辑PDF里的矢量图最好的,图片都是些油路或电路图的图片... 由图片生成的PDF怎样可以修改呢,用什么软件呢? 红酒浇花的正确方法是什么? 图片格式的PDF文件直接转换成可编辑的文件的软件 变质的自酿葡萄酒可以用来浇花吗 iphonex国行什么时候上市? 电脑机械硬盘无法读取 微信公众平台误删素材怎么恢复? 汽车后备箱加装尾翼打了孔,现在要拆尾翼,打的那个孔怎么处理? 高尔夫6原装尾翼打孔后怎么恢复原貌? 汽车装尾翼后备箱打了三个螺丝洞怎么修 朗动尾翼打了孔还可以换别的尾翼吗 加装的尾翼在高速公路上被风吹掉了砸到了别人的车保险公司会赔对方的车辆吗? 安装尾翼时在后备箱盖上打孔,怎么修复孔