php网站建设视频教程,飞沐网站建设公司北京,微信商店小程序,网络教学平台的功能一、目标
单片机通过串口向电脑发送数据#xff08;数字递增#xff09;电脑通过串口控制单片机上的LED
二、基本概念
1. 串口
串口是一种应用十分广泛的通讯接口#xff0c;串口成本低、容易使用、通信线路简单#xff0c;可实现两个设备的互相通信。 单片机的串口可以…一、目标
单片机通过串口向电脑发送数据数字递增电脑通过串口控制单片机上的LED
二、基本概念
1. 串口
串口是一种应用十分广泛的通讯接口串口成本低、容易使用、通信线路简单可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信极大的扩展了单片机的应用范围增强了单片机系统的硬件实力。 51单片机内部自带UARTUniversal Asynchronous Receiver Transmitter通用异步收发器可实现单片机的串口通信。
2. 硬件电路
简单双向串口通信有两根通信线发送端Transmit Exchange Data, TXD和接收端Revieve Exchange Data, RXD TXD与RXD要交叉连接 当只需单向的数据传输时可以直接一根通信线 当电平标准不一致时需要加电平转换芯片 3. 点评标准
电平标准是数据1和数据0的表达方式是传输线缆中人为规定的电压与数据的对应关系串口常用的电平标准有如下三种
TTL电平5V表示10V表示0 RS232电平-3~-15V表示13~15V表示0 RS485电平两线压差2~6V表示1-2~-6V表示0差分信号
4. 引脚接口及定义DB9 现在笔记本电脑上都没有这个接口了都用USB接口。
5. 常见通信接口比较
名称引脚定义通信方式特点UARTTXD、RXD全双工、异步点对点通信I²CSCL、SDA半双工、同步可挂载多个设备SPISCLK、MOSI、MISO、CS全双工、同步可挂载多个设备1-WireDQ半双工、异步可挂载多个设备
此外还有CAN、USB等 全双工通信双方可以在同一时刻互相传输数据 半双工通信双方可以互相传输数据但必须分时复用一根数据线 单工通信只能有一方发送到另一方不能反向传输 异步通信双方各自约定通信速率 同步通信双方靠一根时钟线来约定通信速率 总线连接各个设备的数据传输线路类似于一条马路把路边各住户连接起来使住户可以相互交流
6. 51单片机的UART
STC89C52有1个UART
STC89C52的UART有四种工作模式 模式0同步移位寄存器 模式18位UART波特率可变常用 模式29位UART波特率固定 模式39位UART波特率可变 TXD接RXDRXD接TXD 7. 串口参数及时序图
波特率串口通信的速率发送和接收各数据位的间隔时间检验位用于数据验证停止位用于数据帧间隔 8. 串口模式图 SBUF串口数据缓存寄存器物理上是两个独立的寄存器但占用相同的地址。写操作时写入的是发送寄存器读操作时读出的是接收寄存器
9. 串口和中断系统 在简单情况下控制ES、EA即可控制中断。
10. 串口相关寄存器 三、单片机通过串口向电脑发送数据
新建项目“8-1 串口向电脑发送数据”新建main.c。 把之前的Delay.c和Delay.h复制到本项目文件夹中。
SCON串行控制寄存器可位寻址
其中SM0、SM1按下列组合确定串行口的工作方式:
REN允许/禁止串行接收控制位。由软件置位REN即REN1为允许串行接收状态可启动串行接收器RxD开始接收信息。软件复位REN即REN0则禁止接收。
TI发送中断请求标志位。在方式0当串行发送数据第8位结束时由内部硬件自动置位即TI1向主机请求中断响应中断后必须用软件复位即TI0。在其他方式中则在停止位开始发送时由内部硬件置位必须用软件复位。初始化一般置0
RI接收中断请求标志位。在方式0当串行接收到第8位结束时由内部硬件自动置位RI1向主机请求中断响应中断后必须用软件复位即RI0。在其他方式中串行接收到停止位的中间时刻由内部硬件置位即RI1(例外情况见SM2说明)必须由软件复位即RI0。初始化一般置0
1. 串口初始化
我们选择工作方式1所以SM00, SM11其余的置零0100 0000即SCON0x40
电源控制寄存器PCON不可位寻址
SMOD波特率选择位。当用软件置位SMOD即SMOD1则使串行通信方式1、3的波特率加倍SMOD0则各工作方式的波特率加倍。复位时SMOD0。
SMOD0帧错误检测有效控制位。当SMOD01SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能当SMOD00SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。复位时SMOD00。
我们需要让波特率加倍所以SMOD1寄存器赋值应该为1000 0000所以PCON0x80
void Uart_Init(void) //4800bps11.0592MHz
{PCON 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率TMOD 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xFA; //设定定时初值TH1 0xFA; //设定定时器重装值ET1 0; //禁止定时器1中断TR1 1; //启动定时器1
}上述代码可以从STC-ISP中的波特率计算器获得 要注意误差为0%
2. 串口写入
void UART_SendByte(unsigned char Byte)
{SBUFByte; //写入while(TI0);TI0; //响应中断后软件复位
}主函数为
void main()
{Uart_Init();UART_SendByte(0x66);while(1){}
}编译一下发现按一下开发板的重置键STC-ISP的串口助手就出现一次66 如果串口助手的波特率改为其他数字了按下充值键出现的就不是66了数据就出错了因为采样的时间不一样。
3. 发送秒数
定义一个unsigned char Sec1;用来记秒数把UART_SendByte(Sec1);放入while(1)循环中。 发送完Sec1后要自增Sec1;然后延时1秒Delay(1000);
void main()
{Uart_Init();while(1){UART_SendByte(Sec1);Sec1;Delay(1000);}
}4. 模块化
新建UART.c和UART.h文件把串口初始化程序和串口写入程序放到YART.c中在UART.h中声明一下在main.c中#include UART.h。
UART.c
#include REGX52.H/*** brief 串口初始化4800bps11.0592MHz* param 无* retval 无*/
void Uart_Init(void) //4800bps11.0592MHz
{PCON 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率TMOD 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xFA; //设定定时初值TH1 0xFA; //设定定时器重装值ET1 0; //禁止定时器1中断TR1 1; //启动定时器1
}/*** brief 串口发送一个字节数据* param Byte 要发送的一个字节数据* retval 无*/
void UART_SendByte(unsigned char Byte)
{SBUFByte; //写入while(TI0);TI0; //响应中断后软件复位
}UART.h
#ifndef __UART__H__
#define __UART__H__void Uart_Init(void);
void UART_SendByte(unsigned char Byte);#endifmain.c
#include REGX52.H
#include Delay.h
#include UART.hunsigned char Sec1;void main()
{Uart_Init();while(1){UART_SendByte(Sec1);Sec1;Delay(1000);}
}四、电脑通过串口控制LED
因为单片机不知道电脑什么时候发信息所以需要一个中断程序电脑发过来信息后触发中断在中断函数中处理数据。
所以在初始化的时候要把中断程序接上即EA1;ES1; SCON的REN之前置0现在要置1允许串行口接收信息。也就是说SCON 0x50;
void Uart_Init(void) //4800bps11.0592MHz
{PCON 0x80; //使能波特率倍速位SMODSCON 0x50; //8位数据,可变波特率TMOD 0x0F; //清除定时器1模式位TMOD | 0x20; //设定定时器1为8位自动重装方式TL1 0xFA; //设定定时初值TH1 0xFA; //设定定时器重装值ET1 0; //禁止定时器1中断TR1 1; //启动定时器1EA 1;ES 1;
}在main.c中定义一个中断服务子函数
void UART_Routine() interrupt 4
{P20x00;
}当中断号 4 产生时程序就会跳转到UART_Rountine()点亮所有LED
编译一下打开串口助手随便发一个数据可以看到8个LED全亮了。
把程序升级一下让LED根据发送的数据亮对应的灯。
修改一下中断子函数
void UART_Routine() interrupt 4
{if(RI1){P2~SBUF;RI0;}
}编译一下在串口助手中输入f0点击发送数据 可以看到D5~D8亮了。
发送aaD2 D4 D6 D8亮了。
下面再把接收到的数据发回给电脑
void UART_Routine() interrupt 4
{if(RI1){P2~SBUF;UART_SendByte(SBUF);RI0;}
}五、数据集显示模式
HEX模式/十六进制模式/二进制模式以原始数据的形式显示
文本模式/字符模式以原始数据编码后的形式显示