微网站设置,爱企业查询,推广小说赚钱平台,创意网页设计题库串口工作方式 方式0方式0输出方式0输入 方式1方式1输出方式1输入 方式2或方式3输出输入 串口使用方法如何计算波特率串口初始化步骤串口回传实验模拟printf实验串口接收数据不丢失实验 方式0 方式 0 时#xff0c;串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输 入… 串口工作方式 方式0方式0输出方式0输入 方式1方式1输出方式1输入 方式2或方式3输出输入 串口使用方法如何计算波特率串口初始化步骤串口回传实验模拟printf实验串口接收数据不丢失实验   方式0 方式 0 时串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输 入或输出口。 数据由 RXDP3.0引脚输入或输出同步移位脉冲由 TXDP3.1 引脚输出。发送和接收均为 8 位数据低位在先高位在后。波特率固定为 fosc/12 方式0输出 方式0输入 方式1 
方式 1 是 10 位数据的异步通信口。TXD 为数据发送引脚RXD 为数据接收引 脚传送一帧数据的格式如下所示。其中 1 位起始位8 位数据位1 位停止位。  
方式1输出 方式1输入 用软件置 REN 为 1 时接收器以所选择波特率的 16 倍速率采样 RXD 引脚电 平检测到 RXD 引脚输入电平发生负跳变时则说明起始位有效将其移入输入 移位寄存器并开始接收这一帧信息的其余位。接收过程中数据从输入移位寄 存器右边移入起始位移至输入移位寄存器最左边时控制电路进行最后一次移 位。当 RI0且 SM20或接收到的停止位为 1时将接收到的 9 位数据的前 8 位数据装入接收 SBUF第 9 位停止位进入 RB8并置 RI1向 CPU 请求中断。 方式2或方式3 
输出 方式 2 或方式 3 时为 11 位数据的异步通信口。TXD 为数据发送引脚RXD 为 数据接收引脚。 发送开始时先把起始位 0 输出到 TXD 引脚然后发送移位寄存器的输出位 D0到 TXD 引脚。每一个移位脉冲都使输出移位寄存器的各位右移一位并由 TXD 引脚输出。第一次移位时停止位“1”移入输出移位寄存器的第 9 位上 以后每次移位左边都移入 0。当停止位移至输出位时左边其余位全为 0检 测电路检测到这一条件时使控制电路进行最后一次移位并置 TI1向 CPU 请求中断。 输入 接收时数据从右边移入输入移位寄存器在起始位 0 移到最左边时控制 电路进行最后一次移位。当 RI0且 SM20或接收到的第 9 位数据为 1时 接收到的数据装入接收缓冲器 SBUF 和 RB8接收数据的第 9 位置 RI1向 CPU 请求中断。如果条件不满足则数据丢失且不置位 RI继续搜索 RXD 引脚 的负跳变。 串口使用方法 
如何计算波特率 256 - TH1  11.0592M/12169600所以TH1TL1250 
串口初始化步骤 
如何使用串口大家可以按照以下几个步骤配置。 
①确定 T1 的工作方式TMOD 寄存器②确定串口工作方式SCON 寄存器③计算 T1 的初值设定波特率装载 TH1、TL1④启动 T1TCON 中的 TR1 位⑤如果使用中断需开启串口中断控制位IE 寄存器。 
串口回传实验 //功能串口回传实验PC通过串口通讯工具发送字符a或字符串helloMCU回复相同内容#include reg52.htypedef unsigned int 	u16;
typedef unsigned char 	u8;
typedef unsigned long 	u32;//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(ims;i0;i--)for(j123;j0;j--);
}						
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void);	  //串口1的初始化void main()
{Uart1_Init();while(1)	//保持应用程序不退出{}
}void Uart1_Init(void)//配置串口为工作方式1定时器1工作方式为28位自重载
{//串口模块寄存器PCON | 0x80;			//使能波特率倍速位SMODSCON | 0x50;			//配置串口工作方式1允许接收数据//定时器1相关寄存器TMOD  0x0F;		//使用定时器1TMOD | 0x20;		//配置工作方式28位自重载TL1  0xFA;			//设置定时计数器的低8位TH1  0xFA;			//设置定时计数器的高8位TR1  1;			//开启定时器1//中断相关寄存器ES  1;			  	//串行口中断允许位EA  1;				//CPU 中断允许总允许位
}void Uart1_Isp(void)	interrupt 4
{u8	u8RecData  0;if(RI)	//检测串口接收完成中断{u8RecData  SBUF;		//将串口模块缓存寄存器中的数据读到用户内存	SBUF  	u8RecData;		//将用户数据传输到串口缓存寄存器中准备发送while(TI0);			//用户在等待串口发送单元发送完成RI  0;		//用户清除接收数据完成标志TI  0;		//用户清除发送数据完成标志}
}模拟printf实验 //功能实现printf的输出重定向#include reg52.h
#include stdio.htypedef unsigned int 	u16;
typedef unsigned char 	u8;
typedef unsigned long 	u32;//定义LED的引脚
sbit LED1  P2^0;//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(ims;i0;i--)for(j123;j0;j--);
}						
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void);	  //串口1的初始化
void Uart1_SendData(u8 u8data);		//串口1的发送数据void main()
{u16 i  0;Uart1_Init();while(1)	//保持应用程序不退出{i;delay_ms(1000);printf(i  %03d,hello world!\r\n,i);}
}void Uart1_Init(void)//配置串口为工作方式1定时器1工作方式为28位自重载
{//串口模块寄存器PCON | 0x80;			//使能波特率倍速位SMODSCON | 0x50;			//配置串口工作方式1允许接收数据//定时器1相关寄存器TMOD  0x0F;		//使用定时器1TMOD | 0x20;		//配置工作方式28位自重载TL1  0xFA;			//设置定时计数器的低8位TH1  0xFA;			//设置定时计数器的高8位TR1  1;			//开启定时器1//中断相关寄存器ES  1;			  	//串行口中断允许位EA  1;				//CPU 中断允许总允许位
}void Uart1_Isp(void)	interrupt 4
{u8	u8RecData  0;if(RI)	//检测串口接收完成中断{u8RecData  SBUF;		//将串口模块缓存寄存器中的数据读到用户内存	switch(u8RecData){case 0x10:	LED1  1;break;case 0x11:	LED1  0;break;default:break;}RI  0;		//用户清除接收数据完成标志}
}char putchar (char dat)	//标准C的输出重定向
{Uart1_SendData(dat);return dat;
}void Uart1_SendData(u8 u8data)
{SBUF  u8data;		//串口输出单元开始工作while(TI  0)			//等TI为高电平输出完成{}TI  0;				//清除发送标志
}串口接收数据不丢失实验 //功能串口接收长字符50以内不丢失数据通过printf发送给PC#include reg52.h
#include stdio.htypedef unsigned int 	u16;
typedef unsigned char 	u8;
typedef unsigned long 	u32;u8 	u8Uart_Buffer[50]{0};		//串口缓存池
u8	u8Uart_Rx_STA  0;		//串口接收状态标志
//bit7	0:表示没有接收完成	1反之
//bit6	0:表示没有接收到\r,	1反之
//bit5--bit0	表示接收到的有效数据长度//以毫秒为单位的延时
void delay_ms(unsigned int ms){unsigned int i,j;for(ims;i0;i--)for(j123;j0;j--);
}						
//以10微秒为单位的延时
void delay_10us(u16 ten_us)
{while(ten_us--);
}void Uart1_Init(void);	  //串口1的初始化
void Uart1_SendData(u8 u8data);		//串口1的发送数据
void Uart1_RecvData(void);void main()
{u8 len  0;Uart1_Init();while(1)	//保持应用程序不退出{if(u8Uart_Rx_STA  0x80)	//串口数据接收完成{len  	u8Uart_Rx_STA  0x3f;u8Uart_Buffer[len]  0;printf(%s\r\n,u8Uart_Buffer);u8Uart_Rx_STA  0;		//清除状态标志}}
}void Uart1_Init(void)//配置串口为工作方式1定时器1工作方式为28位自重载
{//串口模块寄存器PCON | 0x80;			//使能波特率倍速位SMODSCON | 0x50;			//配置串口工作方式1允许接收数据//定时器1相关寄存器TMOD  0x0F;		//使用定时器1TMOD | 0x20;		//配置工作方式28位自重载TL1  0xFA;			//设置定时计数器的低8位TH1  0xFA;			//设置定时计数器的高8位TR1  1;			//开启定时器1//中断相关寄存器ES  1;			  	//串行口中断允许位EA  1;				//CPU 中断允许总允许位
}void Uart1_Isp(void)	interrupt 4
{u8	u8RecData  0;if(RI)	//检测串口接收完成中断{Uart1_RecvData();RI  0;		//用户清除接收数据完成标志}
}char putchar (char dat)	//标准C的输出重定向
{Uart1_SendData(dat);return dat;
}void Uart1_SendData(u8 u8data)
{SBUF  u8data;		//串口输出单元开始工作while(!TI);			//等TI为高电平输出完成TI  0;				//清除发送标志
}void Uart1_RecvData(void)
{u8 r  SBUF;if((u8Uart_Rx_STA  0x80)  0)//没有接收完成{if(u8Uart_Rx_STA  0x40){if(r!\n){u8Uart_Rx_STA  0;		//将状态清0}else{u8Uart_Rx_STA | 0x80;	//标记数据接收完成}}else	//还没有接收过\r{if(r  \r){u8Uart_Rx_STA | 0x40;	//标记数据接收到\r}else{if((u8Uart_Rx_STA  0x3f)48){u8Uart_Buffer[u8Uart_Rx_STA]  r;}else{u8Uart_Rx_STA  0;}}}}
}