标题:
单片机数字温度计程序与实物图
[打印本页]
作者:
侯学师
时间:
2018-1-9 21:37
标题:
单片机数字温度计程序与实物图
数字温度计实物图:
QQ图片20180107202830.jpg
(54.82 KB, 下载次数: 26)
下载附件
2018-1-9 21:34 上传
单片机源程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;
sbit lcden=P2^1; //液晶使能端
sbit DATA=P3^7; //ds18b20接口
uchar FLAG_DIS=0;
uchar bai_18b20,shi_18b20,ge_18b20,num;//定义变量
bit flag_Negative_number;//负数标志
uchar code table[]="temperature";
/****一毫秒定时*****/
void delay_ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/****延时子程序*****/
void delay(uint num)
{
while(num--);
}
/*****液晶写命令****/
void write_lcd_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}
/****液晶写数据*******/
void write_lcd_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay_ms(1);
lcden=1;
delay_ms(1);
lcden=0;
}
/*****液晶初始化******/
void lcd_init()
{
write_lcd_com(0x38);
write_lcd_com(0x0c);
write_lcd_com(0x06);
write_lcd_com(0x01);
}
/*****18b20温度传感器函数*****/
void Init_DS18B20(void)//初始化ds18b20
{
uchar x=0;
DATA=1; //DQ复位
delay(10); //稍作延时
DATA=0; //单片机将DQ拉低
delay(80); //精确延时大于480us
DATA=1; //拉高总线
delay(20);
x=DATA; //稍作延时后如果x=0则初始化成功x=1则初始化失败
delay(30);
}
/****温度传感器读一个字节****/
ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DATA=0; //给脉冲信号
dat>>=1;
DATA=1; //给脉冲信号
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
/*****温度传感器写一个字节*****/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8;i>0;i--)
{
DATA=0;
DATA=dat&0x01;
delay(10);
DATA=1;
dat>>=1;
}
delay(8);
}
/********读取温度传感器************/
int ReadTemperature(viod)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序列号的操作
WriteOneChar(0xBE);//读取温度寄存器前两个是温度
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读低8位
t=b;
t<<=8;
t=t|a; //两个字节合成一个整形变量
if(b&0x80)
{
t=~t+1;
flag_Negative_number=1;
}
else
{flag_Negative_number=0;}
tt=t*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度所以读回数据的最低位代表的是0.0625度
t=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可现显示数字,同时进行一个四舍五入操作
return(t);
}
/******液晶显示温度*********/
void dis_DS18B20(void)
{
int temp;
temp=ReadTemperature(); //读温度
bai_18b20=temp%1000/100; //显示十位
shi_18b20=temp%100/10; //显示个位
ge_18b20=temp%10; //显示十分位
if(flag_Negative_number) //负数
{
if(bai_18b20==0)//十位为 0,则不显示十位
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x2D);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
else
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x2D);
write_lcd_date(0x30+bai_18b20);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
}
else //正数
{
if(bai_18b20==0) //十位为0.则不显示
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x2E);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
else
{
write_lcd_com(0x80+0x40);
write_lcd_date(0x30+bai_18b20);
write_lcd_date(0x30+shi_18b20);
write_lcd_date(0x2E);
write_lcd_date(0x30+ge_18b20);
write_lcd_date(0xDF);
write_lcd_date(0x43);
}
}
}
void main()
{
lcd_init();
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;//开启中断
write_lcd_com(0x80);
for(num=0;num<11;num++)
{
write_lcd_date(table[num]);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
新建 Microsoft Word 97 - 2003 文档.doc
(28.5 KB, 下载次数: 17)
2018-1-9 21:37 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
chenpeng
时间:
2018-4-7 12:10
真的能用吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1