找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3277|回复: 2
收起左侧

51单片机实现scanf 与printf函数

[复制链接]
ID:7209 发表于 2018-8-2 22:29 | 显示全部楼层 |阅读模式
printf  函数这个可以不用直接使用库中的, scanf  函数需要自己添加

这个是.c  文件,粘贴复制可能会出现字符问题,直接编译可能不通过,自己敲敲代码,把不用的函数去掉即可,里面有测试wifi 的函数。


#include "reg51.h"
//#include "intrins.h"
#include "stdio.h"
#include <stdarg.h>
//#include "string.h"
#include "esp8266.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;



#define UART_BUF_SIZE 10
static BYTE uart_rx_wp;        //buffer¶Ôê×Ö¸Õë
static BYTE uart_rx_rp;        //buffer¶óÎ2Ö¸Õë
static BYTE uart_rx_cnt;        //bufferàïÃæμÄ×Ö·ûêyá¿
static BYTE idata uart_rx[UART_BUF_SIZE];



char Receive;  //½óêÕμÄμ¥¸ö×Ö·û
char Receive_table[30]; //½óêÕ¶à¸ö×Ö·û′®
bit busy;
void(*pNet_Test)(void);
void SendString_Usart_1(unsigned char *s);//′®¿ú1 ·¢Ëí×Ö·û







