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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4050|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

基于DS1621的多點(diǎn)測溫單片機(jī)程序及Proteus仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
做的很細(xì),ds18B20的網(wǎng)上很多,DS1621的沒有,花了一點(diǎn)時間做出來了,現(xiàn)在整理到一塊,有緣者取


單片機(jī)源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define  uchar unsigned char
  4. #define  uint  unsigned int
  5. #define  DiSdata P0           //七段碼數(shù)據(jù)輸出口
  6. #define  discan  P2           //掃描數(shù)據(jù)輸出口
  7. sbit     DIN=P0^7;           //小數(shù)點(diǎn)控制
  8. sbit     Scl=P3^0;            //串行時鐘
  9. sbit     Sda=P3^1;            //串行數(shù)據(jù)
  10. sbit     alarm=P1^7;
  11. sbit     alarm2=P1^6;
  12. uint     i;
  13. uint     h;  
  14. uint     temp;
  15. uchar dath[2];                 //溫度輸入口
  16. uchar ff2,ff1=0,t3=0;
  17. uchar code   
  18. dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //共陰LED段碼表 "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "滅" "-"               
  19. uchar code scan_con[5]={0xfd,0xfb,0xf7,0xef,0xdf};  //LED顯示控制,對應(yīng)0的LED有效
  20. uchar data display[5]={0x00,0x00,0x00,0x00,0x002};   //顯示單元數(shù)據(jù),共6個數(shù)據(jù)和一個運(yùn)算暫用
  21. uchar data display1[5]={0x01,0x02,0x03,0x04,0x052};
  22. uchar data DD[4]={0x90,0x92,0x94};
  23. //
  24. void
  25.   delay_us(uint t)            //延時函數(shù)  
  26. {     
  27. for (;t>0;t--);   }
  28.   //
  29. scan()                        //LED掃描函數(shù)   
  30. {     
  31. uchar k;     
  32. for(k=0;k<5;k++)      
  33. {      
  34. discan=scan_con[k];        //控制位送P2口      
  35. DiSdata=dis_7[display[k]];   //數(shù)據(jù)位送P0口        
  36. if (k==3){DIN=1;}        
  37. else      
  38. DIN=0;                   //小數(shù)點(diǎn)顯示               
  39. delay_us(150);      
  40. }   
  41. }
  42. //
  43. void delay(void)    //延時函數(shù)   
  44. {   
  45. _nop_();   
  46. _nop_();   
  47. _nop_();   
  48. _nop_();     
  49. _nop_();     
  50. _nop_();   
  51. }  
  52. //
  53. void i_start(void)   
  54. {   
  55. Sda=1;   
  56. Scl=1;   
  57. delay();   
  58. Sda=0;   
  59. delay();   
  60. Scl=0;     
  61. }  


  62. //   
  63. void i_stop(void)      
  64. {   
  65. Sda=0;     
  66. Scl=1;   
  67. delay();   
  68. Sda=1;   
  69. delay();   
  70. Scl=0;   
  71. Sda=0;   
  72. }  
  73. //
  74. bit i_clock(void)     //應(yīng)答信號  
  75. {    bit sample;   
  76. Scl=1;   
  77. delay();   
  78. sample=Sda;   
  79. _nop_();   
  80. _nop_();   
  81. Scl=0;   
  82. delay();   
  83. return(sample);   
  84. }  
  85. //   
  86. void i_ack(void)   
  87. {   
  88. Sda=0;   
  89. i_clock();   
  90. Sda=1;    }
  91. //  
  92. bit i_send(uchar i_data)     
  93. {  
  94.    
  95. uchar i;    for(i=0;i<8;i++)      
  96. {      
  97. Sda=(bit)(i_data & 0x80);      
  98. i_data=i_data<<1;      
  99. i_clock();      
  100. }   
  101. Sda=1;   
  102. return(~i_clock());    }
  103. //
  104. uchar i_receive(void)
  105. {   
  106. uchar i_data=0;   
  107. uchar i;   
  108. for(i=0;i<8;i++)      
  109. {      
  110. i_data<<=1;      
  111. Scl=0;delay();     
  112. Scl=1;delay() ;   
  113. i_data|=Sda;     }   
  114. Scl=0; delay();   
  115. return(i_data);    }  
  116. //   
  117. bit start_temperature_T(unsigned char d)  //開始轉(zhuǎn)換命令   
  118. {      
  119. uchar t1;   
  120. t1=DD[d];   
  121. i_start();   
  122. if(i_send(t1))      
  123. {      
  124. if(i_send(0xee))      
  125. {        
  126. i_stop();        
  127. delay();        
  128. return(1);        
  129. }      
  130. else        
  131. {        
  132. i_stop();        
  133. delay();        
  134. return(0);        
  135. }      
  136. }   
  137. else      
  138. {      
  139. i_stop();      
  140. delay();      
  141. return(0);      
  142. }   
  143. }  
  144. //   
  145. bit read_temperature_T(unsigned char *p,unsigned char d)   
  146. {      
  147. unsigned char t1,t2;   
  148. t1=DD[d];   
  149. t2=DD[d]+0x01;   
  150. i_start();   
  151. if(i_send(t1))     
  152. {     
  153. if(i_send(0xaa))      
  154. {      
  155. i_start();      
  156. if(i_send(t2))            
  157. {      
  158. *(p+1)=i_receive();        
  159. i_ack();      
  160. *p=i_receive();      
  161. i_stop();      
  162. delay();   
  163. i_send(t1);      
  164. i_send(0x22);   
  165. delay();      
  166. return(1);        
  167. }      
  168. else        
  169. {        
  170. i_stop();        
  171. delay();        
  172. return(0);        
  173. }      
  174. }      
  175. else      
  176. {      
  177. i_stop();      
  178. delay();      
  179. return(0);      
  180. }      
  181. }     
  182. else      
  183. {      
  184. i_stop();      
  185. delay();      
  186. return(0);      
  187. }     
  188. }  
  189. bit ds1621(unsigned char d)      
  190. {   
  191. unsigned char t1;   
  192. t1=DD[d];

  193.   
  194. i_start();   
  195. if(i_send(t1))     
  196. {     
  197. if(i_send(0xac))      
  198. {  
  199. i_start();  
  200. if(i_send(0x0a))     
  201. {   
  202. i_stop();      
  203. delay();      
  204. return(1);     
  205. }     
  206. else      
  207. {      
  208. i_stop();      
  209. delay();      
  210. return(0);      
  211. }      
  212. }   
  213. else   
  214. {      
  215. i_stop();      
  216. delay();      
  217. return(0);     
  218. }   
  219. }   
  220. else      
  221. {      
  222. i_stop();      
  223. delay();      
  224. return(0);     
  225. }   
  226. }  
  227. //


  228. void chuli_temp(unsigned char d)   
  229. {           
  230. unsigned char datah,f=1,datal,t;   
  231. while(f)     
  232. {
  233. t=start_temperature_T(d);     
  234. if(t)      
  235. {
  236. read_temperature_T(dath,d);
  237. f=0;
  238. }      
  239. delay_us(20);      
  240. }      
  241. datah=dath[1];
  242. datal=dath[0];     
  243. if(datal<20)      
  244. alarm2=1;     
  245. else      
  246. alarm2=0;   
  247. if(datah>80)      
  248. alarm2=1;     
  249. else      
  250. alarm2=0;  
  251. display[0]=d;   
  252. f=0;   
  253. if((datah&0x80)!=0)     
  254. {f=1;        
  255. display[1]=10;      
  256. datah=datah+1;         
  257. datah=~datah;         
  258. datah=datah+1;      
  259. display[2]=((datah/10)%10);      
  260. display[3]=datah%10;        
  261. if((datal&0x80)==0x80)           
  262. display[4]=5;         
  263. else         
  264. display[4]=0;      
  265. }   
  266. else
  267.    
  268. {     
  269. display[1]=datah/100;     
  270. display[2]=((datah/10)%10);     
  271. display[3]=datah%10;        
  272. if((datal&0x80)==0x80)            
  273. display[4]=5;        
  274. else         
  275. display[4]=0;   
  276. }      
  277. if(!display[1])                //符號位顯示判斷         
  278. {        
  279. display[1]=0x0a;             //最高位為0時不顯示        
  280. if(!display[2])         
  281. {         
  282. display[2]=0x0a;         
  283. if(f) {display[2]=0x0b;f=2;}   //次高位為0時不顯示         
  284. }        
  285. }        
  286. if(f==1)display[1]=0x0b;       //負(fù)溫度時最高位顯示"-"   
  287. }
  288. void  ex_int0() interrupt 0   
  289. {   
  290. ff2=1;   
  291. ff1=0;   
  292. }  
  293. //
  294. void  ex_int1() interrupt 2   
  295. {      
  296. EA=0;   
  297. ff1=1;   
  298. ff2=0;   
  299. EA=1;   
  300. }
  301. //  
  302. main()             //主函數(shù)   
  303. {   
  304. uchar d=0,t4=1;   
  305. DiSdata=0xff;     //初始化端口   
  306. discan=0xff;   
  307. alarm=0;   
  308. EA=1;   
  309. EX0=1;   
  310. EX1=1;   
  311. IT0=1;
  312. IT1=1;   
  313. for(h=0;h<5;h++)   //開機(jī)顯示"0000"     
  314. {     
  315. display[h]=0;     
  316. }      
  317. scan();     
  318. delay_us(3);     
  319. for(d=0;d<3;d++)      
  320. {
  321. ds1621(d);}   
  322. d=0;     
  323. while(1)        
  324. {         
  325. if(ff1)         
  326. {         
  327. chuli_temp(d);         
  328. for(h=0;h<100;h++)      
  329. scan();      
  330. d++;      
  331. if(d==3)           
  332. d=0;      }      
  333. if(ff2)         
  334. {         
  335. t3=t3+ff2;        
  336. if(t3==3)      
  337. t3=0;         
  338. chuli_temp(t3);      
  339. ff2=0;         
  340. }         
  341. scan();      
  342. }   
  343. }
