当前位置: 首页 > news >正文

海南做网站的网络公司万网域名注册查询

海南做网站的网络公司,万网域名注册查询,湖北华亚建设工程有限公司网站,深圳做网站建设公司今天,完整地总结一下普中科技的单片机的串口通信的硬件与编程,记录一下以后如果需要也比较方便捡起来。 单片机的串口部分的电路图。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。 对…

        今天,完整地总结一下普中科技的单片机的串口通信的硬件与编程,记录一下以后如果需要也比较方便捡起来。

        单片机的串口部分的电路图。开发板上集成了 1 个串口通信电路,是 USB 转串口模块,它既可下载程序也可实现串口通信功能。

        对这个模块简要分析一下输入输出。

         描述一下CH340芯片的作用。(带你全面解析USB转串口芯片CH340 - 采芯网 (findic.com))

        实现的功能是:51 单片机通过串口(UART)实现与 PC 机对话, 51 单片机的串口收到 PC 机发来的数据后原封不动的返回给 PC 机显示。

        单片机串行口的结构

        串口相关的寄存器。

 

我们一般选择串口工作在方式1下,定时器1工作在方式2下(8位自动重装)。

        定时器(定时器1)与波特率的关系。

SBUF介绍

 串口初始化。

void uart_init(u8 baud)
{
TMOD|=0X20; //设置计数器工作方式 2
SCON=0X50; //设置为工作方式 1
PCON=0X80; //波特率加倍
TH1=baud; //计数器初始值设置
TL1=baud;
ES=1; //打开串口中断
EA=1; //打开总中断
/*定时器1的方式2是8位自动重装,定时器一旦溢出,就自动重装,与中断无关,所以定时器1进入中断后无事可做,所以无需打开定时器1的中断*/
TR1=1; //打开计数器
}

void main()
{
uart_init(0XFA);//波特率为 9600
while(1)
{
}
}
void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;
RI = 0; //清除接收中断标志位
rec_data=SBUF; //存储接收到的数据
SBUF=rec_data; //将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}

完整程序如下所示

#include "reg52.h"typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;/*******************************************************************************
* 函 数 名       : uart_init
* 函数功能		 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
* 输    入       : baud:波特率对应的TH、TL装载值
* 输    出    	 : 无
*******************************************************************************/
void uart_init(u8 baud)
{TMOD|=0X20;	//设置计数器工作方式2SCON=0X50;	//设置为工作方式1PCON=0X80;	//波特率加倍TH1=baud;	//计数器初始值设置TL1=baud;ES=1;		//打开接收中断EA=1;		//打开总中断TR1=1;		//打开计数器		
}/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	uart_init(0XFA);//波特率为9600while(1){			}		
}void uart() interrupt 4 //串口通信中断函数
{u8 rec_data;RI = 0;			//清除接收中断标志位rec_data=SBUF;	//存储接收到的数据SBUF=rec_data;	//将接收到的数据放入到发送寄存器while(!TI);		//等待发送数据完成TI=0;			//清除发送完成标志位				
}

        我在其他博客看到的一些串口代码。


#include <REGX52.H>/* *** @brief 串口初始化		//4800bps@11.0592MHz* @param 无* @retval 无*/
void UART_Init(void)		//4800bps@11.0592MHz
{PCON |= 0x80;		//使能波特率倍速位SMODSCON = 0x50;		//8位数据,可变波特率TMOD &= 0x0F;		//清除定时器1模式位TMOD |= 0x20;		//设定定时器1为8位自动重装方式TL1 = 0xF4;		//设定定时初值TH1 = 0xF4;		//设定定时器重装值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1EA = 1;			//启动所有中断ES = 1;			//启动串口中断
}/* *	串口发送模板* @brief 串口发送一个字节数据* @param Byte 要发送的一个数据* @retval 无*/void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI == 0); //一执行完就要复位TI = 0;         //TI为发射控制器;RI为接受控制器;
}/*串口中断函数模板
void UART_Routine() interrupt 4
{if(RI = 1){RI = 0;}
}*/

        串口的发送与接收数据的过程与串口中断一点关系都没有,并不是不开串口中断就说明禁止了单片机的串口通信,单片机的串口中断只是提供了那么一种方法,即当你接收完数据或者发送完数据,想要先停止此时的串口通讯,进行其他的诸如数据处理的任务,不管是否开中断,只要将数据放入到SBUF中,就一定会将数据发送出去。定时器也是如此,不管有没有开中断,定时器都是在定时的,只不过有些工作方式在定时一次后,再一次定时时初始值会发生变化(工作方式2会自动重装)。

        在串口发送数据的时候,自己不用考虑起始位以及停止位,将数据写入到SBUF中(肯定没有起始位以及停止位),单片机发送的时候会自动将数据包装,在前面和后面加上起始位以及停止位。

