养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

单片机串口字符串输出的方法

时间:2024-10-24 09:26:24

以51单片机为例,51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。当串行发送完毕后,将在标志位TI置1,同样,当收到了数据后,也会在RI置1。无论RI或TI出现了1,只要串口中断处于开放状态,单片机都会进入串口中断处理程序。

工具/原料

PC一台,

C语言开发环境

方法/步骤

1、/**单片机接收主机的数据,然后将数据传送到P1口,并传回给主机;**咯悝滩镞当按下K1=P1.4时,单片机发送字符串给主机惺绅寨瞀*****/#include<reg51.h>#include<intrins.h>unsignedcharkey_s,key_v,tmp;charcodestr1[]="5142587cccddddddcom5652125487";charcodestr2[]="QQ:15920380";charcodestr3[]="EMAIL:crsybody@sohu.com";voidsend_str();bitscan_key();voidproc_key();voiddelayms(unsignedcharms);voidsend_char(unsignedchartxd);sbitK1=P1^4;main(){TMOD=0x20;//定时器1工作于8位自动重载模式,用于产生波特率TH1=0xFD;//波特率9600TL1=0xFD;SCON=0x50;//设定串行口工作方式PCON&=0xef;//波特率不倍增TR1=1;//启动定时器1IE=0x0;//禁止任何中断while(1){if(scan_key())//扫描按键{delayms(10);//延时去抖动if(scan_key())//再次扫描{key_v=key_s;//保存键值proc_key();//键处理}}if(RI)//是否有数据到来{RI=0;tmp=SBUF;//暂存接收到的数据P2=tmp;//数据传送到P0口send_char(tmp);//回传接收到的数据}}}bitscan_key()//扫描按键{key_s=0x00;key_s|=K1;return(key_s^key_v);}voidproc_key()//键处理{if((key_v&0x01)==0){//K1按下send_str();//传送字串"welcome!...}}voidsend_char(unsignedchartxd)//传送一个字符{SBUF=txd;while(!TI);//等特数据传送TI=0;//清除数据传送标志}voidsend_str()//传送字串{unsignedchari=0;while(str1[i]!='\0'){SBUF=str1[i];while(!TI);//等特数据传送TI=0;//清除数据传送标志i++;//下一个字符}i=0;while(str2[i]!='\0'){SBUF=str2[i];while(!TI);//等特数据传送TI=0;//清除数据传送标志i++;//下一个字符}i=0;while(str3[i]!='\0'){SBUF=str3[i];while(!TI);//等特数据传送TI=0;//清除数据传送标志i++;//下一个字符}}voiddelayms(unsignedcharms)//延时子程序{unsignedchari;while(ms--){for(i=0;i<120;i++);}}

2、PC与单片机串口通信:如果在电脑上发送以$开始的字符串,则将整个字符串原样返回(字符串长度不是固定的)。如果接收到1,则将P10置高电平,接收到0,P10置低电平。(用来控制一个LED)单片机是STC89C52RC/晶振11.0592/波特率要求是9600或4800,STC89C52RC是宏晶公司的增强型MCS-51单片机,例如可能会将【$ABCD,123456,987654ccc,aasdasd,aaaa,sssd,4D】这样的字符串(字符串长度约为50-150个字符)传送给单片机,只能能原样返回。

3、#includesbitLED=P1^0;unsignedcharUAR哌囿亡噱T_buff;bitNew_rec=0,Send_ed=1,Money=0;//---------幻腾寂埒-------------------------------------voidmain(void){SCON=0x50;//串口方式1,8-n-1,允许接收.TMOD=0x20;//T1方式2TH1=0xFD;[url=]//9600bps@11.0592MHz[/url]TL1=0xFD;TR1=1;ES=1;//开中断.EA=1;while(Money==0);//等着交费,呵呵,等着接收$.while(1){if((New_rec==1)&&(Send_ed==1)){//如果收到新数据及发送完毕SBUF=UART_buff;//那就发送.New_rec=0;Send_ed=0;}}}//----------------------------------------------voidser_int(void)interrupt4{if(RI==1){//如果收到.RI=0;//清除标志.New_rec=1;UART_buff=SBUF;//接收.if(UART_buff=='1')LED=1;if(UART_buff=='0')LED=0;if(UART_buff=='$')Money=1;}else{//如果送毕.TI=0;//清除标志.Send_ed=1;}}//----------------------------------------------

4、串口接收程序是基于串口中断的,单片机的串口每次接收到一字节数据产生一次中断,然后再读取某个寄存器就可以得到串口接收的数据了。然而在实际应用当中,基本上不会有单字节接收的情况。一般都是基于一定串口通信协议的多字节通信。在422或者485通信中,还可能是一个主机(一般是计算机)带多个从机(相应的有单片机的板卡)。这就要求我们的单片机能够在连续接收到的串口数据序列中识别出符合自己板卡对应的通信协议,来进行控制操作,不符合则不进行任何操作。简而言之就是,单片机要在一串数据中找到符合一定规律的几个字节的数据。

© 一点知识