久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1929|回復(fù): 1
收起左側(cè)

分開使用DS18B20,和舵機(jī)(要用到單片機(jī)定時器)遇到的問題?

[復(fù)制鏈接]
ID:627541 發(fā)表于 2019-10-24 20:37 | 顯示全部樓層 |閱讀模式
在main函數(shù)里,定義a,if(a==1){.............}(18b20讀溫度可以正常顯示),else{.................}(定時器初始化,可以用舵機(jī),)。a的值通過遙控改變。按下電源鍵后,先是a==1,然后我按二,也可以正常使用,再按1時,溫度顯示0000,全為零,注意在按1的同時,舵機(jī)的定時器已關(guān)TR1=0;ET1=0;TF1=0,請問怎么回事。
單片機(jī)源程序如下:
  1. #include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
  2. #include"temp.h"        

  3. typedef unsigned int u16;          //對數(shù)據(jù)類型進(jìn)行聲明定義
  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. * 函 數(shù) 名         : datapros()
  14. * 函數(shù)功能                   : 溫度讀取處理轉(zhuǎn)換函數(shù)
  15. * 輸    入         : temp
  16. * 輸    出         : 無
  17. *******************************************************************************/

  18. void datapros(int temp)         
  19. {
  20.            float tp;  
  21.         if(temp< 0)                                //當(dāng)溫度值為負(fù)數(shù)
  22.           {
  23.                 DisplayData[0] = 0x40;           //   -
  24.                 //因為讀取的溫度是實際溫度的補(bǔ)碼,所以減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;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
  35.                 //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  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;//下降沿觸發(fā)
  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函數(shù)
  71. void main()
  72. {u8 i,n=0;
  73. IrInit();
  74. lcdinit();
  75.   dj=0;
  76. while(1)
  77.   {if(flag1==1)         //關(guān)閉定時器,實現(xiàn)功能為超過設(shè)定溫度打開電機(jī)
  78.      {  if(k==0)
  79.             {        lcdinit();
  80.                 datapros(Ds18b20ReadTemp());
  81.               k=1;
  82.              }
  83.             
  84.                   
  85.          
  86.            datapros(Ds18b20ReadTemp());         //數(shù)據(jù)處理函數(shù)

  87.             for(i=0;i<8;i++)
  88.            {               
  89.             lcdwrd(DisplayData[i]+0x30);
  90.            }
  91.             lcdwrc(0x80);
  92.                
  93.          }
  94.     else         //打開定時器,(電機(jī)舵機(jī))關(guān)閉溫度傳感器,和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)                //確認(rèn)是否真的接收到正確的信號
  115.         {         
  116.                
  117.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  118.                 /*當(dāng)兩個條件都為真是循環(huán),如果有一個條件為假的時候跳出循環(huán),免得程序出錯的時
  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組數(shù)據(jù)
  134.                         {                                
  135.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(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表示第幾組數(shù)據(jù)
  155.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于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 舵機(jī)0度
  169.           jd=1;
  170.         if(IrValue[2]==0x0c)  //按鍵1 舵機(jī)45度
  171.           jd=2;
  172.         if(IrValue[2]==0x18)  //按鍵2 舵機(jī)90度
  173.           jd=3;
  174.         if(IrValue[2]==0x5e)  //按鍵3 舵機(jī)135度
  175.           jd=4;
  176.         if(IrValue[2]==0x08) //按鍵4 舵機(jī)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         模式二 調(diào)整舵機(jī)
  186.            {flag1=0;
  187.            m=0;
  188.            }
  189.         if(IrValue[2]==0x47)
  190.            {dj=1;                                //                打開電機(jī)  注意flag2的作用為設(shè)置為了控制優(yōu)先級大于if(temp>25)
  191.             flag2=1;
  192.                 }
  193.         if(IrValue[2]==0x44)         //      關(guān)閉電機(jī)
  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. }
復(fù)制代碼
全部資料51hei下載地址:
程序.7z (20.63 KB, 下載次數(shù): 8)

回復(fù)

使用道具 舉報

ID:627541 發(fā)表于 2019-10-24 20:41 | 顯示全部樓層
就是通過flag1的值,flag=1時,用溫度傳感器.flag=2時使用舵機(jī),但再次另flag=1時,溫度就顯示不了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一区视频 | 超碰在线播 | 久久久激情视频 | 国产一区二区黑人欧美xxxx | 国产目拍亚洲精品99久久精品 | 一级在线视频 | av免费网站在线观看 | 成人免费在线观看 | 中文字幕av一区 | 一级a爱片性色毛片免费 | 国产在线精品一区二区 | 亚洲成人一区二区三区 | 男女免费观看在线爽爽爽视频 | www.一级片| 99国产精品久久久久 | 国产精品一区二区三区在线 | 亚洲精品日韩视频 | 亚洲高清免费 | 可以在线看的黄色网址 | 无码日韩精品一区二区免费 | 天天干b| 天天操天天操 | 国产精品久久久久久久久久免费看 | 人人九九精 | 毛片一区二区三区 | 91精品一区二区三区久久久久 | 久久国产精品视频观看 | 久草免费在线视频 | 精品一区二区三区四区视频 | 亚洲精品视频在线播放 | av在线黄 | av免费观看网站 | 91免费在线看 | 夜夜精品浪潮av一区二区三区 | 国产 亚洲 网红 主播 | 久久久久久久久久久一区二区 | 国产视频在线一区二区 | 日韩激情视频一区 | 久久精品久久精品久久精品 | 蜜月va乱码一区二区三区 | 国产精品色综合 |