精华内容
下载资源
问答
  • 例如单片机串口发送ASCII码$01,play只需要发送其对应的十六进制数,如下: $对应0x24 0对应0x30 1对应0x31 ,对应0x2C P对应0x70 l对应0x6C a对应0x61 y对应0x79 通过串口发送所对应的十六进制数就相当于...

    例如单片机向串口发送ASCII码$01,play只需要发送其对应的十六进制数,如下:

    $对应0x24

    0对应0x30 

    1对应0x31 

    ,对应0x2C

    P对应0x70 

    l对应0x6C 

    a对应0x61 

    y对应0x79 

         通过串口发送所对应的十六进制数就相当于发送了ASCII码,例如单片机发送$01,play和发送24 30 31  2C 70 6C 61 79是一样的。

    展开全文
  • 单片机串口发送16进制、ASCII

    千次阅读 2020-06-18 11:13:44
    单片机串口发送16进制、ASCII 单片机的串口是,你给的是什么格式他就发送什么格式,在使用串口助手接收到时候也会出现“用什么显示的选项”: 1.如果你串口发送的是16进制数,可以直接把16进制数放到数组里面进行...
    单片机串口发送16进制、ASCII

    单片机的串口是,你给的是什么格式他就发送什么格式,在使用串口助手接收到时候也会出现“用什么显示的选项”:
    1.如果你串口发送的是16进制数,可以直接把16进制数放到数组里面进行发送,也可以用sprintf函数对数据进行格式化成16进制格式,在进行发送。
    2.如果你想发送ASCII码,就要把数据转换成字符串或者ASCII码进行发送

    个人理解,互进。

    展开全文
  • 51单片机接收ASCII时会把ASCII转换成相应的十进制和十六进制数字代码,所以要写一个相应的库,通过转换ASCII码的数字代码使其对应相应的字符实现在1602上的显示.还有要注意在与电脑和open MV通信时要注意波特率。

      

    #include "reg52.h"
    #define uchar unsigned char
    #define uint unsigned int

    uint code tade[]={'0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; 
    uint code tade_x[]={'0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    uint code tade_s[]={'0','1','2','3','4','5','6','7','8','9'};
    uint code tabe_r[]={'r','e','c','t'};
    uint code tabe_c[]={'c','i','r','c','l','e'};
    uchar code tabe_y_g[]={'g','r','e','e','n'};
    uint code tabe_y_b[]={'b','l','u','e'};
    uint code tabe_y_r[]={'r','e','d'};
    uint code tabe_t[]={'t','r','i','a','n','g','l','e'};
    uchar jieshou[9];

    uchar xz,ys;
    uchar t;
    uchar i,z;
    uchar p=' ';
    int shou=0;

    sbit EN=P2^7; //enable
    sbit RS=P2^6;//Command selection side
    sbit RW=P2^5;

    void delay_2(uint z)//delay
    {
        uint x,y;
        for(x=z;x>0;x--)
            for(y=110;y>0;y--);
    }

    void wite_c(uchar com) // wite order
    {
        RS = 0;
        RW = 0;
        P0 = com;
        delay_2(5);
        EN = 1;
        delay_2(5);
        EN = 0;
    }

    void wite_d(uchar date) //wite date
    {
        RS = 1;
        RW = 0;
        P0 = date;
        delay_2(5);
        EN = 1;
        delay_2(5);
        EN = 0;
    }


    void  init1602() //1602 init
    {
        EN = 0;
        wite_c(0x38);
        wite_c(0x0c);
    //    wite_c(0x06);
        wite_c(0x01);    
    }

    void show()
    {
        wite_c(0x01);    
        switch(tade[(jieshou[0]&0X1F)])
        {
            case 'R':
            wite_c(0x80);
            for(i=0;i<4;i++)
            {
                wite_d(tabe_r[i]);
                jieshou[0]=' ';
            }
                        break;
            case 'C':    
            wite_c(0x80);
            for(i=0;i<6;i++)
            {
                wite_d(tabe_c[i]);
                jieshou[0]=' ';
            }
                        break;
            case 'T':
            wite_c(0x80);
            for(i=0;i<8;i++)
            {
                wite_d(tabe_t[i]);
                jieshou[0]=' ';
            }
                        break;
        }
        switch(tade_x[(jieshou[1]&0X1F)])
        {
            case 'r':
            wite_c(0x80+0x08);
                for(i=0;i<3;i++)
            {
            wite_d(tabe_y_r[i]);
                jieshou[1]=' ';
            }
                        break;
            case 'g':ys=2;
            wite_c(0x80+0x08);
                for(i=0;i<5;i++)
            {
                wite_d(tabe_y_g[i]);
                jieshou[1]=' ';
                
            }
                        break;
            case 'b':ys=3;
            wite_c(0x80+0x08);
                for(i=0;i<4;i++)
            {
            wite_d(tabe_y_b[i]);
                jieshou[1]=' ';
            }
                        break;
        }
     
            wite_c(0x80+0x40);
        for(i=2;i<5;i++)
        {
            if(jieshou[i]<0x41)
            {
                wite_d(tade_s[(jieshou[i]&0X0F)]);
                jieshou[i]=' ';
            }
            if(jieshou[i]>0x40&&jieshou[i]<0x60)
            {    
                wite_d(tade[(jieshou[i]&0X1F)]);
                jieshou[i]=' ';
            }
            if(jieshou[i]>0x60)
            {    
                wite_d(tade_x[(jieshou[i]&0X1F)]);
                jieshou[i]=' ';
            }
        }
        wite_c(0x80+0x40+0x04);
        for(i=5;i<9;i++)
        {
            if(jieshou[i]<0x41)
            {
                wite_d(tade_s[(jieshou[i]&0X0F)]);
                jieshou[i]=' ';
            }
            if(jieshou[i]>0x40&&jieshou[i]<0x60)
            {    
                wite_d(tade[(jieshou[i]&0X1F)]);
                jieshou[i]=' ';
            }
            if(jieshou[i]>0x60)
            {    
                wite_d(tade_x[(jieshou[i]&0X1F)]);
                jieshou[i]=' ';
            }
        }
        wite_c(0x80+0X40+0x08);    
            wite_d('c');
        wite_c(0x80+0X40+0x09);    
            wite_d('m');
        t = 0;
        shou = 0;
    }
    //串口&定时器初始化
    void init(void)        //9600bps@11.0592MHz
    {
        SCON = 0x50;        //串口初始化
        TMOD = 0x20;
        TH1  = 0xFD;
        TL1  = 0xFD;
        TR1  = 1;
        ES   = 1;
        EA   = 1;
    }

    void send(void)
    {    uint wei_fa=0;
        for(wei_fa = 0; wei_fa<9; wei_fa++)
        {
            SBUF = jieshou[wei_fa];
            while(!TI);        //等待是否发送完毕
            TI = 0;
        }
    }

    void main(void)
    {
        t=0;
        init1602();
        init();
        while(1)
        {
            if(t==1)
            {
       show();
            }
     } 
    }

    void interrupt_uart() interrupt 4
    {
        if(RI)
        {
            RI = 0;
            jieshou[shou++] = SBUF;
            t=1;
            if(shou >=9)
            {
                shou = 0;
                send();
            }
        }    
    }

      由于时间比较仓促所以程序有写的有点乱。51单片机接收ASCII时会把ASCII转换成相应的十进制和十六进制数字代码,所以要写一个相应的库,通过转换ASCII码的数字代码使其对应相应的字符实现在1602上的显示.还有要注意在与电脑和open MV通信时要注意波特率。

    展开全文
  • 51单片机串口程序,字符串/16进制发送与接收

    万次阅读 多人点赞 2014-03-31 21:50:51
    这篇文章将说明51串口通信的发送与接收。分为:单个字符接收,字符串接收;十进制发送与接收,十六进制发送与接收。 字符串发送与十六进制发送,参考:...程序皆由PC串口工具发送,由单片机接收,并返回接收值给PC机。

    这篇文章将说明51串口通信的发送与接收。分为:单个字符接收,字符串接收;十进制发送与接收,十六进制发送与接收。

    字符串发送与十六进制发送,参考:http://blog.csdn.net/yibu_refresh/article/details/22695063

    程序皆由PC串口工具发送,由单片机接收,并返回接收值给PC机。


    一:单个字符的发送与接收

    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    //定义接收 字符
    uchar Buffer;
    
    //串口初始化函数
    void   URATinit( )
    {
     TMOD=0x20;
     SCON=0x50;
     EA=1;
     ES=1;
     TR1=1;
     TH1=0xfd;
     TL1=0xfd;
    }
    //中断函数
    void receive() interrupt 4
    {
     if(RI)
     { 
      Buffer=SBUF;
      RI=0;
     }
     SBUF=Buffer;
     while(!TI);
     TI=0;
    }
    //主函数
    void  main()
    {
     URATinit( );
    }
    在中断函数中,如果接收到数据则RI由硬件置1,这时候把SBUF缓冲区的数据赋值给Buffer,并将RI置0,等待下次接收。同时,将接收到的数据再放入缓冲区,发送给PC机。当发送完毕的时候TI会被硬件置1,这时候需要将TI置0,以待下次发送。

    运行效果:


    发送数据1,则返回1。


    二.字符串接收

    (1)

    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    //定义接收 数组
    uchar Buffer[5]={0};
    uchar i=0,j=0;
    
    //串口初始化函数
    void   URATinit( )
    {
     TMOD=0x20;
     SCON=0x50;
     EA=1;
     ES=1;
     TR1=1;
     TH1=0xfd;
     TL1=0xfd;
    }
    //中断函数
    void receive() interrupt 4
    {
     if(RI)
     { 
      Buffer[i]=SBUF;
      RI=0;
     }
     SBUF=Buffer[i];
     while(!TI)	;
     TI=0;
     i++;
     if(i>=5){
     	i=0;
     }
    }
    //主函数
    void  main()
    {
     URATinit( );
    }		 
    在中断函数当中用Buffer[]接收收到的数据,同时将Buffer[]再发送给上位机。这里要注意变量i的定义。 如果定义为全局变量则Buffer[0-5]都可以接收到数据,需要对i计数,防止大于5溢出。

    运行效果:


    (2)

    #include <reg52.h>
    #define uint unsigned int
    #define uchar unsigned char
    //定义接收 数组
    uchar Buffer[5];
    uchar i=0,flag;
    
    //延时函数
    delay(uint  ms)
    {
     uchar i;
     while(ms--)
     for(i=0;i<123;i++);
    }
    //串口初始化函数
    void   URATinit( )
    {
     TMOD=0x20;
     SCON=0x50;
     EA=1;
     ES=1;
     TR1=1;
     TH1=0xfd;
     TL1=0xfd;
    }
    //中断函数
    void receive() interrupt 4
    {
     if(RI)
     { 
      Buffer[i++]=SBUF;
      RI=0;	 
      if(i>=5){
     	i=0;
     	}
      flag=1;
     }
    }
    //主函数
    void  main()
    {
     uchar k=0;
     for(k;k<5;k++){
     Buffer[k]=0;
     }
     URATinit( );
     while(1){
     if(flag) {
     	uchar j=0;
     	for(j;j<5;j++){
     		SBUF=Buffer[j];
     		while(!TI)	;
     		TI=0;
    		delay(50);
     		}
     	flag=0;
    	}
    }
    }		 
    
    这时不是从中断函数中发送接收到的字符串,而是在主函数中发送接收到的字符串。于是需要flag标志位来判断是否接收到数据,并且用while(1)循环来不断判断并输出接收到的字符串。

    运行效果:


    其实方法(1)优于方法(2),现在来发送字符串"1234"与“123456”来看看效果:

    发送“1234”(发送3次)


    发送“123456”(发送3次):


    可以看出(1)方法总是可以正确传输回并显示所发送的字符串,而(2)方法则有一定的局限性,只有当传输5个字符的字符串时才可以出现想要的显示效果。

    分析发现:(1)中在中断中直接发出收到的字符,接收一个发送一个,为实时效果。(2)则在主程序中整体发送接收到的Buffer数组,例如接收“1234”,当“1234”发过来的时候由于Buffer为5位数组,因此第一次发送会给Buffer[0-3]赋值,Buffer[4]未赋值,返回给上位机第一次输出为“1234”,但第二次发送时候会给Buffer[4]赋值,同时溢出把i归为0。再次输出Buffer时造成了传输字符串的重叠与混乱。其实(1)也有这个现象,只是(1)的返回为及时返回。


    三. 字符串发送与十六进制发送:

    #include<reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    uchar num;
    
    sbit dula=P2^6;		//申明U1锁存器的锁存端
    sbit wela=P2^7;		//申明U2锁存器的锁存端
    
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71};
    
    void delay(uint xms)				
    {
    	uint i,j;
    	for(i=xms;i>0;i--)		      //i=xms即延时约xms毫秒
    		for(j=110;j>0;j--);
    }
    
    void display(uint value)  //显示子函数
    {
    	uchar wan,qian,bai,shi,ge;   //定义万千百十个位
    	wan=value/10000;               
    	qian=value%10000/1000;
    	bai=value%1000/100;		
    	shi=value%100/10;
    	ge=value%10;
    	
    	dula=1;
    	P0=table[wan];    
    	dula=0;
    	P0=0xff;	
    	wela=1;			
    	P0=0xfe;		
    	wela=0;
    	delay(2);	  
    	
    	dula=1;
    	P0=table[qian];
    	dula=0;
    	P0=0xff;
    	wela=1;
    	P0=0xfd;
    	wela=0;
    	delay(2);
    	
    	dula=1;
    	P0=table[bai];
    	dula=0;
    	P0=0xff;
    	wela=1;
    	P0=0xfb;
    	wela=0;
    	delay(2);
    	
    	dula=1;
    	P0=table[shi];
    	dula=0;
    	P0=0xff;
    	wela=1;
    	P0=0xf7;
    	wela=0;
    	delay(2);	
    	
    	dula=1;
    	P0=table[ge];
    	dula=0;
    	P0=0xff;
    	wela=1;
    	P0=0xef;
    	wela=0;
    	delay(2);	
    }
    
    void init()         //初始化函数
    {
    	TMOD=0x20;      //设置定时器1工作方式
    	TH1=0xfd;
    	TL1=0xfd;
    	TR1=1;
    	SM0=0;
    	SM1=1;
    	REN=1;
    	EA=1;
    	ES=1;
    }
    
    void main()
    {
        init();
    	while(1)
    	{
    	    display(num);
    	}
    		
    }
    
    void ser() interrupt 4     //串口中断函数
    {
    	if(RI){
    	   num=SBUF;          
           RI=0;
    	   }              //置RI为0以便接收下一个数据
    	   SBUF=num;
    	   while(!TI);
    	   TI=0;
    }
    这个程序可以在数码管上显示接收到的字符/数据,同时将接收到的数据返回给上位机显示。

    先发送字符‘a’,即默认的字符串发送方式:


    发送字符‘a’,这时单片机返回给上位机的也为‘a’(默认的字符串显示方式)。但是数码却显示97,为‘a’的ASCII码。这说明在传输过程中,始终为ASCII码传输。数码管之所以没显示‘a’,因为数码管为十进制显示方式,故显示97。(‘a’(ASCII显示)——>97(十进制显示)——>'a'(ASCII码显示))

    发送字符‘a’,选择16进制发送,16进制显示:


    这时发送端为16进制‘a’,即10进制的10。数码管显示10,而返回的值用16制显示为0A。

    由文章开始的参考文章知道16进制发送时每次发送两位数据,如:发送十进制20,即16进制的14,这时数码管会显示20。(14(16进制显示)——>20(10进制显示)——>14(16进制显示))。


    展开全文
  • STM32串口 ASCII 的数字接收与发收 串口发送 先重定义,如下 int fputc(int ch,FILE* f) { HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,1); return ch; } 数据量大的可用DMA,亲测有效 int fputc(int ch...
  • 典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信重要的参数...
  • 单片机串口通信基础

    2017-11-01 14:50:11
    单片机串口通信基础串口通信是非常总要的,首先我们先了解一下基础随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能越来越显的重要。计算机通信是指计算机与外部设备或者计算机与计算机制之间的...
  • //将串口接收到的数据写入接收数组 //sc.DataReceived(object sender, EventArgs e, rec); builder.Append(Encoding.ASCII.GetString(rec)); 这个是我自己写的,获取不到东西,还有一个是别人提供...
  • * 【程序功能】: 串口工作方式1,8位UART,比特率9600,接收串口数据,数码管以十 进制格式显示,并且把接收到的数据加1后通过串口发出 ************************************************************************...
  • 单片机外挂汉字库程序加串口接收程序 单片机 汉字 和ASCII字符程序,程序中的汉字和英文全部存在 字库 中。单片机用的是常用的8051, 仿真 软件用的是 proteus 。由于proteus中的flash最大是64k,没有29c040等,而...
  • 51单片机串口通信

    千次阅读 多人点赞 2020-01-13 10:28:25
    这节我们主要讲单片机串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能...
  • 单片机串口理解

    千次阅读 2013-06-05 15:54:56
    8051单片机的通讯方式有两种: 并行通讯:数据的各位同时发送或接收。 串行通讯:数据一位一位顺序发送或接收。参看下图:  串行通讯的方式: 异步通讯:它用一个起始位表示字符的开始,用停止位表示字符...
  • #include unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, ...//总开关闭合(EA) + 串口中断开关闭合(ES) TR1 = 1; //开启timer1 while(1) { disp_digit(buf); } return 0; }  
  • 51单片机串口通信实例

    千次阅读 2013-06-29 23:01:36
    一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为...与之前一样,首先我们来了解单片机串口相关的寄
  • 姓名:周崇杰 学号:16040120059 专业:机械设计制造及其自动化转载自:http://blog.csdn.net/a514371309/article/details/73481423...【嵌牛鼻子】:单片机,C语言,串口通信协议【嵌牛提问】:单片机是通过协议进...
  • STM32 串口中断 接收ASCII码整数 转换为 多位整形数据 maixpy IDE 写K210的串口发送函数,数据会以ASCII码的形式发送出来 下面的代码K210发送的是一个不大于三位数的ASCII码数据,使用STM32串口中断服务函数进行接收...
  • 串口通信发送的数据是以ASCII码形式,对数据进行处理需要将ASCII码转换成数值,对数值转换成二进制,再根据帧格式对其拆帧。 流程; 1、接收串口发送的数据(串口中断服务函数) 2、将串口发送的数据转换为数值。 3、...
  • 单片机串口通信紊乱

    2017-07-12 19:29:12
    参加西门子比赛的时候用到了51单片机,涉及到多级通信,当时把卫星信号传输,红外信号发射,语音控制等几个功能全整合到51上,想通过一块芯片实现,奈何51太渣渣,串口就一个。实现三个模块之间的数据通信实在太累了...
  • 实现功能:51单片机与电脑串口通信,电脑给...补充说明:电脑和单片机串口通信时,数据是以ASCII码形式存在的,所以在操作的 时候应该注意格式的问题,(1)如果在串口助手中,以文本形式发送数据的话,单片机接收...
  • 很高兴您能使用大家都喜欢的串口小工具–iPort 一、用户协议 使用该软件则默认您已经同意了以下协议: 1.本软件为免费软件 2.可以免费任意使用,拷贝,传递本软件 3.对使用软件所产生的任何后果,作者概不负责 ...
  • 之前用串口的USART_IT_IDLE中断和USART_IT_RXNE(此中断每接收一个字节就会进一次中断),然后利用USART_IT_IDLE检测空闲接收完整的一帧数据,但是此方法需要...//串口接收DMA缓存 #define UART_RX_LEN 128 /********...
  • 单片机串口通信实例

    千次阅读 2016-06-24 23:53:27
    通过该讲,读者可以掌握单片机串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。  一、原理简介  51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,...
  • (三):单片机串口通信实例

    千次阅读 2013-04-12 14:42:15
    一、原理简介  51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的... 与之前一样,首先我们来了解单片机串口相关的寄存器
  • 51 单片机串口实验

    千次阅读 2016-01-25 12:02:54
    在 PROTEUS 软件中,可以使用虚拟终端,和单片机串口进行通信实验。此时,并不需要在电路中加上 TTL-RS232 电平转换器件。直接把单片机串口,和虚拟终端连接在一起就可以了。但是在一些书中,以及一些网络...
  • 深入理解51单片机串口通信

    万次阅读 多人点赞 2016-04-10 12:44:18
    串口通信的基本认识 通信分为并行通信和串行通信,并行通信时的数据各个位同时传送,可以实现字节为单位通信,但通信线多占用资源,成本高。以前用到的的P1=0x55,一次给P1口的8个管脚分别赋值,同时进行信号输出,...
  • 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离...
  • 半双工串口通信实例36:STC12单片机和STC12单片机串口通信一、串口通信实例目的:STC12单片机主站数字量输入DI01~DI08控制STC12单片机从站数字量输出DO01~DO08;STC12单片机从站数字量输入DI01~DI08控制STC12单片机...
  • 单片机串口收发字符数据的类型

    千次阅读 2018-06-09 17:50:38
    今天在用51单片机进行串口收发数据的时候遇到了这样一个问题,上位机给单片机的字符数据是什么类型的,单片机又是怎样存储的?串口中断如下/* UART中断服务函数 */ void InterruptUART() interrupt 4 { if (RI) //...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,748
精华内容 699
关键字:

单片机串口接收ascii