请编写一个C语言程序,基于stm32zet6,编写一个上下班打卡考勤系统,利用按键,串口通信,freertos系统,
时间: 2024-05-27 20:13:09 浏览: 62
实现以下功能:
1. 上下班打卡记录:员工上下班时按下对应按键,系统通过串口通信将记录发送至后台。
2. 考勤统计:后台将员工的打卡记录进行统计,计算出考勤情况并保存。
3. 考勤查询:员工可以通过特定的查询方式查询自己的考勤记录,如查询当前月份的考勤情况。
以下是参考代码,仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include "freertos.h"
#include "task.h"
#include "stm32f4xx.h"
#define USARTx USART2 //串口号
#define BAUDRATE 9600 //波特率
TaskHandle_t xTask1Handle, xTask2Handle;
QueueHandle_t xQueue1, xQueue2;
void USART_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.USART_BaudRate = BAUDRATE;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStruct);
USART_Cmd(USARTx, ENABLE);
}
void GPIO_Config(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
void vTask1(void *pvParameters)
{
char buf[256];
while (1)
{
if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0)) //检测按键1是否按下
{
sprintf(buf, "ClockIn %d", xTaskGetTickCount()); //记录打卡时间
xQueueSend(xQueue1, buf, 0); //发送打卡记录至队列1
}
else if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1)) //检测按键2是否按下
{
sprintf(buf, "ClockOut %d", xTaskGetTickCount()); //记录打卡时间
xQueueSend(xQueue1, buf, 0); //发送打卡记录至队列1
}
vTaskDelay(pdMS_TO_TICKS(100)); //延时100ms
}
}
void vTask2(void *pvParameters)
{
char buf[256];
while (1)
{
if (xQueueReceive(xQueue1, buf, portMAX_DELAY) == pdTRUE) //接收队列1中的打卡记录
{
USART_SendString(USARTx, buf); //通过串口发送打卡记录至后台
}
}
}
int main()
{
USART_Config();
GPIO_Config();
xQueue1 = xQueueCreate(10, sizeof(char) * 256); //创建队列1
xQueue2 = xQueueCreate(10, sizeof(char) * 256); //创建队列2
xTaskCreate(vTask1, "Task1", configMINIMAL_STACK_SIZE, NULL, 1, &xTask1Handle);
xTaskCreate(vTask2, "Task2", configMINIMAL_STACK_SIZE, NULL, 2, &xTask2Handle);
vTaskStartScheduler();
return 0;
}
阅读全文