找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机智慧大棚监测程序-18b20实验

[复制链接]
跳转到指定楼层
楼主
ID:1138266 发表于 2024-12-4 22:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4.        
  5. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  6.                             0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //段码表
  7. unsigned char code table1[]={0x7f,0xbf,0xdf,0xef,0xf7};

  8. bit DS18B20_Reset();
  9. void DS18B20_WriteData(uchar dat);
  10. uchar DS18B20_RadeData();
  11. void Seg7_Display(uint val);
  12. void delayms(uint xms);
  13. void system_Ini();
  14. void InitMotor();
  15. void SetMotor();

  16. uchar tempL;
  17. sbit CS88=P2^2;
  18. uint tempH;
  19. uint temp;

  20. sbit LED=P1^1;
  21. sbit DS=P2^4;           //引脚定义
  22. sbit DU=P2^0;
  23. sbit WE=P2^1;
  24. sbit beep = P2^3;

  25. sbit A = P3^4;          //定义管脚
  26. sbit b = P3^5;
  27. sbit C = P3^6;
  28. sbit D = P3^7;

  29. //步进电机驱动
  30. unsigned char MotorStep=0;  //步进马达步序
  31. unsigned int  MotorDelay,Speed=1,TIM,CT;
  32. #define speed 12   // 调整速度 数值不要设的太低 低了会引起震动。

  33. void main()
  34. {
  35.    system_Ini();
  36.    InitMotor();
  37.         while(1)
  38.         {
  39.                 CS88=0;
  40.                 DS18B20_Reset();
  41.                 DS18B20_WriteData(0xcc);  //跳过ROM检测
  42.                 DS18B20_WriteData(0x44);  //启动温度转换
  43.                 DS18B20_Reset();
  44.                 DS18B20_WriteData(0xcc);  //跳过ROM检测
  45.                 DS18B20_WriteData(0xbe);  //读暂存器
  46.                 tempL=DS18B20_RadeData();       //读温度地位
  47.           tempH=DS18B20_RadeData();
  48.           tempH=(tempH<<8)|tempL;     //16位
  49.                 if((tempH&0xf8)==0xf800)   //如果温度是负值,取反加一
  50.                         tempH=~tempH+1;               
  51.                         temp=tempH*0.0625*1000;  //25   25360
  52. //显示读取到的温度               
  53.                   Seg7_Display(temp);     //25.360
  54. //判断温度是否超过29度               
  55.                         if (temp>34000)
  56.                         {
  57.                                 LED=0;
  58.                                 beep=0;
  59.                                 SetMotor();
  60.                         }
  61.                         else
  62.                         {
  63.                                 LED=1;
  64.                                 beep=1;
  65.                                 A = 0;
  66.         b = 0;                    
  67.         C = 0;
  68.         D = 0;
  69.                         }
  70.                        
  71. //静态显示小数点                       
  72.                         DU=1;
  73.                         P0=0x80;
  74.                         DU=0;
  75.                         P0=0xff;
  76.                         WE=1;
  77.                         P0=0xef;
  78.                         WE=0;
  79.         }
  80. }


  81. bit DS18B20_Reset()
  82. {
  83.         bit flag;
  84.         uchar i;
  85.         DS=0;
  86.         for(i=240;i>0;i--);  //每执行一次,是两个机器周期 240X2=480
  87.         DS=1;
  88.         for(i=40;i>0;i--);    //延时80us
  89.         flag=DS;
  90.         for(i=200;i>0;i--);   //延时400us
  91.         return flag;
  92. }

  93. void DS18B20_WriteData(uchar dat)
  94. {
  95.         uchar i,j;
  96.         for(j=0;j<8;j++)
  97.         {
  98.                 DS=0;
  99.                 for(i=2;i>0;i--);
  100.                 DS=dat&0x01;  //取出最低位
  101.                 for(i=30;i>0;i--);    //延时约60us
  102.                 DS=1;          //释放总线
  103.                 dat = dat>>1;
  104.         }
  105. }

  106. uchar DS18B20_RadeData()
  107. {
  108.         uchar i,j,rdata;
  109.         for(j=0;j<8;j++)
  110.         {
  111.                 rdata>>=1;
  112.                 DS=0;
  113.                 for(i=2;i>0;i--);
  114.           DS=1;
  115.                 for(i=3;i>0;i--);
  116.                 if(DS==1)
  117.                         rdata=rdata|0x80;
  118.                 for(i=30;i>0;i--);
  119.           DS=1;
  120.         }
  121.         return rdata;
  122. }
  123. void delayms(uint xms)
  124. {
  125. uint i,j;
  126. for(i=xms;i>0;i--)
  127.     for(j=110;j>0;j--);
  128. }

  129. void Seg7_Display(uint val)
  130. {
  131.         uint i=4;
  132.         uint dis_data[5]={0};
  133.         dis_data[0]=val%10;      
  134.         dis_data[1]=val/10%10;   
  135.         dis_data[2]=val/100%10;   
  136.         dis_data[3]=val/1000%10;  
  137.         dis_data[4]=val/10000%10;  

  138.         for (i=0;i<5;i++)
  139.         {
  140.         P0=0xff;
  141.         DU=1;
  142.         P0=table[dis_data[i]];
  143.         DU=0;
  144.         P0=0xff;
  145.         WE=1;
  146.         P0=table1[i];
  147.         WE=0;
  148.         delayms(1);
  149.         }
  150.        
  151. }
  152. void InitMotor()
  153. {
  154.   A = 1;
  155.   b = 1;
  156.   C = 1;
  157.   D = 1;
  158. }

  159. void SetMotor()
  160. {

  161.     MotorDelay=Speed;        //调整速度
  162.     switch(MotorStep)
  163.     {
  164.        case 0:
  165.           if(TIM)   // A
  166.           {                                    
  167.             A = 0;                    //0xf1  
  168.             b = 1;
  169.                               C = 1;
  170.             D = 1;
  171.             MotorStep = 1;
  172.                         TIM=0;
  173.           }
  174.        break;

  175.        case 1:                 // AB
  176.          if(TIM)
  177.           {       
  178.             A = 0;                   //0xf3
  179.             b = 0;
  180.                    C = 1;
  181.             D = 1;
  182.             MotorStep = 2;
  183.                         TIM=0;
  184.           }
  185.        break;

  186.        case 2:           //B
  187.          if(TIM)
  188.           {
  189.            
  190.                   A = 1;
  191.             b = 0;                  //0xf2
  192.             C = 1;
  193.             D = 1;
  194.            
  195.             MotorStep = 3;
  196.                         TIM=0;
  197.           }
  198.        break;


  199.        case 3:                //BC
  200.          if(TIM)
  201.           {       
  202.             A = 1;
  203.             b = 0;                    //0xf6
  204.             C = 0;
  205.             D = 1;
  206.             MotorStep = 4;
  207.                         TIM=0;
  208.           }
  209.        break;
  210.      case 4:                 //C
  211.          if(TIM)
  212.           {       
  213.             A = 1;
  214.             b = 1;                    //0xf4
  215.             C = 0;
  216.             D = 1;
  217.             MotorStep = 5;
  218.                         TIM=0;
  219.            }
  220.        break;
  221.         case 5:                          //CD
  222.          if(TIM)
  223.           {       
  224.             A = 1;
  225.             b = 1;                    //0xfc
  226.             C = 0;
  227.             D = 0;
  228.             MotorStep = 6;
  229.                         TIM=0;
  230.           }
  231.        break;
  232.         case 6:                          //D
  233.          if(TIM)
  234.           {       
  235.             A = 1;
  236.             b = 1;                    //0xf8
  237.             C = 1;
  238.             D = 0;
  239.             MotorStep = 7;
  240.                         TIM=0;
  241.           }
  242.        break;
  243.         case 7:                        //DA
  244.          if(TIM)
  245.           {       
  246.             A = 0;
  247.             b = 1;                    //0xf9
  248.             C = 1;
  249.             D = 0;
  250.             MotorStep = 0;
  251.                         TIM=0;
  252.           }
  253.        break;
  254.        
  255.         }

  256. }


  257. void system_Ini()
  258. {
  259.     TMOD|= 0x11;
  260.     TH0=0xDC; //11.0592M
  261.     TL0=0x00;       
  262.           IE = 0x8A;       
  263.     TR0  = 1;
  264. }

  265. void Tzd(void) interrupt 1
  266. {
  267.    TH0 = 0xfe;    //11.0592
  268.          TL0 = 0x33;

  269.         if( CT++==speed)
  270.           {TIM=1;
  271.            CT=0;
  272.           }
  273. }
复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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