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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

帶有存儲器功能的數字溫度計-DS1624技術應用

[復制鏈接]
跳轉到指定樓層
樓主
1. DS1624基本原理
   DS1624是美國DALLAS公司生產的集成了測量系統和存儲器于一體的芯片。數字接口電路簡單,與I2C總線兼容,且可以使用一片控制器控制多達8片的DS1624。其數字溫度輸出達13位,精度為0.03125℃。DS1624可工作在最低2.7V電壓下,適用于低功耗應用系統。
1). DS1624基本特性
  ◆ 無需外圍元件即可測量溫度
◆ 測量范圍為-55℃~+125℃,精度為0.03125℃
◆ 測量溫度的結果以13位數字量(兩字節傳輸)給出
◆ 測量溫度的典型轉換時間為1秒        
◆ 集成了256字節的E2PROM非易性存儲器
◆ 數據的讀出和寫入通過一個2-線(I2C)串行接口完成
◆采用8腳DIP或SOIC封裝
DS1624在測量溫度時使用了獨有的在線溫度測量技術。它通過在一個由對溫度高度敏感的振蕩器決定的計數周期內對溫度低敏感的振蕩器時鐘脈沖的計數值的計算來測量溫度。DS1624在計數器中預置了一個初值,它相當于-55℃。如果計數周期結束之前計數器達到0,已預置了此初值的溫度寄存器中的數字就會增加,從而表明溫度高于-55℃。
與此同時,計數器斜坡累加電路被重新預置一個值,然后計數器重新對時鐘計數,直到計數值為0。
通過改變增加的每1℃內的計數器的計數,斜坡累加電路可以補償振蕩器的非線性誤差,以提高精度,任意溫度下計數器的值和每一斜坡累加電路的值對應的計數次數須為已知。
  DS1624通過這些計算可以得到0.03125℃的精度,溫度輸出為13位,在發出讀溫度值請求后還會輸出兩位補償值。表2給出了所測的溫度和輸出數據的關系。這些數據可通過2線制串行口連續輸出,MSB在前,LSB在后。
