串行口接收信号

以下是程序

#include "stm32f10x.h"

#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"


#define LED0    GPIO_Pin_8
#define LED1    GPIO_Pin_9
#define LED2    GPIO_Pin_10
#define LED3    GPIO_Pin_11
#define LED4    GPIO_Pin_12
#define LED5    GPIO_Pin_13
#define LED6    GPIO_Pin_14
#define LED7    GPIO_Pin_15
#define LED_ALL (LED0 | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7)
#define LED_PORT GPIOC
#define N_LE GPIO_Pin_2
#define N_LE_PORT GPIOD
#define SWN 4 /* 按键数量 */
#define N_K1 GPIO_Pin_0
#define N_K2 GPIO_Pin_8
#define N_K3 GPIO_Pin_1
#define N_K4 GPIO_Pin_2
#define N_K1C GPIOA
#define N_K2C GPIOA
#define N_K3C GPIOB
#define N_K4C GPIOB


#define LED_OUT(x) GPIO_SetBits(LED_PORT,LED_ALL), \
GPIO_ResetBits(LED_PORT, x<<8), \
GPIO_SetBits(N_LE_PORT,N_LE), \
GPIO_ResetBits(N_LE_PORT,N_LE)


typedef enum

FALSE = 0,
  TRUE
}y_bool;
static y_bool led_t = TRUE; /* 设置二极管状态标记 */
static y_bool rl = TRUE; /* 设置二极管左右移状态标记 */
static y_bool km = TRUE; /* 设置二极管移动速度标记 */
static y_bool key_t = FALSE; /* 设置按键检测标记 */
  static y_bool usart_t = FALSE; /* 设置串行口发送标记 */
/*void SystemInit()
{

}*/
/* 配置函数(初始化) */
void init()
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
/* 配置时钟:ABCD端口,USART2串口 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE);
/* 配置LED模式 */
GPIO_InitStructure.GPIO_Pin = LED_ALL ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(LED_PORT , &GPIO_InitStructure);


/* 配置N_LE引脚 */ 
GPIO_InitStructure.GPIO_Pin=N_LE;
GPIO_Init(N_LE_PORT , &GPIO_InitStructure);

/* 配置按键的引脚 */
GPIO_InitStructure.GPIO_Pin =  N_K1 | N_K2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(N_K1C , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =  N_K3 | N_K4;
GPIO_Init(N_K3C , &GPIO_InitStructure);
/* 配置TXD2模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 配置RXD2模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 配置USART模式 */
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);


/* 配置滴答定时器 */
    //SysTick_Config(8000);
}
/*SysTick中断程序*/
void SysTick_Handler()
{
static uint16_t i = 0;
if(++i >= 1000)        
i = 0;
if(i % 20 == 0) /* 每20ms重置TRUE */
key_t = TRUE;
if(i%1000 == 0) /* 每1000ms重置TRUE */
led_t = TRUE;
}


/* K2(控制快慢)按下后续处理 */
/* 初始:设为1s */
/* 按下可改变速度 */
void SysT()
{
if(km)
SysTick_Config(72000);
else
SysTick_Config(18000);
}


/* 判断K1(亮灯移动方向,左右)是否按下 */
/* 按下可改变方向 */
void Led()
{
static uint8_t led_b = 0x01; /* 设置静态变量二极管初始显示 */
LED_OUT(led_b);  
SysT(); /* 检测按键K2 */
if(rl)
{
if((led_b <<= 1) == 0x00)
led_b = 0x01;
}
else
{
if((led_b >>= 1) == 0x00)
led_b = 0x80;
}
}
/* 按键检测函数 */
uint8_t key_c()
{
static uint8_t key_o = 0x0f;
uint8_t i, key_n, x;
const uint16_t key_pin[SWN] = {N_K1, N_K2, N_K3, N_K4}; /* 设置按键组(引脚),使按键可以表示为十六进制 */
const GPIO_TypeDef* key_port[SWN] = {N_K1C, N_K2C, N_K3C, N_K4C};/* 设置按键组(端口),使按键可以表示为十六进制 */
for(key_n = 0, i = 0; i < SWN; i++)/* 检测 */
{
/* 先将变量key_n置1 */
/* 向左移一位 */
/* 如果按键按下跳过if函数 */
/* 如果按键没按下,key_n 或上0x01 */
key_n <<= 1;
if(GPIO_ReadInputDataBit((GPIO_TypeDef*)key_port[i], key_pin[i]))
 key_n |= 0x01;  
}
x = (key_n ^ key_o) & key_o;/* 取key_n补码(值为按键十六进制值) */
key_o = key_n;/* 当前按键值作为下次比较对象 */
return x;
}
/* 串口发送函数 */
 void USART_SendString(int8_t *str)
{
    uint8_t index = 0;/* 设置位选 */
    
    do
    { //串口发送函数//把数据发转移到发送数据寄存器TDR,触发串口向pc机发送数据
        USART_SendData(USART2,str[index]);   
/*使用while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET)
不停的检查串口发送是否完成的标志位TC*/
        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
        index++;/* 位停留下一位 */        
    }
    while(str[index] != 0);  //检查字符串结束标志
    
}
/* 按键处理函数 */
void key_d(uint8_t x)
{
if(x & 0x08)
rl = !rl;
if(x & 0x04)
km = !km;
if(x & 0x02)
usart_t = TRUE;
}


int main()
{
uint8_t key_dn;
init();
USART_SendString("\r\n 开始 \r\n");
while(1)
{
if(led_t)
{
led_t = FALSE; /* 先将led_t还原初始值 */
Led();   /* 调用二极管移动函数 */
}
if(key_t)
{
key_t = FALSE;
key_dn = key_c();/* 调用按键检测函数 */
}
if(key_dn)
{
key_d(key_dn);/* 调用按键处理函数 */
key_dn = 0x00;
}
if(usart_t)
{
USART_SendString("\r\n   Hello World \r\n");
USART_SendString("\r\n Welcome to ccit \r\n");
usart_t=FALSE;/* 还原初始值 */
}
  }

}

你可能感兴趣的:(串行口接收信号)