簡易電子溫度計
用極少的元件 做一個溫度計
不需要外部晶振 可以用兩個3V紐扣電池驅動
溫度傳感器采用LM75數字式 體積小 功耗低
對于初學者很適合制作
電子溫度計.jpg (102.93 KB, 下載次數: 62)
下載附件
電路圖
2018-12-3 14:46 上傳
EDS812液晶引腳圖.jpg (239.1 KB, 下載次數: 76)
下載附件
液晶引腳圖
2018-12-3 14:46 上傳
單片機源程序如下:
- /*********************************************************************************************
- 程序名:電子溫度計源程序
- 1-201006062315 驅動了模塊并加入時間設置程序,用超級終端顯示并設置。
- 2-201007080143 完成常顯示省電方式的溫度計功能,采用空閑方式。每1分鐘更新一次溫度。
- /*********************************************************************************************
- 說明:
- 模塊接口定義在VIIC_C51.C文件里面修改。修改接口時需要注意把相應I/O接口設置為推挽方式。
- 否則就需要在I2C總線上各加2.2K歐上拉電阻。
- - 每1分鐘左右更新一次溫度數據
- - 采用單片機空閑模式,LM75掉電模式。
- ----------------------------------------
- /*********************************************************************************************/
- #include <STC12C5A60S2.H> //STC頭文件
- #include <string.h>
- #include <intrins.h> //51基本運算(包括_nop_空函數)
- bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
- bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
- bit LM75_N;//溫度值的符號(0正1負)
- unsigned char LM75_T,LM75_P;//溫度值的整數,小數值(十進制,小數值2位,精度0.125中的前兩位)
- unsigned char d1=0,d2=0,d3=0;
- bit m;
- unsigned int cou;
- unsigned char menu=0;
- /*********************************************************************************************/
- //“程序開發調試設置項”
- #define LM75A_ADD 0x9E // LM75A的I2C地址(1001 A2 A1 A0 W/R)(模塊專用地址,禁止修改)
- sbit DY_LCD_COM =P1 ^ 4; //設置LCD連接的I/O口(LCD公共端)
- sbit DY_LCD1_L1 =P0 ^ 5; //設置LCD連接的I/O口a
- sbit DY_LCD1_L2 =P0 ^ 6; //設置LCD連接的I/O口b
- sbit DY_LCD1_L3 =P1 ^ 7; //設置LCD連接的I/O口c
- sbit DY_LCD1_L4 =P1 ^ 6; //設置LCD連接的I/O口d
- sbit DY_LCD1_L5 =P1 ^ 5; //設置LCD連接的I/O口e
- sbit DY_LCD1_L6 =P0 ^ 4; //設置LCD連接的I/O口f
- sbit DY_LCD1_L7 =P0 ^ 3; //設置LCD連接的I/O口g
- sbit DY_LCD1_L8 =P4 ^ 7; //設置LCD連接的I/O口dp
- sbit DY_LCD2_L1 =P4 ^ 5; //設置LCD連接的I/O口a
- sbit DY_LCD2_L2 =P4 ^ 4; //設置LCD連接的I/O口b
- sbit DY_LCD2_L3 =P3 ^ 2; //設置LCD連接的I/O口c
- sbit DY_LCD2_L4 =P3 ^ 1; //設置LCD連接的I/O口d
- sbit DY_LCD2_L5 =P3 ^ 0; //設置LCD連接的I/O口e
- sbit DY_LCD2_L6 =P4 ^ 6; //設置LCD連接的I/O口f
- sbit DY_LCD2_L7 =P0 ^ 7; //設置LCD連接的I/O口g
- sbit DY_LCD2_L8 =P3 ^ 3; //設置LCD連接的I/O口dp
- sbit DY_LCD3_L1 =P2 ^ 5; //設置LCD連接的I/O口a
- sbit DY_LCD3_L2 =P2 ^ 4; //設置LCD連接的I/O口b
- sbit DY_LCD3_L3 =P3 ^ 6; //設置LCD連接的I/O口c
- sbit DY_LCD3_L4 =P3 ^ 5; //設置LCD連接的I/O口d
- sbit DY_LCD3_L5 =P3 ^ 4; //設置LCD連接的I/O口e
- sbit DY_LCD3_L6 =P2 ^ 6; //設置LCD連接的I/O口f
- sbit DY_LCD3_L7 =P2 ^ 7; //設置LCD連接的I/O口g
- unsigned char code disdata[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00//無小數點數碼管段碼表(0~9,無)
- };
- /*********************************************************************************************/
- void DELAY_MS (unsigned int a){ // 1ms延時程序(12MHz 10倍于51單片機速度時)
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 600; i++);
- }
- }
- /*********************************************************************************************/
- void display_LCD (){ //LCD液晶片交流驅動程序
- unsigned char i;
- m = ~m;//產生交流驅動
- DY_LCD_COM = ~m;//將交流狀態給COM
- i = d1 & 0x01;if(i == 0x01){DY_LCD1_L1 = m;}else{DY_LCD1_L1 = ~m;}
- i = d1 & 0x02;if(i == 0x02){DY_LCD1_L2 = m;}else{DY_LCD1_L2 = ~m;}
- i = d1 & 0x04;if(i == 0x04){DY_LCD1_L3 = m;}else{DY_LCD1_L3 = ~m;}
- i = d1 & 0x08;if(i == 0x08){DY_LCD1_L4 = m;}else{DY_LCD1_L4 = ~m;}
- i = d1 & 0x10;if(i == 0x10){DY_LCD1_L5 = m;}else{DY_LCD1_L5 = ~m;}
- i = d1 & 0x20;if(i == 0x20){DY_LCD1_L6 = m;}else{DY_LCD1_L6 = ~m;}
- i = d1 & 0x40;if(i == 0x40){DY_LCD1_L7 = m;}else{DY_LCD1_L7 = ~m;}
- i = d1 & 0x80;if(i == 0x80){DY_LCD1_L8 = m;}else{DY_LCD1_L8 = ~m;}
- i = d2 & 0x01;if(i == 0x01){DY_LCD2_L1 = m;}else{DY_LCD2_L1 = ~m;}
- i = d2 & 0x02;if(i == 0x02){DY_LCD2_L2 = m;}else{DY_LCD2_L2 = ~m;}
- i = d2 & 0x04;if(i == 0x04){DY_LCD2_L3 = m;}else{DY_LCD2_L3 = ~m;}
- i = d2 & 0x08;if(i == 0x08){DY_LCD2_L4 = m;}else{DY_LCD2_L4 = ~m;}
- i = d2 & 0x10;if(i == 0x10){DY_LCD2_L5 = m;}else{DY_LCD2_L5 = ~m;}
- i = d2 & 0x20;if(i == 0x20){DY_LCD2_L6 = m;}else{DY_LCD2_L6 = ~m;}
- i = d2 & 0x40;if(i == 0x40){DY_LCD2_L7 = m;}else{DY_LCD2_L7 = ~m;}
- i = d2 & 0x80;if(i == 0x80){DY_LCD2_L8 = m;}else{DY_LCD2_L8 = ~m;}
- i = d3 & 0x01;if(i == 0x01){DY_LCD3_L1 = m;}else{DY_LCD3_L1 = ~m;}
- i = d3 & 0x02;if(i == 0x02){DY_LCD3_L2 = m;}else{DY_LCD3_L2 = ~m;}
- i = d3 & 0x04;if(i == 0x04){DY_LCD3_L3 = m;}else{DY_LCD3_L3 = ~m;}
- i = d3 & 0x08;if(i == 0x08){DY_LCD3_L4 = m;}else{DY_LCD3_L4 = ~m;}
- i = d3 & 0x10;if(i == 0x10){DY_LCD3_L5 = m;}else{DY_LCD3_L5 = ~m;}
- i = d3 & 0x20;if(i == 0x20){DY_LCD3_L6 = m;}else{DY_LCD3_L6 = ~m;}
- i = d3 & 0x40;if(i == 0x40){DY_LCD3_L7 = m;}else{DY_LCD3_L7 = ~m;}
- //i = d3 & 0x80;if(i == 0x80){DY_LCD3_L8 = m;}else{DY_LCD3_L8 = ~m;}
- //DELAY_MS(10);
- }
- /*********************************************************************************************
- 函數名:讀出LM75A的溫度值(-55~125攝氏度)
- 調 用:LM75A_GetTemp();
- 參 數:無
- 返回值:無
- 結 果:將溫度數據寫入3個LM75的全局變量
- 備 注:需要3個全局變量(bit LM75_N;//0正1負 unsigned char LM75_T,LM75_P;//整數,小數值十進制)
- /**********************************************************************************************/
- void LM75A_GetTemp(void){
- unsigned char buf[2]; //溫度值儲存
- unsigned char t=0,a=0;
- IRcvStr(LM75A_ADD,0x00,buf,2); //讀出溫度值(器件地址,子地址,數據儲存器,字節數)
- t = buf[0]; //處理溫度整數部分,0~125度
- LM75_N = 0; //溫度值為正值
- if(t & 0x80){ //判斷溫度是否是負極(MSB表示溫度符號)
- LM75_N = 1; //溫度值為負值
- t = ~t; t++; //計算補碼(原碼取反后加1)
- }
- if(t & 0x01){ a=a+1; } //從高到低按位加入溫度積加值(0~125)
- if(t & 0x02){ a=a+2; }
- if(t & 0x04){ a=a+4; }
- if(t & 0x08){ a=a+8; }
- if(t & 0x10){ a=a+16; }
- if(t & 0x20){ a=a+32; }
- if(t & 0x40){ a=a+64; }
- LM75_T = a;
- a = 0;
- t = buf[1]; //處理小數部分,取0.125精度的前2位(12、25、37、50、62、75、87)
- if(t & 0x20){ a=a+12; }
- if(t & 0x40){ a=a+25; }
- if(t & 0x80){ a=a+50; }
- LM75_P = a;
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函數名:定時/計數器初始化函數
- 調 用:T_C_init();
- 參 數:無
- 返回值:無
- 結 果:設置SFR中T/C1和(或)T/C0相關參數
- 備 注:本函數控制T/C1和T/C0,不需要使用的部分可用//屏蔽
- /**********************************************************************************************/
- void T_C_init (void){
- TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
- EA = 1; //中斷總開關
- TH0 = 0; //16位計數寄存器T0高8位
- TL0 = 0; //16位計數寄存器T0低8位
- ET0 = 1; //T/C0中斷開關
- TR0 = 1; //T/C0啟動開關
- }
- /**********************************************************************************************/
- /**********************************************************************************************/
- void UD (void){ //數據刷新程序
- LM75A_GetTemp();//讀溫度
- if(LM75_N == 0){//當溫度為正值時
- d1 = disdata[LM75_T/10];
- d2 = disdata[LM75_T%10]+0x80;//0x80為顯示小數點
- d3 = disdata[LM75_P/10];
- }else{
- d1 = 0x40;//顯示負號
- d2 = disdata[LM75_T/10];
- d3 = disdata[LM75_T%10];
- }
- }
- /**********************************************************************************************/
- void LM75_ON (void){//LM75芯片進入工作模式
- unsigned char a;
- unsigned char c[] = {0x00}; //溫度值儲存
- a=ISendStr(LM75A_ADD,0x01,c,1); //(器件地址,子地址,數據儲存器,字節數)
- }
- /**********************************************************************************************/
- void LM75_OFF (void){//LM75芯片進入掉電模式
- unsigned char a;
- unsigned char b[] = {0x01}; //溫度值儲存
- a=ISendStr(LM75A_ADD,0x01,b,1); //(器件地址,子地址,數據儲存器,字節數)
- }
- /**********************************************************************************************/
- void main (void){ //主程序
- P4SW = 0xFF;
- P0M0 = 0x00;//強推輸出
- P2M0 = 0x0e;//強推輸出 0000 1110
- P1M0 = 0x00;//強推輸出//修改IIC總線接口時需要注意把相應I/O接口設置為推挽方式。
- P0 = 0xff;
- P1 = 0xff;
- P2 = 0xfe;//P2.0應為0,LM75的負極
- P3 = 0xff;
- P4 = 0xff;
- DELAY_MS(200);//LM75上電轉換需要100mS
- T_C_init();//定時時初始
- UD();//更新一次溫度數據
- while (1){
- if(menu == 0){//進入掉電模式程序塊
- if(cou == 990){//提前一段時間打開LM75電源
- LM75_ON();//
- }
- PCON = 0x01;//進入空閑模式
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
- }
- if(menu == 1){//每分鐘一次溫度讀取程序塊
- UD();//更新溫度數據
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
附件.rar
(4.92 KB, 下載次數: 54)
2018-12-3 14:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|