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