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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1841|回復: 0
打印 上一主題 下一主題
收起左側

51單片機智能魚缸源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:426770 發表于 2022-2-5 19:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define  LED_ON    led=1
  6. #define  LED_OFF   led=0
  7. uchar dis_time_buf[16]={0};
  8. char code str[] =  "已加熱\n";
  9. char code str1[] =  "已喂食\n";
  10. char code str21[] =  "已關燈\n";
  11. char code str22[] =  "已開燈\n";
  12. char code str3[] =  "已供氧\n";
  13. unsigned char dat;
  14. uint rrr;
  15. //定義led燈
  16. sbit led=P1^0;  //照明引腳
  17. sbit ledds1302 =P1^4;   //加熱棒工作
  18. sbit dianji1=P1^6;                                
  19. sbit dianji2=P1^5;
  20. sbit ledduiguan=P1^7;    //水泵工作  開始供氧氣
  21. //ds18b20引腳定義
  22. sbit DQ =     P2 ^ 6;  //定義端口DQ
  23. sbit led0    =P2^0;
  24. sbit led1    =P2^1;
  25. sbit led2    =P2^2;
  26. sbit led3    =P2^3;
  27. sbit k         =P3^4;
  28. sbit l          =P3^5;
  29. sbit led7     =P1^4;
  30. unsigned char q=1;
  31. unsigned char w=8;
  32. //紅外對管引腳定義
  33. sbit OUT1=P2^5;//3
  34. sbit OUT2=P2^4;
  35. //ds18b20數組
  36. unsigned char tx[10]={0,0,0x2E,0,0,0,0,0xDF,0x43,0x0A};
  37. //ds18b20數組

  38. //unsigned code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
  39.                         0xf8,0x80,0x90};//gongyang
  40. //unsigned code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  41.                         //0x07,0x7f,0x6f};//gongying

  42. //功能:延時1毫秒
  43. //入口參數:x
  44. //出口參數:無
  45. //說明:當晶振為12M時,j<112;當晶振為11.0592M時,j<122
  46. void Delay_xms(uint x)
  47. {
  48.   uint i,j;
  49.   for(i=0;i<x;i++)
  50.     for(j=0;j<112;j++);
  51. }
  52. /********************************************************************
  53. * 名稱 : Delay()
  54. * 功能 : 微秒級延時函數
  55. * 輸入 : num
  56. * 輸出 : 無
  57. ***********************************************************************/
  58. void Delay(int num)//延時函數
  59. {
  60.         while(num--) ;
  61. }
  62. /********************************************************************
  63. * 名稱 : Delaynms()
  64. * 功能 : 毫秒級延時函數
  65. * 輸入 : num
  66. * 輸出 : 無
  67. ***********************************************************************/
  68. void Delaynms(unsigned int di) //延時
  69. {
  70.         unsigned int da,db;
  71.          for(da=0;da<di;da++)
  72.                    for(db=0;db<100;db++);
  73. }
  74. void Init_DS18B20(void)//初始化ds1820
  75. {
  76.         unsigned char x=0;
  77.         DQ = 1;    //DQ復位
  78.         Delay(8);  //稍做延時
  79.         DQ = 0;    //單片機將DQ拉低
  80.         Delay(80); //精確延時 大于 480us
  81.         DQ = 1;    //拉高總線
  82.         Delay(14);
  83.         x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  84.         Delay(20);
  85. }

  86. unsigned char ReadOneChar(void)//讀一個字節
  87. {
  88.         unsigned char i=0;
  89.         unsigned char dat = 0;
  90.         for (i=8;i>0;i--)
  91.         {
  92.                 DQ = 0; // 給脈沖信號
  93.                 dat>>=1;
  94.                 DQ = 1; // 給脈沖信號
  95.                 if(DQ)
  96.                 dat|=0x80;
  97.                 Delay(4);
  98.         }
  99.         return(dat);
  100. }

  101. void WriteOneChar(unsigned char dat)//寫一個字節
  102. {
  103.         unsigned char i=0;
  104.         for (i=8; i>0; i--)
  105.         {
  106.                 DQ = 0;
  107.                 DQ = dat&0x01;
  108.                 Delay(2);
  109.                 DQ = 1;
  110.                 dat>>=1;
  111.         }
  112. }


  113. void ReadTemperature(void)//讀取溫度
  114. {
  115.         unsigned char a=0;
  116.         unsigned char b=0;
  117.         unsigned char Data_L=0;
  118.         unsigned char num=0;

  119.         Init_DS18B20();

  120.         WriteOneChar(0xCC); // 跳過讀序號列號的操作
  121.         WriteOneChar(0x44); // 啟動溫度轉換
  122.         Init_DS18B20();
  123.         WriteOneChar(0xCC); //跳過讀序號列號的操作
  124.         WriteOneChar(0xBE); //讀取溫度寄存器

  125.         a=ReadOneChar();  //讀低8位
  126.         b=ReadOneChar(); //讀高8位

  127.     tx[0] = (a/16+b*16)/10;      //整數部分


  128.         tx[1] = (a/16+b*16)%10;

  129. //    Data_L=a&0X0F;
  130. //    for(num=3;num<7;num++)                 //小數部分
  131.    {
  132.       Data_L=Data_L*10;                                 //10           //100                //40                 //80
  133.      tx[num]=Data_L/16;                         //0          //6                        //2                         //5
  134.       Data_L=Data_L%16;                                 //10           //4                        //8
  135.         }

  136. }

  137. void anjian()
  138. {
  139.         if(k==1)
  140.         {
  141.                 Delay(5);
  142.                 if(k==1)
  143.                 {
  144.                                 w++;
  145.                         if(w>=9)
  146.                         {
  147.                         w=9;
  148.                         }
  149.                 }
  150. }
  151.      if(l==1)
  152.          {
  153.                 Delay(5);
  154.                  if(l==1)
  155.                  {
  156.                         w--;
  157.                          if(w<=0)
  158.                          {
  159.                         w=0;
  160.                         }
  161.                 }
  162.         }
  163. }




  164. //定時器中斷函數
  165. void Timer2() interrupt 5          //定時器2是5號中斷
  166. {
  167.         
  168. static uchar t;
  169. TF2=0;
  170. t++;
  171. if(t==100)               //間隔200ms(50ms*4)讀取一次時間
  172.   {
  173.    t=0;
  174.          rrr++;
  175.           if(rrr%2)
  176.                 {
  177.                         dianji2=1;
  178.                 }
  179.                 else
  180.                 {
  181.                         dianji2=0;
  182.                 }
  183.         }}
  184. //定時器2初始化
  185. void Init_timer2(void)
  186. {
  187.   RCAP2H=0x3c;//賦T2初始值0x3cb0,溢出20次為1秒,每次溢出時間為50ms
  188. RCAP2L=0xb0;
  189. TR2=1;             //啟動定時器2
  190. ET2=1;                 //打開定時器2中斷
  191. EA=1;                 //打開總中斷
  192. }


  193. //發送字符
  194.   //字符串發送函數
  195. void sendwendu( )
  196.                    // 傳送字串
  197.     {
  198.             unsigned char i = 0;
  199.             while(str[i] != '\0')
  200.            {
  201.                 SBUF = str[i];
  202.                 while(!TI);                                // 等特數據傳送
  203.                 TI = 0;                                        // 清除數據傳送標志
  204.                 i++;                                        // 下一個字符
  205.            }        
  206.    }
  207.          
  208.   void sendweishi( )
  209.                    // 傳送字串
  210.     {
  211.             unsigned char i = 0;
  212.             while(str1[i] != '\0')
  213.            {
  214.                 SBUF = str1[i];
  215.                 while(!TI);                                // 等特數據傳送
  216.                 TI = 0;                                        // 清除數據傳送標志
  217.                 i++;                                        // 下一個字符
  218.            }        
  219.     }
  220.          void senddengguang1( )
  221.                    // 傳送字串
  222.     {
  223.             unsigned char i = 0;
  224.             while(str21[i] != '\0')
  225.            {
  226.                 SBUF = str21[i];
  227.                 while(!TI);                                // 等特數據傳送
  228.                 TI = 0;                                        // 清除數據傳送標志
  229.                 i++;                                        // 下一個字符
  230.            }        
  231.     }
  232.                  void senddengguang2( )
  233.                    // 傳送字串
  234.     {
  235.             unsigned char i = 0;
  236.             while(str22[i] != '\0')
  237.            {
  238.                 SBUF = str22[i];
  239.                 while(!TI);                                // 等特數據傳送
  240.                 TI = 0;                                        // 清除數據傳送標志
  241.                 i++;                                        // 下一個字符
  242.            }        
  243.     }
  244. void sendgongyang( )
  245.                    // 傳送字串
  246.     {
  247.             unsigned char i = 0;
  248.             while(str3[i] != '\0')
  249.            {
  250.                 SBUF = str3[i];
  251.                 while(!TI);                                // 等特數據傳送
  252.                 TI = 0;                                        // 清除數據傳送標志
  253.                 i++;                                        // 下一個字符
  254.            }        
  255.     }

  256.         
  257. //紅外引腳  **********  P3^2   *********************
  258. /*端口定義*/
  259. unsigned char  irtime;//紅外用全局變量
  260. bit irpro_ok,irok;
  261. unsigned char IRcord[4];//用來存放用戶碼、用戶反碼、數據碼、數據反碼
  262. unsigned char   irdata[33];//用來存放32位碼值

  263. void clear_IR()
  264. {
  265.          IRcord[0] = 0;
  266.          IRcord[1] = 0;
  267.          IRcord[2] = 0;
  268.          IRcord[3] = 0;
  269. }        

  270. void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
  271. {
  272.         irtime++;
  273. }
  274. void ex0_isr (void) interrupt 0 using 0//外部中斷0服務函數
  275. {
  276.         static unsigned char  i;
  277.         static bit startflag;
  278.         if(startflag){
  279.             if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼
  280.         i=0;   
  281.             irdata[i]=irtime;
  282.             irtime=0;
  283.             i++;
  284.                    if(i==33){
  285.                           irok=1;
  286.                         i=0;
  287.                           }
  288.                 }         
  289.         else{
  290.                 irtime=0;
  291.                 startflag=1;
  292.                 }
  293. }
  294. void TIM0init(void)//定時器0初始化
  295. {
  296.         TMOD=0x22;//定時器0工作方式2,TH0是重裝值,TL0是初值
  297.   TH0=0x00;//reload value
  298.   TL0=0x00;//initial value
  299.         TL1=0xFD;
  300.         TH1=0xFD;
  301.         TR1=1;
  302.         SCON = 0x50;
  303.         ES=1;
  304.   ET0=1;//開中斷
  305.   TR0=1;
  306. }
  307. void EX0init(void)   //外部中斷0子函數
  308. {
  309.         IT0 = 1;   // Configure interrupt 0 for falling edge on /INT0 (P3.2)
  310.         EX0 = 1;   // Enable EX0 Interrupt
  311.         EA = 1;  
  312. }
  313. void Ircordpro(void)//紅外碼值處理函數(關鍵函數)
  314. {
  315.         unsigned char i, j, k=1;
  316.         unsigned char cord,value;

  317.         for(i=0;i<4;i++){//處理4個字節
  318.                 for(j=1;j<=8;j++){ //處理1個字節8位
  319.                         cord=irdata[k];
  320.                         value=value>>1;
  321.                 if(cord>7) value=value|0x80; //大于某值為1
  322.                    k++;
  323.                  }
  324.              IRcord[i]=value;
  325.              value=0;     
  326.              }
  327.     irpro_ok=1;//處理完畢標志位置1   
  328. }

  329. void none( void ) interrupt 4
  330. {
  331.         if(RI)                         //是否接收中斷
  332.     {
  333.        RI=0;
  334.        dat=SBUF;
  335.          }
  336. }
  337. //主函數
  338. void main(void)
  339. {
  340. led=0;
  341. Delay_xms(50);//等待系統穩定
  342. Init_DS18B20();
  343. Delay_xms(10);
  344. Init_timer2(); //外部中斷0
  345. EX0init();    //外部中斷0子函數
  346. TIM0init();   // 定時器0初始化

  347. SBUF = 1;
  348. dianji1=1;
  349. dianji2=1;
  350. ledds1302=0;
  351. ledduiguan=1;
  352. while(1)
  353.   {
  354.         if(OUT1==1||OUT2==0)//紅外對管+水泵
  355.                         {
  356.             ledduiguan=0;
  357.             Delay_xms(900);
  358.             ledduiguan=1;
  359.                         }        
  360.                 anjian();        ////////////////////////////////////////////////////////////////////////
  361.         ReadTemperature();         //讀取溫度
  362.             if(tx[1]==w)
  363. {
  364.                 led=0;
  365.                 Delay(500);
  366.                  led=1;
  367.         }
  368. /////////////////////////////////////////////////////////////////////////////////HX1838b
  369.         if(irok)
  370.         {
  371.         Ircordpro();
  372.         irok=0;
  373.         }
  374.             if(irpro_ok)
  375.                         { /*遙控成功接收*/
  376.         irpro_ok=0;
  377.                            }
  378.                                 //紅外控制照明  照明
  379.                         switch(IRcord[2])
  380.             {
  381.             case 0x45:LED_ON;senddengguang1();clear_IR();                            break;//1    燈泡
  382.         case 0x44:LED_OFF;senddengguang2( );clear_IR();                        break;//4
  383.         case 0x07:ledds1302=0;sendwendu( );clear_IR();                                break;//2   加熱棒
  384.         case 0x16:ledds1302=1;sendwendu( );clear_IR();                                break;//5
  385.         case 0x47:dianji1=1;dianji2=0;sendweishi( );clear_IR();                break;//3  喂食電機
  386.         case 0x43:dianji1=1;dianji2=1;sendweishi( );clear_IR();                break;//6
  387.         case 0x15:ledduiguan=0;sendgongyang( );clear_IR();          break;//8                     水泵供養
  388.         case 0x19:ledduiguan=1;clear_IR();                                                         break;//0
  389.             }        
  390. }
  391. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品中文字幕 | 午夜丁香视频在线观看 | 国产精品视频偷伦精品视频 | 69亚洲精品 | 亚洲精品一区在线观看 | 欧美日韩成人影院 | 黄色一级大片视频 | 黄a网站 | 欧美成人精品一区二区三区 | 国产永久免费 | 在线观看国产视频 | 欧美日韩精品一区二区三区四区 | 日本久久精品 | 中文字幕成人 | 国产一区久久精品 | 中文字幕乱码亚洲精品一区 | 亚洲第一区久久 | 国产一区二区精品在线观看 | 久草精品在线 | 亚洲高清在线 | 国产精品久久久久久久久久久久午夜片 | 一级特黄视频 | 国产精品一区二区电影 | 黑人一级片视频 | 成人三级视频在线观看 | 在线免费观看黄色网址 | 黄色大片免费看 | 久久久精| 国产偷录叫床高潮录音 | 国产精品精品视频一区二区三区 | 日韩精品一区二区三区中文在线 | 久久黄视频 | 视频三区 | 岛国av免费在线观看 | 在线视频日韩精品 | 成人在线a | 日本高清中文字幕 | av大片在线观看 | 午夜电影日韩 | 91精品麻豆日日躁夜夜躁 | 日本久久福利 |