單片機stc15w通用溫度探頭ds18b20 接P3^6
顯示屏tm1637 4位數碼管SCL=P3^1;SDA=P3^0;
晶振11.0592
實測正常 負溫度和100度以上顯示特殊
當溫度大于100度是: 第一位十位 第二位 個位 第三位十分位 第四位顯示A
當溫度大于0小于100度時:第一位十位 第二位 個位 第三位十分位 第四位百分位
當溫度小于0: 第一位十位 第二位 個位 第三位十分位 第四位顯示-
實測工作電流0.018A 電壓5v
準備再做一個無線串口通信的溫度計 有興趣的留言
制作出來的實物圖如下:
51hei圖片_20191221164549.jpg (173.07 KB, 下載次數: 66)
下載附件
2019-12-21 16:46 上傳
51hei圖片_20191221164558.jpg (183.76 KB, 下載次數: 55)
下載附件
2019-12-21 16:46 上傳
單片機源程序如下:
- //單只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)
2019-12-21 16:47 上傳
點擊文件名下載附件
溫度計 下載積分: 黑幣 -5
|