由于數據在總線上傳輸時MSB在前,所以DS1624讀出的數據可以是一個字節(分辨率為1℃),也可以是兩個字節,第二個字節包含的最低位為0.03125℃。
  1. #include <AT89X52.H>
  2. #include <INTRINS.H>
  3. unsigned char code displaybit[]={0xfe,0xfd,0xfb,0xf7,
  4. 0xef,0xdf,0xbf,0x7f};
  5. unsigned char code displaycode[]={0x3f,0x06,0x5b,0x4f,
  6. 0x66,0x6d,0x7d,0x07,
  7. 0x7f,0x6f,0x77,0x7c,
  8. 0x39,0x5e,0x79,0x71,0x00};
  9.  
  10. unsigned char code dotcode[32]={0,3,6,9,12,16,19,22,
  11. 25,28,31,34,38,41,44,48,
  12. 50,53,56,59,63,66,69,72,
  13. 75,78,81,84,88,91,94,97};
  14. sbit SDA=P1^6;
  15. sbit SCL=P1^7;
  16.  
  17. unsigned char displaybuffer[8]={0,1,2,3,4,5,6,7};
  18. unsigned char eepromdata[8];
  19. unsigned char temperdata[2];
  20.  
  21. unsigned char timecount;
  22. unsigned char displaycount;
  23.  
  24. bit secondflag=0;
  25. unsigned char secondcount=0;
  26. unsigned char retn;
  27. unsigned int result;
  28. unsigned char x;
  29. unsigned int k;
  30. unsigned int ks;
  31.  
  32. void delay(void);
  33. void delay10ms(void);
  34. void i_start(void);
  35. void i_stop(void);
  36. void i_init(void);
  37. void i_ack(void);
  38. bit i_clock(void);
  39. bit i_send(unsigned char i_data);
  40. unsigned char i_receive(void);
  41. bit start_temperature_T(void);
  42. bit read_temperature_T(unsigned char *p);
  43. void delay(void)
  44. {
  45. _nop_();
  46. _nop_();
  47. _nop_();
  48. _nop_();
  49. _nop_();
  50. _nop_();
  51. }
  52.  
  53. void delay10ms(void)
  54. {
  55. unsigned int i;
  56. for(i=0;i<1000;i++)
  57. {
  58. delay();
  59. }
  60. }
  61.  
  62. void i_start(void)
  63. {
  64. SCL=1;
  65. delay();
  66. SDA=0;
  67. delay();
  68. SCL=0;
  69. delay();
  70. }
  71.  
  72. void i_stop(void)
  73. {
  74. SDA=0;
  75. delay();
  76. SCL=1;
  77. delay();
  78. SDA=1;
  79. delay();
  80. SCL=0;
  81. delay();
  82. }
  83. void i_init(void)
  84. {
  85. SCL=0;
  86. i_stop();
  87. }
  88.  
  89. void i_ack(void)
  90. {
  91. SDA=0;
  92. i_clock();
  93. SDA=1;
  94. }
  95.  
  96. bit i_clock(void)
  97. {
  98. bit sample;
  99.  
  100. SCL=1;
  101. delay();
  102. sample=SDA;
  103. _nop_();
  104. _nop_();
  105. SCL=0;
  106. delay();
  107. return(sample);
  108. }
  109.  
  110. bit i_send(unsigned char i_data)
  111. {
  112. unsigned char i;
  113.  
  114. for(i=0;i<8;i++)
  115. {
  116. SDA=(bit)(i_data & 0x80);
  117. i_data=i_data<<1;
  118. i_clock();
  119. }
  120. SDA=1;
  121. return(~i_clock());
  122. }
  123. unsigned char i_receive(void)
  124. {
  125. unsigned char i_data=0;
  126. unsigned char i;
  127.  
  128. for(i=0;i<8;i++)
  129. {
  130. i_data*=2;
  131. if(i_clock()) i_data++;
  132. }
  133. return(i_data);
  134. }
  135.  
  136. bit start_temperature_T(void)
  137. {
  138. i_start();
  139. if(i_send(0x90))
  140. {
  141. if(i_send(0xee))
  142. {
  143. i_stop();
  144. delay();
  145. return(1);
  146. }
  147. else
  148. {
  149. i_stop();
  150. delay();
  151. return(0);
  152. }
  153. }
  154. else
  155. {
  156. i_stop();
  157. delay();
  158. return(0);
  159. }
  160. }
  161.  
  162. bit read_temperature_T(unsigned char *p)
  163. {
  164. i_start();
  165. if(i_send(0x90))
  166. {
  167. if(i_send(0xaa))
  168. {
  169. i_start();
  170. if(i_send(0x91))
  171. {
  172. *(p+1)=i_receive();
  173. i_ack();
  174. *p=i_receive();
  175. i_stop();
  176. delay();
  177. return(1);
  178. }
  179. else
  180. {
  181. i_stop();
  182. delay();
  183. return(0);
  184. }
  185. }
  186. else
  187. {
  188. i_stop();
  189. delay();
  190. return(0);
  191. }
  192. }
  193. else
  194. {
  195. i_stop();
  196. delay();
  197. return(0);
  198. }
  199. }
  200.  
  201. void main(void)
  202. {
  203. P1=0xff;
  204. timecount=0;
  205. displaycount=0;
  206. TMOD=0x21;
  207. TH1=0x06;
  208. TL1=0x06;
  209. TR1=1;
  210. ET1=1;
  211. ET0=1;
  212. EA=1;
  213.  
  214. if(start_temperature_T()) //向DS1624發送啟動A/D溫度轉換命令,成功則啟動T0定時1s。
  215. {
  216. secondflag=0;
  217. secondcount=0;
  218. TH0=55536/256;
  219. TL0=55536%256;
  220. TR0=1;
  221. }
  222. while(1)
  223. {
  224. if(secondflag==1)
  225. {
  226. secondflag=0;
  227. TR0=0;
  228. if(read_temperature_T(temperdata)) //T0定時1s時間到,讀取DS1624的溫度值
  229. {
  230. for(x=0;x<8;x++)
  231. {
  232. displaybuffer[x]=16;
  233. }
  234. x=2;
  235. result=temperdata[1]; //將讀取的溫度值進行數據處理,并送到顯示緩沖區
  236. while(result/10)
  237. {
  238. displaybuffer[x]=result%10;
  239. result=result/10;
  240. x++;
  241. }
  242. displaybuffer[x]=result;
  243. result=temperdata[0];
  244. result=result>>3;
  245. displaybuffer[0]=(dotcode[result])%10;
  246. displaybuffer[1]=(dotcode[result])/10;
  247. if(start_temperature_T()) //溫度值數據處理完畢,重新啟動DS1624開始溫度轉換
  248. {
  249. secondflag=0;
  250. secondcount=0;
  251. TH0=55536/256;
  252. TL0=55536%256;
  253. TR0=1;
  254. }
  255. }
  256. }
  257. }
  258. }
  259. void t0(void) interrupt 1 using 0 //T0用于定時1s時間到
  260. {
  261. secondcount++;
  262. if(secondcount==100)
  263. {
  264. secondcount=0;
  265. secondflag=1;
  266. }
  267. TH0=55536/256;
  268. TL0=55536%256;
  269. }
  270. void t1(void) interrupt 3 using 0 //T1定時1ms用數碼管的動態刷新
  271. {
  272. timecount++;
  273. if(timecount==4) //T1定時1ms到
  274. {
  275. timecount=0;
  276. if (displaycount==5)
  277. {
  278. P0=(displaycode[displaybuffer[7-displaycount]] | 0x80); //在該位同時還要顯示小數點
  279. }
  280. else
  281. {
  282. P0=displaycode[displaybuffer[7-displaycount]];
  283. }
  284. P2=displaybit[displaycount];
  285. displaycount++;
  286. if(displaycount==8)
  287. {
  288. displaycount=0;
  289. }
  290. }
  291. }
