搜档网
当前位置:搜档网 › STM32F5个串口的例程

STM32F5个串口的例程

STM32F5个串口的例程
STM32F5个串口的例程

/******************** (C) COPYRIGHT 2011 STMicroelectronics ******************** * File Name : ADCompute.c

* Author : ZTIMBER

* Version : V1.0

* Date : 10/08/2011

* Description : USART program body

******************************************************************************* *

* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONL Y AIMS AT PROVIDING CUSTOMERS

* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME.

* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,

* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE

* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING

* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

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

/* Includes ------------------------------------------------------------------*/

//#include "stm32f10x.h"

#include

#include "main.h"

#include "stm32f10x_usart.h"

#include "stm32f10x_lib.h"

#include "stm32f10x_map.h"

#include "platform_config.h"

#include "stm32f10x_nvic.h"

#include "stm32f10x_adc.h"

#include "stm32f10x_dma.h"

#include "extern.h"

extern vu16 ADC_V alueData[10];

unsigned char USART1_RXD(void);

unsigned char USART2_RXD(void);

unsigned char USART3_RXD(void);

unsigned char UART4_RXD(void);

unsigned char UART5_RXD(void);

void USART1_TXD(unsigned char TXD_Data);

void USART2_TXD(unsigned char TXD_Data);

void USART3_TXD(unsigned char TXD_Data);

void UART4_TXD(unsigned char TXD_Data);

void UART5_TXD(unsigned char TXD_Data);

extern unsigned char Message_data1;

extern void Delay(u32 nCount);

unsigned int Signal_Data[10];

unsigned char Receive_Signal_Data[22];

struct Ctrl_Flag CtrlState;

unsigned char messagetemp;

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

* Function Name : USART_Configuration

* Description : Configures the USART1.

* Input : None

* Output : None

* Return : None

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

void USART_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

/* USART2 configuration ------------------------------------------------------*/

/* USART2 configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

- USART Clock disabled

- USART CPOL: Clock is active low

- USART CPHA: Data is captured on the middle

- USART LastBit: The clock pulse of the last data bit is not output to

the SCLK pin

*/

USART_https://www.sodocs.net/doc/0017351442.html,ART_BaudRate = 57600/PSC_Dynameter;

USART_https://www.sodocs.net/doc/0017351442.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.sodocs.net/doc/0017351442.html,ART_StopBits = USART_StopBits_1;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Parity = USART_Parity_No;

USART_https://www.sodocs.net/doc/0017351442.html,ART_HardwareFlowControl =

USART_HardwareFlowControl_None;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Clock = USART_Clock_Disable; ///

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPOL = USART_CPOL_Low;

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPHA = USART_CPHA_2Edge;

USART_https://www.sodocs.net/doc/0017351442.html,ART_LastBit = USART_LastBit_Disable;

USART_Init(USART1, &USART_InitStructure);

//使能USART2接收中断

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

USART_Cmd(USART1, ENABLE);

USART_ReceiverWakeUpCmd(USART1, ENABLE);

USART_SetAddress(USART1, 1);

/* USART2 configuration ------------------------------------------------------*/

/* USART2 configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

- USART Clock disabled

- USART CPOL: Clock is active low

- USART CPHA: Data is captured on the middle

- USART LastBit: The clock pulse of the last data bit is not output to

the SCLK pin

*/

USART_https://www.sodocs.net/doc/0017351442.html,ART_BaudRate = 57600/PSC_Dynameter;

USART_https://www.sodocs.net/doc/0017351442.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.sodocs.net/doc/0017351442.html,ART_StopBits = USART_StopBits_1;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Parity = USART_Parity_No;

USART_https://www.sodocs.net/doc/0017351442.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Clock = USART_Clock_Disable; ///

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPOL = USART_CPOL_Low;

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPHA = USART_CPHA_2Edge;

USART_https://www.sodocs.net/doc/0017351442.html,ART_LastBit = USART_LastBit_Disable;

USART_Init(USART2, &USART_InitStructure);

//使能USART2接收中断

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

USART_Cmd(USART2, ENABLE);

USART_ReceiverWakeUpCmd(USART2, ENABLE);

USART_SetAddress(USART2, 1);

// USART_InitTypeDef USART_InitStructure;

/* USART3 configuration ------------------------------------------------------*/

/* USART3 configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

- USART Clock disabled

- USART CPOL: Clock is active low

- USART CPHA: Data is captured on the middle

- USART LastBit: The clock pulse of the last data bit is not output to

the SCLK pin

*/

USART_https://www.sodocs.net/doc/0017351442.html,ART_BaudRate = 57600/PSC_Dynameter;

USART_https://www.sodocs.net/doc/0017351442.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.sodocs.net/doc/0017351442.html,ART_StopBits = USART_StopBits_1;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Parity = USART_Parity_No;

