找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3535|回复: 2
收起左侧

基于DS1621的多点测温单片机程序及Proteus仿真

[复制链接]
ID:575483 发表于 2019-7-5 16:33 | 显示全部楼层 |阅读模式
做的很细,ds18B20的网上很多,DS1621的没有,花了一点时间做出来了,现在整理到一块,有缘者取
0.png 仿真图.png

单片机源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define  uchar unsigned char
  4. #define  uint  unsigned int
  5. #define  DiSdata P0           //七段码数据输出口
  6. #define  discan  P2           //扫描数据输出口
  7. sbit     DIN=P0^7;           //小数点控制
  8. sbit     Scl=P3^0;            //串行时钟
  9. sbit     Sda=P3^1;            //串行数据
  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显示控制,对应0的LED有效
  20. uchar data display[5]={0x00,0x00,0x00,0x00,0x002};   //显示单元数据,共6个数据和一个运算暂用
  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)            //延时函数  
  26. {     
  27. for (;t>0;t--);   }
  28.   //
  29. scan()                        //LED扫描函数   
  30. {     
  31. uchar k;     
  32. for(k=0;k<5;k++)      
  33. {      
  34. discan=scan_con[k];        //控制位送P2口      
  35. DiSdata=dis_7[display[k]];   //数据位送P0口        
  36. if (k==3){DIN=1;}        
  37. else      
  38. DIN=0;                   //小数点显示               
  39. delay_us(150);      
  40. }   
  41. }
  42. //
  43. void delay(void)    //延时函数   
  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)     //应答信号  
  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)  //开始转换命令   
  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;       //负温度时最高位显示"-"   
  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()             //主函数   
  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++)   //开机显示"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. }
复制代码

所有资料51hei提供下载:
多点测温.zip (935.42 KB, 下载次数: 73)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:575483 发表于 2019-12-30 11:32 | 显示全部楼层
18行共阴改成共阳吧,要么会显示不出来
回复

使用道具 举报

ID:863391 发表于 2021-7-20 15:30 | 显示全部楼层
fanli 发表于 2019-12-30 11:32
18行共阴改成共阳吧,要么会显示不出来

那不是共阳段码表吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表