找回密码
 立即注册

QQ登录

只需一步,快速开始

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

分开使用DS18B20,和舵机(要用到单片机定时器)遇到的问题?

[复制链接]
跳转到指定楼层
楼主
ID:627541 发表于 2019-10-24 20:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在main函数里,定义a,if(a==1){.............}(18b20读温度可以正常显示),else{.................}(定时器初始化,可以用舵机,)。a的值通过遥控改变。按下电源键后,先是a==1,然后我按二,也可以正常使用,再按1时,温度显示0000,全为零,注意在按1的同时,舵机的定时器已关TR1=0;ET1=0;TF1=0,请问怎么回事。
单片机源程序如下:
  1. #include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
  2. #include"temp.h"        

  3. typedef unsigned int u16;          //对数据类型进行声明定义
  4. typedef unsigned char u8 ;
  5. sbit  IRIN=P3^2;  //红外
  6. sbit  duoji=P3^5;

  7. u8 IrValue[6];
  8. u8 Time=0,jd=0,count=0,flag1=1,flag2,k,m;
  9. u8 Disp[]="trun off";


  10. u8 DisplayData[9];
  11. u8 code smgduan[10]={0,1,2,3,4,5,6,7,8,9};


  12. /*******************************************************************************
  13. * 函 数 名         : datapros()
  14. * 函数功能                   : 温度读取处理转换函数
  15. * 输    入         : temp
  16. * 输    出         : 无
  17. *******************************************************************************/

  18. void datapros(int temp)         
  19. {
  20.            float tp;  
  21.         if(temp< 0)                                //当温度值为负数
  22.           {
  23.                 DisplayData[0] = 0x40;           //   -
  24.                 //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  25.                 temp=temp-1;
  26.                 temp=~temp;
  27.                 tp=temp;
  28.                 temp=tp*0.0625*100+0.5;        
  29.                

  30.           }
  31.          else
  32.           {                        
  33.                 DisplayData[0] = 0x00;
  34.                 tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
  35.                 //如果温度是正的那么,那么正数的原码就是补码它本身
  36.                 temp=tp*0.0625*100+0.5;        
  37.                
  38.         }
  39.         if(flag2==0)
  40.         if(temp>2500)
  41.            dj=1;
  42.         else
  43.            dj=0;
  44.         DisplayData[1] = smgduan[temp / 10000];
  45.         DisplayData[2] = smgduan[temp % 10000 / 1000];
  46.         DisplayData[3] = smgduan[temp % 1000 / 100] ;
  47.         DisplayData[4] = -2;
  48.         DisplayData[5] = smgduan[temp % 100 / 10];
  49.         DisplayData[6] = smgduan[temp % 10];
  50.         DisplayData[7] =51;
  51.         DisplayData[8] =51        ;
  52. }


  53.                                                                 //外部中断0初始化
  54. void IrInit()           
  55. {
  56.         IT0=1;//下降沿触发
  57.         EX0=1;//打开中断0允许
  58.         EA=1;        //打开总中断

  59.         IRIN=1;//初始化端口
  60. }
  61.                                 //定时器1初始化
  62. void time1init()
  63. {TMOD=0X10;
  64. EA=1;
  65. ET1=1;
  66. TR1=1;
  67. TH1=0XFE;
  68. TL1=0X0C;
  69. }               

  70.                                 //main函数
  71. void main()
  72. {u8 i,n=0;
  73. IrInit();
  74. lcdinit();
  75.   dj=0;
  76. while(1)
  77.   {if(flag1==1)         //关闭定时器,实现功能为超过设定温度打开电机
  78.      {  if(k==0)
  79.             {        lcdinit();
  80.                 datapros(Ds18b20ReadTemp());
  81.               k=1;
  82.              }
  83.             
  84.                   
  85.          
  86.            datapros(Ds18b20ReadTemp());         //数据处理函数

  87.             for(i=0;i<8;i++)
  88.            {               
  89.             lcdwrd(DisplayData[i]+0x30);
  90.            }
  91.             lcdwrc(0x80);
  92.                
  93.          }
  94.     else         //打开定时器,(电机舵机)关闭温度传感器,和lcd1602
  95.             {  if(m==0)
  96.                   {time1init();
  97.                   m=1;
  98.                   }
  99.                  for(n=0;n<8;n++)
  100.              {
  101.                     lcdwrd(Disp[n]);        
  102.               }
  103.               lcdwrc(0x80);
  104.                 }
  105.                
  106.   }
  107. }
  108. void ReadIr() interrupt 0
  109. {
  110.         u8 j,k;
  111.         u16 err;
  112.         Time=0;                                         
  113.         delay(700);        //7ms
  114.         if(IRIN==0)                //确认是否真的接收到正确的信号
  115.         {         
  116.                
  117.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  118.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  119.                 侯,程序死在这里*/        
  120.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
  121.                 {                        
  122.                         delay(1);
  123.                         err--;
  124.                 }
  125.                 if(IRIN==1)                        //如果正确等到9ms低电平
  126.                 {
  127.                         err=500;
  128.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  129.                         {
  130.                                 delay(1);
  131.                                 err--;
  132.                         }
  133.                         for(k=0;k<4;k++)                //共有4组数据
  134.                         {                                
  135.                                 for(j=0;j<8;j++)        //接收一组数据
  136.                                 {

  137.                                         err=60;               
  138.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  139.                                         {
  140.                                                 delay(1);
  141.                                                 err--;
  142.                                         }
  143.                                         err=500;
  144.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  145.                                         {
  146.                                                 delay(10);         //0.1ms
  147.                                                 Time++;
  148.                                                 err--;
  149.                                                 if(Time>30)
  150.                                                 {
  151.                                                         return;
  152.                                                 }
  153.                                         }
  154.                                         IrValue[k]>>=1;         //k表示第几组数据
  155.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  156.                                         {
  157.                                                 IrValue[k]|=0x80;
  158.                                         }
  159.                                         Time=0;                //用完时间要重新赋值                                                        
  160.                                 }
  161.                         }
  162.                 }
  163.                 if(IrValue[2]!=~IrValue[3])
  164.                 {
  165.                         return;
  166.                 }
  167.         }
  168.         if(IrValue[2]==0x16)   //按键0 舵机0度
  169.           jd=1;
  170.         if(IrValue[2]==0x0c)  //按键1 舵机45度
  171.           jd=2;
  172.         if(IrValue[2]==0x18)  //按键2 舵机90度
  173.           jd=3;
  174.         if(IrValue[2]==0x5e)  //按键3 舵机135度
  175.           jd=4;
  176.         if(IrValue[2]==0x08) //按键4 舵机180度
  177.          jd=5;        
  178.         if(IrValue[2]==0x45)   //电源键          模式一 过温
  179.            {flag1=1;
  180.            k=0;
  181.            TR1=0;
  182.            ET1=0;
  183.            TF1=0;
  184.            }
  185.         if(IrValue[2]==0x46)   //mode         模式二 调整舵机
  186.            {flag1=0;
  187.            m=0;
  188.            }
  189.         if(IrValue[2]==0x47)
  190.            {dj=1;                                //                打开电机  注意flag2的作用为设置为了控制优先级大于if(temp>25)
  191.             flag2=1;
  192.                 }
  193.         if(IrValue[2]==0x44)         //      关闭电机
  194.            {dj=0;
  195.            flag2=0;
  196.                 }
  197.         
  198.                                 
  199. }
  200. void time1() interrupt 3
  201. {
  202. TH1=0XFE;
  203. TL1=0X0C;
  204. if(count<jd)
  205.    duoji=1;
  206.   else
  207.     duoji=0;
  208.    count+=1;
  209.    count%=40;
  210.   

  211. }
复制代码
全部资料51hei下载地址:
程序.7z (20.63 KB, 下载次数: 8)

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

使用道具 举报

沙发
ID:627541 发表于 2019-10-24 20:41 | 只看该作者
就是通过flag1的值,flag=1时,用温度传感器.flag=2时使用舵机,但再次另flag=1时,温度就显示不了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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