|
單片機(jī)stc15w通用溫度探頭ds18b20 接P3^6
顯示屏tm1637 4位數(shù)碼管SCL=P3^1;SDA=P3^0;
晶振11.0592
實(shí)測正常 負(fù)溫度和100度以上顯示特殊
當(dāng)溫度大于100度是: 第一位十位 第二位 個(gè)位 第三位十分位 第四位顯示A
當(dāng)溫度大于0小于100度時(shí):第一位十位 第二位 個(gè)位 第三位十分位 第四位百分位
當(dāng)溫度小于0: 第一位十位 第二位 個(gè)位 第三位十分位 第四位顯示-
實(shí)測工作電流0.018A 電壓5v
準(zhǔn)備再做一個(gè)無線串口通信的溫度計(jì) 有興趣的留言
制作出來的實(shí)物圖如下:
單片機(jī)源程序如下:
- //單只DS18B20的溫度檢測,測溫范圍-55 —— +125度。
- #include "STC15W4K.H"
- #include "DS18b20.h"
- #include "myfun.h"
- #include "TM1637.h"
- unsigned char str[6]; // 最長字符10字節(jié),比如:-123.4567/0
- unsigned char zf;
- //****************溫度數(shù)據(jù)處理函數(shù)************************/
- void gettemp() //讀取溫度值
- {
- unsigned int temp0,temp; // 存放小數(shù)、整數(shù)、符號(hào),10000倍小數(shù)值
- temp=DS18B20_ReadTemperature(); // 從18B20中讀取2字節(jié)原始溫度值
-
- if ((temp&0xf800)!=0) // 如果是負(fù)溫,將補(bǔ)碼取反加1變?yōu)樵a
- {
- temp=~temp +1;
- zf=1; //負(fù)值
- 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(); //調(diào)用開始信號(hào)
- WriteByte(0x44);//寫命令40H(數(shù)據(jù)設(shè)置)
- stop_IIC(); //調(diào)用結(jié)束信號(hào),一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- switch(zf)
- {
- case 0: //正值
- if (str[1]==0)
- {
- write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一個(gè)數(shù)碼管顯示十位
- write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80); //第二個(gè)數(shù)碼管 個(gè)位
- write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三個(gè)數(shù)碼管 小數(shù)1位
- write_LEDSROM(0xC3,xsbcdbuf[str[5]]);//第四個(gè)數(shù)碼管 小數(shù)2位
- }
- else
- {
- write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一個(gè)數(shù)碼管顯示十位
- write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80); //第二個(gè)數(shù)碼管 個(gè)位
- write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三個(gè)數(shù)碼管 小數(shù)1位
- write_LEDSROM(0xC3,xsbcdbuf[11]);//第四個(gè)數(shù)碼管 顯示 A
- }
- break;
- case 1: //負(fù)值
- write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一個(gè)數(shù)碼管顯示 十位
- write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80); //第二個(gè)數(shù)碼管 個(gè)位
- write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三個(gè)數(shù)碼管 小數(shù)1位
- write_LEDSROM(0xC3,0x40);//第四個(gè)數(shù)碼管 -
- break;
- }
-
- IIC_delay();
- start_IIC(); //調(diào)用開始信號(hào)
- WriteByte(0x8a); //送開屏命令,(8BH),亮度可以根據(jù)低三位調(diào)節(jié)。//顯示亮度
- stop_IIC(); //調(diào)用結(jié)束信號(hào),一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
- }
- 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口設(shè)為準(zhǔn)雙向弱上拉方式。
- DS18B20_SetResolution(3); // 設(shè)置DS18B20的分辨率為12位(默認(rèn)值,新器件可以不作任何設(shè)置)
- while(1)
- {
- gettemp();
- xsled();
- delay60us();
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
TM1637&18b20測溫.zip
(74.03 KB, 下載次數(shù): 200)
2019-12-21 16:47 上傳
點(diǎn)擊文件名下載附件
溫度計(jì)
|
評(píng)分
-
查看全部評(píng)分
|