串口寄存器的配置及使用

可手动配置,也可用STC-ISP工具的波特率计算器生成配置函数

PCON寄存器的SMOD位置1,PCON |= 0x80,设置波特率倍增

因为波特率倍增了,所以TH1TL1设置波特率时,要比预设定的波特率小,如要得到9600,则TH1和TL1就要配成4800的,然后再经过倍增得到9600;想要得到4800,就要配置成2400

//串口初始化函数
void UartInit(void)     //4800bps@11.0592MHz
{PCON |= 0x80;     //使能波特率倍速位SMOD,波特率倍增SCON = 0x50;        //设定串行口的工作方式是:8位数据,可变波特率,这里RENw位置1,表示允许串行接收,不接收时置0TMOD &= 0x0F;       //清除定时器1模式位TMOD |= 0x20;       //设定定时器1为8位自动重装方式TL1 = 0xF4;       //设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800TH1 = 0xF4;        //设定定时器重装值,ET1 = 0;     //禁止定时器1中断TR1 = 1;     //启动定时器1EA = 1;            //开启总中断ES = 1;         //当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}

PCON寄存器的SMOD位置0,PCON |= 0x7F,设置波特率不倍增

想要什么波特率,TH1和TL1就配置成什么波特率初值

//串口初始化函数
void UartInit(void)     //4800bps@11.0592MHz
{PCON &= 0x7F;     //不使能波特率倍速位SMOD,波特率不倍增SCON = 0x50;      //设定串行口的工作方式是:8位数据,可变波特率,这里RENw置1,表示允许串行接收,不接收时置0TMOD &= 0x0F;        //清除定时器1模式位TMOD |= 0x20;       //设定定时器1为8位自动重装方式TL1 = 0xFA;       //设定定时初值,不倍增的话,想要多少波特率就配成多少,这里配置的是4800波特率TH1 = 0xFA;      //设定定时器重装值,ET1 = 0;     //禁止定时器1中断TR1 = 1;     //启动定时器1EA = 1;            //开启总中断ES = 1;         //当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}

单片机给电脑发送数据

配置好初始化函数后,可直接写一个发送数据的方法,比较简单

/*** @brief串口发送一个字符* @param要发送的数据* @retval无*/
void Uart_SendByte(unsigned char dat)
{SBUF = dat;       //把数据放到SBUF缓冲器中,表示发送数据while(!TI);        //当发送标志TI仍为0时,条件为真则死循环,当TI标志置1,条件为假则退出循环TI = 0;           //数据发送完成后会硬件置1,为了下次发送需要软件置0
}

单片机通过串口发送字符串

/*** @brief串口发送一个字符* @param要发送的数据* @retval无*/
void Uart_SendByte(unsigned char dat)
{SBUF = dat;while(!TI);TI = 0;
}
/*** @brief串口发送一个字符串* @param要发送的字符串* @retval无*/
void Uart_SendString(char* str)
{while(*str != '\0'){Uart_SendByte(*str);str++;}
}
void main()
{UartInit();Uart_SendString("student\r\n");   //串口向电脑发送字符串Delay1ms(2000);
}

要实现在串口接收助手中换行显示,需要在字符后加上:\r\n,少一个都不行

发送字符串就是不断调用发送一个字符函数将字符逐个发送,遇到’\0’停止

电脑发送数据给单片机

需要开启串口中断接收数据,使能串口中断,即SCON寄存器的REN位置1

无论是发送还是接收都会触发中断,要在中断函数中处理

/*** @brief中断处理函数* @param无* @retval无*/
void Uart_Routine(void) interrupt 4
{re_dat = SBUF;        //定义一个全局变量接收电脑发来的数据while(RI == 0);RI = 0;                //RI软件置0P2 = ~re_dat;      //根据接收到的数据将LED灯点亮Uart_SendByte(re_dat);     //同时将接收到的数据再发送到电脑上显示
}

电脑发送字符串控制开关LED灯,开灯"open",关灯"close"

/*** @brief串口处理函数* @param无* @retval无*/
void Uart_Rountine() interrupt 4
{static unsigned int p = 0;while(!RI);                 //接收中断请求标志位,接收到RI=1,需要软件置0RI = 0;                       //软件置0rec[p] = SBUF;               //每次进中断获取一个字节的数据放到rec数组中,然后下标后移,接收完一个字符串p++;if(p == size)             //判满操作{p = 0;}if(strstr(rec,"op"))       //如果RX收到的字符串有子串“op”则表示开灯{LED1 = 0;LED2 = 0;p = 0;memset(rec,'\0',size);    //清空rec数组的内容}if(strstr(rec,"clo"))        //如果RX收到的字符串有子串“clo”则表示关灯{LED1 = 1;LED2 = 1;p = 0;memset(rec,'\0',size);}
}

整体示例代码

#include "reg52.h"unsigned char re_dat;//串口初始化函数
void UartInit(void)     //4800bps@11.0592MHz
{PCON |= 0x80;     //使能波特率倍速位SMOD,也可选择不使能,不使能时是0x7FSCON = 0x50;     //设定串行口的工作方式是:8位数据,可变波特率,这里REN置1,表示允许串行接收,不接收时置0TMOD &= 0x0F;     //清除定时器1模式位TMOD |= 0x20;       //设定定时器1为8位自动重装方式TL1 = 0xF4;       //设定定时初值,这里配置的是2400波特率,但使能了SMOD为1,波特率倍增,所以最终波特率为4800TH1 = 0xF4;        //设定定时器重装值,可根据STC-ISP工具配置ET1 = 0;       //禁止定时器1中断TR1 = 1;     //启动定时器1EA = 1;            //开启总中断ES = 1;         //当需要接收电脑的数据时,是通过中断方式接收的,所以要开启串口中断
}//发送数据函数
void Uart_SendByte(unsigned char dat)
{SBUF = dat;       //把数据放到SBUF缓冲器中,表示发送数据while(!TI);        //当发送标志TI仍为0时,条件为真则死循环,当TI标志置1,条件为假则退出循环TI = 0;           //数据发送完成后会硬件置1,为了下次发送需要软件置0
}//中断处理函数
void Uart_Routine(void) interrupt 4
{re_dat = SBUF;        //定义一个全局变量接收电脑发来的数据while(RI == 0);RI = 0;                //RI软件置0P2 = ~re_dat;      //根据接收到的数据将LED灯点亮Uart_SendByte(re_dat);     //同时将接收到的数据再发送到电脑上显示
}int main()
{UartInit();while(1){}
}

单片机通过串口与电脑通信相关推荐

  1. 基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

    基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文) 导读:触摸屏能够直观.生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好.触摸屏和单片机通信,需要根据触 ...

  2. 【硬件控制】5. Pico使用串口与电脑通信

    前几节都是在讲树莓派与外部的元件通信,本节来讲树莓派如何与电脑通信 本篇文章会教大家开发一个这样的上位机软件,用来和Pico通信,文章较长,耐心看完 先看一下树莓派Pico的引脚图吧 我们可以看到上面 ...

  3. 单片机: 串口向电脑发送数据

    题目概述: 串口向电脑发送数据. 编程: #include<REG52.h> unsigned char Sec; void UART_Init() { PCON &= 0x7F; ...

  4. 51单片机:串口向电脑发送数据

    单片机的串口配置可以使用SCT-ISP软件,方法如下,我的单片机晶振频率是11.0592Hz 试验程序如下: #include"regx52.h" #include"in ...

  5. 单片机串口输入c语言,单片机通过串口与电脑连接通信C语言源代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define uchar  unsigned char uchar time,b_break,b_break_3; uchar buf ...

  6. C语言串口与网口转换,单片机通过串口与电脑连接通信C语言源代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #define uchar  unsigned char uchar time,b_break,b_break_3; uchar buf ...

  7. 51单片机_8-1 串口向电脑发送数据

    文章目录 要求 效果 资源 main函数 要求 1.配置单片机串口,向电脑发送数据 效果 资源 工程文件压缩包 链接:https://pan.baidu.com/s/1bmbReFGNStYbg45F ...

  8. 51单片机之——串口通信(含实现部分)

    目录 一  串口通信简介 二  前置知识 二  前置准备 三  实现单片机通过串口向电脑发送数据 四  实现单片机通过串口接收电脑发送数据 一  串口通信简介 本篇文章将实现两个部分,第一部分为单片机 ...

  9. pc-com串口(DB9)管脚定义和单片机uart串口

    1.pc的串口com口,也就是RS-232接口定义(DB9) 引脚    定义         符号 1 载波检测 DCD(Data Carrier Detect) 2 接收数据 RXD(Receiv ...

  10. 51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)

    文章目录 前言 一.串行通信口的功能以及串行通信口的结构及原理 1.1 串行通信口的功能 1.2 51单片机串口的结构 二.串行通信口的控制寄存器 2.1 串行控制寄存器SCON 2.2 电源控制寄存 ...

最新文章

  1. spark spark streaming + kafka receiver方式消费消息
  2. 【08月14日】A股ROE最高排名
  3. SAP JAM的回收站
  4. SAP CRM呼叫中心异步搜索功能的实现
  5. 震惊kafka_5个令人震惊的统计数据证明日志不足
  6. c ++查找字符串_C ++类和对象| 查找输出程序| 套装1
  7. 学习Windows Mobile开发系列笔记(win32基本程序框架)
  8. ABP框架源码学习之修改默认数据库表前缀或表名称
  9. zbbz 坐标标注lisp_CAD_XY坐标标注AUTO_LISP程序
  10. python中fbncc_PythonBNCCorpusReader不能处理完整的bnc语料库
  11. 区块链毕业设计中期检查表模板
  12. python爬取微信运动_微信运动数据抓取(Python)
  13. nuvoton uboo2013引导流程 1 - 配置
  14. 【题解】【AcWing】1564. 哈希
  15. 打开CMD的方式以及常用的指令
  16. oracle12c关闭pdb,oracle 12c pdb启动与关闭
  17. 图片加水印怎么加,快速图片加水印?
  18. xp win7 绿色chrome
  19. iOS身份证的正则验证
  20. π型滤波器 计算_T型π型滤波器计算软件

热门文章

  1. WS小世界网络python快速实现——调用networkx包
  2. python语音合成并播放_用Python写一个语音播放软件
  3. 虚拟机超线程性能分析深入浅出
  4. Excel通过图片名插入图片
  5. 文件服务器域用户配额,域账号配额
  6. 已知分布函数求概率密度例题_助力高考:吃透数学17个必考题型,必定可以考130!(内附解题技巧+例题解析)...
  7. 经历没有亮点可讲?你需要做份“详历”
  8. 专利代理人的真实工作状况
  9. redhat linux 无线网卡,RedHat Linux 6.4安装RTL8188CUS无线网卡驱动
  10. linux shell命令行与脚本编程---处理输入输出