USART_https://www.sodocs.net/doc/0017351442.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Clock = USART_Clock_Disable; ///

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPOL = USART_CPOL_Low;

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPHA = USART_CPHA_2Edge;

USART_https://www.sodocs.net/doc/0017351442.html,ART_LastBit = USART_LastBit_Disable;

USART_Init(USART3, &USART_InitStructure);

//使能USART3接收中断

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

USART_Cmd(USART3, ENABLE);

USART_ReceiverWakeUpCmd(USART3, ENABLE);

USART_SetAddress(USART3, 1);

/* UART4 configuration ------------------------------------------------------*/

/* UART4 configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

- USART Clock disabled

- USART CPOL: Clock is active low

- USART CPHA: Data is captured on the middle

- USART LastBit: The clock pulse of the last data bit is not output to

the SCLK pin

*/

USART_https://www.sodocs.net/doc/0017351442.html,ART_BaudRate = 57600/PSC_Dynameter;

USART_https://www.sodocs.net/doc/0017351442.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.sodocs.net/doc/0017351442.html,ART_StopBits = USART_StopBits_1;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Parity = USART_Parity_No;

USART_https://www.sodocs.net/doc/0017351442.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Clock = USART_Clock_Disable; ///

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPOL = USART_CPOL_Low;

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPHA = USART_CPHA_2Edge;

USART_https://www.sodocs.net/doc/0017351442.html,ART_LastBit = USART_LastBit_Disable;

USART_Init(UART4, &USART_InitStructure);

//使能UART4接收中断

USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);

USART_Cmd(UART4, ENABLE);

USART_ReceiverWakeUpCmd(UART4, ENABLE);

USART_SetAddress(UART4, 1);

/* UART5 configuration ------------------------------------------------------*/

/* UART5 configured as follow:

- BaudRate = 115200 baud

- Word Length = 8 Bits

- One Stop Bit

- No parity

- Hardware flow control disabled (RTS and CTS signals)

- Receive and transmit enabled

- USART Clock disabled

- USART CPOL: Clock is active low

- USART CPHA: Data is captured on the middle

- USART LastBit: The clock pulse of the last data bit is not output to

the SCLK pin

*/

USART_https://www.sodocs.net/doc/0017351442.html,ART_BaudRate = 57600/PSC_Dynameter;

USART_https://www.sodocs.net/doc/0017351442.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.sodocs.net/doc/0017351442.html,ART_StopBits = USART_StopBits_1;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Parity = USART_Parity_No;

USART_https://www.sodocs.net/doc/0017351442.html,ART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_https://www.sodocs.net/doc/0017351442.html,ART_Clock = USART_Clock_Disable; ///

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPOL = USART_CPOL_Low;

USART_https://www.sodocs.net/doc/0017351442.html,ART_CPHA = USART_CPHA_2Edge;

USART_https://www.sodocs.net/doc/0017351442.html,ART_LastBit = USART_LastBit_Disable;

USART_Init(UART5, &USART_InitStructure);

//使能UART5接收中断

USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);

USART_Cmd(UART5, ENABLE);

USART_ReceiverWakeUpCmd(UART5, ENABLE);

USART_SetAddress(UART5, 1);

}

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

* Function Name : USART2_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

void USART1_TXD(unsigned char TXD_Data)

{

USART_SendData(USART1, TXD_Data);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET){}; //等待一帧发送完

USART_ClearITPendingBit(USART1, USART_FLAG_TXE);

}

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

* Function Name : USART2_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

void USART2_TXD(unsigned char TXD_Data)

{

USART_SendData(USART2, TXD_Data);

while(USART_GetFlagStatus(USART2, USART_FLAG_TXE)==RESET){}; //等待一帧发

送完

USART_ClearITPendingBit(USART2, USART_FLAG_TXE);

}

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

* Function Name : USART3_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

void USART3_TXD(unsigned char TXD_Data)

{

USART_SendData(USART3, TXD_Data);

while(USART_GetFlagStatus(USART3, USART_FLAG_TXE)==RESET){}; //等待一帧发送完

USART_ClearITPendingBit(USART3, USART_FLAG_TXE);

}

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

* Function Name : USART3_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

void UART4_TXD(unsigned char TXD_Data)

{

USART_SendData(UART4, TXD_Data);

while(USART_GetFlagStatus(UART4, USART_FLAG_TXE)==RESET){}; //等待一帧发送完

USART_ClearITPendingBit(UART4, USART_FLAG_TXE);

CtrlState.UART4_TXD_Flag = 1;

}

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

* Function Name : USART3_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

void UART5_TXD(unsigned char TXD_Data)

