当前位置:文档之家› DS18B20单片机数码管显示原理图和程序

DS18B20单片机数码管显示原理图和程序

最近天气热了,想要是做个能显示温度的小设备就好了, 于是想到DIY 个电子温度计,
网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。

作为单
片机小虾的我做这个用了 2天时间,当然是下班后,做工不行见谅了。

主要元件用到了单片机
STC89C54RD+ , DB18B20温度传感器,4为共阳数码管,
PNPS8550三极管等。

先上原理图:
洞洞板布局图:
然后就是实物图了:
函8D P3 iW 、
E E
FJ T I RF
D51*BZ0渥度澈码管显示
F7 Dl'AI>D li'A£> I 2、心
PDRM, 杖心P0WAD7
Pl I^TO
洋心EI^AJ D FLSAH
附上源程序:程序是别人写的,我只是自己 修改了下,先谢谢原程序者的无私奉献。

#include"reg52.h”
#define uchar unsigned char #define uint unsigned int
sbit DQ=P3A 4; 〃温度数据口
sbit wx1=P2A0; sbit wx2=P2A1; sbit wx3=P2A2; sbit wx4=P2A3;
unsigned int temp, temp1,temp2, xs;
//位选1 //位选2 //位选3 //位选4
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6};
/****** 延时程序 *******/ void delay1(unsigned int m)
{
unsigned int i,j; for(i=m;i>0;i--) for(j=110;j>0;j--); }
void delay(unsigned int m) {
while(m--);
}
/***********ds18b20 uchar ReadOneChar() {
unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) {
读一个字节 **************/
void Init_DS18B20() { unsigned char x=0;
DQ = 1; //DQ 复位 delay(8); 〃稍做延时 DQ = 0; 〃单片机将 ds18b20通信端口 DQ 拉低
delay(80); //精确延时大于480us DQ = 1;
delay(4); x=DQ; delay(20); } 〃拉高总线
//稍做延时后如果x=0则初始化成功 x=1
则初始化失败
〃共阳数码管
〃温度延时程序
DQ = 0; //高电平拉成低电平时读周期开始 dat>>=1; DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; // delay(4); } return(dat); }
void WriteOneChar(unsigned char dat) {
unsigned char i=0; for (i=8; i>0; i--) {
DQ = 0; //从高电平拉至低电平时,写周期的开始 DQ = dat&0x01; //数据的最低位先写入
delay(5); //60us 至U 120us 延时
DQ = 1;
dat>>=1; //从最低位到最高位传入
读取 ds18b20 当前温度 ************/ void ReadTemperature()
{
unsigned char a=0; unsigned b=0; unsigned t=0; Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作 /
WriteOneChar(0x44); // 启动温度转换 delay(5); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读 9个寄存器)
前两个就是温度/
delay(5);
a=ReadOneChar(); 〃读取温度值低位
/
b=ReadOneChar();
〃读取温度值高位
/
/*************ds18b20
写一个字节 ****************/ /**************
〃高8位中后三位数的值
〃低8位中的高4位值加上高8位中后三位数的值 tempi
temp2=a&0x0f; 〃小数的值
temp=((b*256+a)>>4);
〃当前采集温度值除 16得实际温度值 zhenshu
xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示 xs 小数 xiaoshu
void wenduxianshi() (
wx1=0;
P0=table[temp/10];
〃显示百位
delay1(5); wx1=1; wx2=0; P0=table[temp%10]+0x80; 〃显示十位 加上0x80就显示小数
点了。

delay1(5); wx2=1; wx3=0; P0=table[xs%10]; 〃显示个位 delay1(5); wx3=1; wx4=0; P0=table[12]; //显示 C 字符 delay1(5); wx4=1; }
void main()
(
while(1) (
ReadTemperature(); wenduxianshi();
temp1=b<<4;
temp1+=(a&0xf0)>>4; 室温整数值。

相关主题