找回密码
 立即注册

QQ登录

只需一步,快速开始

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

当温度DS18B20大于20度开始工作,求大神破解

[复制链接]
回帖奖励 180 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:241873 发表于 2018-1-14 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//当温度(DS18B20)大于20度开始工作,工作模式(五相四线步进电机工作十秒钟停止十分钟的循环。)




  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit DQ=P3^7;

  6. sbit P1_0=P1^0;
  7. sbit P1_1=P1^1;
  8. sbit P1_2=P1^2;
  9. sbit P1_3=P1^3;



  10. uchar t,s,speed=50;

  11. unsigned int temp1;




  12. void delay(uint N)//廷迟时间为(24+N*16)us
  13. {
  14.   int i;
  15.         for(i=0;i<N;i++);
  16. }





  17. //步进电机
  18. void gorun(unsigned char step)

  19. {
  20.   switch(step)
  21.   {
  22.   case 0:
  23.           P1_0 = 0;
  24.     P1_1 = 0;
  25.     P1_2 = 0;
  26.     P1_3 = 0;
  27.         break;
  28.   case 1:
  29.     P1_0 = 1;
  30.     P1_1 = 0;
  31.     P1_2 = 0;
  32.     P1_3 = 0;
  33.     break;
  34.   case 2:
  35.     P1_0 = 1;
  36.     P1_1 = 1;
  37.     P1_2 = 0;
  38.     P1_3 = 0;
  39.     break;
  40.   case 3:
  41.     P1_0 = 0;
  42.     P1_1 = 1;
  43.     P1_2 = 0;
  44.     P1_3 = 0;
  45.     break;
  46.   case 4:
  47.     P1_0 = 0;
  48.     P1_1 = 1;
  49.     P1_2 = 1;
  50.     P1_3 = 0;
  51.     break;
  52.   case 5:  
  53.     P1_0 = 0;
  54.     P1_1 = 0;
  55.     P1_2 = 1;
  56.     P1_3 = 0;
  57.     break;
  58.   case 6:
  59.     P1_0 = 0;
  60.     P1_1 = 0;
  61.     P1_2 = 1;
  62.     P1_3 = 1;
  63.     break;
  64.   case 7:
  65.     P1_0 = 0;
  66.     P1_1 = 0;
  67.     P1_2 = 0;
  68.     P1_3 = 1;
  69.     break;
  70.   case 8:
  71.     P1_0 = 1;
  72.     P1_1 = 0;
  73.     P1_2 = 0;
  74.     P1_3 = 1;
  75.         break;
  76.   }
  77. }




  78. /**************************************************
  79. DS18B20初始化
  80. /********************************************/
  81. void init()
  82. {
  83.         DQ=1;
  84.         delay(0);
  85.         DQ=0;
  86.         delay(50);      //廷迟24+50*16=824us
  87.         DQ=1;
  88.         delay(3);       //48us
  89.         delay(10);      //184us
  90.         DQ=1;
  91. }

  92. void write(uchar date)
  93. {
  94.         uint i;
  95.         for (i=0; i<8; i++)
  96.         {
  97.                 DQ = 0;
  98.                 DQ = date & 0x01;    //最低位移出  最低位先写入 //i=0:DQ=(0101 0101 &0000 0001)=0000 0001
  99.                 delay(2);                 //56us                                                                         即将最低位1 写入,i=1        :        将0写入.......                                
  100.                 DQ=1;         
  101.                 date >>= 1;         //右移一位
  102.         }
  103. }

  104. uchar read()
  105. {
  106.         uint i, value=0;
  107.         DQ=1;
  108.         _nop_();            //一个机器周期:(1/11.0952(即晶振频率))*12=1.085us
  109.         for (i=0; i<8; i++)
  110.         {
  111.                 value = value>>1; //15us 之内必须读完一位
  112.                 DQ = 0;           //设i=0 :value=0101 0101  >>1  得到:0010 1010
  113.                 _nop_();          // 读到的DQ=1,0010 1010|1000 0000=1010 1010
  114.                 _nop_();                       // i=1:  value=01010101
  115.                 DQ = 1;                              //读到的DQ=0,  value=01010101
  116.                 _nop_();                      //i=2:  value=0010 1010
  117.                 _nop_();  
  118.                 if (DQ)           //先读最低位
  119.                 value|=0x80;
  120.                 delay(2);         // 56us
  121.                 DQ=1;
  122.         }
  123.         return(value);
  124. }


  125. //DS18B20数据采集转换
  126. uint  read_wen_du()
  127. {        
  128.         uchar HB,LB,temp;
  129.         init();                                                                //  复位
  130.         write(0xcc);                                  //  跳过ROM  即不必读64位序列号的ROM
  131.         write(0x44);                                  //  启动温度转换
  132.         init();
  133.         write(0xcc);                                        //  跳过ROM  即不必读64位序列号的ROM
  134.         write(0xbe);                                        //  读命令
  135.         LB=read();                                    //  低八位 1011 1010
  136.         HB=read();                                    //  高八位 1111 1010
  137.         HB=HB<<4;                                                        //         1011 000
  138.         HB+=(LB&0XF0)>>4;     //  (LB&0xF0)=1011 0000   >>4 :0000 1011  +HB :1010 1011
  139.         temp=HB;
  140.         return temp;                                  //  返回温度值
  141. }

  142. //DS18B20基本函数结束





  143. void main()
  144. {
  145.           TMOD = 0x01;
  146.     TH0 = (65536-50000)/256;
  147.     TL0 = (65536-50000)%256;
  148.                 TR0=1;
  149.                 ET0=1;
  150.                 EA=1;


  151.         while(1)
  152.                 {               
  153.                         
  154.                         temp1=read_wen_du();
  155.                         
  156.                
  157.                                 if(temp1>=20)
  158.                         
  159.                                 {

  160.                                         gorun(s);
  161.                                         EA=1;
  162.                
  163.                                 }
  164.                                 else
  165.                                 {
  166.                                        
  167.                                         s=0;
  168.                                         t=0;
  169.                                         EA=0;
  170.         
  171.                                 }
  172.                 }
  173. }

  174. //中断服务函数
  175. void timeint(void) interrupt 1
  176. {
  177.         TR0=0;
  178.     TH0 = 254;
  179.     TL0 = 255-speed; //调速
  180.         
  181.         t++;
  182.         if(t==10)
  183.         {
  184.                
  185.                         s++;
  186.                         
  187.                         if(s>8)
  188.                         s=1;
  189.                         t=0;
  190.         }
  191.                

  192.         TR0=1;


  193. }
复制代码



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

使用道具 举报

沙发
ID:230826 发表于 2018-1-14 20:57 | 只看该作者
什么意思?
回复

使用道具 举报

板凳
ID:276095 发表于 2018-1-15 11:30 | 只看该作者
程序写错了
回复

使用道具 举报

地板
ID:7485 发表于 2018-1-15 15:08 | 只看该作者

回帖奖励 +20 黑币

你用汉语表述都不能让人看明白。是不是控温装置?达到预设温度控温装置有输出?
回复

使用道具 举报

5#
ID:276214 发表于 2018-1-15 15:38 | 只看该作者
温度大于20度开始工作?步进电机转动10秒,休息10分钟,在转动吗?
回复

使用道具 举报

6#
ID:241873 发表于 2018-1-15 22:41 | 只看该作者
lsp1990 发表于 2018-1-15 15:38
温度大于20度开始工作?步进电机转动10秒,休息10分钟,在转动吗?

是的 就是这样的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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