{

GPIO_WriteBit(GPIOD,GPIO_Pin_0,Bit_SET);

USART_SendData(UART5, TXD_Data);

while(USART_GetFlagStatus(UART5, USART_FLAG_TXE)==RESET){}; //等待一帧发送完

CtrlState.UART5_TXD_Flag = 1;

GPIO_WriteBit(GPIOD,GPIO_Pin_0,Bit_RESET);

}

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

* Function Name : USART1_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

unsigned char USART1_RXD(void)

{

unsigned char i;

while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)!=RESET){}; //等待一帧接收完

i = USART_ReceiveData(USART1);

return i;

}

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

* Function Name : USART2_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

unsigned char USART2_RXD(void)

{

unsigned char i;

while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE)!=RESET){}; //等待一帧接收完

i = USART_ReceiveData(USART2);

return i;

}

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

* Function Name : USART3_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

unsigned char USART3_RXD(void)

{

unsigned char i;

while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE)!=RESET){}; //等待一帧接收完

i = USART_ReceiveData(USART3);

return i;

}

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

* Function Name : USART4_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

unsigned char UART4_RXD(void)

{

unsigned char i;

while(USART_GetFlagStatus(UART4, USART_FLAG_RXNE)!=RESET){}; //等待一帧接

收完

i = USART_ReceiveData(UART4);

return i;

}

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

* Function Name : USART5_Communicate

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

unsigned char UART5_RXD(void)

{

unsigned char i;

while(USART_GetFlagStatus(UART5, USART_FLAG_RXNE)!=RESET){}; //等待一帧接收完

i = USART_ReceiveData(UART5);

return i;

}

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

* Function Name : SendSignalDataTab

* Description : This function handles USART3_Communicate.

* Input : None

* Output : None

* Return : None

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

void SendSignalDataTab(void)

{

unsigned char i;

unsigned int SignalSendtemp;

for(i=0;i<11;i++)

{

SignalSendtemp = Signal_Data[i];

SignalSendtemp = (unsigned char)(SignalSendtemp >> 8);

USART1_TXD(SignalSendtemp);

SignalSendtemp = Signal_Data[i];

SignalSendtemp = (unsigned char)(SignalSendtemp & 0x00ff);

USART1_TXD(SignalSendtemp);

}

}

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

* Function Name : NVIC_Configuration

* Description : Configures NVIC and Vector Table base location.

* Input : None

* Output : None

* Return : None

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

void NVIC_Configuration(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM

/* Set the Vector Table base location at 0x20000000 */

NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

#else /* VECT_TAB_FLASH */

/* Set the Vector Table base location at 0x08000000 */

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

#endif

/* Configure one bit for preemption priority */

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* Enable the TIM2 gloabal Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 5;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

void Message(void)

{

unsigned char i;

if(https://www.sodocs.net/doc/0017351442.html,ART2_RXD_Flag)

{

https://www.sodocs.net/doc/0017351442.html,ART2_RXD_Flag = 0;

for(i=0;i<23;i++)

{

Count_Signal_Data[i] = Receive_Signal_Data[i];

}

}

}

/***************************************************************************** Function Name : Tim_Configuration

Description : TIM_Period,TIM_Prescaler,TIM_ClockDivision,TIM_CounterMode*

Input : none *

Output : none *

Return : none *

******************************************************************************/ void Tim_Configuration(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

// TIM_OCInitTypeDef TIM_OCInitStructure;

/* Time Base configuration */

TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);

TIM_TimeBaseStructure.TIM_Period = 6000; //下一个更新事件装入活动的自动重装载寄存器周期的值((1+TIM_Prescaler )/72M)*(1+TIM_Period )

TIM_TimeBaseStructure.TIM_Prescaler = 1200; //时钟频率除数的预分频值

TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //设置了时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_Cmd(TIM2, ENABLE); // 使能或者失能TIM2外设TIM_TimeBaseStructure.TIM_Period = 50000; //下一个更新事件装入活动的自动重装载寄存器周期的值((1+TIM_Prescaler )/72M)*(1+TIM_Period )

TIM_TimeBaseStructure.TIM_Prescaler = 1400;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

TIM_Cmd(TIM4, ENABLE); // 使能或者失能TIM3外设/* Output Compare Timing Mode configuration: Channel2 */

// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //选择定时器模式TIM输出比较时间模式

// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

// CCR1_Val = 36000;

// TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //设置了待装入捕获比较寄存器的脉冲值

// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性TIM输出比较极性

// TIM_OC1Init(TIM4, &TIM_OCInitStructure); //

// TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);

/* Prescaler configuration */

// TIM_PrescalerConfig(TIM2, 7199, TIM_PSCReloadMode_Immediate); //预分频值即时装入

// TIM_ClearFlag(TIM2, TIM_FLAG_Update);

// TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);//关闭预载入寄存器,对寄存器的修改会立即生效使能或者失能TIMx在CCR2上的预装载寄存器

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* TIM IT enable *///TIM捕获/比较2中断源使能或者失能指定的TIM中断

TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); /* TIM IT enable *///TIM捕获/比较2中断源使能或者失能指定的TIM中断

// TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

}

