找回密码
 立即注册

QQ登录

只需一步,快速开始

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

8通道ds18b20轮流温度检测程序及proteus仿真

[复制链接]
跳转到指定楼层
楼主
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include"18b20.h"
  4. #include"18b20_2.h"
  5. #include"18b20_3.h"
  6. #include"18b20_4.h"
  7. #include"18b20_5.h"
  8. #include"18b20_6.h"
  9. #include"18b20_7.h"
  10. #include"18b20_8.h"

  11. #define uchar unsigned char
  12. unsigned int code duan[14]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x7f,0xc6};
  13. uchar code wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  14. unsigned char TempData[8]; //存储显示值的全局变量
  15. unsigned char  NUM;
  16. bit ReadTempFlag1, ReadTempFlag2, ReadTempFlag3, ReadTempFlag4, ReadTempFlag5, ReadTempFlag6, ReadTempFlag7,  ReadTempFlag8;//定义读时间标志

  17. sbit S_clk=P0^0;
  18. sbit DATA=P0^1;
  19. sbit R_clk=P0^2;
  20.                /*------------------------------------------------*/


  21. /*------------------------------------------------*/

  22. ////////////HC595的传输数据和输入数据////////////////
  23. void Send_com(uchar dat) //送段选
  24. {
  25.         unsigned int i;
  26.         for(i=0;i<8;i++)
  27.         {  
  28.         S_clk=0;
  29.                 DATA=dat&0x80;
  30.                 dat<<=1;
  31.                 S_clk=1;
  32.          }
  33. }

  34. void Outdata()
  35. {
  36.          R_clk=0;
  37.          _nop_();
  38.          R_clk=1;
  39. }
  40. void Dis_one(uchar n,uchar m)
  41. {
  42.   Send_com(wei[n]);
  43.   Send_com(duan[m]);
  44.   Outdata();
  45. }
  46. ///////////////输送位码和段码//////////////////
  47. void Init_Timer0(void)
  48. {
  49.   TMOD|=0x01;
  50.   EA=1;
  51.   ET0=1;
  52.   TH0=(65536-50000)/256;
  53.   TL0=(65536-50000)%256;
  54.   TR0=1;
  55. }

  56.   void Display_all(void)
  57.            {
  58.          Dis_one(0,NUM);
  59.           Dis_one(1,TempData[0]);
  60.           Dis_one(2,TempData[1]);
  61.           Dis_one(3,TempData[2]);
  62.           Dis_one(4,TempData[3]);
  63.           Dis_one(5,12);
  64.           Dis_one(6,TempData[4]);
  65.          Dis_one(7,13);
  66.        }


  67. void main()
  68. {
  69.   unsigned int TempH,TempL,temp;
  70.   Init_Timer0();
  71.   while(1)
  72.   {
  73.   if(ReadTempFlag1==1)
  74.           {
  75.             ReadTempFlag1=0;
  76.           NUM=1;
  77.          temp=ReadTemperature_1();
  78. if(temp&0x8000)
  79.      {
  80.      TempData[0]=10;//负号标志
  81.      temp=~temp;  // 取反加1
  82.          temp +=1;
  83.          }
  84.   else
  85.      TempData[0]=11;

  86.      TempH=temp>>4;
  87.      TempL=temp&0x0F;
  88.      TempL=TempL*6/10;//小数近似处理
  89.            
  90.     if(TempH/100==0)
  91.           TempData[1]=11;
  92.         else
  93.       TempData[1]=TempH/100; //十位温度
  94.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  95.           TempData[2]=11;
  96.         else
  97.      TempData[2]=(TempH%100)/10; //十位温度
  98.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  99.      TempData[4]=TempL;
  100.         // TempData[7]=13;         //显示C符号
  101.           }

  102.   
  103. if(ReadTempFlag2==1)
  104.           {
  105.             ReadTempFlag2=0;
  106.           NUM=2;
  107.          temp=ReadTemperature_2();
  108. if(temp&0x8000)
  109.      {
  110.      TempData[0]=10;//负号标志
  111.      temp=~temp;  // 取反加1
  112.          temp +=1;
  113.          }
  114.   else
  115.      TempData[0]=11;

  116.      TempH=temp>>4;
  117.      TempL=temp&0x0F;
  118.      TempL=TempL*6/10;//小数近似处理
  119.            
  120.     if(TempH/100==0)
  121.           TempData[1]=11;
  122.         else
  123.       TempData[1]=TempH/100; //十位温度
  124.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  125.           TempData[2]=11;
  126.         else
  127.      TempData[2]=(TempH%100)/10; //十位温度
  128.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  129.      TempData[4]=TempL;
  130.         // TempData[7]=13;         //显示C符号
  131.         }

  132. if(ReadTempFlag3==1)
  133.           {
  134.             ReadTempFlag3=0;
  135.           NUM=3;
  136.          temp=ReadTemperature_3();
  137. if(temp&0x8000)
  138.      {
  139.      TempData[0]=10;//负号标志
  140.      temp=~temp;  // 取反加1
  141.          temp +=1;
  142.          }
  143.   else
  144.      TempData[0]=11;

  145.      TempH=temp>>4;
  146.      TempL=temp&0x0F;
  147.      TempL=TempL*6/10;//小数近似处理
  148.            
  149.     if(TempH/100==0)
  150.           TempData[1]=11;
  151.         else
  152.       TempData[1]=TempH/100; //十位温度
  153.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  154.           TempData[2]=11;
  155.         else
  156.      TempData[2]=(TempH%100)/10; //十位温度
  157.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  158.      TempData[4]=TempL;
  159.         // TempData[7]=13;         //显示C符号
  160.           }

  161.   
  162. if(ReadTempFlag4==1)
  163.           {
  164.             ReadTempFlag4=0;
  165.           NUM=4;
  166.          temp=ReadTemperature_4();
  167. if(temp&0x8000)
  168.      {
  169.      TempData[0]=10;//负号标志
  170.      temp=~temp;  // 取反加1
  171.          temp +=1;
  172.          }
  173.   else
  174.      TempData[0]=11;

  175.      TempH=temp>>4;
  176.      TempL=temp&0x0F;
  177.      TempL=TempL*6/10;//小数近似处理
  178.            
  179.     if(TempH/100==0)
  180.           TempData[1]=11;
  181.         else
  182.       TempData[1]=TempH/100; //十位温度
  183.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  184.           TempData[2]=11;
  185.         else
  186.      TempData[2]=(TempH%100)/10; //十位温度
  187.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  188.      TempData[4]=TempL;
  189.         // TempData[7]=13;         //显示C符号
  190.         }

  191. if(ReadTempFlag5==1)
  192.           {
  193.             ReadTempFlag5=0;
  194.           NUM=5;
  195.          temp=ReadTemperature_5();
  196. if(temp&0x8000)
  197.      {
  198.      TempData[0]=10;//负号标志
  199.      temp=~temp;  // 取反加1
  200.          temp +=1;
  201.          }
  202.   else
  203.      TempData[0]=11;

  204.      TempH=temp>>4;
  205.      TempL=temp&0x0F;
  206.      TempL=TempL*6/10;//小数近似处理
  207.            
  208.     if(TempH/100==0)
  209.           TempData[1]=11;
  210.         else
  211.       TempData[1]=TempH/100; //十位温度
  212.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  213.           TempData[2]=11;
  214.         else
  215.      TempData[2]=(TempH%100)/10; //十位温度
  216.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  217.      TempData[4]=TempL;
  218.         // TempData[7]=13;         //显示C符号
  219.           }

  220.   
  221. if(ReadTempFlag6==1)
  222.           {
  223.             ReadTempFlag6=0;
  224.           NUM=6;
  225.          temp=ReadTemperature_6();
  226. if(temp&0x8000)
  227.      {
  228.      TempData[0]=10;//负号标志
  229.      temp=~temp;  // 取反加1
  230.          temp +=1;
  231.          }
  232.   else
  233.      TempData[0]=11;

  234.      TempH=temp>>4;
  235.      TempL=temp&0x0F;
  236.      TempL=TempL*6/10;//小数近似处理
  237.            
  238.     if(TempH/100==0)
  239.           TempData[1]=11;
  240.         else
  241.       TempData[1]=TempH/100; //十位温度
  242.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  243.           TempData[2]=11;
  244.         else
  245.      TempData[2]=(TempH%100)/10; //十位温度
  246.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  247.      TempData[4]=TempL;
  248.         // TempData[7]=13;         //显示C符号
  249.         }

  250. if(ReadTempFlag7==1)
  251.           {
  252.             ReadTempFlag7=0;
  253.           NUM=7;
  254.          temp=ReadTemperature_7();
  255. if(temp&0x8000)
  256.      {
  257.      TempData[0]=10;//负号标志
  258.      temp=~temp;  // 取反加1
  259.          temp +=1;
  260.          }
  261.   else
  262.      TempData[0]=11;

  263.      TempH=temp>>4;
  264.      TempL=temp&0x0F;
  265.      TempL=TempL*6/10;//小数近似处理
  266.            
  267.     if(TempH/100==0)
  268.           TempData[1]=11;
  269.         else
  270.       TempData[1]=TempH/100; //十位温度
  271.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  272.           TempData[2]=11;
  273.         else
  274.      TempData[2]=(TempH%100)/10; //十位温度
  275.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  276.      TempData[4]=TempL;
  277.         // TempData[7]=13;         //显示C符号
  278.           }

  279.   
  280. if(ReadTempFlag8==1)
  281.           {
  282.             ReadTempFlag8=0;
  283.           NUM=8;
  284.          temp=ReadTemperature_8();
  285. if(temp&0x8000)
  286.      {
  287.      TempData[0]=10;//负号标志
  288.      temp=~temp;  // 取反加1
  289.          temp +=1;
  290.          }
  291.   else
  292.      TempData[0]=11;

  293.      TempH=temp>>4;
  294.      TempL=temp&0x0F;
  295.      TempL=TempL*6/10;//小数近似处理
  296.            
  297.     if(TempH/100==0)
  298.           TempData[1]=11;
  299.         else
  300.       TempData[1]=TempH/100; //十位温度
  301.     if((TempH/100==0)&&((TempH%100)/10==0))//消隐
  302.           TempData[2]=11;
  303.         else
  304.      TempData[2]=(TempH%100)/10; //十位温度
  305.      TempData[3]=(TempH%100)%10; //个位温度,带小数点
  306.      TempData[4]=TempL;
  307.         // TempData[7]=13;         //显示C符号
  308.         }


  309. Display_all();
  310.           }
  311.   }

  312. /////////////////定时器0 中断程序////////////////////

  313. /*------------------------------------------------*/
  314. void Timer0_isr(void) interrupt 1
  315. {
  316. static unsigned int num;
  317. TH0=(65536-50000)/256;                  //重新赋值 50ms
  318. TL0=(65536-50000)%256;
  319. num++;
  320. if(num==40)        //
  321.         {
  322.     ReadTempFlag1=1; //读标志位置1
  323.         }
  324.   if(num==80)
  325.           {
  326. ReadTempFlag2=1; //读标志位置1
  327.   }
  328. if(num==120)        //
  329.         {
  330.     ReadTempFlag3=1; //读标志位置1
  331.         }
  332.   if(num==160)
  333.           {
  334. ReadTempFlag4=1; //读标志位置1
  335.   }

  336. if(num==200)        //
  337.         {
  338.     ReadTempFlag5=1; //读标志位置1
  339.         }
  340.   if(num==240)
  341.           {
  342. ReadTempFlag6=1; //读标志位置1
  343.   }
  344. if(num==280)        //
  345.         {
  346.     ReadTempFlag7=1; //读标志位置1
  347.         }
  348.   if(num==320)
  349.           {
  350.           num=0;
  351. ReadTempFlag8=1; //读标志位置1
  352.   }
  353.   
  354. }


复制代码
所有资料打包下载:
DS8B20.zip (135.67 KB, 下载次数: 16)



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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