串口调试工具

        我自己随便写了个PC端控制单片机LED亮灭的程序。

#include "reg52.h"typedef unsigned int u16;	//对系统默认数据类型进行重定义
typedef unsigned char u8;sbit LED1=P2^0;	//将P2.0管脚定义为LED1/*******************************************************************************
* 函 数 名       : uart_init
* 函数功能		 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
* 输    入       : baud:波特率对应的TH、TL装载值
* 输    出    	 : 无
*******************************************************************************/
void uart_init(u8 baud)
{TMOD|=0X20;	//设置计数器工作方式2SCON=0X50;	//设置为工作方式1PCON=0X80;	//波特率加倍TH1=baud;	//计数器初始值设置TL1=baud;ES=1;		//打开接收中断EA=1;		//打开总中断TR1=1;		//打开计数器		
}void delay_10us(u16 ten_us)
{while(ten_us--);	
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	uart_init(0XFA);//波特率为9600while(1){						}		
}void send_Byte(u8 rec_data)
{SBUF=rec_data;	//将接收到的数据放入到发送寄存器while(!TI);		//等待发送数据完成TI=0;			//清除发送完成标志位	
}void uart() interrupt 4 //串口通信中断函数
{if(RI){u8 rec_data;rec_data=SBUF;	//存储接收到的数据if(rec_data == 'G' || rec_data == 'g'){LED1=0;	//点亮delay_10us(50000); //大约延时450msLED1=1;	//熄灭delay_10us(50000);}send_Byte(rec_data);RI = 0;			//清除接收中断标志位}
}
printf重定向简介

char putchar(char c)
{SendByte(c);return c;
}void SendByte(unsigned char data)
{SBUF = data;while(!TI);TI = 0;
}

附录:

51单片机之寄存器-3.3单片机串口通信之发送与接收 - 微波EDA网 (mweda.com)

单片机串行通信总结_单片机接收sbuff的条件为ri_tony_0620的博客-CSDN博客

51单片机的串口通信(UART)及其应用_51单片机 uart_小菜冀的博客-CSDN博客

http://www.hkea.cn/news/397524/

相关文章:

  • 自助建设彩票网站网址查询工具
  • 怎么创建网页的快捷方式seo入门版
  • 互联网企业网站网络优化
  • 山东手工活外发加工网四川二级站seo整站优化排名
  • 行业门户网站开发百度竞价怎么做效果好
  • 适合前端做项目的网站百度网盘搜索
  • 下载网站怎么下载广州网站定制多少钱
  • 西安攻略旅游自由行怎么玩北京seo软件
  • 汉川网站建设sem代运营
  • 装酷网装修平台东莞seo外包
  • 专门做图片的网站吗如何建网站要什么条件
  • 卢氏县住房和城乡建设局网站站长统计 站长统计
  • 济南 网站制作旺道营销软件
  • 新上线网站如何做搜索引擎站长素材网站
  • 做网站编辑深圳疫情防控最新消息
  • PHP网站开发项目式教程google下载手机版
  • 国外专门用于做网站图片的做网站要多少钱
  • 网站维护费用计入什么科目媒介星软文平台官网
  • 网站建设seo 视频做网站哪个平台好
  • 旅行社网站建设方案论文百度seo公司
  • 长沙网站建设与维护百度开户联系方式
  • 做pcr查基因序列的网站南京百度网站快速优化
  • 数据服务网站策划方案关键词快速优化排名软件
  • 响应式网站缺点学大教育培训机构电话
  • 江苏天德建设工程有限公司网站一个平台怎么推广
  • 石家庄做网络推广的网站推广平台收费标准
  • 贵阳天柱网站建设招聘域名注册平台有哪些
  • 网站建设电话营销百度问一问官网
  • 网站优化建设河南怎么关闭seo综合查询
  • 自贡做响应式网站开发公司google搜索引擎入口google