精华内容
下载资源
问答
  • 串行通信实验
    千次阅读
    2021-12-28 22:53:48

    实验二 串口通信实验

    一、实验目的

    1.)了解 USART 的基本特性;
    2.)掌握用库函数操作 USART 的方法;
    3.)掌握如何使用 STM32 的串口发送和接收数据。

    二、实验环境

    1.)硬件:1 个空气温湿度传感器模块、1 个 ST-Link 调试器、1 根 USB2.0 方口线、1
    根 USB3.0 数据线、1 台 PC 机;
    2.)软件:Windows 7/XP、MDK 集成开发环境。
    系统上电、复位提示信息
    3)、 在发送区输入“/物联网感知与控制技术—2.2 串口通信实验 DEMO/”,点
    击按钮 ,通过串口以及 ST-Link 调试器,将数据发送到温湿度传感器模块。
    4)、 由 3.3.4 知,温湿度传感器模块接收到数据后会返回相同的数据,这时,接收区会
    接收到同样的数据,如下图所示。
    在这里插入图片描述

    四、实验步骤

    1)、将 USB3.0 数据线的一端连接感知执行模块的 USB3.0 调试烧写口,另一端连接
    ST-Link 调试器的“Debug”接口。
    2)、 将第 1 根 USB2.0 方口线的一端连接 PC 机的 USB 口,另一端连接 ST-Link 调试器的“USB-Debug”接口。
    3)、将第 2 根 USB2.0 方口线的一端连接 PC 机的 USB 口,另一端连接 ST-Link 调试器的“USB-232”接口。
    4)、双击打开【配套光盘\03-常用工具\01-硬件开发包\09-串口调试工具】目录下的串口
    调试器,选择正确的端口号(可参照 1.2.2 查看串口端号),波特率设为 115200,其他均保
    持默认设置,点击按钮“打开串口”即可,效果见下图。
    串口调试器配置
    5)、双击打开工程文件“STM32-USART.uvproj”。
    6)、在工具栏中点击按钮,编译工程,编译成功后,信息框会出现下图所示的信息。如
    果编译失败,请参照 1.2.1.2 中的内容,确认相关选项是否配置正确。
    在这里插入图片描述
    7)、参照 1.2.1.3 中的内容,确认与硬件调试有关的选项已设置正确。
    8)、 点击按钮“LAOD”,将程序下载到温湿度传感器模块中。下载成功后,信息框显示下图中所示的信息,表明程序下载成功并已自动运行。

    在这里插入图片描述
    9)、 程序运行起来后,User1 指示灯被点亮,观察串口调试器接收区接收到的数据。
    10)、 按一下温湿度传感器模块的复位按钮,再观察串口调试器接收区接收到的数据。
    11)、 在发送区输入一些数字、字母、字符、汉字等内容,点击按钮“发送”发送到串口,
    观察串口调试器接收区接收到的数据。

    五、实验程序

    #include "stm32f10x.h"  
    #include <stdio.h>  
    void gpio_init(void) // GPIO 的初始化配置  
    {  
    GPIO_InitTypeDef GPIO_InitStructure; // 定义一个 GPIO 初始化类型结构体  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |  
    RCC_APB2Periph_GPIOA , ENABLE); // 开启 GPIOB 和 GPIOA 的外设时钟  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; // 选择要控制的 GPIOB 引脚  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速率为 50MHz  
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置引脚模式为通用推挽输出  
    	GPIO_Init(GPIOB, &GPIO_InitStructure); // 调用库函数,初始化 GPIOB  
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // 选择要控制的 GPIOA 引脚  
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 用作串口输出  
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    	GPIO_Init(GPIOA, &GPIO_InitStructure);   
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 用作串口输入  
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
    	GPIO_Init(GPIOA, &GPIO_InitStructure);   
    	}  
    	void led_init(void) // 点亮 User1 指示灯  
    	{  
    	GPIO_ResetBits(GPIOB,GPIO_Pin_7);  
    	}  
    	void USART1_Config(void)  
    	{  
    	USART_InitTypeDef USART_InitStructure; // 定义 USART 初始化类型结构体  
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE); // 开启 USART1 时钟  
    	USART_InitStructure.USART_BaudRate = 115200; // 波特率设为 115200  
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 1 个起始位,8 个数据位  
    	USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1 个停止位  
    	USART_InitStructure.USART_Parity = USART_Parity_No ; // 无奇偶校验  
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  
    	// 失能 CTS    无硬件控制流  
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 使能发送和接收  
    	USART_Init(USART1, &USART_InitStructure); // 调用库函数,初始化 USART1  
    	USART_Cmd(USART1, ENABLE); // 使能 USART1  
    	}  
    	int fputc(int ch, FILE *f) // 
    	{  
    	USART_SendData(USART1, (char) ch);  
    	// 将 printf()中的内容发往串口  
    	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)  
    	// 发送数据寄存器非空时,循环等待  
    	{  
    	}  
    	return (int)ch; // 返回值  
    	}  
    	int main(void)  
    	{  
    	char data='0'; // 保存接收到的数据   
    	gpio_init(); // GPIO 初始化  
    	led_init(); // LED 初始化  
    	USART1_Config(); // 配置 USART1  
    	printf(" Please input a char \r\n"); // 开机后提示输入字符串  
    		
    	while(1)  
    	{  
    	if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == SET)  
    	 {  
    	data=USART_ReceiveData(USART1); // 读取 USART1 接收到的数据到 data 中  
    	USART_SendData(USART1 ,data); // 向串口发送接收到的数据  	
    	 }  
    	}  
    	}  	
    

    六、实验结果

    在这里插入图片描述
    在这里插入图片描述

    七、实验心得

    因为和上次实验用的接口不一样,实验之前要仔细检查到底是COM几。在判断是否已经发送完成时,对比使用了USART_FLAG_TC和USART_FLAG_TXE两个函数。在引脚的选择方面查阅了关于复用的参数。
    在这里插入图片描述

    更多相关内容
  • 这一次的重点是讲解几个串口的实验来加深自己对串口通信的理解。 目录 实验一(将一个简单的字符串输出到单片机中):  实验一—–电路图:  实验一—–代码段:  实验一—–结果: 实验二(通过串口通信的方式...
  • 51单片机串口通信模拟实验串口通信入门。
  • 串口通信实验
  • STM32F4USART串口通信实验例程.rar
  • 串行通信实验的介绍与使用
  • CC2540串口通信实验.ppt

    2018-11-05 16:52:20
    掌握CC2540的UART串口寄存器设置,掌握UART串口中断函数程序的编程方法
  • 串口通信实验

    2013-08-28 21:35:09
    EDUKIT-III实验教学系统-3-串口通信实验,非常有用!
  • 串口通信实验.zip

    2020-08-01 18:58:23
    实验程序,主要用STM3开发板实现串口通信,并且带有附加功能(呼吸灯)。希望这个程序可以帮到大家。在接下来学习STM32的过程中,可以与大家一起学习探讨。谢谢大家的支持。
  • 博文51单片机汇编语言实验(四)----串行通信实验(附参考代码及注释)的附件,包含文章介绍的内容的完整的工程文件
  • STM32串口通信功能的应用主要是串口数据的收发
  • 51单片机串口通信模拟实验,RS232串口通信
  • UART串口通信实验报告.docx
  • stm32f429igt6串口实验例程,多串口,同时,独立工作,任意长度数据收发,HAL库
  • STM32 串口通信实验 自己在开发板上验证过,可以使用。
  • 单片机串行通信实验报告(实验要求、原理、仿真图及例程).doc
  • 单片机串口通信实验报告总结

    千次阅读 2021-05-25 08:04:48
    一 、实验名称串口通信实验二、实验目的及要求1.掌握波特率设置及串口结构。2. 掌握串口方式一编程。三、实验主要仪器设备PC机实验原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,...

    一 、实验名称

    串口通信实验

    二、实验目的及要求

    1.掌握波特率设置及串口结构。

    2. 掌握串口方式一编程。

    三、实验主要仪器设备

    PC机实验原理

    串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,而且也能实现电脑对单片机的控制,比如你可以把写入单片机的数据码显示在电脑上,如可以使用一个按键,当按下它时使某一个字母如:AA,通过单片机的串口将它发送到电脑上显示,起到仿真器的某些功效,站长在开发数据采集设备时就是通过串口来检查数据正确与否的。

    73cb813c0bb507c00db7a92414b15da4.png

    实验内容

    1.方式 0 应用设计。

    2.方式 1 应用设计。

    3.方式 2 应用设计。

    4.方式 3 应用设计。

    六、实验步骤

    1.方式 0 输出应用:编写程序控制 8 个发光二极管轮流点亮。通过 74LS164

    的输出来控制 8 个外接 LED 发光二极管亮灭的接口电路。当串行口被设置在方式输出时,串行数据由 RXD 端送出,移位脉冲由 TXD 端送出,在移位脉冲作用下,

    串行口发送缓冲器的数据逐位地从 RXD 端串行移入 74LS164 中。

    1.画出硬件电路连接示意图。

    6ef8d0851b5816b687682d3ff4d34f0c.png用NotePad编写源程序并用Keil调试

    9b4d988d4317cfcfaeede10e2a46ad77.png

    3. 在Keil uVision3中编译链接生成点阵.hex文件

    4 . 把点阵.hex文件导入仿真电路图中,结果如下:

    eeac37cfdc97bcdeb65dfedfcf8eb8d5.png方式 0 输入应用:为串行口接入一片八位并行输入,串行输出的同步移位寄存器 74LS165,扩展一个八位并行输入口的电路,可将接在 74LS165 的八个开关状态通过串口方式 0 读入到单片机内。74LS165 的 SH/LD*端为控制端。若SH/LD*=0,则 74LS165 可以并行输入数据,且串行输出关闭, SH/LD*=1,并行输入关闭,串行输出。

    1. 画出硬件电路连接示意图。

    e6e4edb6cd12eea85b5b5c5eae7204de.png

    用NotePad编写源程序并用Keil调试

    e42e51c1a40c2859e6def113636a8242.png

    3. 在Keil uVision3中编译链接生成点阵.hex文件

    4 . 把点阵.hex文件导入仿真电路图中,结果如下

    63272bb7f900354c6235639f64a7c37d.png

    ①串口通信方式 0 输入

    1.画出硬件电路连接示意图。

    206c6681474742d0bc6e334b96b13070.png

    2. 用 NotePad 编写源程序并用 Keil 调试

    0ca55c1c915ddfa585226493204fdb09.png

    3. 在Keil uVision3中编译链接生成点阵.hex文件

    4 . 把点阵.hex文件导入仿真电路图中,结果如下

    da50de21f091d2923851187cb8220160.png

    ②串口通信多机通信代码

    1.画出硬件电路连接示意图。

    4a6f4ed32c09e7f9a5fc48cd270d07e2.png用NotePad编写源程序并用Keil调试

    8c8b5bca5c6ecaad9f8f3abfab151355.png

    3. 在Keil uVision3中编译链接生成点阵.hex文件

    4 . 把点阵.hex文件导入仿真电路图中,结果如下

    bd7a11b7aaafe6210a834edd0a10ef5a.png

    七、实验总结

    通过本次串口实验,我对串口通信的知识了解的更透彻,这是在刚开始对串口通信知识不了解的情况下就编程而造成许多错误之后才得到的结果。当采用PC机与微处理器进行串口通信时,必须正确配置串口通信控件的属性值,才能保证数据传输的准确无误。

    八、实验过程中遇到的问题及其解决的措施

    1、遇到的问题:方式 0 输入应用中电阻值过大,LED没有亮。

    解决措施:把它们一起选中换成较小的电阻。

    2、遇到的问题:为端口编号时,编号有重复的,编号也不对应。

    解决措施:重新编号。

    完整的单片机实验报告51hei下载地址(含源码):

    http://www.51hei.com/bbs/dpj-99543-1.html

    展开全文
  • STM32 串口通信实验

    千次阅读 2021-05-29 10:04:25
    stm32串口通信实验UART通信实验(通用异步收发器)UART串口通信原理:UART的通信过程实验功能:软件设计:完整工程下载 实验器材:F103开发板 F407开发板 USB转RS232母线 USB转RS485线 在F103环境下进行UART通信实验...

    实验器材:F103开发板
    在F103环境下进行UART通信实验和RS232通信实验

    UART通信实验(通用异步收发器)

    UART串口通信原理:

    在这里插入图片描述

    什么是串行通信?什么是异步通信?什么是全双工?
    什么是串行通信
    在这里插入图片描述

    相较于串行通信还有一种并行通信(最常用还是串行)
    在这里插入图片描述
    图中可以看出串行通信的传输线有一根,而并行的线有多根,串行是一位一位的发送数据,而并行是多位多位的发送数据,好比单车道和多车道的区别,并行通信的传输速率要比串行高,那是不是并行传输要比串行传输要好?
    非也,非也,并行通信存在多根线,线与线之间会存在数据的干扰,布线难度加大,资源浪费,常用的还是串行通信

    什么是异步通信?

    同步通信相比较与异步通信多了时钟总线,时钟总线的作用就是保证收发双方的时间同步,
    而异步通信是如何做到收发双方数据同步?这里的UART处理是波特率的设置(ulBaud)
    波特率保证了收发数据时间上的同步,每秒发送多少个数据,每秒接受多少个数据。
    常见的有9600,115200……显而易见数值越大发送的越快。
    但是发送越快可能会存在数据的丢失。
    波特率: 是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错

    什么是全双工通信?
    单工通信:数据只能发送,不能接受
    半双工:数据可以发送,可以接受,但是发送和接受不能同时进行(一般只有一条线数据传输)
    全双工:数据可以发送,可以接收,并且可以同时进行(一般是有两条线来传输,TX,RX)

    UART的通信过程

    在这里插入图片描述

    如图:
    1.数据协议规定,在空闲状态下,UART为高电平状态,发送一位的起始位逻辑0代表通信的开始
    2.接着是发送数据位,数据位由5-8位数据位一位奇偶校验组成
    3.数据发送完成是停止位,代表一次通信的结束
    4.数据发送完成后为空闲状态,即恢复为高电平状态,等待下一次的呼叫
    (串口每次只能发送一个字节的数据,是为了减少传输中出现的错误,如果要发送多个字节的数据,则需要重复这一过程)

    起始位: 先发出一个逻辑”0”的信号,表示传输字符的开始。

    数据位: 数据位在起始位之后,它的个数可以是5-8位(先发低位后发高位)如:10101010,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。

    奇偶校验位: 数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性(可有可无,只能校验,不能纠错)

    停止位: 它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

    空闲位: 处于逻辑“1”状态,表示当前线路上没有数据传输。

    波特率: 是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。

    实验功能:

    如图所示:当我们连接好硬件后,打开串口通信软件设置好波特率等等,复位开发板
    串口打印出请输入您的指令:………………
    当我们输入0的时候开发板上的LED右移,LCD显示为LED右移颜色高亮,并且串口返回数据LED右移已打开………………
    其他功能:
    使用中断按键key1,key2,key3,key4操作LCD,并且如串口指令执行功能
    key1,key3 菜单下滑
    key2,key4菜单上滑

    在这里插入图片描述

    软件设计:

    原理图:

    在这里插入图片描述

    uart.c文件

    void USART2_Init(unsigned long ulBaud)
    {
      GPIO_InitTypeDef GPIO_InitStruct;//定义结构体(GPIO,USART,NVIC)
      USART_InitTypeDef USART_InitStruct;
    	NVIC_InitTypeDef NVIC_InitStruct;
    	
      // 允许GPIOA和USART2时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
      // PA2-TX2复用推挽输出(端口配置)
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
      GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
      GPIO_Init(GPIOA, &GPIO_InitStruct);
      /* PA3-TX2浮空输入(复位状态,可以省略)
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
      GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(GPIOA, &GPIO_InitStruct); */
      // 初始化USART2(波特率ulBaud,允许Rx和Tx,默认8个数据位,1个停止位,无校验)
      USART_InitStruct.USART_BaudRate = ulBaud;//波特率
      USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位
      USART_InitStruct.USART_StopBits = USART_StopBits_1;//停止位
      USART_InitStruct.USART_Parity = USART_Parity_No;//(校验位:无)
      USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置收发模式
      USART_InitStruct.USART_HardwareFlowControl
        = USART_HardwareFlowControl_None;//硬件流控制:无
     USART_Init(USART2, &USART_InitStruct);//串口2初始化
     USART_Cmd(USART2, ENABLE);//使能USART2
     USART_ClearFlag(USART2,USART_FLAG_TC);//清除发送完成标志
    	
    	
        USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启USART2接受中断
    	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//主优先级
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子优先级
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//中断使能
    	NVIC_Init(&NVIC_InitStruct);//中断初始化
    	
    }
    // 发送字符
    unsigned char USART_SendChar(USART_TypeDef* USARTx, unsigned char ucChar)
    {
      while(!USART_GetFlagStatus(USARTx, USART_FLAG_TXE));
      USART_SendData(USARTx, ucChar);
      return ucChar;
    }
    // 发送字符串
    void USART_SendString(USART_TypeDef* USARTx, unsigned char* pucStr)
    {
      while(*pucStr != '\0')
        USART_SendChar(USARTx, *pucStr++);
    }
    // 非阻塞接收字符
    unsigned char USART_ReceiveChar_NonBlocking(USART_TypeDef* USARTx)
    {
      if(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE))
        return USART_ReceiveData(USARTx);
      else
        return 0;
    }
    // printf调用函数(使用MicroLIB)
    int fputc(int ch, FILE *f)
    {
      return(USART_SendChar(USART2, ch));
    }
    
    

    注:使用printf打印的时候需要在MDK上勾选Use Micor LIB
    在这里插入图片描述

    #include "key.h"
    #include "led.h"
    #include "lcd.h"
    #include "stdio.h"
    #include "usart.h"
    #include "stm32f10x_exti.h"
    
    
    void LCD_Proc(void);
    void LED_Proc(void);
    void Key_Init(void);
    void LED_Control(uint16_t LED,uint8_t LED_Status);
    void USART2_Init(unsigned long ulBaud);
    
    
    uint32_t TimingDelay = 1;
    unsigned char ucSec,ucLed=1;
    unsigned long ulTick_ms;
    int col_flag=0;
    unsigned int i;
    
    
    int main(void)
    {
      SysTick_Config(72000);			// 定时1ms(HCLK = 72MHz)
      Key_Init();
      LED_Init();
      BUZ_Init();
      STM3210B_LCD_Init();				//LCD的初始化
    	
      LCD_Clear(Cyan);				        //清屏配置颜色
      LCD_SetTextColor(White);		    //字体颜色
      LCD_SetBackColor(Cyan);	  	    //字体背景颜色
       
      LED_Control(LEDALL,0);//控制所有LED灯默认关闭(0关闭,1打开)
    	USART2_Init(9600);       //串口初始化,设置波特率9600
    	
    	    USART_SendString(USART2,"请输入您的指令:\r\n");	
    		USART_SendString(USART2,"   输入0:LED左移\r\n");	
    		USART_SendString(USART2,"   输入1:LED右移\r\n");	
    		USART_SendString(USART2,"   输入2:打开蜂鸣器\r\n");	
    	    USART_SendString(USART2,"   输入3:关闭蜂鸣器\r\n\r\n");	
    	      
      while(1)
      { 
       LCD_Proc();
       LED_Proc();
      }
      
     }
    	
      
    void LED_Proc(void)
    {
    	switch(col_flag)
    	{
    		case 1:
    		  if(ulTick_ms > 300)      //0.3S延时
    		  {
    			ulTick_ms = 0;
    			  
    			ucLed >>= 1;
    			if(ucLed == 0) 
    				ucLed =0x80;           //LED右移函数
    			LED_Disp(ucLed);
    		  }
    		  break;
    			
    			
    		case 2:
    		  if(ulTick_ms > 300)      //0.3S延时
    		  {
    			ulTick_ms = 0;
    			  
    			LED_Disp(ucLed);
    			ucLed <<= 1;             //LED左移函数
    			if(ucLed ==0)
    				ucLed = 1;
    		  }
    		  break;
    			
    			
    		case 3:
    			LED_Control(LEDALL,0);
    			GPIO_ResetBits(GPIOB,GPIO_Pin_4);//打开蜂鸣器
    		  break;
    		
    		
    		case 4:
    			LED_Control(LEDALL,0);
    			GPIO_SetBits(GPIOB,GPIO_Pin_4);
    		
    	}
    	
    }
    
    /*************************************
    
    LCD中文显示需要做字库,在fonts.h文件内
    
    *************************************/
    //LCD中文显示
    void LCD_Proc(void)
    {
          LCD_DisplayStringLine(Line1,"      19");
    	  LCD_DisplayproHZ(Line1, 4, 0);
    	  LCD_DisplayproHZ(Line1, 5, 1);
    	  LCD_DisplayproHZ(Line1, 6, 2);   //嵌入式
    	
    	if(col_flag==1)
    		LCD_SetBackColor(Blue);
    		LCD_DisplayStringLine(Line3,"    1. LED");
            LCD_DisplayproHZ(Line3, 5, 4);
    	    LCD_DisplayproHZ(Line3, 6, 5);   //右移
    		LCD_SetBackColor(Cyan);
    
    	if(col_flag==2)
    		LCD_SetBackColor(Blue);
    		
    	
    	  LCD_DisplayStringLine(Line5,"    2. LED");
    	  LCD_DisplayproHZ(Line5, 5, 3);
    	  LCD_DisplayproHZ(Line5, 6, 5);  //左移
    	  LCD_SetBackColor(Cyan);
    
    	if(col_flag==3)
    	  LCD_SetBackColor(Blue);
    	  LCD_DisplayStringLine(Line7,"    3.");
          LCD_DisplayproHZ(Line7, 3, 6);
          LCD_DisplayproHZ(Line7, 4, 7);
    	  LCD_DisplayproHZ(Line7, 5, 8);
    	  LCD_DisplayproHZ(Line7, 6, 9);  //蜂鸣器开
    		LCD_SetBackColor(Cyan);
    	if(col_flag==4)
    		LCD_SetBackColor(Blue);
    		LCD_DisplayStringLine(Line9,"    4.");
    		LCD_DisplayproHZ(Line9, 3, 6);
    		LCD_DisplayproHZ(Line9, 4, 7);
    	    LCD_DisplayproHZ(Line9, 5, 8);
    	    LCD_DisplayproHZ(Line9, 6, 10); //蜂鸣器关
    		LCD_SetBackColor(Cyan);
    	
     
    
    	
    }
    
    
    //按键中断
    void Key_Init(void)
    {
    	EXTI_InitTypeDef   EXTI_InitStructure;//定义结构体
    	GPIO_InitTypeDef   GPIO_InitStructure;
    	NVIC_InitTypeDef   NVIC_InitStructure; 	
    
    	//时钟配置
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
      /* PA0和PA8浮空输入*/
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure); 
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0|GPIO_PinSource8);
      /* PB1和PB2浮空输入*/
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOB, &GPIO_InitStructure); 
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1|GPIO_PinSource2);
    	
    	
         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//打开PA0中断连接
     	 EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志
     	 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource8);//打开PA8中断连接
    	 EXTI_ClearITPendingBit(EXTI_Line8); 
    	 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);//打开PB1中断连接
    	 EXTI_ClearITPendingBit(EXTI_Line1);
    	 GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2);//打开PB2中断连接
    	 EXTI_ClearITPendingBit(EXTI_Line2);
    	
      	EXTI_InitStructure.EXTI_Line = EXTI_Line0|EXTI_Line8|EXTI_Line1|EXTI_Line2;//选择中断线0,8,2,1
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置中断请求
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发  
      	EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能中断线
      	EXTI_Init(&EXTI_InitStructure);
    
    
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
    		
    		
      //PA0 
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//子优先级
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure);
    
    	//PA8
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      	NVIC_Init(&NVIC_InitStructure);
    
    	//  PB1 
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2;
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      	NVIC_Init(&NVIC_InitStructure);
    
    	// PB2
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      	NVIC_Init(&NVIC_InitStructure);
    
    }
    
    
    
    
    //中断服务函数
    void EXTI0_IRQHandler(void)   //PA0
    {  
    	 for(i=0x5ffff; i>0; i--);//延时
    	
    	if(EXTI_GetFlagStatus(EXTI_Line0)!=RESET)
    	{
    		EXTI_ClearFlag(EXTI_Line0);
    		
    				 col_flag++;
    			if(col_flag>4)
    				 col_flag=1;
    			
    	}
    }
    
    void EXTI9_5_IRQHandler(void)    //PA8
    {   
    	for(i=0x5ffff; i>0; i--);//延时
    	if(EXTI_GetFlagStatus(EXTI_Line8)!=RESET)
    	{
    		EXTI_ClearFlag(EXTI_Line8);
    			   col_flag--;
    			if(col_flag<1)
    				 col_flag=4;
    			
    	}
    }
    
    
    void EXTI1_IRQHandler(void)  //PB1
    {  
    	 for(i=0x5ffff; i>0; i--);//延时
    	
    	if(EXTI_GetFlagStatus(EXTI_Line1)!=RESET)
    	{
    		EXTI_ClearFlag(EXTI_Line1);
    		
    				 col_flag++;
    			if(col_flag>4)
    				 col_flag=1;
    			
    	}
    }
    
    
    
    void EXTI2_IRQHandler(void)  //PB2
    {   for(i=0x5ffff; i>0; i--);//延时
    	if(EXTI_GetFlagStatus(EXTI_Line2)!=RESET)
    	{
    		EXTI_ClearFlag(EXTI_Line2);
    			   col_flag--;
    			if(col_flag<1)
    				 col_flag=4;
    			
    	}
    }
    
    //串口中断服务函数
    void USART2_IRQHandler(void)    
    {
      uint8_t temp;
      if(USART_GetFlagStatus(USART2,USART_IT_RXNE)!=0)
      { 
    		temp=USART_ReceiveData(USART2);
    		USART_SendData(USART2,temp);
    		
    		switch(temp)
    		{
    			
    			case'0':
    				col_flag=1;
    			USART_SendString(USART2,":LED右移已打开\r\n\r\n");
           
    		
    			  break;
    				
    			case'1':
    				col_flag = 2;	
    				USART_SendString(USART2,":LED左移已打开\r\n\r\n");		
    			  
    				break;
    			
    			case'2':
    				//col_flag = 3;	//太吵了,实验自己打开
    				USART_SendString(USART2,":蜂鸣器已打开\r\n\r\n");	
            
           	break;
    			
    			case'3':
    				col_flag = 4;
    				USART_SendString(USART2,":蜂鸣器已关闭\r\n\r\n");	
            break;
    		
    	}
    		
      }
    
    }
    
    
    void SysTick_Handler(void)
    {
      ulTick_ms++;
      if(ulTick_ms%1000 == 0) ucSec+=0;          
    }
    
    
    

    LCD,LED,key初始化函数,以及中文显示请下载工程查看

    完整工程下载

    选择第11个工程

    作者:江多多(在校学生)
    版权所有,欢迎保留原文链接进行转载:)

    不忘初心,牢记使命,励志成为一名优秀的嵌入式工程师! (我的第十三篇博客)

    展开全文
  • 单片机串口通信实验

    2018-05-17 09:36:49
    单片机串口通信实验程序,请大家素质取用不要乱用谢谢
  • 基于STM32的串口通信程序范例DSP串口通信程序
  • 并行口实验,中断实验,DMA实验,串行通信实验
  • 实验4 串口通信实验

    2022-06-23 13:50:14
    1、掌握STM32串口通信原理。 2、学习编程实现STM32的UART通信。

    一、实验目的

    1. 掌握STM32串口通信原理。
    2. 学习编程实现STM32的UART通信。

    二、实验设备

    硬件: PC机             一台

           STM32开发板     一套

    软件: MDK V4.0         一套

           Windows 7        一套

    调试助手        一套

    • 实验原理

    1、开发板串口电路图:

     

     

    2、状态寄存器USART_SR及函数

     

    56 RXNE TC

    RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。

    TC(发送完成),当该位被置位的时候,表示USART_DR内的数据已经被发送完成了。

    在固件库函数里面,读取串口状态的函数是:

    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx,  uint16_t  USART_FLAG )

    这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的RXNE(读数据寄存器非空)以及TC(发送完成)

    例如要判断读寄存器是否非空(RXNE),操作库函数的方法是:

    USART_GetFlagStatus(USART1,USART_FLAG_RXNE);

    要判断发送是否完成(TC),操作库函数的方法是:

    USART_GetFlagStatus(USART1,USART_FLAG_TC);

    /****************************************************************/

    3、串口编程为如下步骤:

    1) 串口时钟使能, GPIO 时钟使能

    配置时钟,由于使用串口是在复用IO口,需要打开串口时钟和相应的IO口时钟。

    2)GPIO 端口模式设置

    串口相应的IO口需要配置,输出口配置成复用推挽输出,输出速度根据需要配置,输入口配置为悬空输入

    3)串口参数初始化,使能串口。(串口调试助手 与之一致

    USART_InitTypeDef    USART_InitStructure;  

    USART_InitStructure.USART_BaudRate = 115200;  //波特率

    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位  

    USART_InitStructure.USART_StopBits = USART_StopBits_1;  //1位停止位

    USART_InitStructure.USART_Parity = USART_Parity_No;  //无奇偶校验位

    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;  //无硬件数据流控制  

    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  

     //收发模式

    USART_Init(USART1, &USART_InitStructure );   //初始化串口1

     //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断。若无中断,该项不需要  

     USART_Cmd(USART1, ENABLE);                    //使能串口1

    4)初始化 NVIC且开启中断(若开启中断才需要该步骤)

    NVIC_InitTypeDef    NVIC_InitStructure;  

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;

        //抢占优先级0,级别可自己设定 ,下面的子优先级可自定

        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;      //子优先级2  

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   

    //IRQ通道使能  

        NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器  

    5)编写中断处理函数 

    4、调试助手 使用方法

    1)将编译好的程序下载到开发板上。(此时需将 串口调试助手 关闭串口)。

    2)调用调试助手软件,设置COM口,参数配置为115200 8-N-1,打开串口。见下图

    3)按开发板复位键,即可在串口调试助手上显示出我们程序中要打印的信息。

     

    四、实验内容

    1、用STM32设计一个与计算机进行串口通讯的实验。STM32向PC发送 123ABC ,用串口调试助手 显示出来查询方式完成。

    2、用STM32设计一个与计算机进行串口通讯的实验。PC向STM32发送 456789 ,STM32接收后,将 每位数值+3 发送给PC,用 串口调试助手 显示出来”789ABC”中断方式完成。

    3、用STM32设计一个与计算机进行串口通讯的实验,利用PC控制LED的亮灭。定时时间用定时器来完成。

            (1)PC向STM32发送 A ,控制LED1,LED2,LED3同时亮灭,间隔时间0.5S,同时在 串口调试助手 显示 “LED1,LED2,LED3同时亮灭”。

            (2)PC向STM32发送 B ,控制LED1,LED2,LED3正向流水亮灭,间隔时间1S,同时在 串口调试助手 显示 “LED1,LED2,LED3正向流水亮灭”。

            (3)PC向STM32发送 C ,控制LED1,LED2,LED3反向流水亮灭,间隔时间2S,同时在 串口调试助手 显示 “LED1,LED2,LED3反向流水亮灭”。

    用STM32设计一个与计算机进行串口通讯的实验。STM32向PC发送 123ABC,用串口调试助手显示出来,查询方式完成。(代码:实验4-1)

    (一)main主函数程序

     Usart.c函数   ,串口1中断服务程序

     usart.h函数

     

    用STM32设计一个与计算机进行串口通讯的实验。PC向STM32发送 456789 ,STM32接收后,将 每位数值+3 发送给PC,用 串口调试助手 显示出来,用中断方式完成。(代码:实验4-2)

    (一)main主函数程序

     (二)usart串口初始化程序

     (三)usart中的串口1中断服务程序

     

    (四)usart.h程序如下

     

    用STM32设计一个与计算机进行串口通讯的实验,利用PC控制LED的亮灭。(代码:实验4-3)

    (一)Led初始化程序

     

    (二)usart的初始化程序

     (三)delay函数程序的编写

     (四)main主函数程序的编写

     

     

    4.实验总结。

    在本实验中——串口通信实验,学习到了如何使用串口去进行单片机和电脑之间的通信,以及烧录的方式。比较了解了STM32串口通信原理。学习了如何使用编程去实现STM32的UART通信。以后在学习中,依然会戒骄戒躁,更多地去注重动手能力,让自己课堂上所学的可以在项目中运用,达到熟能生巧。  

    展开全文
  • 单片机串行通信实验报告(实验要求、原理、仿真图及例程).pdf单片机串行通信实验报告(实验要求、原理、仿真图及例程).pdf单片机串行通信实验报告(实验要求、原理、仿真图及例程).pdf单片机串行通信实验报告(实验要求...
  • 适用于AT89c51/52单片机的串口通信例程,可根据实际需求更改发送的数据和发送波特率
  • 双机串行通信实验

    2018-10-11 10:16:31
    实验内容】 若甲机的P1口接8个拨动开关,乙机的P1口接8个LED发光二极管。编程用甲机P1口接的8个拨动开关控制乙机P1口接的8个LED发光二极管的亮灭。单片机甲的拨动开关状态经串行端口传输到单片机乙P1上的LED。设...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,927
精华内容 11,170
关键字:

串行通信实验

友情链接: snake.rar