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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4203|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)gsm-A6+lcd2864智能花盆程序代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:225134 發(fā)表于 2017-9-1 12:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
51單片機(jī)智能花盆程序代碼,內(nèi)有詳細(xì)介紹,
此系統(tǒng)由51單片機(jī),lcd2864 gsm-a6,各種傳感器組成

  1. #include <reg52.h>
  2. #include "string.h"
  3. #include<intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. typedef         unsigned char        u8;
  7. typedef         unsigned int        u16;
  8. typedef         unsigned long        u32;


  9. #define Buf_Max                    50         //串口1緩存長(zhǎng)度
  10. #define STABLE_TIMES          15        //等待A6上電后穩(wěn)定,再進(jìn)行自適應(yīng)波特率            
  11. #define SEND_AT_TIMES           30    //發(fā)送多少個(gè)AT指令進(jìn)行自適應(yīng)
  12. #define SEND_AT_INTERVAL  2     //2代表的是2*20ms  自適應(yīng)的時(shí)候,每個(gè)AT指令的間隔時(shí)間


  13. //串口1發(fā)送回車換行
  14. #define UART1_SendLR() UART1_SendData(0X0D);\
  15.                                                                                          UART1_SendData(0X0A)

  16. sbit ds   = P2^2;           //ds18b20位聲明
  17. sbit dula = P2^6;           //數(shù)碼管位聲明
  18. sbit wei = P2^7;
  19. sbit beep=P2^3;
  20. sbit lcden=P3^4;           //液晶使能端聲明
  21. sbit lcdrs=P3^5;                 //寄存器使能端聲明
  22. sbit lcdrw=P3^6;                //讀寫端
  23. sbit lcdPSB=P3^7;                //串并口位聲明
  24. sbit key1=P3^0;
  25. sbit key2=P3^1;                         
  26. sbit sda=P2^0;                         //I2C數(shù)據(jù)端口
  27. sbit scl=P2^1;//I2C時(shí)鐘
  28. sbit LED0 = P1^0;
  29. sbit LED1 = P1^1;
  30. sbit LED3 = P1^3;
  31. sbit p5 = P1^5;
  32. sbit p6 = P1^6;
  33. sbit p7= P1^7  ;
  34. sbit p4=P1^4;
  35. bit flag;


  36. uint xdata aa,bb,q,w=10,w0=30,w1,w2,w3,w4,s=30,s0=60,s1,s2,s3,s4,g,g1,g2,temp,DP,k1=2,k2=2,a=0,b=0,c=0;
  37. unsigned int code dofly_DuanMa[16]={0,1,2,3,4,5,6,7,8,9,45,46,66,47,88,99};// 顯示段碼值0~9
  38. unsigned char  irtime;        //紅外用全局變量

  39. bit irpro_ok,irok;
  40. unsigned char xdata IRcord[4];
  41. unsigned char xdata irdata[33];

  42. uchar temp1;

  43. uchar xdata dis1[]={"溫度:    C     " };
  44. uchar xdata dis2[]={"濕度:   %      " };   
  45. uchar xdata dis3[]={"光強(qiáng):         " };  
  46. uchar xdata dis4[]={"自動(dòng)模式:   關(guān) " };        //液晶顯示部分
  47. uchar xdata dis5[]={"溫度: 10-30C   " };
  48. uchar xdata dis6[]={"濕度:30-60%   " };   
  49. uchar xdata dis7[]={"補(bǔ)光:       關(guān) "};
  50. uchar  dis8[]={"自動(dòng)模式:   開 "};
  51. uchar  dis9[]={"補(bǔ)光:       開 "};

  52. xdata u8 Uart1_Buf[Buf_Max];
  53. //u8 Register_Flag=0;  //A6  注冊(cè)標(biāo)志位  1 :注冊(cè)成功  3:注冊(cè)失敗   5:注冊(cè)成功,但處于漫游狀態(tài)下,無法撥打電話發(fā)短信
  54. u8 First_Int = 0;
  55. u8 xdata i,ret;
  56. static u8  *phone_num = "AT+CMGS=\"***********\""; //撥打電話,修改這里可以修改撥打的電話。
  57. const char *AT_CMGS="AT+CMGS=27";
  58. const char *pdu_content0="0011000D91687158538312F70008AA0C4E3B4EBAFF0C62116E344E86" ;
  59. const char *AT_CMG="AT+CMGS=31";
  60. const char  *pdu_content1="0011000D91687158538312F70008AA104E3B4EBAFF0C62115FEB70ED6B7B4E86";
  61. const char  *pdu_content2="0011000D91687158538312F70008AA104E3B4EBAFF0C62115FEB51BB6B7B4E86";
  62. u8  receive_message_mode = 0;

  63. u8  ledon_flag = 0;
  64. /*************        本地函數(shù)聲明        **************/
  65. void delay_ms(u16 ms);   //延時(shí)ms個(gè)20ms  ms*20ms
  66. void CLR_Buf(void);      //清串口接收緩存
  67. u8          Find(u8 *a);        //查找字符串
  68. void UART1_SendData(u8 dat);   //串口1發(fā)送 1字節(jié)
  69. void UART1_SendString(char *s);//串口1發(fā)送 字符串
  70. void UART1_Send_Command(char *s);
  71. u8   UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time);//a6 at命令發(fā)送
  72. void Wait_CREG(void);


  73. void adjust_A6_buadrate(void)
  74. {
  75.         u8 ret;

  76.         ret = UART1_Send_AT_Command("AT","OK",SEND_AT_TIMES,SEND_AT_INTERVAL);
  77.         if(ret == 1)
  78.         {
  79.                 LED0 = 0;
  80.         }
  81.         else
  82.         {
  83.                 LED0 = 1;
  84.         }
  85. }


  86. /***************************************************************
  87. 注:當(dāng)然你可以返回其他值,來確定到底是哪一步發(fā)送指令出現(xiàn)失敗了。
  88. ****************************************************************/
  89. u8 send_pdu_message0(char *content)
  90. {
  91.         u8 ret;
  92.         char content_len[3];//計(jì)算字符串的長(zhǎng)度,暫時(shí)支持的短信內(nèi)容的字符數(shù)為2位,也就是99個(gè)字節(jié),可以根據(jù)自己愛好進(jìn)行修改
  93.         u8 end_char[2];
  94.         idata char *con;
  95.         idata u8 i;
  96.        
  97.         end_char[0] = 0x1A;
  98.         end_char[1] = '\0';
  99.        
  100.         ret = 0;
  101.        
  102.         con = content;
  103.         i = 0;
  104. ret = UART1_Send_AT_Command("AT+CMGF=0","OK",3,50);//配置為PDU模式
  105.         if(ret == 0)
  106.         {
  107.                 return 0;
  108.         }
  109.        
  110.         ret = UART1_Send_AT_Command(AT_CMGS,">",3,50);//發(fā)送字符個(gè)數(shù)指令
  111.         if(ret == 0)
  112.         {
  113.                 return 0;
  114.         }
  115.        
  116.         UART1_SendString(content);                                                 //發(fā)送具體的內(nèi)容
  117.         ret = UART1_Send_AT_Command(end_char,"OK",3,250);//發(fā)送結(jié)束符,等待返回ok,等待5S發(fā)一次,因?yàn)槎绦懦晒Πl(fā)送的狀態(tài)時(shí)間比較長(zhǎng)
  118.        
  119.         return ret;
  120. }

  121. u8 send_pdu_message1(char *content)
  122. {
  123.         u8 ret;
  124.         char content_len[3];//計(jì)算字符串的長(zhǎng)度,暫時(shí)支持的短信內(nèi)容的字符數(shù)為2位,也就是99個(gè)字節(jié),可以根據(jù)自己愛好進(jìn)行修改
  125.         u8 end_char[2];
  126.         idata char *con;
  127.         idata u8 i;
  128.        
  129.         end_char[0] = 0x1A;
  130.         end_char[1] = '\0';
  131.        
  132.         ret = 0;
  133.        
  134.         con = content;
  135.         i = 0;
  136. ret = UART1_Send_AT_Command("AT+CMGF=0","OK",3,50);//配置為PDU模式
  137.         if(ret == 0)
  138.         {
  139.                 return 0;
  140.         }
  141.        
  142.         ret = UART1_Send_AT_Command(AT_CMG,">",3,50);//發(fā)送字符個(gè)數(shù)指令
  143.         if(ret == 0)
  144.         {
  145.                 return 0;
  146.         }
  147.        
  148.         UART1_SendString(content);                                                 //發(fā)送具體的內(nèi)容
  149.         ret = UART1_Send_AT_Command(end_char,"OK",3,250);//發(fā)送結(jié)束符,等待返回ok,等待5S發(fā)一次,因?yàn)槎绦懦晒Πl(fā)送的狀態(tài)時(shí)間比較長(zhǎng)
  150.        
  151.         return ret;
  152. }

  153. void Ir_work(void);
  154.   
  155.   void delay()  //5us
  156. {;;}
  157. void delay1(uint z)//1ms
  158. {
  159.         uint x,y;
  160.         for(x=z;x>0;x--)
  161.                 for(y=120;y>0;y--);       
  162. }
  163.    void write_com(uchar com)         //寫指令數(shù)據(jù)到液晶
  164. {    lcdrs=0;
  165.      lcdrw=0;
  166.      lcden=0;
  167.      P0=com;
  168.      delay1(5);
  169.      lcden=1;
  170.     delay1(5);
  171.      lcden=0;
  172. }
  173. void write_data(uchar date)                 //寫顯示數(shù)據(jù)到液晶
  174. {
  175.     lcdrs=1;
  176.     lcdrw=0;
  177.     lcden=0;
  178.     P0=date;
  179.     delay1(5);
  180.     lcden=1;
  181.     delay1(5);
  182.     lcden=0;
  183. }
  184. void lcd_pos(uchar X,uchar Y)         //液晶位置選擇
  185. {
  186.     uchar pos;
  187.         if(X==0)
  188.     {X=0x80;}
  189.      else if(X==1)
  190.     {X=0x90;  }
  191.     else if(X==2)
  192.     {X=0x88;}
  193.     else if(X==3)
  194.     {X=0x98;}
  195.     pos=X+Y;
  196.    write_com(pos);
  197. }

  198.    void init1()                                   //液晶初始化
  199. {dula=0;
  200.   wei=0;
  201. lcdPSB=1;
  202. write_com(0x30)          ;
  203. delay1(5);
  204. write_com(0x0C);
  205. delay1(5);
  206. write_com(0x01);
  207. delay1(5);


  208. }
  209.    void start()                                  // PCF8591  起始信號(hào)
  210. {
  211.         scl=1;
  212.         _nop_();
  213.         sda=1;
  214.         delay();
  215.         sda=0;
  216.         delay();
  217.         scl=0;
  218.         _nop_();
  219. }
  220. void stop()                                           //PCF8591終止信號(hào)
  221. {
  222.         scl=1;
  223.         _nop_();
  224.         sda=0;
  225.         delay();
  226.         sda=1;
  227.         delay();
  228. }
  229. void respons()                           //應(yīng)答信號(hào)
  230. {
  231.         scl=1;
  232.         _nop_();
  233.         sda=0;
  234.         delay();
  235.         scl=0;
  236.         _nop_();
  237. }
  238. void norespons()
  239. {
  240.         scl=1;
  241.         _nop_();
  242.         sda=1;
  243.         delay();
  244. }
  245. void init()                                  //PCF8591初始化
  246. {
  247.         scl=1;
  248.         _nop_();
  249.         sda=1;
  250.         _nop_();
  251. }
  252. void write_byte(uchar dat)           //主機(jī)向從機(jī)發(fā)送數(shù)據(jù)
  253. {
  254.         uchar i,tem;
  255.         tem=dat;
  256.         for(i=0;i<8;i++)
  257.         {
  258.                 scl=0;
  259.                 _nop_();
  260.                 if((tem&0x80)==0x80)
  261.                         sda=1;          //寫1
  262.                 else
  263.                         sda=0;          //寫0
  264.                 scl=1;
  265.                 _nop_();
  266.                 tem<<=1;
  267.         }
  268.         scl=0;
  269.         _nop_();
  270. }
  271. uchar read_byte()        /*讀一個(gè)字節(jié)(從機(jī)向主機(jī))由高到低位*/
  272. {
  273.         uchar dat,i;
  274.         sda=1;
  275.         _nop_();
  276.         scl=0;
  277.         _nop_();
  278.         for(i=0;i<8;i++)
  279.         {
  280.                 scl=1;
  281.                 _nop_();
  282.                 if(sda)
  283.                         dat|=0x01;
  284.                 if(i<7)
  285.                          dat<<=1;
  286.                 scl=0;
  287.                 _nop_();       
  288.         }
  289.         return dat;
  290. }



  291. uchar ADC_read(uchar com)        /*單片機(jī)讀PCF8591的AD數(shù)據(jù)*/
  292. {
  293.         uchar dat;
  294.         dat=com;
  295.         start();
  296.         write_byte(0x90);
  297.         respons();
  298.         write_byte(com);
  299.         respons();
  300.         start();
  301.         write_byte(0x91);
  302.         respons();
  303.         dat=read_byte();

  304.         norespons();
  305.         stop();
  306.         return dat;
  307. }

  308.   
  309. void TempDelay(uchar us)
  310. {
  311.         while(us--); //6.51us
  312. }

  313. void ds_reset()          //DS18B20初始化
  314. {
  315.         ds=1;
  316.         _nop_();
  317.         ds=0;
  318.         TempDelay(80);//520us
  319.         ds=1;
  320.         TempDelay(5);
  321.         if(ds==0)
  322.                 flag=1;
  323.         else
  324.                 flag=0;
  325.         TempDelay(20);
  326.         ds=1;
  327. }
  328. bit ds_read_bit()                //讀一位數(shù)據(jù)
  329. {
  330.         bit dat;
  331.         ds=0;
  332.         _nop_();
  333.         _nop_();
  334.         ds=1;
  335.         _nop_();
  336.         dat=ds;
  337.         TempDelay(12);
  338.         return dat;
  339. }
  340. uchar ds_read_byte()           //讀1個(gè)字節(jié)數(shù)據(jù)
  341. {
  342.         uchar i,j,value;
  343.         for(i=0;i<8;i++)
  344.         {
  345.                 j=ds_read_bit();
  346.                 value=(j<<7)|(value>>1);
  347.         }
  348.         return value;
  349. }
  350. void ds_write_byte(uchar dat)         //向DS18B20寫數(shù)據(jù)
  351. {
  352.         uchar i,onebit;
  353.         for(i=0;i<8;i++)
  354.         {
  355.                 onebit=dat&0x01;
  356.                 if(onebit)           //寫1
  357.                 {
  358.                         ds=0;
  359.                         TempDelay(1);
  360.                         ds=1;
  361.                         _nop_();
  362.                 }
  363.                 else  //寫0
  364.                 {
  365.                         ds=0;
  366.                         TempDelay(11);
  367.                         ds=1;
  368.                         _nop_();
  369.                 }
  370.                 dat>>=1;
  371.         }
  372. }
  373. void ds_change()         //溫度獲取和轉(zhuǎn)換
  374. {
  375.         ds_reset();
  376.         ds_write_byte(0xcc);
  377.         ds_write_byte(0x44);
  378. }

  379. uint get_temperature()          //讀取溫度數(shù)據(jù)
  380. {
  381.         uchar a,b;
  382.         float temperature;
  383.         ds_reset();
  384.         ds_write_byte(0xcc);
  385.         ds_write_byte(0xbe);
  386.         a=ds_read_byte();
  387.         b=ds_read_byte();
  388.         temp=b;
  389.         temp<<=8;
  390.         temp|=a;
  391.         temperature=temp*0.0625;
  392.         temp=temperature*10+0.5;
  393.         temp=temperature+0.05;
  394.        
  395.         return temp;
  396. }



  397. void Ir_work(void);
  398. void Ircordpro(void);

  399. void tim0_isr (void) interrupt 1 using 1
  400. {
  401.   irtime++;  //用于計(jì)數(shù)2個(gè)下降沿之間的時(shí)間
  402. }

  403. void EX0_ISR (void) interrupt 0 //外部中斷0服務(wù)函數(shù)
  404. {
  405.         static unsigned char  i;             //接收紅外信號(hào)處理
  406.         static bit startflag;                //是否開始處理標(biāo)志位

  407.         if(startflag)                        
  408.         {
  409.                 if(irtime<63&&irtime>=33)//引導(dǎo)碼 TC9012的頭碼,9ms+4.5ms
  410.             i=0;
  411.                     irdata[i]=irtime;//存儲(chǔ)每個(gè)電平的持續(xù)時(shí)間,用于以后判斷是0還是1
  412.                     irtime=0;
  413.                     i++;
  414.                            if(i==33)
  415.                       {
  416.                                   irok=1;
  417.                                 i=0;
  418.                           }
  419.         }
  420.         else
  421.         {
  422.                 irtime=0;
  423.                 startflag=1;
  424.         }
  425. }

  426. void Uart1Init(void)                //9600bps@11.05926MHz
  427. {
  428.         PCON =0x80;                //
  429.         SCON = 0x50;                //

  430. TMOD=0x22;
  431.         TL1 = 0xFA;                  //
  432.         TH1 = 0xFA;                  //
  433.                 TH0=0x00; //重載值
  434.         TL0=0x00; //初始化值
  435.   
  436.         IE = 0x90;
  437.         ET1 = 0;                    //
  438.         TI=1;
  439.         TR1 = 1;                    //
  440.         ES  = 1;                        //
  441. }


  442. void TIM0init(void)//定時(shí)器0初始化
  443. {
  444.         TMOD=0x22;//定時(shí)器0工作方式2,TH0是重裝值,TL0是初值
  445.         TH0=0x00; //重載值
  446.         TL0=0x00; //初始化值
  447.         ET0=1;    //開中斷
  448.         TR0=1;   
  449. }
  450. void EX0init(void)
  451. {
  452. IT0 = 1;   //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
  453. EX0 = 1;   //使能外部中斷
  454. EA = 1;    //開總中斷
  455. }


  456. void Ir_work(void)//紅外鍵值散轉(zhuǎn)程序
  457. {
  458.        switch(IRcord[2])//判斷第三個(gè)數(shù)碼值
  459.                  {
  460.                          case 0x45:DP=dofly_DuanMa[1];break;//1 顯示相應(yīng)的按鍵值
  461.                          case 0x46:DP=dofly_DuanMa[2];break;//2
  462.                          case 0x47:DP=dofly_DuanMa[3];break;//3
  463.                          case 0x44:DP=dofly_DuanMa[4];break;//4
  464.                          case 0x40:DP=dofly_DuanMa[5];break;//5
  465.                          case 0x43:DP=dofly_DuanMa[6];break;//6
  466.                          case 0x07:DP=dofly_DuanMa[7];break;//7
  467.                          case 0x15:DP=dofly_DuanMa[8];break;//8
  468.                          case 0x09:DP=dofly_DuanMa[9];break;//9
  469.                          case 0x19:DP=dofly_DuanMa[0];break;//0
  470.                           case 0x18:DP=dofly_DuanMa[15];break;//上
  471.                          case 0x08:DP=dofly_DuanMa[10];break;//左
  472.                          case 0x5a:DP=dofly_DuanMa[11];break;//右
  473.                      case 0x16:DP=dofly_DuanMa[12];break;//*
  474.                      case 0x52:DP=dofly_DuanMa[13];break;//下
  475.                          case 0x0d:DP=dofly_DuanMa[14];break;//#
  476.                           
  477.              default:break;

  478.                          }

  479.                   irpro_ok=0;//處理完成標(biāo)志

  480. }
  481. void Ircordpro(void)//紅外碼值處理函數(shù)
  482. {
  483.         unsigned char i, j, k,cord,value;
  484.         k=1;
  485.         for(i=0;i<4;i++)      //處理4個(gè)字節(jié)
  486.         {
  487.                 for(j=1;j<=8;j++) //處理1個(gè)字節(jié)8位
  488.                 {
  489.                         cord=irdata[k];
  490.                         if(cord>7)//大于某值為1,這個(gè)和晶振有絕對(duì)關(guān)系,這里使用12M計(jì)算,此值可以有一定誤差
  491.                         value=value|0x80;
  492.                         if(j<8)
  493.                         {
  494.                                 value>>=1;
  495.                         }
  496.                         k++;
  497.                 }
  498.                 IRcord[i]=value;
  499.                 value=0;     
  500.         }
  501.         irpro_ok=1;//處理完畢標(biāo)志位置1
  502. }



  503.     void fk()
  504. {if(irok)                       
  505.                 {   
  506.                         Ircordpro();
  507.                         irok=0;
  508.                 }
  509.                 if(irpro_ok)                  
  510.                
  511.         Ir_work();}

  512. /**********************************************/
  513. /*設(shè)計(jì)思路:
  514. (0)進(jìn)行串口、定時(shí)器初始化工作。
  515. (1)開機(jī)等待15秒,等待模塊準(zhǔn)備好。
  516. (2)發(fā)送AT指令,讓模塊進(jìn)行自適應(yīng)波特率為9600
  517. (3)發(fā)送相應(yīng)的指令。
  518. ************************************************/
  519. void main(void)
  520. {
  521. uchar dat,dat1,dat2;
  522. aa=p5=p6=p7=0;          
  523.                   delay1(5);
  524.   init();
  525.     init1();
  526.        
  527.         ds_change();



  528.          Uart1Init();
  529.                  TIM0init();//初始化定時(shí)器
  530.                          EX0init(); //初始化外部中斷
  531.          delay1(1000);
  532.            for(i = 0;i < STABLE_TIMES;i++)//等待網(wǎng)絡(luò)穩(wěn)定
  533.         {
  534.                 delay_ms(50);
  535.         }
  536.        
  537.         //自適應(yīng)波特率
  538.         adjust_A6_buadrate();
  539.         //等待GSM注冊(cè)成功
  540.         Wait_CREG();
  541.         //設(shè)置存儲(chǔ)位置,不做返回值判斷了
  542.         ret = UART1_Send_AT_Command("AT+CPMS=\"SM\",\"ME\",\"SM\"","OK",3,100);//AT+CPMS="SM","ME","SM"



  543.         while(1)
  544.         {                     delay1(5);
  545.                          
  546.                    if(k1==2)                                                                          
  547. for(i=0;i<15;i++)
  548.         write_data(dis4[i]);
  549.           
  550. if(k1==1)
  551. for(i=0;i<15;i++)               
  552. write_data(dis8[i]);
  553. delay1(5) ;

  554.                         temp1=temp;
  555.                         if((temp1!=255)&&(temp1!=85))
  556.                                      dat1=temp1;
  557.                                 //溫度顯示模塊
  558.                         dis1[6]=(uint) (0x30+dat1/100)        ;
  559.                         dis1[7]=(uint)(0x30+dat1%100/10);
  560.                         dis1[8]=(uint)(0x30+dat1%100%10);
  561.        
  562.    
  563.             lcd_pos(1,0);
  564.                         for(i=0;i<15;i++)
  565.                         {write_data(dis1[i]);         }
  566.                   delay1(100);
  567.                 ds_change();


  568.                 get_temperature();
  569.        
  570.                                     dat2=-ADC_read(0x02);                 //濕度顯示模塊
  571.                        
  572.                         dis2[7]=(uint)(0x30+dat2/2%100/10);
  573.                         dis2[8]=(uint)(0x30+dat2/2%100%10);
  574.                         lcd_pos(2,0);
  575.                         for(i=0;i<15;i++)
  576.                         {write_data(dis2[i]);         }       
  577.                        
  578.                          delay1(5);
  579.                           dat=0;          
  580.                  dat=-ADC_read(0x03);        //光強(qiáng)顯示模塊
  581.                      dis3[6]=(uint) (0x30+dat/100)        ;
  582.                      dis3[7]=(uint)(0x30+dat%100/10);
  583.                          dis3[8]=(uint)(0x30+dat%100%10);
  584.              lcd_pos(3,0);
  585.                          for(i=0;i<15;i++)
  586.                          {write_data(dis3[i]);         }
  587.        
  588.                                

  589.                                  
  590.   //控制界面

  591.                      fk();

  592.      if (DP==66)       
  593.          
  594. {          
  595.          

  596. lcd_pos(0,0);
  597.            if(k1==2)                                                                          
  598. for(i=0;i<15;i++)
  599.         write_data(dis4[i]);
  600.           
  601. if(k1==1)
  602. for(i=0;i<15;i++)               
  603. write_data(dis8[i]);
  604. delay1(5) ;

  605.                                                                                                          

  606. lcd_pos(1,0);
  607.                         for(i=0;i<15;i++)
  608.                         {write_data(dis5[i]);         }
  609.                                 delay1(5);

  610. lcd_pos(2,0);
  611.         for(i=0;i<15;i++)
  612.                         {write_data(dis6[i]);         }
  613.                                 delay1(5)  ;


  614. lcd_pos(3,0);
  615.         if(k2==2)        {                                                                  
  616. for(i=0;i<14;i++)
  617.         write_data(dis7[i]);        }

  618. if(k2==1)  {
  619. for(i=0;i<14;i++)               
  620. write_data(dis9[i]);

  621.                                  }
  622.                                 delay1(5) ;


  623.   do{
  624.          do{
  625.       fk();
  626.                         }while(DP==66);
  627.           

  628. if(DP==45)
  629.         {       
  630.         while(DP==45)
  631.         fk();
  632.         w1=DP;       
  633.                 lcd_pos(1,0);

  634.                 dis5[6]=(0x30+DP);       
  635.                 for(i=0;i<15;i++)
  636.            write_data(dis5[i]);
  637.                  delay1(5) ;

  638.              while(DP==w1)
  639.                 fk();
  640.                 w2=DP ;
  641.                 lcd_pos(1,0);
  642.                         dis5[7]=(0x30+DP);       
  643.                 for(i=0;i<15;i++)
  644.            write_data(dis5[i]);
  645.                    w=w1*10+w2;
  646.                 delay1(5) ;

  647.                         while(DP==w2)
  648.                 fk();
  649.                 w3=DP ;
  650.                 lcd_pos(1,0);
  651.                         dis5[9]=(0x30+DP);       
  652.                 for(i=0;i<15;i++)
  653.            write_data(dis5[i]);
  654.            delay1(5) ;

  655.                    while(DP==w3)
  656.                 fk();
  657.                 w4=DP ;
  658.                 lcd_pos(1,0);
  659.                         dis5[10]=(0x30+DP);       
  660.                 for(i=0;i<15;i++)
  661.            write_data(dis5[i]);
  662.                    w0=w3*10+w4;
  663.                 delay1(5) ;




  664.                           }
  665.                
  666. if(DP==46)                       
  667.         {       
  668.         while(DP==46)
  669.         fk();
  670.         s1=DP;       
  671.                 lcd_pos(2,0);

  672.                 dis6[6]=(0x30+DP);       
  673.                 for(i=0;i<10;i++)
  674.            write_data(dis6[i]);
  675.                  delay1(5) ;

  676.              while(DP==s1)
  677.                 fk();
  678.                 s2=DP ;
  679.                 lcd_pos(2,0);
  680.                         dis6[7]=(0x30+DP);       
  681.                 for(i=0;i<10;i++)
  682.            write_data(dis6[i]);
  683.                     s=s1*10+s2;
  684.                 delay1(5) ;

  685.                            while(DP==s2)
  686.                 fk();
  687.                 s3=DP ;
  688.                 lcd_pos(2,0);
  689.                         dis6[9]=(0x30+DP);       
  690.                 for(i=0;i<15;i++)
  691.            write_data(dis6[i]);
  692.            delay1(5) ;

  693.                    while(DP==s3)
  694.                 fk();
  695.                 s4=DP ;
  696.                 lcd_pos(2,0);
  697.                         dis6[10]=(0x30+DP);       
  698.                 for(i=0;i<15;i++)
  699.            write_data(dis6[i]);
  700.            s0=s3*10+s4;
  701.                 delay1(5) ;



  702.                           }
  703. if(DP==47)
  704.         {       
  705. while(DP==47)
  706.         fk();
  707.         k2=DP;       
  708.                 lcd_pos(3,0);
  709.          if(k2==1)
  710.         for(i=0;i<14;i++)
  711.          write_data(dis9[i]);
  712.          if(k2==2)
  713.         for(i=0;i<14;i++)
  714.          write_data(dis7[i]);
  715.                  delay1(5) ;}

  716. if(DP==99)
  717.         {       
  718.         while(DP==99)
  719.         fk();
  720.         k1=DP;       
  721.                 lcd_pos(0,0);
  722.          if(k1==1)
  723.         for(i=0;i<15;i++)
  724.          write_data(dis8[i]);
  725.          if(k1==2)
  726.         for(i=0;i<15;i++)
  727.          write_data(dis4[i]);
  728.                  delay1(5) ;
  729.                                          }


  730. fk();
  731.                           }while(DP!=88);
  732.           
  733.    

  734.                           
  735.                 }
  736.                        



  737. if(dat1>w)
  738. a=0;

  739. if(dat1<w0)
  740. b=0;
  741. if(dat>70)
  742. p6=0;

  743. if(dat2/2>s)
  744. {c=0;
  745.   p5=0;}

  746. aa++;

  747. if(aa>15)
  748. {

  749. if(k1==2)
  750. {


  751.    if(dat2/2<s)
  752.           {if(c==0){
  753.            ret = send_pdu_message0(pdu_content0);//發(fā)送pdu短信
  754.                                                        
  755.                                 if(ret == 1)
  756.                                 {
  757.                                         LED3 = 0;
  758.                                         c=1;
  759.                                 }
  760.                           

  761.        
  762.        
  763.          }  
  764.        
  765.        
  766.           }

  767.           
  768.    if(dat1<w)

  769.    { if(a==0)
  770.    { delay1(1000);
  771.            ret = send_pdu_message1(pdu_content2);//發(fā)送pdu短信
  772.                                                        
  773.                                 if(ret == 1)
  774.                                 {
  775.                                         LED3 = 0;
  776.                                         a=1;
  777.                                 }
  778.                           
  779.         delay1(1000);
  780.         LED3=1; }              }


  781.    if(dat1>w0)
  782.    {if(b==0){
  783.            ret = send_pdu_message1(pdu_content1);//發(fā)送pdu短信
  784.                                                        
  785.                                 if(ret == 1)
  786.                                 {
  787.                                         LED3 = 0;
  788.                                         b=1;
  789.                                 }
  790.                           
  791.         delay1(1000);
  792.         LED3=1; }            }

  793.        
  794. }

  795.   //自動(dòng)模式
  796. if(k1==1)
  797. {
  798. if(dat1<w)

  799.    {   

  800.     if(a==0)
  801.         { delay1(3000);
  802.            ret = send_pdu_message1(pdu_content2);//發(fā)送pdu短信
  803.                                                        
  804.                                 if(ret == 1)
  805.                                 {
  806.                                         LED3 = 0;
  807.                                         a=1;
  808.                                 }
  809.                           
  810.         delay1(1000);
  811.         LED3=1; }
  812.                       }


  813.    if(dat1>w0)
  814.    {if(b==0)
  815.    { delay1(3000);
  816.            ret = send_pdu_message1(pdu_content1);//發(fā)送pdu短信
  817.                                                        
  818.                                 if(ret == 1)
  819.                                 {
  820.                                         LED3 = 0;
  821.                                         b=1;
  822.                                 }
  823.                           
  824.         delay1(1000);
  825.         LED3=1; }            }
  826.                                           

  827.    if(dat2<s)
  828.           {if(c==0)
  829.           {
  830.            ret = send_pdu_message0(pdu_content0);//發(fā)送pdu短信
  831.                                                        
  832.                                 if(ret == 1)
  833.                                 {
  834.                                
  835.                                         c=1;
  836.                                 }
  837.                   
  838.         }  p5=1;  }
  839. if(k2==1)
  840. {                                               
  841. if(dat<70)
  842. p6=1;                                               
  843.         }
  844. if(k2==2)
  845. {                                               
  846. p6=0;                                               
  847.         }               
  848.        
  849.                                          }


  850.                          }


  851.                 }}
  852.                        
  853.                                















  854. /*******************************************************************************
  855. * 函數(shù)名 : Timer0_ISR
  856. * 描述   : 定時(shí)器0中斷服務(wù)入口函數(shù),1ms中斷一次
  857. * 輸入   :
  858. * 輸出   :
  859. * 返回   :
  860. * 注意   :
  861. *******************************************************************************/


  862. /********************* UART1中斷函數(shù)************************/
  863. void UART1_ISR (void) interrupt 4
  864. {
  865.         if (RI)
  866.         {
  867.                 RI = 0;                           //清除RI位
  868.                 Uart1_Buf[First_Int] = SBUF;            //將接收到的字符串存到緩存中
  869.                 First_Int++;                          //緩存指針向后移動(dòng)
  870.                 if(First_Int > Buf_Max)                 //如果緩存滿,將緩存指針指向緩存的首地址
  871.                 {
  872.                         First_Int = 0;
  873.                 }
  874.                 /*
  875.                 if(First_Int >=6)
  876.                 {
  877.                         if(Find("RING"))
  878.                         {
  879.                                 LED7 = 0;
  880.                         }
  881.                         else
  882.                         {
  883.                                 LED7 = 1;
  884.                         }
  885.                 }
  886.                 */
  887.                 if(receive_message_mode == 1)//說明進(jìn)入接收短信的模式,
  888.                 {
  889.                         if(First_Int >=22)//這里的22是根據(jù)情況進(jìn)行判斷設(shè)定的
  890.                         {
  891.                                 ledon_flag = 1;
  892.                         }
  893.                 }
  894.                
  895.         }
  896.         if (TI)
  897.         {
  898.                 TI = 0;                          //清除TI位
  899.         }
  900. }


  901. /*******************************************************************************
  902. * 函數(shù)名 : CLR_Buf
  903. * 描述   : 清除串口2緩存數(shù)據(jù)
  904. * 輸入   :
  905. * 輸出   :
  906. * 返回   :
  907. * 注意   :
  908. *******************************************************************************/
  909. void CLR_Buf(void)
  910. {
  911.         u8 k;
  912.         for(k=0;k<Buf_Max;k++)      //將緩存內(nèi)容清零
  913.         {
  914.                 Uart1_Buf[k] = 0x00;
  915.         }
  916.     First_Int = 0;              //接收字符串的起始存儲(chǔ)位置
  917. }


  918. /*******************************************************************************
  919. * 函數(shù)名 : Find
  920. * 描述   : 判斷緩存中是否含有指定的字符串
  921. * 輸入   :
  922. * 輸出   :
  923. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  924. * 注意   :
  925. *******************************************************************************/

  926. u8 Find(u8 *a)
  927. {
  928.         ES = 0;  //改進(jìn)程序
  929.         if(strstr(Uart1_Buf,a)!=NULL)
  930.         {
  931.                 ES = 1;
  932.                 return 1;
  933.         }       
  934.         else
  935.         {
  936.                 ES = 1;
  937.                 return 0;
  938.         }
  939.                
  940. }



  941. /*******************************************************************************
  942. * 函數(shù)名 : Wait_CREG
  943. * 描述   : 等待模塊注冊(cè)成功
  944. * 輸入   :
  945. * 輸出   :
  946. * 返回   :
  947. * 注意   :
  948. *******************************************************************************/
  949. void Wait_CREG(void)
  950. {
  951.         u8 i;
  952.         u8 k;
  953.         i = 0;
  954.         CLR_Buf();
  955.         while(i == 0)                               
  956.         {

  957.                 UART1_Send_Command("AT+CREG?");
  958.                 delay_ms(100);
  959.                
  960.                 for(k=0;k<Buf_Max;k++)                             
  961.                 {
  962.                         if((Uart1_Buf[k] == '+')&&(Uart1_Buf[k+1] == 'C')&&(Uart1_Buf[k+2] == 'R')&&(Uart1_Buf[k+3] == 'E')&&(Uart1_Buf[k+4] == 'G')&&(Uart1_Buf[k+5] == ':'))
  963.                         {
  964.                                          
  965.                                 if((Uart1_Buf[k+7] == '1')&&((Uart1_Buf[k+9] == '1')||(Uart1_Buf[k+9] == '5')))
  966.                                 {
  967.                                         i = 1;
  968.                                         LED1 =0;
  969.                                         break;
  970.                                 }
  971.                                
  972.                         }
  973.                 }
  974.                
  975.         }
  976. }



  977. /*----------------------------
  978. UART1 發(fā)送串口數(shù)據(jù)
  979. -----------------------------*/
  980. void UART1_SendData(u8 dat)
  981. {
  982.         ES=0;                        //關(guān)串口中斷
  983.         SBUF=dat;                       
  984.         while(TI!=1);        //等待發(fā)送成功
  985.         TI=0;                        //清除發(fā)送中斷標(biāo)志
  986.         ES=1;                        //開串口中斷
  987. }
  988. /*----------------------------
  989. UART1 發(fā)送字符串
  990. -----------------------------*/
  991. void UART1_SendString(char *s)
  992. {
  993.         while(*s)//檢測(cè)字符串結(jié)束符
  994.         {
  995.                 UART1_SendData(*s++);//發(fā)送當(dāng)前字符
  996.         }
  997. }

  998. /**********************************
  999. 發(fā)送命令
  1000. **********************************/
  1001. void UART1_Send_Command(char *s)
  1002. {
  1003.         CLR_Buf();
  1004.         while(*s)//檢測(cè)字符串結(jié)束符
  1005.         {
  1006.                 UART1_SendData(*s++);//發(fā)送當(dāng)前字符
  1007.         }
  1008.         UART1_SendLR();
  1009. }

  1010. /*******************************************************************************
  1011. * 函數(shù)名 : Second_AT_Command
  1012. * 描述   : 發(fā)送AT指令函數(shù)
  1013. * 輸入   : 發(fā)送數(shù)據(jù)的指針、希望收到的應(yīng)答、發(fā)送等待時(shí)間(單位:interval_time*20 ms)
  1014. * 輸出   :
  1015. * 返回   :
  1016. * 注意   :
  1017. *******************************************************************************/

  1018. u8 UART1_Send_AT_Command(u8 *b,u8 *a,u8 wait_time,u16 interval_time)         
  1019. {
  1020.         u8 i;

  1021.         CLR_Buf();
  1022.         i = 0;
  1023.         while(i < wait_time)                    
  1024.         {
  1025.                 UART1_Send_Command(b);
  1026.                 delay_ms(interval_time);
  1027.                 if(Find(a))            //查找需要應(yīng)答的字符
  1028.                 {
  1029.                         return 1;
  1030.                 }
  1031.                 i++;
  1032.         }
  1033.        
  1034.         return 0;
  1035. }

  1036. void delay_ms(u16 ms)
  1037. {
  1038.         u16 i,j;
  1039.        
  1040.         for (i=ms*20;i>0;i--)
  1041.         for (j=110;j>0;j--)        ;
  1042.        
  1043. }

