-55~125℃温度显示 精度0.1℃
功能:
(1)使用单片机对DS18B20温度传感器进行读取得到温度值
(2)使用74hc573锁存器驱动数码管的断码显示
(3)使用74hc138译码器选择数码管
(4)增加了传感器状态监测,如果传感器连接异常则显示检测动画
显示特点:
(1)数字默认显示整数两位和小数一位,也就是温度可以精确到0.1℃
(2)当前温度为零下是,温度前自动添加符号,非零下时则不显示
(3)默认显示为两位整数,当温度大于100摄氏度时,会增加到三位。
展示图片如下:
零下55℃显示
125℃显示
检测DS18B20
精确0.1℃显
单片机源程序如下:
- /*********************************************
- 程序功能:使用74H573锁存器和138译码器共同完成8位数码管温度显示
- 138译码器的真值表:
- C B A 数码管位
- 0 0 0 1
- 0 0 1 2
- 0 1 0 3
- 0 1 1 4
- 1 0 0 5
- 1 0 1 6
- 1 1 0 7
- 1 1 1 8
- 程序公开,共师兄习
- 如有错误,敬请纠正
- *********************************************/
- #include "DS18B20.h"
- /*138译码器管脚定义*/
- sbit LSA = P2^0; //定义138译码器管脚A
- sbit LSB = P2^1; //定义138译码器管脚B
- sbit LSC = P2^2; //定义138译码器管脚C
- /*数码管字码定义*/
- uchar code table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x58,0X40}; //共阴极数码管字段
- /*带点*/
- uchar code table_bit[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
- uchar G,S,BAI,Q;
- int num = 0;
- void count(void);
- void display(void);
- void delay(uint z);
- void DS18B20_Chack(void);
- void SMG_Channel(uchar x);
- void main(void)
- {
- uint i;
- while(1)
- {
- i++;
- delay(5);
- if(i%40 == 0)
- {
- num = ReadTemperature(); //读取一次温度
- if(num<0) //判断是否为负数
- num = -num; //转成整数
- }
- DS18B20_Chack();
- count(); //计算
- display(); //显示
- }
- }
- void count(void) //把每一位数字都单独存到一个变量中
- {
- G = num%10;
- S = num/10%10;
- BAI = num/100%10;
- Q = num/1000%10;
- }
- void display(void)
- {
- uchar x = 1;
- /*********正负号*********/
- if(temp_flag) //温度为正不显示 1正
- {
- P0 = 0X00;
- SMG_Channel(x);
- P0 = table[11];
- delay(1);
- }
- else x=x-1;
- /********百位**********/
- if(Q)
- {
- x=1;
- P0 = 0X00;
- SMG_Channel(x);
- P0 = table[Q];
- delay(1);
- }
- /*********十位*********/
- P0 = 0X00;
- SMG_Channel(x+1);
- P0 = table[BAI];
- delay(1);
- /*********个位*********/
- P0 = 0X00;
- SMG_Channel(x+2);
- P0 = table_bit[S];
- delay(1);
- /*********小数点后一位*********/
- P0 = 0X00;
- SMG_Channel(x+3);
- P0 = table[G];
- delay(1);
- /*********温度符号*********/
- P0 = 0X00;
- SMG_Channel(x+4);
- P0 = table[10];
- delay(1);
- }
- /********延时函数*********/
- void delay(uint z)
- {
- uint x,y;
- for(x=0;x<z;x++)
- for(y=0;y<123;y++);
- }
- /********监测DS18B20的在线情况*********/
- void DS18B20_Chack(void)
- {
- while(DS18B20_Init()) //监测DS18B20是否在线
- {
- uchar a;
- for(a = 1;a <= 8;a++)
- {
- P0 = 0X00;
- SMG_Channel(a);
- P0 = table[11];
- delay(100);
- }
- }
- }
- /********数码管的选择*********/
- void SMG_Channel(uchar x)
- {
- switch(x)
- {
- case 1: LSA = 0;LSB = 0;LSC = 0; break;
- case 2: LSA = 1;LSB = 0;LSC = 0; break;
- case 3: LSA = 0;LSB = 1;LSC = 0; break;
- case 4: LSA = 1;LSB = 1;LSC = 0; break;
- case 5: LSA = 0;LSB = 0;LSC = 1; break;
- case 6: LSA = 1;LSB = 0;LSC = 1; break;
- case 7: LSA = 0;LSB = 1;LSC = 1; break;
- case 8: LSA = 1;LSB = 1;LSC = 1; break;
- default: break;
- }
- }
复制代码
所有资料51hei提供下载:
DEMO_8SMG_74H573 74LS138 DS18B20.zip
(2.2 MB, 下载次数: 77)
|