51单片机与上位机的串口通讯

先上图

电路连接实拍
如图所示:使用12c052AD,晶振使用11.0592M,晶振电容使用20pf,使用USB使串口与电脑连接,LED灯正极接P1,加限流电阻

注意:使用12M的晶振会出现大概率的乱码。也不能使用单片机的内部晶振。

实现功能:通过USB转串口与电脑进行串口通讯,实现上位机控制LED的功能。

1.单片机内烧入程序

#include <reg52.h>
#include <string.h>  
#define uc unsigned char   
#define uint unsigned int

sbit LED=P3^7;      
uc sChar[50]={'\0'};
unsigned char sChar_i=0;//写入数据sChar指针
unsigned char  sendFlag = 0;	//未发送数据时
unsigned char  receFlag =0;		//未接受到数据时  
 
void sendChar(unsigned char sendValue);  //发送一字节数据
void sendAll(unsigned char *pValue);       //发送一组数据
      
void initSer()//初始化  
{  
     TMOD=0x20;    //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。         
     TH1=0xfd;     //定时器1初值  ,设置波特率为9600 配合为晶振11.0529MHZ,晶振的电容是20uf?  
     TL1=0xfd;  
     TR1=1;        //开启定时器1  
   
     SM0=0;  	   //属于SCON寄存器
     SM1=1;        //串口工作方式1,10位异步接收,(8位数据)波特率可变  
     REN=1;        //允许串行口接收位  
     EA=1;         //允许中断(总闸)  
     ES=1;         //允许串口中断 
}  
void main()  
{  
     initSer();  
     while(1)  
	{  
		if(receFlag)  
		{
			LED=~LED;
			sChar_i=0;//接受数组指针归0,以便以下次接受
			sendAll(sChar); 
			if(strlen(sChar)==4&&sChar[0]=='L'&&sChar[1]=='E'&&sChar[2]=='D')
			{
				 P1=sChar[3];
			}      	
			receFlag=0;  
     	}  
     	if(sendFlag)                          //发送完毕之后,在电脑端输出。  
     	{  
         	TI=1;                             //printf之前必须将T1置为1才行。  
         	while(!TI);
         	sendFlag=0;  
     	}     
	}  
}

 
void sendChar(unsigned char Value)			//发送一个字节数据
{
	 SBUF = Value;     
	 sendFlag = 1;							//设置发送标志位,发一字节就置位
	 while(sendFlag);						//直到发完数据,将sendFlag清零后,才退出sendChar函数
}

void sendAll(unsigned char *pValue)			//发送一组数据
{
	while((*pValue) != '\0')   				//如果没有发送完毕就继续发
	{
		sendChar(*pValue);      			//发送1字节数据
		pValue++;         		  			//指向下1个字节
	}
}   
void serInt() interrupt 4  //中断函数
{  
	//TI——发送中断bai标志位,可寻址标志位。方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI可由软件清“0”。
	//RI——接收中断标志位.可寻址标志位。接收完第8位数据后,该位由硬件置位,在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
	//在串口中断处理时,TI,RI都需要软件清"0",硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。
	 if(RI)       							//接收数据,手动将RI清0  
     {         
		RI=0;
		if(SBUF=='\0'||S
  • 12
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值