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

標題: 單片機+LM75簡易電子溫度計源程序 [打印本頁]

作者: zhouwei0815    時間: 2018-12-3 14:55
標題: 單片機+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)





作者: ljl132    時間: 2019-5-19 21:10
請問有原理圖之類的嗎
作者: ljl132    時間: 2019-5-19 21:10
有原理圖么
作者: zhouwei0815    時間: 2019-5-22 10:55
ljl132 發表于 2019-5-19 21:10
請問有原理圖之類的嗎

第一張圖就是原理圖  看引腳就可以了
作者: zhouwei0815    時間: 2019-5-22 10:56
ljl132 發表于 2019-5-19 21:10
有原理圖么

第一張圖  看引腳 把線連上就出來了
作者: 15266268100    時間: 2020-4-3 17:20
看引腳 把線連上就出來了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲欧美日韩精品久久亚洲区 | 欧美精品91| 欧美13videosex性极品 | 91免费视频观看 | 亚洲成人免费电影 | 欧美午夜精品久久久久久浪潮 | 亚洲久久在线 | 国产一区不卡 | 成人高清视频在线观看 | 亚洲国产精品99久久久久久久久 | 国产高清久久 | 99re热精品视频国产免费 | 美女啪啪国产 | 亚洲成人一区 | 亚洲精品一区二区三区中文字幕 | 一区二区三区不卡视频 | 国产专区在线 | 九九亚洲 | 久久蜜桃资源一区二区老牛 | 日韩精品成人免费观看视频 | 欧美成人一区二区 | 在线观看黄免费 | 亚洲啊v在线 | 国产精品久久久久久婷婷天堂 | 日韩网站在线观看 | 成人黄色电影在线播放 | 久久久久免费观看 | 久久精品一区二区三区四区 | 国产黄视频在线播放 | 国产一区二区不卡 | 激情六月丁香婷婷 | 久久久久久久久久久国产 | 久久精品一区二区视频 | a看片| 香蕉超碰| 希岛爱理在线 | 亚洲第一色av| 91麻豆精品国产91久久久久久 | 成人在线免费电影 | 国产精品久久久久久久久久久免费看 | 国产不卡一|