51串口通信程序(带详细注释)

51串口通信程序(带详细注释) #include#include //后面有一个比较函数#define uchar unsigned char#define uint unsigned intbit UART_Flag=0; //定义串口接收标志位 uchar str[50]; //定义一数组uchar length=0; //数组长度从0 开始void init() //初 始化uart{ TMOD=0X20; //定时器1 定时器方式工作模式2,可自动重载的8 位计数器常把定时/计数器1 以模式2 作为串行口波特率发生器 SCON=0X50; //选择工作模式1 使能接收,允许发送,允许接收 EA=1; //开总中断 ES=1; //打开串口中断ET1=0; //打开定时器中断 PCON=0X80; //8 位自动重载,波特率加倍 TH1=0XFF; //用22.1184 mhz 波特率 TL1=0XFF;TR1=1; //打开中时器 }void UART_Putch(uchar dat) //输出一个字符{SBUF=dat; //把数据送给sbuf 缓 存器中 while(TI!=1);//发送标志位TI 如果发送了为1,没发送为0,没发送等待,到 了退出循环 TI=0; //到了,TI 清为0 }void init1() interrupt 4 //uart 中断,4 为串口中断{ if(RI==1) //收到数据{ uchar m=SBUF; //m 为计算机发送给串口的数据,例,open //总体思想是,计算 机通知串口,我要发数据了RI=0; //收到清0 if(m==) //判断m 这位数据有无{ UART_Putch(); //回车UART_Putch(); // 换行str[length]=; //数据最后位加0 标 志位表示发完了数据UART_Flag=1; // 传完标志位} else if(m==) { } else if(m==)//b表退格//下面几句表删锄{ UART_Putch();

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; } Love is not a maybe thing. You know when you love someone.

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.sodocs.net/doc/0017351442.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

51串口通信协议(新型篇)

51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include #include //预定义 //帧 #define F_ST1 0x6e //帧头标志n #define F_ST2 0x79 //帧头标志y #define F_R 0x72 //帧类型读r #define F_W 0x77 //帧类型写w #define F_D 0x64 //帧类型数据帧d #define F_B 0x62 //帧类型写回应帧b #define F_C 0x63 //帧类型重发命令帧c #define F_Q 0x71 //帧类型放弃帧q #define F_ADDR 0x31 //器件地址0-9 #define F_END 0x7a //帧尾标志z #define F_SPACE 0x30 //空标志0 #define F_ERR1 0x31 //错误标志1,flagerr 1 #define F_ERR2 0x32 //错误标志2 2 //常数 #define S_MAXBUF 16 //接收/发送数据的最大缓存量 #define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为

串口通信测试方法

串口通信测试方法 1 关于串口通信的一些知识: RS-232C是目前最常用的串行接口标准,用来实现计算机和计算机之间、计算机和外设之间的数据通信。 在PC机系统中都装有异步通信适配器,利用它可以实现异步串行通信。而且MCS-51单片机本身具有一个全双工的串行接口,因此只要配以电平转换的驱动电路、隔离电路就可以组成一个简单可行的通信接口。 由于MCS-51单片机的输入和输出电平为TTL电平,而PC机配置的是RS-232C 标准串行接口,二者电气规范不一致,因此要完成PC机与单片机的数据通信,必须进行电平转换。 注明:3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片: 2 实现串口通信的三个步骤: (1)硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 使用MAX232串口通信电路图(9孔串口接头) (2)串行通信程序设计 ①通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种

约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC 机与单片机之间进行通信,在设计过程中,有如下约定:

51单片机与蓝牙串口通信程序

#include #include #include #include "LCD1602.h" #include "matrix_key.h" #define uint unsigned int #define uchar unsigned char #define Nop() _nop_() sbit P10 = P1^0; /*定义独立对地按键端口*/ sbit P11 = P1^1; /*定义独立对地按键端口*/ sbit P12 = P1^2; /*定义独立对地按键端口*/ sbit P13 = P1^3; /*定义独立对地按键端口*/ //shift键 bit shift_flag; bit call_flag ; bit CallIn_flag=0; bit reci_flag; bit reci_flag1; sbit sled_en_port = P3^6; /*定义数码管数据锁存器控制端口*/ sbit led_en_port = P2^5; /*定义发光二极管数据锁存器控制端口*/ sbit ds1302_en_port = P2^2; /*定义时钟的选片脚*/ uchar CallIn_Num[15];//={"00000000000"}; uchar CallOut_Num[15]={" "}; uchar m=0; //拨号指针 uchar temp='?'; uchar code clr[16]={" "}; uchar code lcd_table[16] = {"Ky: Cm: Re: "}; //uchar send_buff[15]; uchar reci_buff[15]={" "}; uchar z; //接收缓冲区指针 uchar time;//定时器中断次数 uchar code mun_to_char[]={"0123456789ABCDEF"}; /*1MS为单位的延时程序*/ void init(); void send(uchar cc); void send_f(uchar ccc); void interrupt_pro(); void key_pro(); void call_out();