復(fù)制代碼

所有資料51hei提供下載:
多點(diǎn)測溫.zip (935.42 KB, 下載次數(shù): 73)

評分

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

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:575483 發(fā)表于 2019-12-30 11:32 | 只看該作者
18行共陰改成共陽吧,要么會顯示不出來
回復(fù)

使用道具 舉報(bào)

板凳
ID:863391 發(fā)表于 2021-7-20 15:30 | 只看該作者
fanli 發(fā)表于 2019-12-30 11:32
18行共陰改成共陽吧,要么會顯示不出來

那不是共陽段碼表嗎
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久99深爱久久99精品 | 伊人青青久久 | 欧美一级毛片免费观看 | 午夜视频在线观看一区二区 | 国产免费a视频 | 日韩在线国产精品 | 精品久久久久久亚洲综合网站 | 欧洲在线视频 | 午夜成人免费视频 | 黄色三级免费 | 久久久国产一区二区三区 | 午夜视频在线 | 91亚洲欧美| 涩涩导航 | 亚洲日日夜夜 | 久久国产精品-国产精品 | 国产免费色 | 国产精品v | 日韩欧美一区二区三区 | 在线免费观看黄色 | 日本午夜在线视频 | 97超级碰碰 | 亚洲第一色站 | 国产综合在线视频 | 久久久久精 | 一区二区蜜桃 | 成人a在线 | 亚洲人a | 亚洲国产精品一区二区第一页 | 国产成人福利 | 拍戏被cao翻了h承欢 | 精品国产一区二区三区成人影院 | 日韩免费一二三区 | 另类二区 | 色吧久久 | 综合一区| 欧美日产国产成人免费图片 | 人人操日日干 | 一区二区三区四区五区在线视频 | 欧美一区在线视频 | 户外露出一区二区三区 |