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

  • 格式:doc
  • 大小:370.00 KB
  • 文档页数:4

下载文档原格式

  / 4
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

先上原理图:

洞洞板布局图:

然后就是实物图了:

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

#include"reg52.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 ReadT emperature()

{

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

{

ReadT emperature();

wenduxianshi();

}

}