void Delay_Ms(WORD ms)
{
WORD i,j;                              
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void Delay_Us(BYTE us)
{
while(us--);
}


void SendData_Usart_2(BYTE dat)
{
    while (busy);           //Wait for the completion of the previous data is sent
    ACC = dat;              //Calculate the even parity bit P (PSW.0)
    if (P)                  //Set the parity bit according to P
    {
#if (PARITYBIT == ODD_PARITY)
        S2CON &= ~S2TB8;    //Set parity bit to 0
#elif (PARITYBIT == EVEN_PARITY)
        S2CON |= S2TB8;     //Set parity bit to 1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
        S2CON |= S2TB8;     //Set parity bit to 1
#elif (PARITYBIT == EVEN_PARITY)
        S2CON &= ~S2TB8;    //Set parity bit to 0
#endif
    }
    busy = 1;
    S2BUF = ACC;            //Send data to UART2 buffer

}
void SendData_Usart_1(BYTE dat)
{
  ES = 0;  //1رÕ′®¿úÖD¶Ï
  SBUF = dat;
  while(!TI);
  TI = 0;
  ES = 1;  //ÔêDí′®¿úÖD¶Ï

}

void SendString_Usart_1(unsigned char *s)
{
    while (*s!='\0')              //Check the end of the string
    {
        SendData_Usart_1(*s++);     //Send current char and increment string ptr
    }
}


void SendString_Usart_2(unsigned char *s)
{

    while (*s)              //Check the end of the string
    {
    SendData_Usart_2(*s++);     //Send current char and increment string ptr
    Delay_Us(5);
        }
        
}








void Stc12c5a60s2_Usart1_Init()
{
    SCON = 0x50;  // ·½ê½1
    PCON&=0xef;  // 2¨ìØÂê2»¼ó±¶
        TMOD = 0x20; //        ¶¨ê±Æ÷T1
    TH1 = 0xfd;//256-(FOSC/12/32)/BAUD;
        TL1 = 0xfd;//TH1;
        TI = 1;             //ê1óÃprintf
        TR1 = 1;     //Timer1 start run        
     //′®¿úÖD¶ÏÔêDíλ   
    uart_rx_wp = 0;
        uart_rx_rp = 0;
        uart_rx_cnt = 0;
        
    ES = 1;
        EA = 1;      //×üÖD¶Ï¿aÆôλ
}

void Stc12c5a60s2_Usart2_Init()
{
    S2CON = 0x50;           //8-bit variable UART
    BRT = 0xfd;             //Set auto-reload vaule of baudrate generator
    AUXR = 0x10;            //Baudrate generator work in 1T mode
    IE2 =  0x01;             //Enable UART2 interrupt
    EA = 1;                 //Open master interrupt switch
}



//′®¿ú1ÖD¶Ï
void Usart_1_Isr() interrupt 4
{

  //char k,temp;
  //char Receive_table[30];
  ES = 0; //1رÕ′®¿ú1ÖD¶Ï
  if(RI)
  {  RI = 0;      //Clear receive interrupt flag
     /*temp=SBUF;
         Receive_table[k++] = temp;
         if((Receive_table[k-1])='\0'||k==29)
         {k=0;}
         SendData_Usart_2(temp);*/
         if(uart_rx_cnt < UART_BUF_SIZE)
            {
                        uart_rx[uart_rx_wp] = SBUF;
                        uart_rx_wp = (uart_rx_wp + 1) % UART_BUF_SIZE;
                        uart_rx_cnt++;
            }
  }
  ES  = 1; //¿aÆô′®¿ú1ÖD¶Ï

}
//μçÄÔ·¢Ëíêy¾Yμ½′®¿ú1
//′®¿ú1½óêÕμ½êy¾YóÃ′®¿ú2·¢Ëíoˉêy·¢Ëí3öè¥
//′®¿ú2½óêÕμ½êy¾YóÃ′®¿ú1·¢Ëíoˉêy·¢Ëí»Øà′
void Uart2_2_Isr() interrupt 8 using 1
{   unsigned char k;
    unsigned char temp;
    IE2 = 0X00;
        if(S2CON&S2RI)
    {
    S2CON &=~S2RI;     //Clear receive interrupt flag
    temp = S2BUF;
        Receive = temp;
        Receive_table[k] = Receive;
        k++;
        if(Receive_table[k-1]=='\0') k=0;
        SendData_Usart_1(temp);
        //SendString_Usart_1(Receive_table);
        }
        IE2 = 0X01;
    if (S2CON & S2TI)
    {
        S2CON &= ~S2TI;     //Clear transmit interrupt flag
        busy = 0;           //Clear transmit busy flag
    }
}


//óÃóúscanf oˉêy½óêÕ′®¿ú1·¢Ëí1yà′μÄêy¾Y
char hal_uart_getchar(void)
{
  unsigned char ch;

  //Wait until a character is available:

  while(uart_rx_cnt == 0);
  ES = 0;
  ch = uart_rx[uart_rx_rp];
  uart_rx_rp = (uart_rx_rp + 1) % UART_BUF_SIZE;
  uart_rx_cnt--;
  ES = 1;
  return ch;
}
//óÃóú′®¿ú 1
char _getkey ()  {
  return hal_uart_getchar();
}




//ESP8266Ä£¿é Ä£ê½2aêÔ
void ESP8266_Send(char *puf)
{
   Delay_Ms(20);
   SendString_Usart_2("AT+CIPSEND=9\r\n");
   Delay_Ms(20);
   SendString_Usart_2(puf);
}



void ESP8266_Send(BYTE *puf)
{
ESP8266_Set("AT+CIPSEND=0,4");
while(*puf!='\0')
{
   SendData_Usart_2(*puf);
   Delay_Us(5);
   puf++;
}
  Delay_Us(5);
  SendData_Usart_2('\n');
  Delay_Us(5);
}



void ESP8266_Set(char *puf)
{
while(*puf!='\0')
{
  SendData_Usart_2(*puf);
  Delay_Us(5);
  puf++;
}
Delay_Us(5);
SendData_Usart_2('\r');
Delay_Us(5);
SendData_Usart_2('\n');
Delay_Us(1000);

}



void ESP8266_Init_AP(void)
{
   char cStrInput [100] = { 0 }, * pStrDelimiter [3];
   char * pBuf, * pStr;
   unsigned char uc = 0;
  SendString_Usart_2("AT\r\n");          //ê×Ïè2aêÔÏÂÄ£¿éêÇ·ñoûμ
  Delay_Ms(2000);                        //·μ»ØOK Õy3£
  SendString_Usart_2(at_cwmode);         //éèÖÃÄ£¿éÄ£ê½ÎaAP
  Delay_Ms(2000);                                             //·μ»ØERROR »ò  no change
  SendString_Usart_2(at_rst);                      //¸′λò»ÏÂ
  Delay_Ms(2000);
  SendString_Usart_2("AT+CWMODE?\r\n");  //Ôú2aêÔò»ÏÂÄ£¿é¿′¿′êÇ·ñéèÖÃ3é1|
  Delay_Ms(2000);
  SendString_Usart_2(at_cwsap);          //éèÖÃᬽóμÄwifiÃû3Æ        
  Delay_Ms(2000);
  SendString_Usart_2(at_rst);                      //¸′λò»ÏÂ
  Delay_Ms(2000);
  SendString_Usart_2(at_cipmux);         //Æôóöà·ᬽóÄ£ê½
  Delay_Ms(2000);
  SendString_Usart_2(at_cipmode);        //éèÖÃ′«êäÄ£ê½êÇí¸′«»1êÇ·Çí¸′«
  Delay_Ms(2000);
  SendString_Usart_2(at_cipsto);         //éèÖÃ3¬ê±ê±¼ä
  Delay_Ms(2000);
  SendString_Usart_2(at_cipserver);      //¿aÆô·tÎñÆ÷¶Ë¿úoÅ 8080
  Delay_Ms(2000);
  SendString_Usart_2(at_cipsend);      
  // while ( ( pStr = strtok ( pBuf, "," ) ) != NULL )
  //        {
  //                pStrDelimiter [ uc ++ ] = pStr;
  //                pBuf = NULL;
  //        }
}





void main()
{
   char up[30]={0},down=0,hight=0;
   int result;
   char ch;
   Stc12c5a60s2_Usart1_Init(); //′®¿ú13õê¼»ˉ
   Stc12c5a60s2_Usart2_Init(); //′®¿ú23õê¼»ˉ
   //ESP8266_Init_AP();


  while(1)
  {
    //printf("**********************\r\n");
        //printf("please input up\r\n");
        //while((ch=_getkey())!=0x0d);
        scanf("%s",up);
        printf("%s\r\n",up);
  }


        
}

下面是.h 文件,


#ifndef __ESP8266_H_
#define __ESP8266_H_


#define FOSC 11059200L      //System frequency
#define BAUD 9600         //UART baudrate


#define NONE_PARITY     0   //None parity
#define ODD_PARITY      1   //Odd parity
#define EVEN_PARITY     2   //Even parity
#define MARK_PARITY     3   //Mark parity
#define SPACE_PARITY    4   //Space parity

#define PARITYBIT NONE_PARITY //óÃóúÑ¡Ôñ′®¿úμÄÆæżD£Ñéλ


sfr AUXR  = 0x8e;           //Auxiliary register
sfr S2CON = 0x9a;           //UART2 control register
sfr S2BUF = 0x9b;           //UART2 data buffer
sfr BRT   = 0x9c;           //Baudrate generator
sfr IE2   = 0xaf;           //Interrupt control 2

#define S2RI  0x01          //S2CON.0
#define S2TI  0x02          //S2CON.1
#define S2RB8 0x04          //S2CON.2
#define S2TB8 0x08          //S2CON.3



/*
* oˉêyÃû£oESP8266_SendString
* Ãèêö  £oWF-ESP8266Ä£¿é·¢Ëí×Ö·û′®
* êäèë  £oenumEnUnvarnishTx£¬éùÃ÷êÇ·ñòÑê1ÄüáËí¸′«Ä£ê½
*       £opStr£¬òa·¢ËíμÄ×Ö·û′®
*       £oulStrLength£¬òa·¢ËíμÄ×Ö·û′®μÄ×Ö½úêy
*       £oucId£¬ÄĸöID·¢ËíμÄ×Ö·û′®
* ·μ»Ø  : 1£¬·¢Ëí3é1|
*         0£¬·¢Ëí꧰ü
* μ÷óà £o±»ía2¿μ÷óÃ
*/
/****
bit ESP8266_SendString ( FunctionalState enumEnUnvarnishTx, char * pStr, u32 ulStrLength, ENUM_ID_NO_TypeDef ucId )
{
        char cStr [20];
        bit bRet = 0;
               
        if ( enumEnUnvarnishTx )
                ESP8266_Usart ( "%s", pStr );

        
        else
        {
                if ( ucId < 5 )
                        sprintf ( cStr, "AT+CIPSEND=%d,%d", ucId, ulStrLength + 2 );

                else
                        sprintf ( cStr, "AT+CIPSEND=%d", ulStrLength + 2 );
               
                ESP8266_Cmd ( cStr, "> ", 0, 1000 );

                bRet = ESP8266_Cmd ( pStr, "SEND OK", 0, 1000 );
  }
        
        return bRet;

}


***/

/***
#define RX_BUF_MAX_LEN     1024   
extern struct  STRUCT_USARTx_Fram     
{
char  Data_RX_BUF[ RX_BUF_MAX_LEN ];
        
union {
          volatile InfAll;
struct {
                  volatile int FramLength       :15;                               // 14:0
                  volatile int FramFinishFlag   :1;                                // 15
            } InfBit;
       };
        
}strPc_Fram_Record, strEsp8266_Fram_Record;

***/


char code at[] = {0x41,0x54,0x0D,0x0D,0x0A};         
//2aêÔATÆô¶ˉ
//·μ»Øok
char code at_cwmode[] = {"AT+CWMODE=2\r\n"};
//2é¿′wifi°æ±¾
//·μ»Ø +CWMODE:2  »ò3
char code at_rst[] = "AT+RST\r\n";
//ÖØÆôÄ£¿é
//·μ»ØOK

//2éÑˉÄ£¿é·tÎñÆ÷3¬ê±ê±¼ä
//·μ»Ø+cipsto:60
//ok
char code at_cwjap[] = "AT+CWJAP\r\n"; //·μ»ØOK μ±Ç°á¬½óμÄwifiÃû3Æ
char code at_cwqap[] ="AT+CWQAP\r\n"; //íÆ3öAPᬽó
char code at_cipmode[] = "AT+CIPMODE=1\r\n";//éèÖÃÎaí¸′«Ä£ê½
char code at_cwsap[]="AT+CWSAP=\"wxs\",\"123456789\",1,3\r\n";
char code at_cipmux[]="AT+CIPMUX=\"1\"\r\n";  //μ«á¬½óoí¶àᬽóÖ®·Ö
char code at_cipserver[]="AT+CIPSERVER=\"1\",\"8080\",\r\n";
char code at_cipsto[] = "AT+CIPSTO=\"1800\"\r\n";  //éèÖÃ3¬ê±ê±¼ä
char code at_cipsend[] = "AT+CIPSEND=\"0\",\"9\"\r\n";

//2éÑˉ½óèëμãÃû3Æ
//½øèëμãí¨μà
//½óèëμãÃüÂë
//½óèëμã¼óÃü·½ê½
//·μ»Ø
//+CWSAP:"Ãû3Æ""ÃüÂë""í¨μà""¼óÃü·½ê½"
//′òó¡2aêÔày3ììáê¾DÅÏ¢
//SendString_Usart_1("\r\nESP8266WIFI2aêÔÄ£¿é");
//SendString_Usart_1("\r\n1,STAÄ£ê½TCP_Client");
//SendString_Usart_1("\r\n2,AP Ä£ê½AP_Server");
//SendString_Usart_1("\r\n3,STA+APÄ£ê½TCP_Client+TCP_Server");
//SendString_Usart_1("\r\n");
//Usart_2_Printf(at_rst);
//SendString_Usart_1("\r\nàyèçÔú′®¿úÖDêäèë3 »Ø3μ\r\n");
//Receive_Data = Receive_Usart_1;
/****/

   // SendString_Usart_2("AT+CWMODE=2\r\n");
//SendString_Usart_2("AT+CWLIF\r\n"); //2é¿′òѽóèëé豸IP
//SendString_Usart_2("AT+CWMODE\r\n");//2éÑˉÃüáî
//SendString_Usart_2("AT+CWJAP=wxs777,123456789\r\n");
//Ñ¡Ôñwifió|óÃÄ£ê½

        
         // //ATÖ¸áî
//SendString_Usart_2("AT+CIPMUX=1\r\n");
//SendString_Usart_2("AT+CIPSERVER=1,8080\r\n");
//SendString_Usart_2("AT+CWSAP=wxs123,123456789,1,3\r\n");
//SendString_Usart_2("AT+CWJAP?\r\n");
//SendString_Usart_2("AT+CWJAP=wxs123,123456789\r\n");         
//         Delay_Ms(50);
//         SendString_Usart_2(at_rst);
//SendString_Usart_2("AT+CIPMODE?\r\n");         
         
         //Delay_Ms(10000);
/*******
SendString_Usart_2("AT+CWMODE=2\r\n");
Delay_Ms(1000);
SendString_Usart_2("AT+RST\r\n");
Delay_Ms(1000);
SendString_Usart_2("AT+CWMODE=2\r\n");
Delay_Ms(1000);
SendString_Usart_2("AT+CWSAP=WXS123,123456789,11,3\r\n");

SendString_Usart_2("AT+RST\r\n");
SendString_Usart_2("AT+CIFSR\r\n");
Delay_Ms(1000);
SendString_Usart_2("AT+CIPMUX=1\r\n");
Delay_Ms(1000);
*******/
/*******óÃóú2aêÔÄ£ê½êÇ·ñ¸Ä±ä**************
SendString_Usart_2("AT+CWMODE=2\r\n");
Delay_Ms(1000);
SendString_Usart_2("AT+RST\r\n");
Delay_Ms(1000);
SendString_Usart_2("AT+CWMODE?\r\n");
//************************/
/*****/
//SendString_Usart_2("AT+CIPMUX=1\r\n");
//Delay_Ms(5000);
//SendString_Usart_2("AT+CIPSERVER=1,8080\r\n");
//Delay_Ms(5000);
//SendString_Usart_2(at_cwsap);
//Delay_Ms(5000);
//SendString_Usart_2("AT+RST\r\n");
//Delay_Ms(5000);
//SendString_Usart_2("AT+CWSAP?\r\n");
//Delay_Ms(5000);
//******/
//SendString_Usart_2("AT+RST\r\n");
//Delay_Ms(1000);
//SendString_Usart_2("AT+CWMODE?\r\n");



#endif


全部测试通过,绝对可以使用 ,里面关于wifi  函数删除或注释掉

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-8-2 23:23 | 显示全部楼层
楼主最好传个压缩包
回复

使用道具 举报

ID:7209 发表于 2020-6-27 08:28 | 显示全部楼层
谢谢 管理员大哥:
   这个项目是关于WIFI 的一个控制,当时找了51 的, 但是测试不成功,后来只好一个一个命令调试了,后续我把STM32  的源码一放到上面给 小伙伴们分享。 
  谢谢管理员大哥!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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