文档库 最新最全的文档下载
当前位置:文档库 › DSB 单片机数码管显示原理图和程序

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

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

最近天气热了,想要是做个能显示温度的小设备就好了,于是想到DIY个电子温度计,网上找了很多资料,结合自己的材料,设计了这个用单片机控制的实时电子温度计。作为单片机小虾的我做这个用了2天时间,当然是下班后,做工不行见谅了。

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

先上原理图:

洞洞板布局图:

然后就是实物图了:

附上源程序:程序是别人写的,我只是自己修改了下,先谢谢原程序者的无私奉献。

#include

eg52.h

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^4; //温度数据口

sbit wx1=P2^0; //位选1

sbit wx2=P2^1; //位选2

sbit wx3=P2^2; //位选3

sbit wx4=P2^3; //位选4

unsigned int temp, temp1,temp2, xs;

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

}

void Init_DS18B20()

{

unsigned char x=0;

DQ = 1; //DQ复位ds18b20通信端口

delay(8); //稍做延时

DQ = 0; //单片机将DQ拉低

delay(80); //精确延时大于480us

DQ = 1; //拉高总线

delay(4);

x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败delay(20);

}

/***********ds18b20读一个字节**************/

uchar ReadOneChar()

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DQ = 0; // 高电平拉成低电平时读周期开始

dat>>=1;

DQ = 1; // 给脉冲信号

if(DQ)

dat|=0x80; //

delay(4);

}

return(dat);

}

/*************ds18b20写一个字节****************/ void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

for (i=8; i>0; i--)

{

DQ = 0; //从高电平拉至低电平时,写周期的开始

DQ = dat&0x01; //数据的最低位先写入

delay(5); //60us到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();

temp1=b<<4; //高8位中后三位数的值

temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位数的值temp1室温整数值

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_x0010_]+0x80; //显示十位就显示小数点了。0x80加上delay1(5);

wx2=1;

wx3=0;

//显示个位P0=table[xs_x0010_];

delay1(5);

wx3=1;

wx4=0;

//显示C 字符P0=table[12];

delay1(5);

wx4=1;

}

void main()

相关文档