復制代碼


22222.jpg (51.51 KB, 下載次數: 50)

22222.jpg

111111111.jpg (22.92 KB, 下載次數: 53)

111111111.jpg

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:328014 發表于 2021-4-14 22:46 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:47286 發表于 2021-4-15 01:21 來自手機 | 只看該作者
是每3度一級嗎 范圍太大了吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利在线观看 | 91福利网址 | 亚洲一区二区久久久 | 亚洲国产一区二区三区在线观看 | 国产成人免费 | 中文字幕一区二区三区四区 | 中文字幕第十五页 | 在线成人免费视频 | 欧美成人精品一区 | 欧美黄页 | 国产在线一区观看 | 国产一区二区在线免费观看 | 午夜影院| 久久久久久高清 | 日韩欧美一区二区三区四区 | 日韩一二区在线观看 | 亚洲一区二区日韩 | 激情自拍偷拍 | 精品成人在线观看 | 午夜免费观看体验区 | 国产精品色| 午夜视频精品 | 久久久久久久av | 国产精品国产成人国产三级 | 高清成人av | 亚洲 欧美 日韩在线 | 国产午夜精品福利 | 天堂视频中文在线 | 成人国产网站 | 中文字幕人成乱码在线观看 | 成人在线视频一区二区三区 | 欧美乱做爰xxxⅹ久久久 | 欧美高清dvd | 久久毛片| 亚洲国产成人精品女人久久久 | 国产高清久久久 | 亚洲综合在线一区 | 欧美在线视频一区二区 | 亚洲日本乱码在线观看 | 草草视频在线免费观看 | 天天插天天狠天天透 |