復(fù)制代碼

全部資料下載地址:
智能花盆程序.docx (24.63 KB, 下載次數(shù): 47)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:312293 發(fā)表于 2018-4-24 16:48 | 只看該作者
此帖僅作者可見

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人在线视频观看 | 国产精品亚洲片在线播放 | 成年网站在线观看 | 国产精品一区二区久久久久 | 国产片侵犯亲女视频播放 | 一区二区三 | 香蕉久久久| 亚洲精品电影在线观看 | 久久九精品 | 日韩精品一区二区三区中文字幕 | 国产欧美日韩综合精品一区二区 | 久久成人一区 | 国产精品自拍av | 久久久久九九九女人毛片 | 中文字幕日韩在线观看 | 日韩在线精品 | 久久久久国产一级毛片高清网站 | 国产精品福利在线观看 | 亚洲精品一区二区在线 | 在线观看中文字幕 | 成人亚洲精品 | 国产免费一二三区 | 久久精品色欧美aⅴ一区二区 | 91国自产 | 国产三级一区二区三区 | 手机av免费在线 | 第四色播日韩第一页 | 狠狠干av | 欧美精品一区二区三区在线播放 | 欧美精品中文字幕久久二区 | 999精品视频在线观看 | 在线观看国产 | 午夜视频免费在线观看 | 色综网 | 中文字幕日韩欧美 | 日本免费视频在线观看 | 亚洲激情视频在线 | 中文字幕第十五页 | 91九色在线观看 | 天堂色 | 91传媒在线观看 |