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

我为本公司想建个网站商务网站建设毕业设计模板下载

我为本公司想建个网站,商务网站建设毕业设计模板下载,12380网站建设的意见建议,辽宁做网站和优化哪家好文章目录 通信接口串口通信硬件电路电平标准参数时序 USART主要特性框图 数据帧发送器 波特率发生器SWART串口发送与接收工程串口收发数据包 通信接口 通信接口是指连接中央处理器#xff08;CPU#xff09;和标准通信子系统之间的接口#xff0c;用于实现数据和控制信息在不… 文章目录 通信接口串口通信硬件电路电平标准参数时序 USART主要特性框图 数据帧发送器 波特率发生器SWART串口发送与接收工程串口收发数据包 通信接口 通信接口是指连接中央处理器CPU和标准通信子系统之间的接口用于实现数据和控制信息在不同设备之间的传输和交换。通信接口可以是硬件或软件实现其目的是使不同设备之间能够进行有效地通信。 上图是常见的通用通信类型。 双工指的是接口能够实现双向数据传输即可以同时进行发送和接收数据的功能。 半双工数据在同一个通信信道上交替地进行双向传输但不能同时进行发送和接收。发送方和接收方需要在不同时间段进行数据传输。 全双工数据可以同时进行双向数据传输发送方和接收方可以在同一时间段进行数据发送和接收。通信双方可以独立地进行发送和接收工作。 时钟是指在传输数据是否能达到同步传输。 同步传输发送方和接收方之间使用一个共同的时钟信号来同步数据的传输。发送方根据时钟信号将数据按照固定的速率发送接收方也按照相同的时钟信号来接收数据。 异步传输数据的传输不依赖于共同的时钟信号而是使用起始位、停止位和数据位之间的固定时间间隔进行同步。发送方会在发送数据之前先发送一个起始位作为同步信号接收方通过检测起始位来确定数据的开始和结束。 电平是指传输信号时的电压信号形式。 单端传输信号传输使用单个导线进行信号的电压相对于某个参考电平变化来表示。这意味着信号只有一个极性数据通过高低电平表示。在单端传输中由于信号线未与其他导线耦合容易受到电磁干扰的影响可能导致信号质量的下降。 差分传输信号的传输使用两个导线进行信号通过两个相互补充的电压信号的差异来表示。差分传输具有很强的抗干扰能力可以减少电磁干扰对信号的影响。 串口通信 串口是一种应用十分广泛的通讯接口串口成本低、容易使用、通信线路简单可实现两个设备的互相通信适用于近距离的通信。 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信极大地扩展了单片机的应用范围增强了单片机系统的硬件实力。 硬件电路 简单双向串口通信有两根通信线发送端TX和接收端RX TX与RX要交叉连接 当只需单向的数据传输时可以只接一根通信线 当电平标准不一致时需要加电平转换芯片 电平标准 电平标准是数据1和数据0的表达方式是传输线缆中人为规定的电压与数据的对应关系串口常用的电平标准有如下三种 TTL电平3.3V或5V表示10V表示0 RS232电平-3~ -15V表示13~ 15V表示0 RS485电平两线压差2~6V表示1-2 ~-6V表示0差分信号 参数 波特率串口通信的速率可以指定每秒传输的位数 起始位标志一个数据帧的开始固定为低电平 数据位数据帧的有效载荷1为高电平0为低电平低位先行 校验位用于数据验证根据数据位计算得来 常用奇偶校验位通过在数据中添加一个附加位校验位以确保接收端可以检测到传输过程中的错误。 奇校验如果数据位中1的个数为偶数则校验位设置为1使得数据位和校验位中的1的总和保持奇数。如果数据位中1的个数为奇数那么校验位置0。 偶校验如果数据位中1的个数为偶数则校验位置0使得数据位和校验位的总个数为偶数。如果数据位中1的个数为奇数校验位置1 。 停止位用于数据帧间隔固定为高电平 时序 输入不同的数据显示不同的时序。 USART 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 主要特性 1.全双工的异步通信 2.分数波特率发生器系统 ─ 发送和接收共用的可编程波特率最高达4.5Mbits/s 3.可编程数据字长度(8位或9位) 4.可配置的停止位-支持1或2个停止位 5.校验控制 ─ 发送校验位 ─ 对接收数据进行校验 6.支持同步模式、硬件流控制、DMA、智能卡、IrDA、LIN 框图 先看左上角的接口处TX与RX就是发送和接收的引脚下面的三个接口是智能卡和IrDA通信的引脚。 发送脚就是通过发送移位寄存器送出去的接收脚就是将接收数据送到接收移位寄存器的。 灰色部分就是串口的数据寄存器。有两个数据寄存器一个用来发送数据一个用来接收数据在程序上只表现为一个寄存器它们寄存器共用地址进行存储。 当你进行写入操作时数据就写到TDR当你进行读取操作时数据就从RDR进行读出。 下面是移位寄存器作用是把一个字节的数据一位一位进行位移。 假设你在某时刻给TDR写入数据0x66在二进制存储就是01100110此时硬件会检测到你写入的数据就会检查移位寄存器是否有数据正在移位如果没有01100110就会立刻放入移位寄存器中此时也会置出一个标志位TXE发送寄存器为空有了这个标志我们就可以在TDR再写入一个数据了。移位寄存器在发送器控制的情况下将数据一位一位进行传输到TX引脚进行输出低位先出当数据全部移位后新的数据就会再次从TDR转移到移位寄存器中来如果移位寄存器还没有完成那么TDR会等移位寄存器完成移位之后才将数据转移。有了TDR和移位寄存器双重缓存可以保证数据发送时数据帧之间没有空闲。 而接收部分也是同样的道理接收移位寄存器由接收器控制低位先放到移位寄存器的高位随着数据的增加而右移当移位寄存器数据达到一个字节后传输给接收寄存器RDR,此时也会有一个标志位RXNE置1意味着接收寄存器有数据了我们可以对DR寄存器的数据进行读走。 接着看到下面有一个硬件数据流控如果发送设备发送太快接收设备来不及处理可以通过流控来控制传输的速度。 它有两个引脚一个是nRTS另一个是nCTS。 nRTS是请求发送是输出脚就是告诉别人我当前能不能接收 nCTS是清除发送是输入脚用于接收别人nRTS的信号 接着看右边的SCLK这是一个产生同步的时钟信号它是配合发送移位寄存器输出的发送移位寄存器每发送一次同步时钟电平就跳变一个周期时钟会告诉对方我已经移出去一个数据了你看要不要让我这个时钟信号来指导你接收一下当然这个时钟只支持输出不支持输入所以两个SWART不能实现同步的串口通信。 主要用途是兼容别的协议或者做自适应波特率。 接着看到中间的唤醒单元这部分的作用是实现串口挂载多个设备。 中断控制支持对标志位标志的地方进行中断。 最下面的波特率发生器部分其实就是分频器对APB时钟进行分频得到发送和接收移位的时钟。 数据帧 字长可以通过编程USART_CR1寄存器中的M位选择成8或9位(见图249)。在起始位期间 TX脚处于低电平在停止位期间处于高电平。 发送器 发送器根据M位的状态发送8位或9位的数据字。当发送使能位(TE)被设置时发送移位寄存器中的数据在TX脚上输出相应的时钟脉冲在CK脚上输出。 USART支持多种停止位的配置 0.5、 1、 1.5和2个停止位。 波特率发生器 发送器和接收器的波特率由波特率寄存器BRR里的DIV确定 计算公式波特率 fPCLK2/1 / (16 * DIV) 假设我们要输出波特率为9600那么通过计算DIV72M/16/9600468.75 所以置于波特率寄存器中的值为468.75. SWART串口发送与接收工程 OLED代码链接入口 接线方式 发送时需要一个串口助手在电脑来显示内容我们将实现STM32与电脑之间的数据传输。以STM32为主机。 Serial.h #ifndef __SERIAL_H__ #define __SERIAL_H__#include stdio.hvoid Serial_Init(); void Serial_SendByte(uint8_t Byte); void Serial_SendArray(uint8_t* Arr,uint8_t Lenth); void Serial_SendString(char* String); void Serial_SendNumber(uint32_t Number,uint8_t Lenth); uint8_t Serial_GetRxFlag(); uint8_t Serial_GetRxData();#endif Serial.c #include stm32f10x.h // Device header #include stdio.h #include stdarg.huint8_t Serial_RxData; uint8_t Serial_RxFlag;void Serial_Init() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;//复用推挽GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU; //上拉输入GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate9600; //配置波特率USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None; //配置硬件流控模式USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx; //串口模式USART_InitStructure.USART_ParityUSART_Parity_No; //配置奇偶效验位USART_InitStructure.USART_StopBitsUSART_StopBits_1; //指定停止位数USART_InitStructure.USART_WordLengthUSART_WordLength_8b; //指定数据帧位数USART_Init(USART1,USART_InitStructure);//配置usart开启中断USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断源RXNENVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelUSART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;NVIC_InitStructure.NVIC_IRQChannelSubPriority1;NVIC_Init(NVIC_InitStructure);USART_Cmd(USART1,ENABLE); }//发送字节 void Serial_SendByte(uint8_t Byte) {USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET); }//发送数组 void Serial_SendArray(uint8_t* Arr,uint8_t Lenth) {uint8_t i;for(i0;iLenth;i){Serial_SendByte(Arr[i]);} }//发送字符串 void Serial_SendString(char* String) {uint8_t i;for(i0;String[i]!\0;i){Serial_SendByte(String[i]);} }uint32_t Serial_Pow(uint32_t X,uint32_t Y) {uint32_t Result1;while(Y--){Result*X;}return Result; }void Serial_SendNumber(uint32_t Number,uint8_t Lenth) {uint8_t i;for(i0;iLenth;i){Serial_SendByte(Number/Serial_Pow(10,Lenth-1-i)%100);} }//获取接收状态 uint8_t Serial_GetRxFlag() {if(Serial_RxFlag1){Serial_RxFlag0;return 1;}return 0;} //获取接收数据 uint8_t Serial_GetRxData() {return Serial_RxData; }void USART1_IRQHandler() {if(USART_GetITStatus(USART1,USART_IT_RXNE)SET){Serial_RxDataUSART_ReceiveData(USART1);Serial_RxFlag1;USART_ClearITPendingBit(USART1,USART_IT_RXNE);} } 初始化输出需要配置复用功能因为SWART为片上外设。 发送字节需要用TXE标志位来表示已经从DR寄存器发送到移位寄存器中。所以用到while来进行等待 接收时利用RNXE产生的标志位来产生中断在中断函数中获取DR寄存器的数据。 main.c #include stm32f10x.h // Device header #include Delay.h #include Buzzer.h #include Serial.h #include OLED.h int main() {uint8_t Rxdata;OLED_Init();Serial_Init();OLED_ShowString(1,1,RxData:);while(1){if(Serial_GetRxFlag()1){RxdataSerial_GetRxData();Serial_SendByte(Rxdata);OLED_ShowHexNum(1,8,Rxdata,2);}}} 串口收发数据包 连接方式 利用连续的数据序列来对LED灯的亮灭进行控制 Serial.h #ifndef __SERIAL_H__ #define __SERIAL_H__#include stdio.h #include string.hextern uint8_t Serial_RxFlag; extern char Serial_RxPacket[];void Serial_Init(); void Serial_SendByte(uint8_t Byte); void Serial_SendArray(uint8_t* Arr,uint8_t Lenth); void Serial_SendString(char* String); void Serial_SendNumber(uint32_t Number,uint8_t Lenth); void Serial_Printf(char* format,...);#endif Serial.c #include stm32f10x.h // Device header #include stdio.h #include stdarg.hchar Serial_RxPacket[100]; uint8_t Serial_RxFlag;void Serial_Init() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AF_PP;//复用推挽GPIO_InitStructure.GPIO_PinGPIO_Pin_9;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);GPIO_InitStructure.GPIO_ModeGPIO_Mode_IPU; //上拉输入GPIO_InitStructure.GPIO_PinGPIO_Pin_10;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate9600; //配置波特率USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None; //配置硬件流控模式USART_InitStructure.USART_ModeUSART_Mode_Tx|USART_Mode_Rx; //串口模式USART_InitStructure.USART_ParityUSART_Parity_No; //配置奇偶效验位USART_InitStructure.USART_StopBitsUSART_StopBits_1; //指定停止位数USART_InitStructure.USART_WordLengthUSART_WordLength_8b; //指定数据帧位数USART_Init(USART1,USART_InitStructure);//配置usart开启中断USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//中断源RXNENVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelUSART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority1;NVIC_InitStructure.NVIC_IRQChannelSubPriority1;NVIC_Init(NVIC_InitStructure);USART_Cmd(USART1,ENABLE); }//发送字节 void Serial_SendByte(uint8_t Byte) {USART_SendData(USART1,Byte);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)RESET); }//发送数组 void Serial_SendArray(uint8_t* Arr,uint8_t Lenth) {uint8_t i;for(i0;iLenth;i){Serial_SendByte(Arr[i]);} }//发送字符串 void Serial_SendString(char* String) {uint8_t i;for(i0;String[i]!\0;i){Serial_SendByte(String[i]);} }uint32_t Serial_Pow(uint32_t X,uint32_t Y) {uint32_t Result1;while(Y--){Result*X;}return Result; } //发送数字 void Serial_SendNumber(uint32_t Number,uint8_t Lenth) {uint8_t i;for(i0;iLenth;i){Serial_SendByte(Number/Serial_Pow(10,Lenth-1-i)%100);} }void Serial_Printf(char* format,...) {char String[100];va_list arg;va_start(arg,format);vsprintf(String,format,arg);va_end(arg);Serial_SendString(String); }//串口接收中断接收一位数据中断一次接收数据包 void USART1_IRQHandler() {static uint8_t RxState0; //获取当前状态static uint8_t pRxPacket0; //数据包有效位下标if(USART_GetITStatus(USART1,USART_IT_RXNE)SET){uint8_t RxDataUSART_ReceiveData(USART1);if(RxState0){if(RxData Serial_RxFlag0){RxState1;pRxPacket0;}}else if(RxState1){ if(RxData\r){RxState2;}else{Serial_RxPacket[pRxPacket]RxData;}}else if(RxState2){if(RxData\n){RxState0;Serial_RxPacket[pRxPacket]\0;Serial_RxFlag1;}}USART_ClearITPendingBit(USART1,USART_IT_RXNE);} } 对于接收的数据包利用了一种状态机的方式进行接收 通过包头和包尾对数据有效位进行保护可以让一连串重复的数据可以找到数据位避免找不到数据位的头的情况。 main.c #include stm32f10x.h // Device header #include Delay.h #include LED.h #include Serial.h #include OLED.h int main() {OLED_Init();Serial_Init();LED_Init();OLED_ShowString(1, 1, RxPacket:);while(1){if(Serial_RxFlag1){if(strcmp(Serial_RxPacket,LED_ON)0){LED1_ON();OLED_ShowString(2,1,LED_ON_OK );Serial_SendString(LED_ON_OK);}else if(strcmp(Serial_RxPacket,LED_OFF)0){LED1_OFF();OLED_ShowString(2,1,LED_OFF_OK );Serial_SendString(LED_OFF_OK);}else{OLED_ShowString(2,1,ERROR_COMMAND);Serial_SendString(ERROR_COMMAND);}Serial_RxFlag0;}}} LED.c #include stm32f10x.h // Device headervoid LED_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2); }void LED1_ON(void) {GPIO_ResetBits(GPIOA, GPIO_Pin_1); }void LED1_OFF(void) {GPIO_SetBits(GPIOA, GPIO_Pin_1); }void LED1_Turn(void) {if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) 0){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);} }void LED2_ON(void) {GPIO_ResetBits(GPIOA, GPIO_Pin_2); }void LED2_OFF(void) {GPIO_SetBits(GPIOA, GPIO_Pin_2); }void LED2_Turn(void) {if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) 0){GPIO_SetBits(GPIOA, GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);} } LED.h #ifndef __LED_H__ #define __LED_H__void LED_Init(); void LED1_ON(); void LED1_OFF(); void LED1_Turn(); void LED2_ON(); void LED2_OFF(); void LED2_Turn();#endif
http://www.pierceye.com/news/705712/

