找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2038|回复: 1
收起左侧

单片机智能水杯程序

[复制链接]
ID:553731 发表于 2019-8-27 08:48 | 显示全部楼层 |阅读模式
智能水杯

  1. /*连线说明:  蓝牙: RXD--P43
  2. 液晶 RXD--P31
  3. DHT11   DATA--P20
  4. */


  5. /*************** 用户定义参数 *****************************/

  6. #define MAIN_Fosc        11059200L        //define main clock
  7. #define Baudrate1        9600                //define the baudrate, 如果使用BRT做波特率发生器,则波特率跟串口2一样
  8.                                                                 //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
  9. #define Baudrate2        9600                //define the baudrate2,
  10.                                                                         //12T mode: 600~115200 for 22.1184MHZ, 300~57600 for 11.0592MHZ
  11. #define        BUF_LENTH        1                //定义串口接收缓冲长度
  12. /**********************************************************/


  13. #include        <STC12C5A60S2.h>
  14. #include    <DS18B20.h>
  15. #define U8  unsigned char
  16. #define U16 unsigned int

  17. unsigned char         uart1_wr;                //写指针
  18. unsigned char         uart1_rd;                //读指针
  19. unsigned char         xdata RX1_Buffer[BUF_LENTH];
  20. bit                B_TI,flag;

  21. unsigned char         uart2_wr;                //写指针
  22. unsigned char         uart2_rd;                //读指针
  23. unsigned char         xdata RX2_Buffer[BUF_LENTH];
  24. bit                 B_TI2;

  25. sbit JDQ=P3^7;

  26. bit  sec;
  27. U8   state,cnt;
  28. int  TempThreshold,TH;

  29. /****************** 编译器自动生成,用户请勿修改 ************************************/

  30. #define T1_TimerReload        (256 - MAIN_Fosc / 192 / Baudrate1)                        //Calculate the timer1 reload value        at 12T mode
  31. #define BRT_Reload                (256 - MAIN_Fosc / 192 / Baudrate2)                //Calculate BRT reload value

  32. #define        TimeOut1                (28800 / (unsigned long)Baudrate1 + 2)
  33. #define        TimeOut2                (28800 / (unsigned long)Baudrate2 + 2)

  34. #define        TI2                                (S2CON & 0x02) != 0
  35. #define        RI2                                (S2CON & 0x01) != 0
  36. #define        CLR_TI2()                 S2CON &= ~0x02
  37. #define        CLR_RI2()                 S2CON &= ~0x01

  38. /******************** 本地函数声明 ***************/
  39. void uart1_init(void);
  40. void uart2_init(void);
  41. void UART1_TxByte(unsigned char dat);
  42. void UART2_TxByte(unsigned char dat);
  43. void PrintString1(unsigned char *puts);
  44. void PrintString2(unsigned char *puts);

  45. /**********************************************************/
  46. //液晶相关函数,利用串口2完成数据收发功能

  47. void UART1_TxByte(unsigned char dat)
  48. {
  49.         B_TI = 0;
  50.         SBUF = dat;
  51.         while(!B_TI);
  52.         B_TI = 0;
  53. }

  54. void UART2_TxByte(unsigned char dat)
  55. {
  56.         B_TI2 = 0;
  57.         S2BUF = dat;
  58.         while(!B_TI2);
  59.         B_TI2 = 0;
  60. }

  61. void PrintString1(unsigned char *puts)                //发送一串字符串
  62. {
  63.     for (; *puts != 0;        puts++)  UART1_TxByte(*puts);         //遇到停止符0结束
  64. }

  65. void PrintString2(unsigned char *puts)                //发送一串字符串
  66. {
  67.     for (; *puts != 0;        puts++)  UART2_TxByte(*puts);         //遇到停止符0结束
  68. }

  69. void uart1_init(void)
  70. {
  71.         PCON |= 0x80;                //UART0 Double Rate Enable
  72.         SCON = 0x50;                //UART0 set as 10bit , UART0 RX enable
  73.         TMOD &= ~(1<<6);                //Timer1 Set as Timer, 12T
  74.         TMOD = (TMOD & ~0x30) | 0x20;        //Timer1 set as 8 bits auto relaod
  75.         TH1 = T1_TimerReload;                //Load the timer
  76.         TR1  = 1;
  77.         ES  = 1;
  78.         EA = 1;
  79. }

  80. /**********************************************/
  81. void UART0_RCV (void) interrupt 4
  82. {
  83.         if(RI)
  84.         {
  85.                 RI = 0;
  86.                 RX1_Buffer[uart1_wr] = SBUF;
  87.                 if(++uart1_wr >= BUF_LENTH)        uart1_wr = 0;
  88.         }

  89.         if(TI)
  90.         {
  91.                 TI = 0;
  92.                 B_TI = 1;
  93.         }
  94. }


  95. /**********************************************/
  96. void uart2_init(void)
  97. {
  98.         AUXR |=  (1 << 3);                //串口2波特率加倍
  99.         S2CON  = (S2CON & 0x3f) | (1<<6);        //串口2模式1,8位UART,(2^S2SMOD / 32) * BRT溢出率
  100.         S2CON |= 1 << 4;                //允许串2接收

  101.         AUXR |=  1 << 4;        //baudrate use BRT
  102.         BRT = BRT_Reload;

  103.         IE2 |=  1;                        //允许串口2中断
  104. }

  105. /**********************************************/
  106. void UART2_RCV (void) interrupt 8
  107. {
  108.         if(RI2)
  109.         {
  110.                 CLR_RI2();
  111.                 RX2_Buffer[uart2_wr] = S2BUF;
  112.                 flag=1;
  113.                 if(++uart2_wr >= BUF_LENTH)        uart2_wr = 0;
  114.         }

  115.         if(TI2)
  116.         {
  117.                 CLR_TI2();
  118.                 B_TI2 = 1;
  119.         }
  120. }

  121. /**********************************************************/
  122. void InitT0()
  123. {
  124.    TMOD|=0X01;
  125.    IE|=0X82;
  126.    TR0=1;
  127. }

  128. void T0Ser() interrupt 1
  129. {
  130.    if(++cnt==16)
  131.    {
  132.       cnt=0;
  133.           sec=1;
  134.    }
  135. }

  136. void Uart2Enter()
  137. {
  138.    UART2_TxByte(0x0d);
  139.    UART2_TxByte(0x0a);
  140. }

  141. void Uart1Enter()
  142. {
  143.    UART1_TxByte(0x0d);
  144.    UART1_TxByte(0x0a);
  145. }

  146. void dis_LanYa(void)
  147. {
  148.         char  temp[]="TH=25.0C";  

  149.         temp[3]=TempThreshold/100+48;
  150.     temp[4]=TempThreshold%100/10+48;       
  151.     temp[6]=TempThreshold%10+48;

  152.         UART2_TxByte('T');
  153.         UART2_TxByte('=');
  154.         UART2_TxByte(TH%1000/100+0x30);
  155.         UART2_TxByte(TH%100/10+0x30);
  156.         UART2_TxByte('.');
  157.         UART2_TxByte(TH%10+0x30);
  158.         PrintString2("C");
  159.         Uart2Enter();
  160.           
  161.     PrintString2(temp);
  162.         Uart2Enter();
  163.         Uart2Enter();   
  164. }

  165. void dis_LanYa2(void)
  166. {
  167.         char  temp[]="TH=25.0C";  

  168.         temp[3]=TempThreshold/100+48;
  169.     temp[4]=TempThreshold%100/10+48;       
  170.     temp[6]=TempThreshold%10+48;

  171.         UART1_TxByte('T');
  172.         UART1_TxByte('=');
  173.         UART1_TxByte(TH%1000/100+0x30);
  174.         UART1_TxByte(TH%100/10+0x30);
  175.         UART1_TxByte('.');
  176.         UART1_TxByte(TH%10+0x30);
  177.         PrintString1("C");
  178.     PrintString1(temp);
  179.         Uart1Enter();
  180.         Uart1Enter();  

  181. }

  182. void main(void)
  183. {
  184.         unsigned int  oldT,oldTh;

  185.     InitT0();

  186.         uart1_rd = 0;
  187.         uart1_wr = 0;
  188.         uart2_rd = 0;
  189.         uart2_wr = 0;

  190. //        AUXR |=  0x01;                //串口1使用独立波特率发生器, 波特率跟串口2一样
  191.         AUXR1 |= (1<<4);        //将UART2从P1口切换到 RXD2--P1.2切换到P4.2   TXD2---P1.3切换到P4.3
  192.        
  193.         uart1_init();
  194.         uart2_init();
  195.        
  196.         state=0; //==0 正常模式,==1设置模式                 
  197.           TempThreshold=400;
  198.                
  199.         P3M1&=0X7F;        //强推挽模式,推动继电器
  200.         P3M0|=0X80;

  201.         PrintString1("Hello");

  202.         while(1)
  203.         {
  204.            if(flag) //串行口2(蓝牙)接收到数据 A(温度增加)  B(温度减少)
  205.            {
  206.               flag=0;

  207.                      if(RX2_Buffer[0]=='A' || RX2_Buffer[0]=='a')
  208.                   {
  209.                     TempThreshold+=10; //目标温度++               
  210.                         if(TempThreshold>800)
  211.                         {
  212.                            PrintString2("Warning,you can't set the value greater than 80C");
  213.                            Uart2Enter();
  214.                            TempThreshold=800;
  215.                         }
  216.                   }
  217.           else if(RX2_Buffer[0]=='B' || RX2_Buffer[0]=='b')                 
  218.                   {
  219.                     TempThreshold-=10; //目标温度--
  220.                         if(TempThreshold<40)
  221.                         {
  222.                            PrintString2("Warning,you can't set the value less than 4C");
  223.                            Uart2Enter();
  224.                            TempThreshold=40;
  225.                         }                                                                            
  226.                   }                  
  227.            }

  228.            if(sec)
  229.            {
  230.                         sec=0;
  231.                         TH=Get_temp();
  232.                        
  233.                         if((oldT!=TH)||(TempThreshold!=oldTh))//如果温度有变化或者设置的阈值有变化,才更新显示
  234.                         {
  235.                            oldT=TH;
  236.                        oldTh=TempThreshold;

  237.                            dis_LanYa();
  238.                            dis_LanYa2();
  239.                             
  240.                            if(TH>=TempThreshold-1)  //还差1度就停止加热
  241.                                 {
  242.                                   PrintString2("Stop heat");
  243.                                   Uart2Enter();
  244.                                   JDQ=0;//关闭加热装置
  245.                                 }
  246.                                 else if(TH<TempThreshold-1) //相差1摄氏度再开启加热
  247.                                 {                   
  248.                                     JDQ=1;// 打开加热装置
  249.                                         PrintString2("Heating");
  250.                                     Uart2Enter();                                   
  251.                                 }       
  252.                         }
  253.                                                                  
  254.            }
  255.         }
  256. }
复制代码


智能水杯.7z

29.96 KB, 下载次数: 7, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1 发表于 2019-8-27 15:35 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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