51单片机串口通信

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

单片机与pc串口通信程序及电路图

单片机与pc串口通信程序及电路图 单片机与pc串口通信程序及电路图 #include #define BUFFERLEGTH 10 //----------------------------------------------------------------- void UART_init(); //串口初始化函数 void COM_send(void); //串口发送函数 char str[20]; char j; //------------------------------------------------------------------- void main(void) { unsigned char i; UART_init(); j=0; //初始化串口 for(i = 0;i }; while(1); } //------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- // 函数名称:UART_init()串口初始化函数 // 函数功能:在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s // 串口接收中断允许,发送中断禁止 //-------------------------------------------------------------------------------------------------- void UART_init() { //初始化串行口和波特率发生器

51单片机串口通信程序详解

51单片机串口通信程序详解 串口通信简介串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU 的器件。一般完成这种功能的电路,我们称为串行接口电路。 本文主要介绍单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。 一、原理简介51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1)。 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。该仅用于方式2 和方式3 的多机通信。其中发送机SM2 =1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第

51单片机串口通信(相关例程)

51单片机串口通信 1./*打开串口调试程序,将波特率设置为9600,无奇偶校验 晶振11.0592MHz,发送和接收使用的格式相同,如都使用 字符型格式,在发送框输入hello,I Love MCU ,在接 收框中同样可以看到相同字符,说明设置和通信正确*/ #include /*主程序*/ void main (void) { SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload*/ TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ EA = 1; /*打开总中断*/ ES = 1; /*打开串口中断*/ while (1) /*主循环不做任何动作*/ { } } void UART_SER (void) interrupt 4 //串行中断服务程序 { unsigned char Temp; //定义临时变量 if(RI) //判断是接收中断产生 { RI=0; //标志位清零 Temp=SBUF; //读入缓冲区的值 P1=Temp; //把值输出到P1口,用于观察 SBUF=Temp; //把接收到的值再发回电脑端 } if(TI) //如果是发送标志位,清零 TI=0; } 2.51单片机与电脑串口通信的C程序,最好是中断方式的 #include #include unsigned char ch; bit read_flag= 0 ; void init_serialcom( void ) //串口通信初始设定 { SCON = 0x50 ; //UART为模式1,8位数据, 允许接收 TMOD |= 0x20 ; //定时器1为模式2,8位自动重装 PCON |= 0x80 ; //SMOD=1; TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz IE |= 0x90 ; //Enable Serial Interrupt TR1 = 1 ; // timer 1 run

51单片机串口485通讯程序

/* 以下为单片机串口485通讯程序,从机程序(当然也适用于主机程序),主机发送可以先用串口帮手软件来调试,经过Keil uVision4实际测试,测试效果如结尾图片所示, 大部分来自网络,只是改了两个地方: len = sizeof(dbuf),if(i >=( __ERRLEN+1)) // 帧超长,错误,返回,就可以实现了,其中的原因自已体会吧*/ #ifndef __485_C__ #define __485_C__ #include #include #include #include #define uchar unsigned char #define uint unsigned int /* 通信命令*/ #define __ACTIVE_ 0x01 // 主机询问从机是否存在 #define __GETDATA_ 0x02 // 主机发送读设备请求 #define __OK_ 0x03 // 从机应答 #define __STATUS_ 0x04 // 从机发送设备状态信息 #define __MAXSIZE 0x08 // 缓冲区长度 #define __ERRLEN 12 // 任何通信帧长度超过12则表示出错 //uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息 uchar dbuf[__MAXSIZE];//={0,1,2,3,4,5,6,7}; // 该缓冲区用于保存设备状态信息 uchar dev; // 该字节用于保存本机设备号 sbit M_DE = P1^0; // 驱动器使能,1有效 sbit M_RE = P1^1; // 接收器使能,0有效 void get_status(); // 调用该函数获得设备状态信息,函数代码未给出 void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧 bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息 void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main() { uchar type; uchar len; /* 系统初始化*/ P1 = 0xff; // 读取本机设备号 //dev = (P1>>2); dev = 0x01; TMOD = 0x20; // 定时器T1使用工作方式2 TH1 = 250; // 设置初值 TL1 = 250; TR1 = 1; // 开始计时 PCON = 0x80; // SMOD = 1 SCON = 0x50; // 工作方式1,波特率9600bps,允许接收

51单片机的串口通信程序(C语言)