相关文章:

  • 优秀包装设计网站软件工程师工作
  • 舟山建设信息港网站泉州百度网络推广
  • 网站流量宝镜像别人网站做排名的好处
  • 如何学习网站建设app网络营销方案设计题
  • 高端品牌网站建设明细报价报腾讯云 win wordpress
  • 云南建设网站网站建设公司现在还挣钱吗
  • 濮阳微信网站建设没有数据库的网站
  • 网站开发与没计是做什么贵阳查房子备案的网站
  • 做网站学不需要做后台管理系统mean网站开发
  • 网页网站公司如何做备份游戏型网站开发
  • 网站排名必做阶段性seo策略软文写作是什么意思
  • 网站域名商渭南哪家公司可以做网站
  • 医院网站asp源码加强机关网站建设
  • wordpress建手机站网站建设规划大纲
  • 同个主体新增网站备案施工企业副总经理竞聘
  • 视频网站后台设计针式个人知识库管理系统
  • 外围网站开发网页制作对联
  • 深圳福永网站建设网站多个用户怎样建设
  • 百度网站排名怎么提高wordpress页面全屏的插件
  • 企业网站优化方式wordpress 外链播放器
  • 设计衣服的网站久久诗歌网
  • 上海网站营销it运维网
  • 一起做网店广州站怎么推广软件让别人下载
  • 王晴儿网站建设方案wordpress媒体库 ftp
  • 乡村建设网站自己的网站做防伪码
  • 企业网站托管新乡企业网站建设
  • 移动网站开发课程设计莱芜四中网站
  • 做论坛网站赚钱吗做电影网站要几G空间的
  • 网站建设综合实训心得intitle 网站建设
  • 天津市做网站公司wordpress demo