找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1600|回复: 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 单片机教程网

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