#include #include #include #include #define uchar unsigned char #define uint unsigned int sbit Key1 = P2^3; sbit Key2 = P2^2; sbit Key3 = P2^1; sbit Key4 = P2^0; sbit BELL = P3^6; sbit CONNECT = P3^7; unsigned int Key1_flag = 0; unsigned int Key2_flag = 0; unsigned int Key3_flag = 0; unsigned int Key4_flag = 0; unsigned char b; unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00, 0x10,0x89}; unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF}; unsigned char Disbuf[4]; void delayms(uint t) { uint i; while(t--) { /* 对于11.0592M时钟,约延时1ms */ for (i=0;i<125;i++) {} } } //----------------------------------------------------- void SendData(uchar Dat) { uchar i=0; SBUF = Dat; while (1) { if(TI) { TI=0; break;

单片机串口通信实验报告

信息工程学院实验报告 课程名称:单片机原理及接口 实验项目名称:串口通信实验实验时间:2017.5 一、实验目的: 1.了解什么是串口,串口的作用等。 2、了解串口通信的相关概念 3、利用keil软件,熟悉并掌握中串口通信的使用 4、通过实验,熟悉串口通信程序的格式,串口通信的应用等 二、实验原理 1、串口通信概念: 单片机应用与数据采集或工业控制时,往往作为前端机安装在工业现场,远离主机,现场数据采用串行通信方式发往主机进行处理,以降低通信成本,提高通信可靠性。如下图所示。 2、串口数据通信方式及特点 ★数据通信方式有两种:并行通信与串行通信 ★并行通信:所传送数据的各位同时发送或接收, 数据有多少位就需要多少根数据线。 特点:速度快,成本高,适合近距离传输 如计算机并口,打印机,8255 。 ★串行通信:所传送数据的各位按顺序一位一位 地发送或接收。 只需一根数据,一根地线,共2 根 特点:成本低,硬件方便,适合远距离通信, 传输速度低。 串行通信与并行通信示意图如下: 成绩: 指导老师(签名):

3、串行通信基本格式 ①单工通信:数据只能单向传送。 ②半双工通信:通信是双向的,但每一时刻,数据流通的方向是单向的。 ③全双工通信:允许数据同时在两个方向流动,即通信双方的数据发送和接收是同时进行的。 4、异步串行通信/同步串行通信 ①异步串行通信: 异步串行通信采用如下的帧结构: 起始位+ 8位数据位+ 停止位或起始位+ 9位数据位+ 停止位 其中:起始位为低电平,停止位为高电平。 优点:硬件结构简单 缺点:传输速度慢 ②同步串行通信: 在同步通信中,发送方在数据或字符开始处就用同步字符(常约定1~2个字节)指示一帧的开始,由时钟来实现发送端和接收端同步,接收方一旦检测到与规定的同步字符符合,下面就连续按顺序传送若干个数据,最后发校验字节。见下图: 5、串行通信过程与UART 基本的计算机异步串行通信系统中,两台计算机之间通过三根信号线TxD、RxD和GND连接起来,TxD与GND构成 发送线路,RxD与GND构成接收线路。一台计算机的TxD、RxD线分别与 另一台计算机的RxD、TxD线相连。

89C51单片机的串口通信编程1

一、pc机上的串口通信编程过程如下: 1.建立项目 打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点); 2.在项目中插入MSComm控件 选择Project菜单下Add To Project子菜单中的Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX 就可以了), 这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。 3.利用ClassWizard定义CMSComm类控制对象 打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了 //{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 4.在对话框中添加控件 向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发 送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。

实验单片机与PC机串口通信

实验单片机与PC机串口通信(C51编程)实验 要求: 1、掌握串行口的控制与状态寄存器SCON 2、掌握特殊功能寄存器PCON 3、掌握串行口的工作方式及其设置 4、掌握串行口的波特率(bond rate)选择 任务: 1、实现PC机发送一个字符给单片机,单片机接收到后即在个位、十位数码管上进行显示,同时将其回发给PC机。要求:单片机收到PC机发来的信号后用串口中断方式处理,而单片机回发给PC机时用查询方式。 采用软件仿真的方式完成,用串口调试助手和KEIL C,或串口调试助手和PROTEUS分别仿真。 需要用到以下软件:KEIL,VSPD XP5(virtual serial ports driver xp5.1虚拟串口软件),串口调试助手,Proteus。 (1)虚拟串口软件、串口调试助手和KEIL C的联调 首先在KEIL里编译写好的程序。

打开VSPD,界面如下图所示:(注明:这个软件用来进行串口的虚拟实现。在其网站上可以下载,但使用期为2周)。 左边栏最上面的是电脑自带的物理串口。点右边的add pair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。 接下来的一步很关键。把KEIL和虚拟出来的串口绑定。现在把COM3和KEIL绑定。在KEIL 中进入DEBUG模式。在最下面的COMMAND命令行,输入 (以上参数设置注意要和所编程序中设置一致!) 打开串口调试助手

