条件1.使用stm32f103c8t6,c语言编程 条件2.使用PA0,PA1,PA2,PA3,PA4,PA5。配置成上拉输入,根据6个引脚的电平高低生成二进制数。例如000000表示6引脚电平全为0;统计0,1次数。 条件3.串口1半小时发送一次,条件2下的二进制数到PC端. 条件4.串口1使用中断接收数据,结束符0X0D,0X0A. 条件5.串口1无数据接收,则让条件2下的数据备份:二进制数,0,1出现次数。将下一次条件2的数据与备份数据比较,若0,1次数相等或二进制数一致,则串口打印,设备数量正确。否,串口打印设备异常。 条件6.若串口1接收数据,数据为二进制数,0,1出现次数,结束符0X0D,0X0A. 则将该数据和条件2数据比较,若0,1次数相等或二进制数一致,则串口打印,设备数量正确
时间: 2023-05-16 22:05:36 浏览: 47
以下是符合条件的代码:
```c
#include "stm32f10x.h"
#include <stdio.h>
#define BUFFER_SIZE 20
uint8_t buffer[BUFFER_SIZE];
uint8_t backup[BUFFER_SIZE];
uint8_t count_0 = 0;
uint8_t count_1 = 0;
uint8_t backup_count_0 = 0;
uint8_t backup_count_1 = 0;
uint8_t backup_data[BUFFER_SIZE];
uint8_t data[BUFFER_SIZE];
uint8_t data_received = 0;
uint8_t data_length = 0;
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
uint8_t received = USART_ReceiveData(USART1);
if (received == 0x0D || received == 0x0A)
{
data_received = 1;
data_length = 0;
}
else
{
data[data_length++] = received;
}
}
}
void USART1_SendData(uint8_t *data, uint8_t length)
{
for (int i = 0; i < length; i++)
{
USART_SendData(USART1, data[i]);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
;
}
}
void USART1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
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_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
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(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void delay(uint32_t nCount)
{
for (uint32_t i = 0; i < nCount; i++)
{
for (uint32_t j = 0; j < 7200; j++)
{
}
}
}
void read_data(void)
{
count_0 = 0;
count_1 = 0;
for (int i = 0; i < 6; i++)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0 << i) == Bit_RESET)
{
count_0++;
}
else
{
count_1++;
}
}
}
void backup_data_and_count(void)
{
for (int i = 0; i < data_length; i++)
{
backup_data[i] = data[i];
}
backup_count_0 = count_0;
backup_count_1 = count_1;
}
int compare_data_and_count(void)
{
if (data_length != 8)
{
return 0;
}
uint8_t count_0_new = 0;
uint8_t count_1_new = 0;
for (int i = 0; i < 8; i++)
{
if (data[i] == '0')
{
count_0_new++;
}
else if (data[i] == '1')
{
count_1_new++;
}
else
{
return 0;
}
}
if (count_0_new == backup_count_0 && count_1_new == backup_count_1)
{
return 1;
}
return 0;
}
int compare_data(void)
{
if (data_length != 8)
{
return 0;
}
for (int i = 0; i < 8; i++)
{
if (data[i] != backup_data[i])
{
return 0;
}
}
return 1;
}
int main(void)
{
USART1_Configuration();
GPIO_Configuration();
while (1)
{
read_data();
uint8_t binary = count_0 << 3 | count_1 << 0;
USART1_SendData(&binary, 1);
delay(1800000);
if (data_received)
{
if (compare_data_and_count() || compare_data())
{
USART1_SendData("Device count correct.\r\n", 24);
}
else
{
USART1_SendData("Device count incorrect.\r\n", 26);
}
data_received = 0;
}
else
{
backup_data_and_count();
}
}
}
```
这个程序使用了 STM32F103C8T6 开发板和 C 语言编程,根据 PA0-PA5 引脚的电平高低生成二进制数,并统计 0 和 1 的出现次数。然后,每半小时通过串口 1 发送这个二进制数到 PC 端。如果串口 1 接收到数据,数据为二进制数、0 和 1 的出现次数和结束符 0x0D、0x0A,则将该数据和上一次的数据比较,如果 0 和 1 的出现次数相等或二进制数一致,则串口打印“Device count correct.”,否则串口打印“Device count incorrect.”。如果串口 1 没有接收到数据,则将这个二进制数和 0、1 的出现次数备份,下一次再和新的数据比较。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![sb3](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)