找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机程序检测没问题,发送有回应,但无法控制单片机,求大佬看看,蓝牙在最后

[复制链接]
跳转到指定楼层
楼主
ID:545715 发表于 2019-5-23 19:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20黑币
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar time_data[7];
  6. uchar code write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};       //数据的地址
  7. uchar code read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};

  8. uchar code table1[]="S:000 2000/00/00";
  9. uchar code table2[]="N:000 00:00:00 0";
  10. uchar code table3[]="                ";                         //清屏内容
  11. uchar code table4[]="  Set Real Time ";
  12. uchar code table5[]="  Set Heat Time ";
  13. uchar code table6[]="   Start Time:  ";
  14. uchar code table7[]="    00:00:00    ";
  15. uchar code table8[]="    End Time:   ";
  16. uchar code table9[]="  Set Water Temp";
  17. uchar code table10[]="Temperature:    ";
  18. uchar code table11[]="            000C";

  19. bit Adjust;                          //调节标志位,=1表示进入调节模式,=0是正常模式
  20. bit Timer;                          //定时模式标志位,=1表示进入定时开启模式,=0是光线开启模式
  21. sbit rs=P1^0;                  //LCD1602
  22. sbit rw=P1^1;                   //LCD1602
  23. sbit e=P1^2;                  //LCD1602
  24. sbit sck=P3^2;                  //时钟端口
  25. sbit io=P3^3;                  //时钟端口
  26. sbit rst=P3^4;                  //时钟端口
  27. sbit SELT =P1^3;          //选择键
  28. sbit ENTER=P1^4;          //确认键
  29. sbit UP   =P1^5;          //加键
  30. sbit DOWN =P1^6;          //减键
  31. sbit CLEAN_LED=P3^7;  //清洗灯接口
  32. sbit CHECK=P3^6;          //水位检测灯接口
  33. sbit HEAT =P3^5;          //加热灯端口
  34. sbit JDQ  =P2^7;          //继电器接口
  35. sbit BEEP =P2^6;          //蜂鸣器接口
  36. sbit DQ   =P2^0;          //温度检测端口
  37. sbit WATER=P2^1;          //水位传感器接口
  38. sbit CLOSED=P2^2;          //红外检测接口
  39. sbit PUMP=P2^3;              //水泵接口
  40. sbit ADD  =P2^5;          //加水接口
  41. sbit CLEAN=P2^4;          //清洗接口

  42. int temperature;          //全局变量 温度
  43. int temp_set=100;          //设定温度 默认100
  44. uchar Select_num;          //选择按键按下次数
  45. uchar Enter_num;          //确认按键按下次数
  46. float Year,Month,Day,Hour,Minute,Second,Week;                //时间设置值
  47. float Hour_H,Minute_H,Second_H;                                          //设置开始时间
  48. float Hour_L,Minute_L,Second_L;                                          //设置结束时间
  49. int Count;                                                                                            //T0中断次数
  50. uchar Miao;                                                                                        //延时时间10s
  51. void read_rtc();
  52. uchar receive;

  53. /*********************************************************************************************************************/
  54. void delay1(uint z)                          //延时函数
  55. {
  56.         uint x,y;
  57.         for(x=z;x>0;x--)
  58.                 for(y=10;y>0;y--);
  59. }

  60. void write_com(uchar com)                         //写指令函数
  61. {
  62.         rw=0;
  63.         delay1(5);
  64.         rs=0;
  65.         delay1(5);
  66.         e=1;
  67.         delay1(5);
  68.         P0=com;
  69.         delay1(5);
  70.         e=0;
  71.         delay1(5);        
  72. }

  73. void write_date(uchar date)                        //写数据函数
  74. {                                                                        
  75.         rw=0;
  76.         delay1(5);
  77.         rs=1;
  78.         delay1(5);
  79.         e=1;
  80.         delay1(5);
  81.         P0=date;
  82.         delay1(5);
  83.         e=0;
  84.         delay1(5);        
  85. }

  86. void init()                                                    //初始化函数
  87. {        
  88.         uchar num;
  89.         Hour_H=23;
  90.         Minute_H=59;
  91.         Second_H=59;
  92.         e=0;                                                    // 时序表e初始为0
  93.         write_com(0x38);                        //设置16*2显示,5*7点阵,8位数据接口
  94.         write_com(0x0c);                                //设置光标
  95.         write_com(0x06);                                //光标自动加1,光标输入方式
  96.         write_com(0x01);                                //清屏
  97.         write_com(0x80);                                //设置初始显示位置
  98.         for(num=0;num<16;num++)
  99.         {
  100.                 write_date(table1[num]);
  101.                 delay1(5);
  102.         }
  103.         write_com(0x80+0x40);
  104.         for(num=0;num<16;num++)
  105.         {
  106.                 write_date(table2[num]);
  107.                 delay1(5);
  108.         }                                          
  109. }

  110. void SetTime_dispaly(uchar add,uchar dat)         //第一个:参数的地址,第二个:参数的内容
  111. {
  112.         uchar shi,ge;
  113.         shi=dat/10;                                                        //十位提取出来
  114.         ge=dat%10;                                                        //个位提取出来
  115.         write_com(add);                                                    //要写的地址
  116.         write_date(0x30+shi);                                //十位的内容   1602字符库
  117.         write_date(0x30+ge);                                //个位的内容   1602字符库
  118. }
  119. void Temperature_dispaly(uchar add,uchar dat)         //第一个:参数的地址,第二个:参数的内容
  120. {
  121.         uchar bai,shi,ge;
  122.         bai=dat/100;
  123.         shi=dat%100/10;                                                //把温度的十位提取出来
  124.         ge=dat%10;                                                        //把温度的个位提取出来
  125.         write_com(add);                                                   //要写的地址
  126.         write_date(0x30+bai);
  127.         write_date(0x30+shi);                                //十位的内容   1602字符库
  128.         write_date(0x30+ge);                                //个位的内容   1602字符库
  129. }
  130. void Date_dispaly(uchar add,uchar dat)         //第一个:参数的地址,第二个:参数的内容
  131. {
  132.         uchar shi,ge;
  133.         shi=dat/16;                                                        //把温度的十位提取出来
  134.         ge=dat%16;                                                        //把温度的个位提取出来
  135.         write_com(add);                                                    //要写的地址
  136.         write_date(0x30+shi);                                //十位的内容   1602字符库
  137.         write_date(0x30+ge);                                //个位的内容   1602字符库                                   
  138. }
  139. void Week_dispaly(uchar add,uchar dat)        //第一个:参数的地址,第二个:参数的内容
  140. {
  141.         write_com(add);                                                //要写的地址
  142.         write_date(0x30+dat);                                //十位的内容   1602字符库
  143. }
  144. void LCD_Clean(uchar i)                                        //液晶屏清除显示
  145. {
  146.         uchar num;
  147.         if(i==1)
  148.         {
  149.                 write_com(0x80);                                //设置初始显示位置
  150.                 for(num=0;num<16;num++)                        //显示第一行内容
  151.                 {
  152.                         write_date(table3[num]);
  153.                         delay1(1);
  154.                 }
  155.         }
  156.         if(i==2)
  157.         {
  158.                 write_com(0x80+0x40);
  159.                 for(num=0;num<16;num++)                        //显示第二行内容
  160.                 {
  161.                         write_date(table3[num]);
  162.                         delay1(1);
  163.                 }
  164.         }
  165. }

  166. void LCD_Display_String(unsigned char line,unsigned char *string)
  167. {                                                                                 //液晶屏显示内容,把要显示的内容写到对应的位置
  168.         unsigned char i;
  169.         unsigned char address=0;
  170.         if(line==1)
  171.         {
  172.                 address=0x80;                                         //0X80是第1行的第1个位置  ,0x81第2位
  173.         }
  174.         else if(line==2)
  175.         {
  176.                 address=0x80+0x40;                          //0X80+0x40是第2行的第1个位置  ,0X80+0x40+1是第2行第2位
  177.         }
  178.         
  179.         for(i=0;i<16;i++)
  180.         {
  181.                 write_com(address);
  182.                 write_date(string[i]);
  183.                 address++;
  184.         }
  185. }

  186. void Time_Display(void)
  187. {
  188.         read_rtc();
  189.         Date_dispaly(0x80+0x40+12,time_data[6]);  //显示秒
  190.         Date_dispaly(0x80+0x40+9,time_data[5]);         //显示分
  191.         Date_dispaly(0x80+0x40+6,time_data[4]);         //显示时
  192.         Date_dispaly(0x80+14,time_data[3]);                 //显示日
  193.         Date_dispaly(0x80+11,time_data[2]);                 //显示月
  194.         Week_dispaly(0x80+0x40+15,time_data[1]); //显示周
  195.         Date_dispaly(0x80+8,time_data[0]);                 //显示年
  196.                                            //        Year/10*16+Year%10
  197.         Year=time_data[0]/16*10+time_data[0]%16;
  198.         Week=time_data[1]/16*10+time_data[1]%16;
  199.         Month=time_data[2]/16*10+time_data[2]%16;
  200.         Day=time_data[3]/16*10+time_data[3]%16;
  201.         Hour=time_data[4]/16*10+time_data[4]%16;
  202.         Minute=time_data[5]/16*10+time_data[5]%16;
  203.         Second=time_data[6]/16*10+time_data[6]%16;
  204. }


  205. void write_ds1302_byte(uchar dat)
  206. {
  207.         uchar i;
  208.         for(i=0;i<8;i++)
  209.         {
  210.                 sck=0;
  211.                 io=dat&0x01;                                           //准备数据,从最低位开始
  212.                 dat=dat>>1;
  213.                 sck=1;
  214.         }
  215. }

  216. void write_ds1302(uchar add,uchar dat)
  217. {
  218.         rst=0;
  219.         _nop_();                                                  //CPU原地踏步
  220.         sck=0;
  221.         _nop_();
  222.         rst=1;
  223.         _nop_();
  224.         write_ds1302_byte(add);                    //传地址
  225.         write_ds1302_byte(dat);                    //传数据
  226.         rst=0;                                                     //不受其他影响
  227.         _nop_();
  228.         io=1;                                                   //释放
  229.         sck=1;
  230. }

  231. uchar read_ds1302(uchar add)
  232. {
  233.         uchar i,value;
  234.         rst=0;
  235.         _nop_();  //CPU原地踏步
  236.         sck=0;
  237.         _nop_();
  238.         rst=1;
  239.         _nop_();
  240.         write_ds1302_byte(add);
  241.         for(i=0;i<8;i++)
  242.         {
  243.                 value=value>>1;
  244.                 sck=0;
  245.                 if(io)
  246.                 value=value|0x80;
  247.                 sck=1;
  248.         }
  249.         rst=0;
  250.         _nop_();
  251.         sck=0;
  252.         _nop_();
  253.         sck=1;
  254.         io=1;
  255.         return value;
  256. }

  257. void set_rtc()                                  //设置时间
  258. {
  259.         uchar i,j;
  260.         for(i=0;i<7;i++)                         //转换BCD码
  261.         {
  262.                 j=time_data[i]/10;
  263.                 time_data[i]=time_data[i]%10;
  264.                 time_data[i]=time_data[i]+j*16;
  265.         }
  266.         write_ds1302(0x8e,0x00);          //去除写保护
  267.         for(i=0;i<7;i++)
  268.         {
  269.                 write_ds1302(write_add[i],time_data[i]);
  270.         }
  271.         write_ds1302(0x8e,0x80);      //加写保护
  272. }

  273. void read_rtc()
  274. {
  275.         uchar i;
  276.         for(i=0;i<7;i++)
  277.         {
  278.                 time_data[i]=read_ds1302(read_add[i]);        //最终读出来的数 16进制
  279.         }
  280. }

  281. /*************************************************按键****************************************************************/
  282. void Keyscan(void)
  283. {
  284.         if(SELT==0)
  285.         {
  286.                 delay1(2);
  287.                 if(SELT==0)
  288.                 {
  289.                         while(!SELT);
  290.                         Select_num++;                                        //选择键按下一次
  291.                         Adjust=1;                                                //进入调节模式                        
  292.                 }
  293.                 if(Select_num==1)
  294.                 {
  295.                         LCD_Clean(1);
  296.                         LCD_Clean(2);
  297.                         LCD_Display_String(1,table4);
  298.                         LCD_Display_String(2,table5);
  299.                         write_com(0x80+0);                                //写 >>
  300.                         write_date(0x3e);
  301.                         write_com(0x80+1);                                //写 >>
  302.                         write_date(0x3e);
  303.                         Enter_num=0;
  304.                 }
  305.                 if(Select_num==2)
  306.                 {
  307.                         LCD_Clean(1);
  308.                         LCD_Clean(2);
  309.                         LCD_Display_String(1,table4);
  310.                         LCD_Display_String(2,table5);
  311.                         write_com(0x80+0x40+0);                                //写 >>
  312.                         write_date(0x3e);
  313.                         write_com(0x80+0x40+1);                                //写 >>
  314.                         write_date(0x3e);
  315.                         Enter_num=0;
  316.                 }
  317.                 if(Select_num==3)
  318.                 {
  319.                         LCD_Clean(1);
  320.                         LCD_Clean(2);
  321.                         LCD_Display_String(1,table9);
  322.                         LCD_Display_String(2,table3);
  323.                         write_com(0x80+0);                                //写 >>
  324.                         write_date(0x3e);
  325.                         write_com(0x80+1);                                //写 >>
  326.                         write_date(0x3e);
  327.                         Enter_num=0;
  328.                 }
  329.                 if(Select_num==4)
  330.                 {
  331.                         LCD_Clean(1);
  332.                         LCD_Clean(2);
  333.                         LCD_Display_String(1,table1);
  334.                         LCD_Display_String(2,table2);
  335.                         Select_num=0;
  336.                         Enter_num=0;                                       
  337.                         Adjust=0;
  338.                 }
  339.                 write_com(0x0c);                                                                        //光标不再闪烁
  340.                 Enter_num=0;
  341.         }
  342.         
  343.         if(ENTER==0)
  344.         {
  345.                 delay1(2);
  346.                 if(ENTER==0)
  347.                 {
  348.                         while(!ENTER);
  349.                         Enter_num++;
  350.                 }
  351.                 if(Select_num==1)                                        //设置实时时间
  352.                 {
  353.                         if(Enter_num==1)
  354.                         {
  355.                                 LCD_Clean(1);
  356.                                 LCD_Clean(2);
  357.                                 LCD_Display_String(1,table1);
  358.                                 LCD_Display_String(2,table2);
  359.                                 SetTime_dispaly(0x80+8,Year);
  360.                                 SetTime_dispaly(0x80+11,Month);
  361.                                 SetTime_dispaly(0x80+14,Day);
  362.                                 SetTime_dispaly(0x80+0x40+6,Hour);
  363.                                 SetTime_dispaly(0x80+0x40+9,Minute);
  364.                                 SetTime_dispaly(0x80+0x40+12,Second);
  365.                                 Week_dispaly(0x80+0x40+15,Week);
  366.                                 write_com(0x80+8);                        //光标闪烁地址,停留在年的位置上                                       
  367.                                 write_com(0x0f);                        //光标闪烁
  368.                         }
  369.                         if(Enter_num==2)
  370.                         {
  371.                                 write_com(0x80+11);                        //光标闪烁地址,停留在月的位置上                                       
  372.                                 write_com(0x0f);                        //光标闪烁
  373.                         }
  374.                         if(Enter_num==3)
  375.                         {
  376.                                 write_com(0x80+14);                        //光标闪烁地址,停留在日的位置上                                       
  377.                                 write_com(0x0f);                        //光标闪烁
  378.                         }
  379.                         if(Enter_num==4)
  380.                         {
  381.                                 write_com(0x80+0x40+6);                //光标闪烁地址,停留在时的位置上                                       
  382.                                 write_com(0x0f);                        //光标闪烁
  383.                         }
  384.                         if(Enter_num==5)
  385.                         {
  386.                                 write_com(0x80+0x40+9);                //光标闪烁地址,停留在分的位置上                                       
  387.                                 write_com(0x0f);                        //光标闪烁
  388.                         }
  389.                         if(Enter_num==6)
  390.                         {
  391.                                 write_com(0x80+0x40+12);                //光标闪烁地址,停留在秒的位置上                                       
  392.                                 write_com(0x0f);                        //光标闪烁
  393.                         }
  394.                         if(Enter_num==7)
  395.                         {
  396.                                 write_com(0x80+0x40+15);        //光标闪烁地址,停留在星期的位置上                                       
  397.                                 write_com(0x0f);                        //光标闪烁
  398.                         }
  399.                         if(Enter_num==8)
  400.                         {
  401.                                 Enter_num=0;
  402.                                 write_com(0x0c);                        //光标不再闪烁
  403.                                 LCD_Clean(1);
  404.                                 LCD_Clean(2);
  405.                                 LCD_Display_String(1,table1);
  406.                                 LCD_Display_String(2,table2);
  407.                                 time_data[0]=Year;///10*16+Year%10;
  408.                                 time_data[1]=Week;///10*16+Week%10;
  409.                                 time_data[2]=Month;///10*16+Month%10;
  410.                                 time_data[3]=Day;///10*16+Day%10;
  411.                                 time_data[4]=Hour;///10*16+Hour%10;
  412.                                 time_data[5]=Minute;///10*16+Minute%10;
  413.                                 time_data[6]=Second;///10*16+Second%10;
  414.                                 set_rtc();                                         //设置时间
  415.                                 Select_num=0;
  416.                                 Adjust=0;
  417.                         }
  418.                 }

  419.                 if(Select_num==2)                                        //设置时间段
  420.                 {
  421.                         if(Enter_num==1)
  422.                         {
  423.                                 LCD_Clean(1);
  424.                                 LCD_Clean(2);
  425.                                 LCD_Display_String(1,table6);
  426.                                 LCD_Display_String(2,table7);
  427.                                 SetTime_dispaly(0x80+0x40+4,Hour_L);
  428.                                 SetTime_dispaly(0x80+0x40+7,Minute_L);
  429.                                 SetTime_dispaly(0x80+0x40+10,Second_L);
  430.                                 write_com(0x80+0x40+4);                //光标闪烁地址,停留在时的位置上                                       
  431.                                 write_com(0x0f);                        //光标闪烁
  432.                         }
  433.                         if(Enter_num==2)
  434.                         {
  435.                                 write_com(0x80+0x40+7);                //光标闪烁地址,停留在分的位置上                                       
  436.                                 write_com(0x0f);                        //光标闪烁
  437.                         }
  438.                         if(Enter_num==3)
  439.                         {
  440.                                 write_com(0x80+0x40+10);        //光标闪烁地址,停留在秒的位置上                                       
  441.                                 write_com(0x0f);                        //光标闪烁
  442.                         }
  443.                         if(Enter_num==4)
  444.                         {
  445.                                 write_com(0x0c);                        //光标不再闪烁
  446.                                 LCD_Clean(1);
  447.                                 LCD_Clean(2);
  448.                                 LCD_Display_String(1,table8);
  449.                                 LCD_Display_String(2,table7);        
  450.                                 SetTime_dispaly(0x80+0x40+4,Hour_H);
  451.                                 SetTime_dispaly(0x80+0x40+7,Minute_H);
  452.                                 SetTime_dispaly(0x80+0x40+10,Second_H);
  453.                                 write_com(0x80+0x40+4);                //光标闪烁地址,停留在时的位置上                                       
  454.                                 write_com(0x0f);                        //光标闪烁
  455.                         }
  456.                         if(Enter_num==5)
  457.                         {
  458.                                 write_com(0x80+0x40+7);                //光标闪烁地址,停留在分的位置上                                       
  459.                                 write_com(0x0f);                        //光标闪烁
  460.                         }
  461.                         if(Enter_num==6)
  462.                         {
  463.                                 write_com(0x80+0x40+10);        //光标闪烁地址,停留在秒的位置上                                       
  464.                                 write_com(0x0f);                        //光标闪烁
  465.                         }               
  466.                         if(Enter_num==7)
  467.                         {
  468.                                 Enter_num=0;
  469.                                 write_com(0x0c);                        //光标不再闪烁
  470.                                 LCD_Clean(1);
  471.                                 LCD_Clean(2);
  472.                                 LCD_Display_String(1,table1);
  473.                                 LCD_Display_String(2,table2);
  474.                                 Select_num=0;
  475.                                 Adjust=0;
  476.                         }
  477.                 }

  478.                 if(Select_num==3)                                        //设置水温
  479.                 {
  480.                         if(Enter_num==1)
  481.                         {
  482.                                 LCD_Clean(1);
  483.                                 LCD_Clean(2);
  484.                                 LCD_Display_String(1,table10);
  485.                                 LCD_Display_String(2,table11);
  486.                                 Temperature_dispaly(0x80+0x40+12,temp_set);
  487.                                 write_com(0x80+0x40+12);        //光标闪烁地址,停留在水温的位置上                                       
  488.                                 write_com(0x0f);                        //光标闪烁
  489.                         }                        
  490.                         if(Enter_num==2)
  491.                         {
  492.                                 Enter_num=0;
  493.                                 write_com(0x0c);                        //光标不再闪烁
  494.                                 LCD_Clean(1);
  495.                                 LCD_Clean(2);
  496.                                 LCD_Display_String(1,table1);
  497.                                 LCD_Display_String(2,table2);
  498.                                 Select_num=0;
  499.                                 Adjust=0;
  500.                         }
  501.                 }

  502.         }
  503.         if(UP==0)
  504.         {
  505.                 delay1(2);
  506.                 if(UP==0)
  507.                 {
  508.                         while(!UP);
  509.                         if(Select_num==1)
  510.                         {
  511.                                 if(Enter_num==1)
  512.                                 {
  513.                                         Year++;
  514.                                         if(Year>99)
  515.                                         Year=0;
  516.                                         SetTime_dispaly(0x80+8,Year);
  517.                                         write_com(0x80+8);                                                               
  518.                                         write_com(0x0f);                        
  519.                                 }
  520.                                 if(Enter_num==2)
  521.                                 {
  522.                                         Month++;
  523.                                         if(Month>12)
  524.                                         Month=1;
  525.                                         SetTime_dispaly(0x80+11,Month);
  526.                                         write_com(0x80+11);                                                               
  527.                                         write_com(0x0f);                                                         
  528.                                 }
  529.                                 if(Enter_num==3)
  530.                                 {
  531.                                         Day++;
  532.                                         if(Day>31)
  533.                                         Day=1;
  534.                                         SetTime_dispaly(0x80+14,Day);
  535.                                         write_com(0x80+14);                                                               
  536.                                         write_com(0x0f);
  537.                                 }
  538.                                 if(Enter_num==4)
  539.                                 {
  540.                                         Hour++;
  541.                                         if(Hour>23)
  542.                                         Hour=0;
  543.                                         SetTime_dispaly(0x80+0x40+6,Hour);
  544.                                         write_com(0x80+0x40+6);                                                               
  545.                                         write_com(0x0f);
  546.                                 }
  547.                                 if(Enter_num==5)
  548.                                 {
  549.                                         Minute++;
  550.                                         if(Minute>59)
  551.                                         Minute=0;
  552.                                         SetTime_dispaly(0x80+0x40+9,Minute);
  553.                                         write_com(0x80+0x40+9);                                                               
  554.                                         write_com(0x0f);
  555.                                 }
  556.                                 if(Enter_num==6)
  557.                                 {
  558.                                         Second++;
  559.                                         if(Second>59)
  560.                                         Second=0;
  561.                                         SetTime_dispaly(0x80+0x40+12,Second);
  562.                                         write_com(0x80+0x40+12);                                                               
  563.                                         write_com(0x0f);
  564.                                 }
  565.                                 if(Enter_num==7)
  566.                                 {
  567.                                         Week++;
  568.                                         if(Week>7)
  569.                                         Week=1;
  570.                                         Week_dispaly(0x80+0x40+15,Week);
  571.                                         write_com(0x80+0x40+15);                                                               
  572.                                         write_com(0x0f);
  573.                                 }
  574.                         }
  575.                         if(Select_num==2)
  576.                         {                                
  577.                                 if(Enter_num==1)
  578.                                 {
  579.                                         Hour_L++;
  580.                                         if(Hour_L>23)
  581.                                         Hour_L=0;
  582.                                         SetTime_dispaly(0x80+0x40+4,Hour_L);
  583.                                         write_com(0x80+0x40+4);                                                               
  584.                                         write_com(0x0f);
  585.                                 }
  586.                                 if(Enter_num==2)
  587.                                 {
  588.                                         Minute_L++;
  589.                                         if(Minute_L>59)
  590.                                         Minute_L=0;
  591.                                         SetTime_dispaly(0x80+0x40+7,Minute_L);
  592.                                         write_com(0x80+0x40+7);                                                               
  593.                                         write_com(0x0f);
  594.                                 }
  595.                                  
  596.                                 if(Enter_num==3)
  597.                                 {
  598.                                         Second_L++;
  599.                                         if(Second_L>59)
  600.                                         Second_L=0;
  601.                                         SetTime_dispaly(0x80+0x40+10,Second_L);
  602.                                         write_com(0x80+0x40+10);                                                               
  603.                                         write_com(0x0f);
  604.                                 }
  605.                                 if(Enter_num==4)
  606.                                 {
  607.                                         Hour_H++;
  608.                                         if(Hour_H>23)
  609.                                         Hour_H=0;
  610.                                         SetTime_dispaly(0x80+0x40+4,Hour_H);
  611.                                         write_com(0x80+0x40+4);                                                               
  612.                                         write_com(0x0f);
  613.                                 }
  614.                                 if(Enter_num==5)
  615.                                 {
  616.                                         Minute_H++;
  617.                                         if(Minute_H>59)
  618.                                         Minute_H=0;
  619.                                         SetTime_dispaly(0x80+0x40+7,Minute_H);
  620.                                         write_com(0x80+0x40+7);                                                               
  621.                                         write_com(0x0f);
  622.                                 }
  623.                                  
  624.                                 if(Enter_num==6)
  625.                                 {
  626.                                         Second_H++;
  627.                                         if(Second_H>59)
  628.                                         Second_H=0;
  629.                                         SetTime_dispaly(0x80+0x40+10,Second_H);
  630.                                         write_com(0x80+0x40+10);                                                               
  631.                                         write_com(0x0f);
  632.                                 }
  633.                         }
  634.                         if(Select_num==3)
  635.                         {                                
  636.                                 if(Enter_num==1)
  637.                                 {
  638.                                         temp_set++;
  639.                                         if(temp_set>100)                                  //最高100度
  640.                                         temp_set=0;
  641.                                         Temperature_dispaly(0x80+0x40+12,temp_set);
  642.                                         write_com(0x80+0x40+12);                                                               
  643.                                         write_com(0x0f);
  644.                                 }                                
  645.                         }
  646.                 }
  647.         }
  648.         if(DOWN==0)
  649.         {
  650.                 delay1(2);
  651.                 if(DOWN==0)
  652.                 {
  653.                         while(!DOWN);
  654.                         if(Select_num==1)
  655.                         {
  656.                                 if(Enter_num==1)
  657.                                 {
  658.                                         Year--;
  659.                                         if(Year<0)
  660.                                         Year=99;
  661.                                         SetTime_dispaly(0x80+8,Year);
  662.                                         write_com(0x80+8);                                                               
  663.                                         write_com(0x0f);
  664.                                 }
  665.                                 if(Enter_num==2)
  666.                                 {
  667.                                         Month--;
  668.                                         if(Month<1)
  669.                                         Month=12;
  670.                                         SetTime_dispaly(0x80+11,Month);
  671.                                         write_com(0x80+11);                                                               
  672.                                         write_com(0x0f);
  673.                                 }
  674.                                 if(Enter_num==3)
  675.                                 {
  676.                                         Day--;
  677.                                         if(Day<1)
  678.                                         Day=31;
  679.                                         SetTime_dispaly(0x80+14,Day);
  680.                                         write_com(0x80+14);                                                               
  681.                                         write_com(0x0f);
  682.                                 }
  683.                                 if(Enter_num==4)
  684.                                 {
  685.                                         Hour--;
  686.                                         if(Hour<0)
  687.                                         Hour=23;
  688.                                         SetTime_dispaly(0x80+0x40+6,Hour);
  689.                                         write_com(0x80+0x40+6);                                                               
  690.                                         write_com(0x0f);
  691.                                 }
  692.                                 if(Enter_num==5)
  693.                                 {
  694.                                         Minute--;
  695.                                         if(Minute<0)
  696.                                         Minute=59;
  697.                                         SetTime_dispaly(0x80+0x40+9,Minute);
  698.                                         write_com(0x80+0x40+9);                                                               
  699.                                         write_com(0x0f);
  700.                                 }
  701.                                 if(Enter_num==6)
  702.                                 {
  703.                                         Second--;
  704.                                         if(Second<0)
  705.                                         Second=59;
  706.                                         SetTime_dispaly(0x80+0x40+12,Second);
  707.                                         write_com(0x80+0x40+12);                                                               
  708.                                         write_com(0x0f);
  709.                                 }
  710.                                 if(Enter_num==7)
  711.                                 {
  712.                                         Week--;
  713.                                         if(Week<1)
  714.                                         Week=7;
  715.                                         Week_dispaly(0x80+0x40+15,Week);
  716.                                         write_com(0x80+0x40+15);                                                               
  717.                                         write_com(0x0f);
  718.                                 }               
  719.                         }

  720.                         if(Select_num==2)
  721.                         {
  722.                                 if(Enter_num==1)
  723.                                 {
  724.                                         Hour_L--;
  725.                                         if(Hour_L<0)
  726.                                         Hour_L=23;
  727.                                         SetTime_dispaly(0x80+0x40+4,Hour_L);
  728.                                         write_com(0x80+0x40+4);                                                               
  729.                                         write_com(0x0f);
  730.                                 }
  731.                                 if(Enter_num==2)
  732.                                 {
  733.                                         Minute_L--;
  734.                                         if(Minute_L<0)
  735.                                         Minute_L=59;
  736.                                         SetTime_dispaly(0x80+0x40+7,Minute_L);
  737.                                         write_com(0x80+0x40+7);                                                               
  738.                                         write_com(0x0f);
  739.                                 }
  740.                                 if(Enter_num==3)
  741.                                 {
  742.                                         Second_L--;
  743.                                         if(Second_L<0)
  744.                                         Second_L=59;
  745.                                         SetTime_dispaly(0x80+0x40+10,Second_L);
  746.                                         write_com(0x80+0x40+10);                                                               
  747.                                         write_com(0x0f);
  748.                                 }
  749.                                  
  750.                                 if(Enter_num==4)
  751.                                 {
  752.                                         Hour_H--;
  753.                                         if(Hour_H<0)
  754.                                         Hour_H=23;
  755.                                         SetTime_dispaly(0x80+0x40+4,Hour_H);
  756.                                         write_com(0x80+0x40+4);                                                               
  757.                                         write_com(0x0f);
  758.                                 }
  759.                                 if(Enter_num==5)
  760.                                 {
  761.                                         Minute_H--;
  762.                                         if(Minute_H<0)
  763.                                         Minute_H=59;
  764.                                         SetTime_dispaly(0x80+0x40+7,Minute_H);
  765.                                         write_com(0x80+0x40+7);                                                               
  766.                                         write_com(0x0f);
  767.                                 }
  768.                                 if(Enter_num==6)
  769.                                 {
  770.                                         Second_H--;
  771.                                         if(Second_H<0)
  772.                                         Second_H=59;
  773.                                         SetTime_dispaly(0x80+0x40+10,Second_H);
  774.                                         write_com(0x80+0x40+10);                                                               
  775.                                         write_com(0x0f);
  776.                                 }
  777.                         }
  778.                         if(Select_num==3)
  779.                         {                                
  780.                                 if(Enter_num==1)
  781.                                 {
  782.                                         temp_set--;
  783.                                         if(temp_set<0)                                  //最高70度
  784.                                         temp_set=100;
  785.                                         Temperature_dispaly(0x80+0x40+12,temp_set);
  786.                                         write_com(0x80+0x40+12);                                                               
  787.                                         write_com(0x0f);
  788.                                 }                                
  789.                         }
  790.                 }
  791.         }
  792. }

  793. void Open(void)
  794. {
  795.         float Now;
  796.         float Set_L,Set_H;
  797.         Now=Hour+Minute/60+Second/3600;                                  //把实时时间化成小时为单位
  798.         Set_L=Hour_L+Minute_L/60+Second_L/3600;                  //把设置下限时间化成小时为单位
  799.         Set_H=Hour_H+Minute_H/60+Second_H/3600;                  //把设置上限时间化成小时为单位
  800.         if(WATER==1)                                                                  //表示有水
  801.         {
  802.                 ADD=1;                                                                          //停止加水
  803.                 BEEP=0;                                                                          //关蜂鸣器
  804.                 CHECK=1;                                                              //缺水灯灭
  805.                 if(temperature<temp_set)                                  //温度低于设置值 需要加热
  806.                 {
  807.                         if((Now>=Set_L)&(Now<=Set_H))                  //实时时间在上下限时间范围内
  808.                         {
  809.                                 HEAT=0;                                                          //加热
  810.                                 JDQ=0;                                                          //闭合继电器
  811.                         }
  812.                         if((Now<Set_L)|(Now>Set_H))                          //实时时间不在范围内
  813.                         {
  814.                                 HEAT=1;                                                          //停止加热
  815.                                 JDQ=1;                                                          //断开继电器
  816.                         }
  817.                 }
  818.                 else
  819.                 {
  820.                         HEAT=1;                                                                    //停止加热
  821.                         JDQ=1;                                                                  //断开继电器
  822.                 }

  823.                 if(CLOSED==0)                                                          //有水时 靠近开水泵出水
  824.                 PUMP=0;
  825.                 else
  826.                 PUMP=1;
  827.         }
  828.         else                                                                                  //如果缺水
  829.         {
  830.                 CHECK=0;                                                                  //缺水灯亮
  831.                 BEEP=1;                                                                          //开蜂鸣器
  832.                 HEAT=1;                                                                           //停止加热
  833.                 JDQ=1;                                                                            //断开继电器
  834.                 ADD=0;                                                                          //加水
  835.                 PUMP=1;                                                                          //无水时无法出水
  836.         }
  837.         if((time_data[1]==2)&(Hour>=6)&(Hour<7))          //清洗功能  固定周一早上六点到七点 2表示一个星期第二天,星期一
  838.         {
  839.                 CLEAN=0;                                                                  //开启清洗电机
  840.                 CLEAN_LED=0;                                                          //开启清洗灯
  841.         }
  842.         else
  843.         {
  844.                 CLEAN=1;                                                                  //关闭清洗电机
  845.                 CLEAN_LED=1;                                                          //关闭清洗灯
  846.         }

  847. }

  848. /****************************************************************************************************/
  849. /*void delay(uint y)                                                                           //DS18B20延时函数(仿真用)
  850. {
  851.         while(y--);
  852. }
  853. */
  854. void delay(uint z)                                                                                  //DS18B20延时函数(实物用)
  855. {
  856.         uint x,y;
  857.         for(x=z;x>0;x--)
  858.                 for(y=1;y>0;y--);
  859. }  

  860. void write_byte(uint dat)                        //写一个字节
  861. {
  862.         uchar i;
  863.         for(i=0;i<8;i++)                        //循环八次          共有八位
  864.         {
  865.                 DQ=0;                                                //写零
  866.                 DQ=dat&0x01;                //向总线写位数据,从最低位写起
  867.                 delay(4);
  868.                 DQ=1;                                                //写一
  869.                 dat>>=1;                                    //下次写作准备,移位数据
  870.         }
  871.         delay(4);
  872. }                                    

  873. uchar read_byte(void)                                //读一个字节,返回值
  874. {
  875.         uchar i;
  876.         uint value;
  877.         for(i=0;i<8;i++)                        //循环八次          共有八位
  878.         {
  879.                 DQ=0;
  880.                 value>>=1;
  881.                 DQ=1;                                                //释放总线
  882.                 if(DQ)
  883.                 value|=0x80;                            //DQ=1,value取1
  884.                 delay(4);
  885.         }
  886.         return value;
  887. }

  888. void ds18b20_init()                                    //初始化函数
  889. {
  890.         uint n;
  891.         DQ=1;
  892.         delay(8);                                          
  893.         DQ=0;
  894.         delay(80);                                            //低电平480——960us
  895.         DQ=1;                                                        //总线释放
  896.         delay(8);                                            //等待50——100us
  897.         n=DQ;                                                    //读取复位状态
  898.         delay(4);
  899. }

  900. int readtemperature()                                //读整数部分
  901. {        
  902.     int a,b;                                                //高八位,低八位
  903.         ds18b20_init();
  904.         write_byte(0xcc);                            //跳过rom匹配,跳过读序列号的操作,可节省操作时间
  905.         write_byte(0x44);                            //启动温度检测
  906.         delay(300);                                            //测温度
  907.         ds18b20_init();                                    //开始操作前需要复位
  908.         write_byte(0xcc);                                //跳过rom匹配
  909.         write_byte(0xbe);                            //写读寄存器中温度值的命令
  910.         a=read_byte();                                    //low          低位开始读取
  911.         b=read_byte();                                    //high          高位开始读取
  912.         b<<=8;                                                        //把高位左移八位
  913.         b=b|a;                                                        //高八位与第八位进行或运算,得到总和
  914.         if(b>=0)                                                //如果温度大于等于0
  915.         {
  916.                 b=b*0.0625;                                        //直接乘以0.0625
  917.         }
  918.     else                                                        //温度小于0
  919.         {        
  920.                 b=~b+1;                                                //取反码再加一
  921.                 b=b*0.0625;                                        //再运算
  922.         }
  923.         return b;                                                //返回b,此时以表示温度
  924. }

  925. /*******************************************************************************************************/
  926. void T0_init(void)
  927. {
  928.         TMOD=0x11;                                              //设置定时器0为工作方式1
  929.         TH0=(65536-50000)/256;              //50MS定时
  930.         TL0=(65536-50000)%256;
  931.         EA=1;                                                      //开定时器T0的中断        总中断
  932.         ET0=1;                                                   //允许T0中断
  933.         TR0=1;                                                   //开启定时器
  934. }

  935. void UsartConfiguration(void)
  936. {        
  937.         SCON=0X50;                        //设置为工作方式1,8位数据,可变波特率
  938.         TMOD=0X20;                        //设置计数器工作方式2
  939.         PCON=0X00;                        //波特率不加倍
  940.         TH1=0XFd;                    //计数器初始值设置,[url=mailto:9600@11.0592MHz]9600@11.0592MHz[/url]
  941.         TL1=0XFd;
  942.         TR1=1;                                        //打开计数器
  943.         ES = 1;         //开串口中断
  944.    EA = 1;         //开总中断
  945. }


  946. void main()
  947. {
  948.         BEEP=0;                                                 //关闭蜂鸣器
  949.         T0_init();                                         //定时器初始化
  950.         init();                                                 //液晶初始化
  951.         UsartConfiguration();
  952.         while(1)
  953.         {
  954.          if(Adjust==0)                         //非调节模式下显示时间和开锁
  955.                 {
  956.                         Time_Display();                 //显示时间
  957.                         if(Count>=10)                                                        //50ms*10次=0.5s
  958.                         {
  959.                                 temperature=readtemperature();                //读取温度
  960.                                 Temperature_dispaly(0x80+0x40+2,temperature);//显示温度
  961.                                 Temperature_dispaly(0x80+2,temp_set);             //显示设置温度
  962.                                 Count=0;                                                        //清除计数
  963.                         }
  964.                         Open();                                  //动作判断
  965.                 }
  966.                 Keyscan();                                 //扫描键盘
  967.         }

  968. }


  969. void Timer0() interrupt 1                                        //定时器T0中断函数
  970. {
  971.         TH0=(65536-50000)/256;                                        //赋初值=50ms
  972.         TL0=(65536-50000)%256;                                        //TH0=3C,TL0=B0
  973.         Count++;                                                                //每中断一次,Count加一,计数20次,表示1s的时间到
  974. }
  975. void UART_SER(void) interrupt 4
  976. {
  977.                 EA=0;
  978.                receive=SBUF;
  979.         RI=0;  
  980.                       if(receive=='1')
  981.                                 {
  982.                                  HEAT=0;                                                          //加热
  983.                                  JDQ=0;                                                          //闭合继电器
  984.                                 }
  985.                       if(receive=='2')
  986.                                 {
  987.                                          HEAT=1;                                                                    //停止加热
  988.                          JDQ=1;                                                                  //断开继电器
  989.                                 }
  990.                      if(receive=='3')
  991.                                 {
  992.                                          CLEAN=0;                                                                  //开启清洗电机
  993.                         CLEAN_LED=0;                                                          //开启清洗灯
  994.                                 }
  995.                      if(receive=='4')
  996.                                 {
  997.                                          CLEAN=1;                                                                  //关闭清洗电机
  998.                         CLEAN_LED=1;                                                          //关闭清洗灯
  999.                                 }      

  1000.                     
  1001.                          SBUF = receive;   //将要发送的数据放入到发送寄存器
  1002.                         while(!TI);                    //等待发送数据完成
  1003.                         TI=0;                                //清除发送完成标志位                        
  1004.                     EA=1;
  1005. }
复制代码

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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