可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率9600,无校验位、8位数据位,1位停止位(和COM3、程序里的设置一样)。打开COM4。 现在就可以开始调试串口发送接收程序了。可以通过KEIL发送数据,在串口调试助手中就可以显示出来。也可以通过串口调试助手发送数据,在KEIL中接收。 实验实现PC机发送一个字符给单片机,单片机接收到后将其回发给PC机。在调试助手上(模拟PC)发送数据,单片机收到后将收到的结果回送到调试助手上。 2、以下在Proteus和串口调试助手实现的结果: 将编译好的HEX程序加载到Proteus中,注意这里需要加上串口模块,用来进行串行通信参数的设置。

51单片机的串行通讯程序

51 单片机的串行通讯 一、简介: 在中颖单片机2009年79F系列单片机的试用活动中,有幸成为一名试用者,在此首先 感谢该公司为电工们举办的此次公益活动,得到了一套79F32评估板和一个JET51 仿真器,该仿真器能在Keil 下通过JTAG 口联机调试程序和编程,这对程序开发过程中的串行通讯功 能调试非常有用。 先上开发评估套件的图片如下: 由于常用的51 单片机只有一个串行通讯口,且简易仿真器大都是通过串口来完成仿真 时的通讯功能的,还有很多51单片机是通过串口来ISP程序的(比如STC和NXP的51单片机)。因而遇到有串行通讯的应用时,过去都采用直接把程序烧写到目标系统后然后联机测试结果,有问题时重新改程序,重新下载测试来实现的(俗称盲调),俺过去都用A T89S52 加一个下载器来调试此类应用,因为它下载程序时,不占用串口,故串口可与目标系统直接相连。中颖新推的8 位51 单片机具有JTAG 仿真功能,因而对于调试具有串行通讯外设的 应用系统带来了一个新的选择。 “51 单片机串行通讯”,这个话题我想大家初次看到,也许会觉得很简单,但您真的用 好串口的监视和可靠通讯两大主要功能吗?本文将结合本人的工作经验以中颖8 位51 增强 型SOC 单片机为平台讲述如何用好串行通讯功能,中颖单片机有双串口,非常适合有多种通讯要求的应用,比如集散控制系统的中位机硬件平台,起到承上启下的作用。 时间仓促,如有不当或不对之处,还请各位不吝指正。 文档版本(V1.0)

此部分为笔 者为验证流 水灯自行 DIY的元件 PDF 文件使用"pdfFactory Pro" 试用版本创建https://www.sodocs.net/doc/0017351442.html, 二、串口通讯的初始化与底层驱动程序: 51 单片机初始化串口有两个要点, 第一,初始化串口的波特率 中颖8051 中,波特率可以设置为系统时钟的分频或定时器的分频。 设置注意事项及规则如下: A. 波特率不能等于系统时钟频率或定时器溢出率,只能为其分频值。 B. 当为串口方式1 或3 时,波特率发生器通过T2CON 的TCLK 和RCLK 来选择。TCLK 和RCLK 为1 时,选Timer2;TCLK 和RCLK 为0 时,选Timer1。 C. 当使用EUART1 时,不能使用Timer1 产生波特率。不管TCLK 和RCLK 为1或0,波特率发生器都为定时器2。但是当TCLK 或RCLK 为1 时,波特率为TCLK 或RCLK 为0 时的波特率的二分频。 D. UART 工作在不同的工作方式下,波特率发生器有所不同,具体内容如下: 方式0 时,波特率固定,波特率发生器为系统时钟的分频。当SM2=1时,波特率为系 统时钟的4 分频;当SM2=0 时,波特率为系统时钟的12 分频。当使用32.768K 并PLL 倍频后,系统时钟为8.192MHZ 当为方式 1 时,波特率可变,通过设置TCLK 和RCLK 来选择Timer1 或Timer2作为波特率发生器。通过SMOD 位(二倍频控制位)来选择分频值。当SMOD=1 时,波特率为定时器1 或2 溢出率/ 32 的二倍频,即16 分频;当SMOD=0 时,波特率为定时器1 或2 溢出率的32 分频。 当为方式 2 时,波特率固定,波特率发生器为系统时钟的分频。通过SMOD 位(二倍频控制位)来选择分频值。当SMOD=1 时,波特率为系统时钟/ 64 的二倍频,即32 分频;当SMOD=0时,波特率为系统时钟的64 分频。 当为方式 3 时,波特率可变,通过设置TCLK 和RCLK 来选择Timer1 或Timer2作为波特率发生器。通过SMOD 位(二倍频控制位)来选择分频值。当SMOD=1 时,波特率为定时器1 或2 溢出率/ 32 的二倍频,即16 分频;当SMOD=0 时,波特率为定时器1 或2 溢出率的32 分频。 小结一下: 1.串口方式0 和方式2 为不可变波特率,方式1 和方式3 为可变波特率,可变值由T1 或T2 控制 2.中颖单片机只用一个串口0 时,可选T1 或T2 作为波特率发生器。 3.中颖单片机使用两个串口时,T1 为串口0 波特率发生器,T2 为串口1的波特率发生器。第二,初始化串口的控制器SCON和其它部分(比如中断和波特率加倍位等) 串口0 的控制寄存器为SCON,串口1 的控制寄存器为SCON1,其内容与51 的相同,但要注 意中颖51 的串口为与其它功能复用,因而要将管脚配置好方向,输入引脚配置好上拉电阻,而输出引脚全部输出为高电平1,这样才能可靠的发送,发送完成后,状态符合串行通讯的要求。 Demo 程序如下,采用定时器1作波特率发生器,也适用于普通51单片机使用。 串口初始化示例程如下,以中颖79F32平台验证,在8.192M系统时钟时,波特率为9600

