找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2088|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机多点温度测试程序,含c文件,hex文件 proteus仿真文件

[复制链接]
跳转到指定楼层
楼主
多点温度测试,超过阈值声光报警。LCD1602显示。


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit lcdrs=P2^6;
  5. sbit lcdrw=P2^5;
  6. sbit lcden=P2^7;
  7. sbit led0=P0^0;
  8. sbit led1=P0^1;
  9. sbit led2=P0^2;
  10. sbit led3=P0^3;
  11. sbit speak=P2^4;
  12. uchar code t0[]="T1:     T2:     ";
  13. uchar code t1[]="T3:     T4:     ";
  14. uchar code digital[]="0123456789";

  15. uint data a[10]={0xff,0,0,0,0,0,0,0,0,0xfb};        //发送的数据 ,分别以0xff和0xfb作为起始位和停止位,用于校验
  16. sbit DS0=P2^0;
  17. sbit DS1=P2^1;
  18. sbit DS2=P2^2;
  19. sbit DS3=P2^3;
  20. unsigned int flag;//是否报警标志

  21. uchar i;
  22. void delay(uchar z)//延时
  23. { uchar x,y;
  24. for(x=1000;x>1;x--)
  25. for(y=z;y>1;y--);
  26. }

  27. void delay_50us(uint t)//  延时50us
  28. {
  29. uchar j;
  30. for(;t>0;t--)
  31. for(j=19;j>0;j--);
  32. }
  33. void delay_50ms(uint t)//延时50ms
  34. {
  35. uint j;
  36. for(;t>0;t--)
  37. for(j=6245;j>0;j--);
  38. }
  39. /***LCD1602相关程序*******************************/
  40. void write_com(uchar com)
  41. {
  42. lcdrs=0;
  43. P1=com;
  44. delay(5);
  45. lcden=1;
  46. delay(5);
  47. lcden=0;
  48. }
  49. void write_date(uchar date)
  50. {
  51. lcdrs=1;
  52. P1=date;
  53. delay(5);
  54. lcden=1;
  55. delay(5);
  56. lcden=0;
  57. }



  58. void init_lcd()
  59. {
  60. lcden=0;
  61. lcdrw=0;
  62. write_com(0x0f);
  63. write_com(0x38);
  64. write_com(0x01);
  65. write_com(0x0c);

  66. write_com(0x06);

  67. write_com(0x06);

  68.        
  69.        

  70. write_com(0x80);
  71. for(i=0;i<16;i++)
  72. {write_date(t0[i]);
  73. delay(0);
  74. }
  75. write_com(0x80+0x40);
  76. for(i=0;i<16;i++)
  77. {write_date(t1[i]);
  78. delay(0);
  79. }}



  80. void tmpDelay(int num)
  81. { while(num--) ;
  82. }
  83. /**************DS18B20初始化及数据处理程序******************/
  84. void Init_DS018B200() //第一块DS18B20初始化
  85. { unsigned char x=0;
  86. DS0 = 1;
  87. tmpDelay(8);
  88. DS0 = 0;
  89. tmpDelay(80);
  90. DS0 = 1;
  91. tmpDelay(14);
  92. x=DS0;

  93. tmpDelay(20);
  94. }

  95. unsigned char ReadOneChar0()
  96. { unsigned char i=0;
  97. unsigned char dat = 0;
  98. for (i=8;i>0;i--) { DS0 = 0;
  99. dat>>=1;
  100. DS0 = 1;
  101. if(DS0)
  102. dat|=0x80;
  103. tmpDelay(4);
  104. }
  105. return(dat);
  106. }

  107. void WriteOneChar0(unsigned char dat)
  108. { unsigned char i=0;
  109. for (i=8; i>0; i--) { DS0 = 0;
  110. DS0 = dat&0x01;
  111. tmpDelay(5);
  112. DS0 = 1;
  113. dat>>=1;
  114. } }

  115. unsigned int Readtemp0()  //第一个温度点温度数据处理
  116. {unsigned char a=0;
  117. unsigned char b=0;
  118. unsigned int t=0;
  119. float tt=0;
  120. Init_DS018B200();
  121. WriteOneChar0(0xCC);
  122. WriteOneChar0(0x44);
  123. Init_DS018B200();
  124. WriteOneChar0(0xCC);
  125. WriteOneChar0(0xBE);
  126. a=ReadOneChar0();
  127. b=ReadOneChar0();
  128. t=b;
  129. t<<=8;
  130. t=t|a;                  
  131. tt=t*0.0625;


  132. t= tt*10;

  133. return(t);
  134. }











  135. void Init_DS118B201() //第二块DS18B20初始化
  136. { unsigned char x=0;
  137. DS1 = 1;
  138. tmpDelay(8);
  139. DS1 = 0;
  140. tmpDelay(80);
  141. DS1 = 1;
  142. tmpDelay(14);
  143. x=DS1;

  144. tmpDelay(20);
  145. }

  146. unsigned char ReadOneChar1()
  147. { unsigned char i=0;
  148. unsigned char dat = 0;
  149. for (i=8;i>0;i--) { DS1 = 0;
  150. dat>>=1;
  151. DS1 = 1;
  152. if(DS1)
  153. dat|=0x80;
  154. tmpDelay(4);
  155. }
  156. return(dat);
  157. }

  158. void WriteOneChar1(unsigned char dat)
  159. { unsigned char i=0;
  160. for (i=8; i>0; i--) { DS1 = 0;
  161. DS1 = dat&0x01;
  162. tmpDelay(5);
  163. DS1 = 1;
  164. dat>>=1;
  165. } }

  166. unsigned int Readtemp1()  //第二个温度点温度数据处理
  167. {unsigned char a=0;
  168. unsigned char b=0;
  169. unsigned int t=0;
  170. float tt=0;
  171. Init_DS118B201();
  172. WriteOneChar1(0xCC);
  173. WriteOneChar1(0x44);
  174. Init_DS118B201();
  175. WriteOneChar1(0xCC);
  176. WriteOneChar1(0xBE);
  177. a=ReadOneChar1();
  178. b=ReadOneChar1();
  179. t=b;
  180. t<<=8;
  181. t=t|a;
  182. tt=t*0.0625;


  183. t= tt*10;

  184. return(t);
  185. }




  186. void Init_DS218B202() //第三块DS18B20初始化
  187. { unsigned char x=0;
  188. DS2 = 1;
  189. tmpDelay(8);
  190. DS2 = 0;
  191. tmpDelay(80);
  192. DS2 = 1;
  193. tmpDelay(14);
  194. x=DS2;

  195. tmpDelay(20);
  196. }

  197. unsigned char ReadOneChar2()
  198. { unsigned char i=0;
  199. unsigned char dat = 0;
  200. for (i=8;i>0;i--) { DS2 = 0;
  201. dat>>=1;
  202. DS2 = 1;
  203. if(DS2)
  204. dat|=0x80;
  205. tmpDelay(4);
  206. }
  207. return(dat);
  208. }

  209. void WriteOneChar2(unsigned char dat)
  210. { unsigned char i=0;
  211. for (i=8; i>0; i--) { DS2 = 0;
  212. DS2 = dat&0x01;
  213. tmpDelay(5);
  214. DS2 = 1;
  215. dat>>=1;
  216. } }

  217. unsigned int Readtemp2()  //第三个温度点温度数据处理
  218. {unsigned char a=0;
  219. unsigned char b=0;
  220. unsigned int t=0;
  221. float tt=0;
  222. Init_DS218B202();
  223. WriteOneChar2(0xCC);
  224. WriteOneChar2(0x44);
  225. Init_DS218B202();
  226. WriteOneChar2(0xCC);
  227. WriteOneChar2(0xBE);
  228. a=ReadOneChar2();
  229. b=ReadOneChar2();
  230. t=b;
  231. t<<=8;
  232. t=t|a;
  233. tt=t*0.0625;

  234. t= tt*10;

  235. return(t);
  236. }




  237. void Init_DS318B203()//第四块DS18B20初始化
  238. { unsigned char x=0;
  239. DS3 = 1;
  240. tmpDelay(8);
  241. DS3 = 0;
  242. tmpDelay(80);
  243. DS3 = 1;
  244. tmpDelay(14);
  245. x=DS3;

  246. tmpDelay(20);
  247. }

  248. unsigned char ReadOneChar3()
  249. { unsigned char i=0;
  250. unsigned char dat = 0;
  251. for (i=8;i>0;i--) { DS3 = 0;
  252. dat>>=1;
  253. DS3 = 1;
  254. if(DS3)
  255. dat|=0x80;
  256. tmpDelay(4);
  257. }
  258. return(dat);
  259. }

  260. void WriteOneChar3(unsigned char dat)
  261. { unsigned char i=0;
  262. for (i=8; i>0; i--) { DS3 = 0;
  263. DS3 = dat&0x01;
  264. tmpDelay(5);
  265. DS3 = 1;
  266. dat>>=1;
  267. } }

  268. unsigned int Readtemp3()//第四个温度点温度数据处理
  269. {unsigned char a=0;
  270. unsigned char b=0;
  271. unsigned int t=0;
  272. float tt=0;
  273. Init_DS318B203();
  274. WriteOneChar3(0xCC);
  275. WriteOneChar3(0x44);
  276. Init_DS318B203();
  277. WriteOneChar3(0xCC);
  278. WriteOneChar3(0xBE);
  279. a=ReadOneChar3();
  280. b=ReadOneChar3();
  281. t=b;
  282. t<<=8;
  283. t=t|a;
  284. tt=t*0.0625;


  285. t= tt*10;

  286. return(t);
  287. }
  288. /*****************************************************/

  289. /***********************LCD1602显示程序*********************/
  290. void display(unsigned int pt) //LCD1602显示程序

  291. { unsigned int m;
  292.         m=pt;
  293.    
  294.         if (m==0){
  295. uint num0;
  296. uint shi0,ge0,xiaoshu0;
  297. num0=Readtemp0();
  298.        
  299. shi0=num0/100;
  300. ge0=num0/10%10;
  301. xiaoshu0=num0%10;

  302. a[1]=num0/10;//第一个温度数据整数部分保存到待发送的数组中
  303. a[2]=xiaoshu0;//第一个温度数据小数部分保存到待发送的数组中
  304.                
  305. write_com(0x80+3);
  306. write_date(digital[shi0]);
  307. write_com(0x80+4);
  308. write_date(digital[ge0]);
  309. write_com(0x80+5);
  310. write_date(0x2e);
  311. write_com(0x80+6);
  312. write_date(digital[xiaoshu0]);

  313.           if(shi0<2||shi0>8){led0=0;
  314.                 flag=1;}
  315.                 else{led0=1;}
  316. }

  317.        
  318.         else if(m==1){
  319.                 uint num1;
  320. uint shi1,ge1,xiaoshu1;
  321. num1=Readtemp1();
  322.                
  323.        
  324. shi1=num1/100;
  325. ge1=num1/10%10;
  326. xiaoshu1=num1%10;

  327. a[3]=num1/10;//第二个温度数据整数部分保存到待发送的数组中
  328. a[4]=xiaoshu1; //第二个温度数据小数部分保存到待发送的数组中

  329. write_com(0x80+11);
  330. write_date(digital[shi1]);
  331. write_com(0x80+12);
  332. write_date(digital[ge1]);
  333. write_com(0x80+13);
  334. write_date(0x2e);
  335. write_com(0x80+14);
  336. write_date(digital[xiaoshu1]);
  337.         if(shi1<2||shi1>8){led1=0;
  338.                 flag=1;}
  339.                 else{led1=1;}
  340.         }
  341.        
  342.        
  343.          else if(m==2){
  344.                  uint num2;
  345. uint shi2,ge2,xiaoshu2;
  346. num2=Readtemp2();
  347.                
  348.        
  349. shi2=num2/100;
  350. ge2=num2/10%10;
  351. xiaoshu2=num2%10;

  352. a[5]=num2/10; //第三个温度数据整数部分保存到待发送的数组中
  353. a[6]=xiaoshu2;//第三个温度数据小数部分保存到待发送的数组中

  354. write_com(0x80+0x40+3);
  355. write_date(digital[shi2]);
  356. write_com(0x80+0x40+4);
  357. write_date(digital[ge2]);
  358. write_com(0x80+0x40+5);
  359. write_date(0x2e);
  360. write_com(0x80+0x40+6);
  361. write_date(digital[xiaoshu2]);
  362.         if(shi2<2||shi2>8){led2=0;
  363.                 flag=1;}
  364.                 else{led2=1;}
  365.         }
  366.        
  367.         else{
  368.                 uint num3;
  369. uint shi3,ge3,xiaoshu3;
  370. num3=Readtemp3();
  371.                        
  372.        
  373. shi3=num3/100;
  374. ge3=num3/10%10;

  375. xiaoshu3=num3%10;
  376. a[7]=num3/10;//第四个温度数据整数部分保存到待发送的数组中
  377. a[8]=xiaoshu3;//第四个温度数据小数部分保存到待发送的数组中

  378. write_com(0x80+0x40+11);
  379. write_date(digital[shi3]);
  380. write_com(0x80+0x40+12);
  381. write_date(digital[ge3]);
  382. write_com(0x80+0x40+13);
  383. write_date(0x2e);
  384. write_com(0x80+0x40+14);
  385. write_date(digital[xiaoshu3]);
  386.                  if(shi3<2||shi3>8) //判断温度数据是否在指定范围20~90
  387.                 {led3=0;                                                                                                 
  388.                 flag=1;}
  389.                 else{led3=1;}
  390.                

  391. }
  392.                
  393. }
  394. /***************************************************************/

  395. void InitScom(void)         //串口初始化
  396. {
  397. TMOD=0x21;
  398. TH1=0xfd;
  399. TL1=0xfd;
  400. PCON=0x00;
  401. TR1=1;
  402. SCON=0x50;

  403. RI = 0;
  404. TI = 0;
  405. ES=1;
  406. EA=1;
  407. }

  408. void SendChar(uchar SendData) //发送数据
  409. {
  410. SBUF=SendData;
  411. while(TI==0);
  412. TI=0;
  413. }
  414. /**************************主程序*****************************/
  415. void main()
  416. {unsigned int h,i,j;
  417.         h=0;
  418.        
  419. init_lcd();
  420. InitScom();
  421. while(1)
  422. {
  423.    flag=0;        //清零报警标志
  424.         h=0;                                          
  425.         display(h);

  426.         h=1;
  427.         display(h);
  428.   
  429.         h=2;
  430.         display(h);
  431.                 
  432.         h=3;
  433.         display(h);
  434.         for(i=0;i<10;i++)//依次发送数据

  435.      SendChar(a[i]) ;
  436.       delay_50ms(10);
  437.                                                        

  438.        

  439.            for(i=0;i<4;i++)
  440.         if(flag==1)//flag=1则报警
  441.         {
  442.                 
  443.          for(j=0;j<500;j++)
  444. {speak=1;
  445. delay_50us(10); //延时500us
  446. speak=0;
  447. delay_50us(10); //延时500us
  448. }
  449. delay_50ms(10); //延时0.5s
  450. }       
  451. delay_50ms(20);//再延时1s每五秒刷新一次数据
  452. }
  453. }
  454. /*****************************************************************/
  455.   void Receive() interrupt 4 using 0
  456. { uchar rdata;
  457. if(RI)
  458. { RI=0;
  459. rdata=SBUF;
  460. P2=rdata; } }       
复制代码

所有资料51hei提供下载:
多点温度测试.rar (27.22 KB, 下载次数: 48)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:577503 发表于 2021-3-13 21:35 来自手机 | 只看该作者
请问楼主这个流程图是什么啊,我比较菜鸡看不懂C程序
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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