<noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • 安可信01

    安可信01的詳細介紹

    創作者:新用戶 | 更新日期:2016-06-20 | 在線時長:6時
    用于實時監測室內甲醛濃度(畢業設計相關)。

    #include<reg52.h>
    #include<intrins.h>
    #define uint unsigned int
    #define uchar unsigned char
    #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
    /*-----------1602顯示相關聲明--------------------*/
    
    uchar d[]={"Welcome To Use Please wait..."};//開機界面
    uchar e[]={"CL of CH2O is:"};//工作界面1
    uchar f[10];
    sbit LCD_RS = P1^3;//  相關引腳定義     
    sbit LCD_RW = P1^4;
    sbit LCD_EN = P1^5;
    sbit mang=P2^7;
    
    void LCD_Init();
    bit lcd_busy();
    void lcd_wcmd(uchar cmd);
    void lcd_wdat(uchar dat);
    void LCD_Clear();
    void LCD_Write_kaiji();
    void LCD_Write_work1();
    void LCD_Write_work2();
    /*-------------------------------------------------*/
    uint ch2o;
    sbit feng=P1^2;//蜂鳴器
    void fm();
    /*--------------------------------------
                WLAN-URAT
    ----------------------------------------*/
    uchar wlan_mode[]="AT+CWMODE=1\r\n";
    uchar wlan_lj[]="AT+CWJAP=\"zzu_wifi\",\"z12345678a\"\r\n";
    uchar fwqlj[]="AT+CIPSTART=\"TCP\",\"121.42.180.30\",8181\r\n";
    
    uchar wlan_cipm[]="AT+CIPMODE=1\r\n";
    uchar wlan_cips[]="AT+CIPSEND\r\n";
    
    //uchar now_dat[]="{\"M\":\"update\",\"ID\":\"309\",\"V\":{\"304\":\"00.15\"}}\r\n";
    //uchar now_dat1[]="{\"M\":\"update\",\"ID\":\"309\",\"V\":{\"304\":\"0.12\"}}\r\n";
    uchar now_dat2[]="{\"M\":\"update\",\"ID\":\"309\",\"V\":{\"304\":\"value1\"}}\r\n";
    uchar wlan_land[]="{\"M\":\"checkin\",\"ID\":\"309\",\"K\":\"a167d99a9\"}\r\n";
    void wlan_cipsend();
    
    void wlan_link();
    void yun_dat();
    void yun_land();
    /*--------------------------------------------------
                 串口通信聲明
    ---------------------------------------------------*/
    uchar out_num;
    uchar in_num;
    uchar a[5]={0xa5,0x5a,0x02,0x80,0xaa};
    uchar b[4];
    uchar recdat[9]={0};//接收緩存
    bit recFlag=0;//為1代表串口接收到了數據
    
    void init_uart();
    void dat_check();
    void datfig();
    void datclear();
    void datsent(uchar catdat);
    void sendc(uchar *pd);
    void UART_INT(void);
    void delay(uint z);
    
    /*-----------------------------------------
          串口通信初始化
    -----------------------------------------*/
    void init_uart()
    {
    	 EA=0;
    	 PCON=0x00;//smod=0波特率正常
    	 SCON=0x50;//串口工作方式1,允許接收
    	 TMOD=0x20;//定時器1,工作方式2,8位自動裝載
    	 TH1=0xfd;
    	 TL1=0xfd;//設定波特率為9600
    	 ET1=0;//不允許定時器1中斷       
    	 TR1 = 1; //啟動定時器1 
    	 RI=0;
    	 TI=0;
    	 IE=0x90;//單片機中斷開,串口中斷開
    }
    
    /*------------------------------------------
               數據發送
    ------------------------------------------*/
    
    void datsent(uchar catdat)
    {
    	SBUF=catdat;
    	while(TI==0);
    	TI=0;
    }
    void sendc(uchar *pd)
    {
     while((*pd)!='\0')
     {
      datsent(*pd);
      pd++;
     }
    }
    /*------------------------------------------------
    判斷數據是否合理
    ------------------------------------------------*/
    void dat_check()
    {
    	static uchar count;//靜態局部變量用于數據的計數
    	uchar i;
    	if(recdat[0]==0xa5)//
    	 {
    			count=1; 
    	 }
      if(count==1&&recdat[1]==0x5a) 
    	{  
    		count=2; 
    		
    	}
    	if(count==2&&recdat[2]==0x06) 
    	{  
    		count=3; 
    		
    	}
    	if(count==3&&recdat[3]==0x80) 
    	{  
    		count=4;
    		i=0;
    		
    	}
     while(count>=4&&count<9)
     {     
    		b[i]=recdat[count];//存入甲醛濃度信息
    		count ++;
    	  i++;
     }
    
     if(count==9&&recdat[8]==0xaa)
    	 {      
    			recFlag=1;//數據接收標志位置1,通知主程序已接收到有效數據
    			count=0;   //計數變量清零為下次接收做準備         
    	 }	 
    }
    /*----------------------------------------------------
    數據處理
    -----------------------------------------------------*/
    void datfig()
    {
    	ch2o=b[2]*256+b[3];
    	//if(ch2o>60)
    	//{
    		//feng=0;
    	//}
    	//else feng=1;
    	f[0]=0x30+ch2o/10000;
    	f[1]=0x30+(ch2o/1000)%10;
    	f[2]=0x30+(ch2o/100)%10;
    	f[4]=0x30+(ch2o/10)%10;
    	f[5]=0x30+ch2o%10;
    	now_dat2[37]=0x30+ch2o/10000;
    	now_dat2[38]=0x30+(ch2o/1000)%10;
    	now_dat2[39]=0x30+(ch2o/100)%10;
    	now_dat2[40]='.';
    	now_dat2[41]=0x30+(ch2o/10)%10;
    	now_dat2[42]=0x30+ch2o%10;
    }
    /*----------------------------------------------------
    數據緩存清零
    -----------------------------------------------------*/
    void datclear()
    {
    	recdat[0]=0;
    	recdat[1]=0;
    	recdat[2]=0;
    	recdat[3]=0;
    	recdat[4]=0;
    	recdat[5]=0;
    	recdat[6]=0;
    	recdat[7]=0;
    	recdat[8]=0;
    }
    /*----------------------------------------------------
    顯示相關程序段
    -----------------------------------------------------*/
    
    /*------------------------------------------------
                  判忙函數
    ------------------------------------------------*/
     bit lcd_busy()
     {                          
        bit result;
        LCD_RS = 0;
        LCD_RW = 1;
        LCD_EN = 1;//RS=L,RW=H,E=H,1602狀態可讀
        delayNOP();
        result =mang;
        LCD_EN = 0;
        return result; 
     }
    /*------------------------------------------------
                  寫命令函數
    ------------------------------------------------*/
     void lcd_wcmd(uchar cmd)
    {                          
        while(lcd_busy()==1);
        LCD_RS = 0;
        LCD_RW = 0;//RS=L,RW=L,寫指令
        LCD_EN = 0;
        _nop_();
        _nop_(); 
        P2=cmd;
        delayNOP();
        LCD_EN = 1;//E=H,產生高脈沖
        delayNOP();
        LCD_EN = 0; 
        delay(10);
    }
    /*------------------------------------------------
                  寫數據函數
    ------------------------------------------------*/
     void lcd_wdat(uchar dat)
    {                          
        while(lcd_busy()==1);
        LCD_RS = 1;
        LCD_RW = 0;
        LCD_EN = 0;
        P2=dat;
        delayNOP();
        LCD_EN = 1;
        delayNOP();
        LCD_EN = 0; 
        delay(10);
    }
    /*------------------------------------------------
                    清屏函數
    ------------------------------------------------*/
     void LCD_Clear(void) 
     { 
     lcd_wcmd(0x01); 
     delay(5);
     }
     /*-------------------------------------------------
     --------------------------------------------------*/
     void lcd_pos(uchar pos)
    {                          
      lcd_wcmd(pos|0x80);//80H+地址碼
    }
    /*------------------------------------------------
                  1602初始化
    ------------------------------------------------*/
     void lcd_init()
    {    
        delay(15);   
        lcd_wcmd(0x38); 
        delay(5);
        lcd_wcmd(0x38);         
        delay(5);
        lcd_wcmd(0x38);         
        delay(5);
    		while(lcd_busy()==1);//忙則等待
    		lcd_wcmd(0x38);
    		while(lcd_busy()==1);
    		lcd_wcmd(0x08);
    		while(lcd_busy()==1);
    		lcd_wcmd(0x01);      
    		while(lcd_busy()==1);
    		while(lcd_busy()==1);
        lcd_wcmd(0x0c);      
    		while(lcd_busy()==1);
    		lcd_wcmd(0x06);
        delay(5);
    		while(lcd_busy()==1);
        lcd_wcmd(0x01);      
        delay(5);
    }
    /*------------------------------------------------
                顯示函數
    ------------------------------------------------*/
     void LCD_Write_kaiji( ) 
     {   
    		uchar num;
    	  lcd_pos(0x00);
    		for(num=0;num<14;num++)
    		{
    			lcd_wdat(d[num]);
    			delay(20);
    		}
    		lcd_pos(0x40);
    		for(num=15;num<29;num++)
    		{
    			lcd_wdat(d[num]);
    			delay(20);
    		}
    }
    /*------------------------------------------------
                  工作顯示
    ------------------------------------------------*/
     void LCD_Write_work1( ) 
     {   
    		uchar num;
    	  
    	  lcd_pos(0x00);
    		for(num=0;num<14;num++)
    		{
    				lcd_wdat(e[num]);
    				delay(2);
    		}
    		f[3]='.';
    		f[7]='p';
    		f[8]='p';
    		f[9]='m';
    		lcd_pos(0x43);
    		num=3;
    		lcd_wdat(f[num]);
    		lcd_pos(0x46);
    		for(num=7;num<10;num++)
    		{
    			lcd_wdat(f[num]);
    			delay(2);
    		}
     }
     /*------------------------------------------------
                  工作顯示
    ------------------------------------------------*/
     void LCD_Write_work2( ) 
     {   
    		uchar num;
    	  lcd_pos(0x40);
    		for(num=0;num<3;num++)
    		{
    			lcd_wdat(f[num]);
    			delay(2);
    		}
    		
    		lcd_pos(0x44); 
    		for(num=4;num<6;num++)
    		{
    			lcd_wdat(f[num]);
    			delay(2);
    		}
     }
     /*-----------------------------------
                  蜂鳴器函數
     -----------------------------------*/
    void fm()
    {
    	if(ch2o>60)
    		{
    			feng=0;
    		}
    		else feng=1;
    		yun_dat();
    }
    /*-----------------------------------------
              1ms延時函數
    ------------------------------------------*/
    void delay(uint z)
    {
    	uint x,y;
    	for(x=z;x>0;x--)
    		for(y=114;y>+0;y--);
    }
    /*------------------------------------------
                 主函數
    ------------------------------------------*/
    void main( )
    {
    	init_uart();
    	LCD_Clear();
    	lcd_init();
    	LCD_Write_kaiji();
    	//init_uart();
      wlan_link();
    	wlan_cipsend();
      yun_land();	
    	delay(6000);
    	LCD_Clear();
    	LCD_Write_work1();
    	while(1)
    	{
    		recFlag=0;
    	while(recFlag==0)
    	{
    		in_num=0;
    		sendc(a);
    		delay(2000);
    		dat_check();
    		//delay(2000);
    	}
    		datfig();
    	  delay(2000);
    		yun_dat();
    		LCD_Write_work2();
    		//if(ch2o>60)
    		//{
    			//feng=0;
    		//}
    		//else feng=1;
    		//yun_dat();
    		fm();
    		datclear();
    	}
    }
    /******************************************* 
                中斷服務程序
     ******************************************/
    void UART_INT(void) interrupt 4
    { 
    	if(RI)
    	{
    	RI=0;
    	recdat[in_num]=SBUF;
    	in_num++;
    	if(in_num>9)
    	{
    		in_num=0;
    	}
      }
    }
    /*--------------------------
    
    ----------------------------*/
    void wlan_cipsend()
    {
    sendc(wlan_cipm);
    delay(500);
    sendc(wlan_cips);
    delay(500);
    }
    /*-------------------------
    -------------------------*/
    void wlan_link()
    {
    sendc(wlan_mode);
    delay(500);
    sendc(wlan_lj);
    delay(15000);
    sendc(fwqlj);
    delay(1000);
    }
    /*------------------------
    -------------------------*/
    void yun_dat()
    {
    //sendc(now_dat);
    //delay(2000);
    //sendc(now_dat1);
    //delay(2000);
    //sendc(now_dat1);
    //delay(2000);
    //sendc(now_dat);
    //delay(2000);
    sendc(now_dat2);
    delay(2000);
    sendc(now_dat2);
    }
    void yun_land()
    {
    sendc(wlan_land);
    delay(2000);
    }

    簡單的云端數據上傳,基于ESP8266-01,使用C51單片機控制。畢業答辯結束了現在公開代碼吧。這里有一個問題,在上傳數據時,每第二次數據才能被上傳,不知道問題出在哪里,望大神指導


    <noscript id="mmkmi"><source id="mmkmi"></source></noscript>
  • <noscript id="mmkmi"><kbd id="mmkmi"></kbd></noscript>
  • <table id="mmkmi"><source id="mmkmi"></source></table>
  • 三上悠亚在线观看