51单片机串口通信程序整理

单片机串口通信程序: 串口调试程序:(已通过编译) //串口调试程序51单片机 /******************************************************************/ #include//头文件调用,写程序时都要加上 #define uint unsigned int//宏定义,为了后面定义变量书写简便 #define uchar unsigned char /******************************************************************//*名称:主函数*/ /*内容:打开串口调试程序,将波特率设置为9600,无奇偶校验*/ /*晶振11.0592MHz,发送和接收使用的格式相同,如都使用*/ /*字符型格式,在发送框输入hello,ILoveMCU,在接*/ /*收框中同样可以看到相同字符,说明设置和通信正确*/ /******************************************************************/ //******波特率设置及串口初始化 #define baudrate 9600UL #define fosc 11059200UL//其中,UL是不能省略的,代表长整型。 unsigned char a,flag; void serial_init(void) { unsigned char S_MOD=1; TMOD=0x20;//T1工作在方式2 SCON=0x50;//SM0=0 SM1=1->串口通信在模式1, //SM2=0->多级通信中使用的位,REN=1; PCON=0; if((PCON&0x80)==0x80) S_MOD=2; TH1=256-(fosc*S_MOD)/(baudrate*12*32);//其中SMOD=0, TL1=256-(fosc*S_MOD)/(baudrate*12*32); TR1=1; ES=1; EA=1; } //************* void main(void) { serial_init(); //初始化 while(1) //主循环不做任何动作 {} } /******************************************************************//*串口中断程序*/ /******************************************************************/

51串口通信程序

51单片机串口通信软件程序集 作者:jdzj868来源:机电之家下载站录入:jdzj868更新时间:2009-9-11 16:46:01点击数:0 【字体: 】 串口通信的单片机程序 beep bit p3.7 ;蜂鸣器定义 org 00h jmp main org 23h ;串行中断入口地址 jmp com_int ;串行中断服务程序 ;*********** 主程序开始 ******************* org 30h main: mov sp,#30h ;设置堆栈 lcall rest ;初始化 lcall comm ;串口初始化 jmp $ ;原地等待 ; ************* 初始化 ********************* rest: mov p0,#00h ;禁止数码管显示 mov p2,#255 clr beep ;禁止蜂鸣器 mov p1,#255 ;禁止LED显示 RET ;返回 ; ************** 串口初始化 ***************** ;设置串行口工作方式1,定时器1作为波特率发生器

;波特率设置为 2400 ; comm: mov tmod,#20h ;设置定时器T1工作方式2 mov tl1,#0f3h ;定时器计数初值,波特率 2400 mov th1,#0f3h ;定时器重装值 setb ea ;允许总的中断 setb es ;允许串行中断 mov pcon,#00h ;波特率不倍增 mov scon,#50h ;设置串口工作方式1,REN = 1 允许接收 setb tr1 ;定时器开始工作 ret ;返回 ;*************** 串口中断服务程序 *********** ; 如果接收 0FF 表示上位机需要联机信号,单片机发送 0FFH作为 ; 应答信号,如果接收到数字 1~ n,表示相应的功能; ; 这里,如果收到 1 ,则单片机向计算机发送字符 'H'; ; 如果收到 2 ,则单片机向计算机发送字符 'e'; ; 如果收到其他的数据,则发送 'J'; com_int: clr es ;禁止串行中断 clr ri ;清除接收标志位 mov a,sbuf ;从缓冲区取出数据 mov p1,a mov dptr,#tab cjne a,#0ffh,in_1 ;检查数据 mov sbuf,#255 ;收到联机信号,发送联机信号 jnb ti,$ ;等待发送完毕 clr ti ;清除发送标志 setb es ;允许串行中断 reti ;中断返回 in_1: cjne a,#1H, in_2 ;如果收到1

相关主题