久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5822|回復: 5
打印 上一主題 下一主題
收起左側

單片機+LM75簡易電子溫度計源程序

[復制鏈接]
跳轉到指定樓層
樓主
簡易電子溫度計
用極少的元件 做一個溫度計
不需要外部晶振  可以用兩個3V紐扣電池驅動
溫度傳感器采用LM75數字式 體積小 功耗低
對于初學者很適合制作



單片機源程序如下:
  1. /*********************************************************************************************
  2. 程序名:電子溫度計源程序

  3. 1-201006062315 驅動了模塊并加入時間設置程序,用超級終端顯示并設置。
  4. 2-201007080143 完成常顯示省電方式的溫度計功能,采用空閑方式。每1分鐘更新一次溫度。
  5. /*********************************************************************************************
  6. 說明:
  7. 模塊接口定義在VIIC_C51.C文件里面修改。修改接口時需要注意把相應I/O接口設置為推挽方式。
  8. 否則就需要在I2C總線上各加2.2K歐上拉電阻。
  9. - 每1分鐘左右更新一次溫度數據
  10. - 采用單片機空閑模式,LM75掉電模式。
  11. ----------------------------------------
  12. /*********************************************************************************************/
  13. #include <STC12C5A60S2.H> //STC頭文件
  14. #include <string.h>
  15. #include <intrins.h>        //51基本運算(包括_nop_空函數)
  16. bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
  17. bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no);
  18. bit LM75_N;//溫度值的符號(0正1負)
  19. unsigned char LM75_T,LM75_P;//溫度值的整數,小數值(十進制,小數值2位,精度0.125中的前兩位)
  20. unsigned char d1=0,d2=0,d3=0;
  21. bit m;
  22. unsigned int cou;
  23. unsigned char menu=0;
  24. /*********************************************************************************************/
  25. //“程序開發調試設置項”
  26. #define LM75A_ADD                 0x9E  // LM75A的I2C地址(1001 A2 A1 A0 W/R)(模塊專用地址,禁止修改)

  27. sbit        DY_LCD_COM        =P1 ^ 4; //設置LCD連接的I/O口(LCD公共端)
  28. sbit        DY_LCD1_L1        =P0 ^ 5; //設置LCD連接的I/O口a
  29. sbit        DY_LCD1_L2        =P0 ^ 6; //設置LCD連接的I/O口b
  30. sbit        DY_LCD1_L3        =P1 ^ 7; //設置LCD連接的I/O口c
  31. sbit        DY_LCD1_L4        =P1 ^ 6; //設置LCD連接的I/O口d
  32. sbit        DY_LCD1_L5        =P1 ^ 5; //設置LCD連接的I/O口e
  33. sbit        DY_LCD1_L6        =P0 ^ 4; //設置LCD連接的I/O口f
  34. sbit        DY_LCD1_L7        =P0 ^ 3; //設置LCD連接的I/O口g
  35. sbit        DY_LCD1_L8        =P4 ^ 7; //設置LCD連接的I/O口dp
  36. sbit        DY_LCD2_L1        =P4 ^ 5; //設置LCD連接的I/O口a
  37. sbit        DY_LCD2_L2        =P4 ^ 4; //設置LCD連接的I/O口b
  38. sbit        DY_LCD2_L3        =P3 ^ 2; //設置LCD連接的I/O口c
  39. sbit        DY_LCD2_L4        =P3 ^ 1; //設置LCD連接的I/O口d
  40. sbit        DY_LCD2_L5        =P3 ^ 0; //設置LCD連接的I/O口e
  41. sbit        DY_LCD2_L6        =P4 ^ 6; //設置LCD連接的I/O口f
  42. sbit        DY_LCD2_L7        =P0 ^ 7; //設置LCD連接的I/O口g
  43. sbit        DY_LCD2_L8        =P3 ^ 3; //設置LCD連接的I/O口dp
  44. sbit        DY_LCD3_L1        =P2 ^ 5; //設置LCD連接的I/O口a
  45. sbit        DY_LCD3_L2        =P2 ^ 4; //設置LCD連接的I/O口b
  46. sbit        DY_LCD3_L3        =P3 ^ 6; //設置LCD連接的I/O口c
  47. sbit        DY_LCD3_L4        =P3 ^ 5; //設置LCD連接的I/O口d
  48. sbit        DY_LCD3_L5        =P3 ^ 4; //設置LCD連接的I/O口e
  49. sbit        DY_LCD3_L6        =P2 ^ 6; //設置LCD連接的I/O口f
  50. sbit        DY_LCD3_L7        =P2 ^ 7; //設置LCD連接的I/O口g
  51. unsigned char code disdata[]={
  52. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00//無小數點數碼管段碼表(0~9,無)
  53. };
  54. /*********************************************************************************************/
  55. void DELAY_MS (unsigned int a){ // 1ms延時程序(12MHz 10倍于51單片機速度時)
  56.         unsigned int i;
  57.         while( --a != 0){
  58.                 for(i = 0; i < 600; i++);
  59.         }                                     
  60. }
  61. /*********************************************************************************************/
  62. void display_LCD (){ //LCD液晶片交流驅動程序
  63.         unsigned char i;
  64.         m = ~m;//產生交流驅動
  65.         DY_LCD_COM = ~m;//將交流狀態給COM
  66.         i = d1 & 0x01;if(i == 0x01){DY_LCD1_L1 = m;}else{DY_LCD1_L1 = ~m;}
  67.         i = d1 & 0x02;if(i == 0x02){DY_LCD1_L2 = m;}else{DY_LCD1_L2 = ~m;}
  68.         i = d1 & 0x04;if(i == 0x04){DY_LCD1_L3 = m;}else{DY_LCD1_L3 = ~m;}
  69.         i = d1 & 0x08;if(i == 0x08){DY_LCD1_L4 = m;}else{DY_LCD1_L4 = ~m;}
  70.         i = d1 & 0x10;if(i == 0x10){DY_LCD1_L5 = m;}else{DY_LCD1_L5 = ~m;}
  71.         i = d1 & 0x20;if(i == 0x20){DY_LCD1_L6 = m;}else{DY_LCD1_L6 = ~m;}
  72.         i = d1 & 0x40;if(i == 0x40){DY_LCD1_L7 = m;}else{DY_LCD1_L7 = ~m;}
  73.         i = d1 & 0x80;if(i == 0x80){DY_LCD1_L8 = m;}else{DY_LCD1_L8 = ~m;}

  74.         i = d2 & 0x01;if(i == 0x01){DY_LCD2_L1 = m;}else{DY_LCD2_L1 = ~m;}
  75.         i = d2 & 0x02;if(i == 0x02){DY_LCD2_L2 = m;}else{DY_LCD2_L2 = ~m;}
  76.         i = d2 & 0x04;if(i == 0x04){DY_LCD2_L3 = m;}else{DY_LCD2_L3 = ~m;}
  77.         i = d2 & 0x08;if(i == 0x08){DY_LCD2_L4 = m;}else{DY_LCD2_L4 = ~m;}
  78.         i = d2 & 0x10;if(i == 0x10){DY_LCD2_L5 = m;}else{DY_LCD2_L5 = ~m;}
  79.         i = d2 & 0x20;if(i == 0x20){DY_LCD2_L6 = m;}else{DY_LCD2_L6 = ~m;}
  80.         i = d2 & 0x40;if(i == 0x40){DY_LCD2_L7 = m;}else{DY_LCD2_L7 = ~m;}
  81.         i = d2 & 0x80;if(i == 0x80){DY_LCD2_L8 = m;}else{DY_LCD2_L8 = ~m;}

  82.         i = d3 & 0x01;if(i == 0x01){DY_LCD3_L1 = m;}else{DY_LCD3_L1 = ~m;}
  83.         i = d3 & 0x02;if(i == 0x02){DY_LCD3_L2 = m;}else{DY_LCD3_L2 = ~m;}
  84.         i = d3 & 0x04;if(i == 0x04){DY_LCD3_L3 = m;}else{DY_LCD3_L3 = ~m;}
  85.         i = d3 & 0x08;if(i == 0x08){DY_LCD3_L4 = m;}else{DY_LCD3_L4 = ~m;}
  86.         i = d3 & 0x10;if(i == 0x10){DY_LCD3_L5 = m;}else{DY_LCD3_L5 = ~m;}
  87.         i = d3 & 0x20;if(i == 0x20){DY_LCD3_L6 = m;}else{DY_LCD3_L6 = ~m;}
  88.         i = d3 & 0x40;if(i == 0x40){DY_LCD3_L7 = m;}else{DY_LCD3_L7 = ~m;}
  89.         //i = d3 & 0x80;if(i == 0x80){DY_LCD3_L8 = m;}else{DY_LCD3_L8 = ~m;}
  90.         //DELAY_MS(10);
  91. }
  92. /*********************************************************************************************
  93. 函數名:讀出LM75A的溫度值(-55~125攝氏度)
  94. 調  用:LM75A_GetTemp();
  95. 參  數:無
  96. 返回值:無
  97. 結  果:將溫度數據寫入3個LM75的全局變量
  98. 備  注:需要3個全局變量(bit LM75_N;//0正1負 unsigned char LM75_T,LM75_P;//整數,小數值十進制)
  99. /**********************************************************************************************/
  100. void LM75A_GetTemp(void){   
  101.     unsigned char buf[2]; //溫度值儲存   
  102.     unsigned char t=0,a=0;   
  103.     IRcvStr(LM75A_ADD,0x00,buf,2); //讀出溫度值(器件地址,子地址,數據儲存器,字節數)
  104.         t = buf[0]; //處理溫度整數部分,0~125度
  105.         LM75_N = 0; //溫度值為正值
  106.         if(t & 0x80){ //判斷溫度是否是負極(MSB表示溫度符號)
  107.                 LM75_N = 1; //溫度值為負值
  108.                 t = ~t; t++; //計算補碼(原碼取反后加1)
  109.         }
  110.         if(t & 0x01){ a=a+1; } //從高到低按位加入溫度積加值(0~125)
  111.         if(t & 0x02){ a=a+2; }
  112.         if(t & 0x04){ a=a+4; }
  113.         if(t & 0x08){ a=a+8; }
  114.         if(t & 0x10){ a=a+16; }
  115.         if(t & 0x20){ a=a+32; }
  116.         if(t & 0x40){ a=a+64; }
  117.         LM75_T = a;
  118.         a = 0;
  119.         t = buf[1]; //處理小數部分,取0.125精度的前2位(12、25、37、50、62、75、87)
  120.         if(t & 0x20){ a=a+12; }
  121.         if(t & 0x40){ a=a+25; }
  122.         if(t & 0x80){ a=a+50; }
  123.         LM75_P = a;   
  124. }
  125. /**********************************************************************************************/
  126. /*********************************************************************************************
  127. 函數名:定時/計數器初始化函數
  128. 調  用:T_C_init();
  129. 參  數:無
  130. 返回值:無
  131. 結  果:設置SFR中T/C1和(或)T/C0相關參數
  132. 備  注:本函數控制T/C1和T/C0,不需要使用的部分可用//屏蔽
  133. /**********************************************************************************************/
  134. void T_C_init (void){
  135.         TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
  136.         EA = 1;        //中斷總開關
  137.         TH0 = 0; //16位計數寄存器T0高8位
  138.         TL0 = 0; //16位計數寄存器T0低8位
  139.         ET0 = 1; //T/C0中斷開關
  140.         TR0 = 1; //T/C0啟動開關
  141. }
  142. /**********************************************************************************************/
  143. /**********************************************************************************************/
  144. void UD (void){        //數據刷新程序
  145.         LM75A_GetTemp();//讀溫度
  146.         if(LM75_N == 0){//當溫度為正值時
  147.                 d1 = disdata[LM75_T/10];
  148.                 d2 = disdata[LM75_T%10]+0x80;//0x80為顯示小數點
  149.                 d3 = disdata[LM75_P/10];
  150.         }else{
  151.                 d1 = 0x40;//顯示負號
  152.                 d2 = disdata[LM75_T/10];
  153.                 d3 = disdata[LM75_T%10];
  154.         }
  155. }
  156. /**********************************************************************************************/
  157. void LM75_ON (void){//LM75芯片進入工作模式
  158.         unsigned char a;
  159.         unsigned char c[] = {0x00}; //溫度值儲存  
  160.         a=ISendStr(LM75A_ADD,0x01,c,1); //(器件地址,子地址,數據儲存器,字節數)
  161. }
  162. /**********************************************************************************************/
  163. void LM75_OFF (void){//LM75芯片進入掉電模式
  164.         unsigned char a;
  165.         unsigned char b[] = {0x01}; //溫度值儲存  
  166.         a=ISendStr(LM75A_ADD,0x01,b,1); //(器件地址,子地址,數據儲存器,字節數)
  167. }
  168. /**********************************************************************************************/       
  169. void main (void){ //主程序
  170.         P4SW = 0xFF;
  171.         P0M0 = 0x00;//強推輸出
  172.         P2M0 = 0x0e;//強推輸出 0000 1110
  173.         P1M0 = 0x00;//強推輸出//修改IIC總線接口時需要注意把相應I/O接口設置為推挽方式。
  174.         P0 = 0xff;
  175.         P1 = 0xff;
  176.         P2 = 0xfe;//P2.0應為0,LM75的負極
  177.         P3 = 0xff;
  178.         P4 = 0xff;
  179.         DELAY_MS(200);//LM75上電轉換需要100mS
  180.         T_C_init();//定時時初始
  181.         UD();//更新一次溫度數據
  182.         while (1){
  183.                 if(menu == 0){//進入掉電模式程序塊
  184.                         if(cou == 990){//提前一段時間打開LM75電源
  185.                                 LM75_ON();//
  186.                         }
  187.                         PCON = 0x01;//進入空閑模式
  188.                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  189.                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  190.                         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  191.                 }
  192.                 if(menu == 1){//每分鐘一次溫度讀取程序塊                       
  193.                         UD();//更新溫度數據
  194. ……………………

  195. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
附件.rar (4.92 KB, 下載次數: 54)




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:328696 發表于 2019-5-19 21:10 | 只看該作者
請問有原理圖之類的嗎
回復

使用道具 舉報

板凳
ID:328696 發表于 2019-5-19 21:10 | 只看該作者
有原理圖么
回復

使用道具 舉報

地板
ID:350104 發表于 2019-5-22 10:55 | 只看該作者
ljl132 發表于 2019-5-19 21:10
請問有原理圖之類的嗎

第一張圖就是原理圖  看引腳就可以了
回復

使用道具 舉報

5#
ID:350104 發表于 2019-5-22 10:56 | 只看該作者

第一張圖  看引腳 把線連上就出來了
回復

使用道具 舉報

6#
ID:446389 發表于 2020-4-3 17:20 | 只看該作者
看引腳 把線連上就出來了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一区二区三区四区五区 | 色接久久 | 99pao成人国产永久免费视频 | 国产毛片久久久 | 女女百合av大片一区二区三区九县 | 999久久久| 999久久| 精品国产青草久久久久96 | 日韩一级电影免费观看 | 免费国产黄网站在线观看视频 | 亚洲精品久久久久久一区二区 | 成年人免费网站 | 中文字幕免费视频 | 久久这里只有精品首页 | 91麻豆蜜桃一区二区三区 | www.国产视频 | 国产精品日韩一区二区 | 久久99深爱久久99精品 | 最新日韩欧美 | 99爱国产| 日韩中文一区二区三区 | 日本不卡在线视频 | 国产精品久久久久久av公交车 | 欧美日韩国产精品一区二区 | 狠狠操狠狠干 | 国产乱码精品一区二区三区五月婷 | 蜜桃av一区二区三区 | aaaaaa大片免费看最大的 | 亚洲 中文 欧美 日韩 在线观看 | 啪啪综合网 | 亚洲成av人片在线观看无码 | 色免费在线视频 | 国产在线一区观看 | 美女毛片免费看 | 精品国产欧美 | 日日碰狠狠躁久久躁96avv | 99精品视频免费观看 | 亚洲人成人网 | 久久久久国产精品一区二区 | 青青草国产在线观看 | 欧美日韩国产一区二区三区 |