单片机stc15w通用温度探头ds18b20 接P3^6
显示屏tm1637 4位数码管SCL=P3^1;SDA=P3^0;
晶振11.0592
实测正常 负温度和100度以上显示特殊
当温度大于100度是: 第一位十位 第二位 个位 第三位十分位 第四位显示A
当温度大于0小于100度时:第一位十位 第二位 个位 第三位十分位 第四位百分位
当温度小于0: 第一位十位 第二位 个位 第三位十分位 第四位显示-
实测工作电流0.018A 电压5v
准备再做一个无线串口通信的温度计 有兴趣的留言
制作出来的实物图如下:
单片机源程序如下:
- //单只DS18B20的温度检测,测温范围-55 —— +125度。
- #include "STC15W4K.H"
- #include "DS18b20.h"
- #include "myfun.h"
- #include "TM1637.h"
- unsigned char str[6]; // 最长字符10字节,比如:-123.4567/0
- unsigned char zf;
- //****************温度数据处理函数************************/
- void gettemp() //读取温度值
- {
- unsigned int temp0,temp; // 存放小数、整数、符号,10000倍小数值
- temp=DS18B20_ReadTemperature(); // 从18B20中读取2字节原始温度值
-
- if ((temp&0xf800)!=0) // 如果是负温,将补码取反加1变为原码
- {
- temp=~temp +1;
- zf=1; //负值
- temp0=temp*0.0625*100+0.5;
- }
-
- else //温度>0
- {
- zf=0; //正值
- temp0=temp*0.0625*100+0.5;
- }
- str[1]=temp0 / 10000;
- str[2]=temp0 % 10000 / 1000;
- str[3]=temp0 % 1000 / 100;
- str[4]=temp0 % 100 / 10;
- str[5]=temp0 % 10;
- }
- void xsled(void) //送显示
- {
- SDA=1;
- SCL=1;
- start_IIC(); //调用开始信号
- WriteByte(0x44);//写命令40H(数据设置)
- stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
- switch(zf)
- {
- case 0: //正值
- if (str[1]==0)
- {
- write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示十位
- write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80); //第二个数码管 个位
- write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管 小数1位
- write_LEDSROM(0xC3,xsbcdbuf[str[5]]);//第四个数码管 小数2位
- }
- else
- {
- write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示十位
- write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80); //第二个数码管 个位
- write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管 小数1位
- write_LEDSROM(0xC3,xsbcdbuf[11]);//第四个数码管 显示 A
- }
- break;
- case 1: //负值
- write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示 十位
- write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80); //第二个数码管 个位
- write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管 小数1位
- write_LEDSROM(0xC3,0x40);//第四个数码管 -
- break;
- }
-
- IIC_delay();
- start_IIC(); //调用开始信号
- WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
- stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
- }
- void port_mode() // 端口模式
- {
- P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
- P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
- }
- void main()
- {
- unsigned char *s="Now temp is:";
- port_mode(); // 所有IO口设为准双向弱上拉方式。
- DS18B20_SetResolution(3); // 设置DS18B20的分辨率为12位(默认值,新器件可以不作任何设置)
- while(1)
- {
- gettemp();
- xsled();
- delay60us();
- }
- }
复制代码
所有资料51hei提供下载:
TM1637&18b20测温.zip
(74.03 KB, 下载次数: 200)
|