Download as pdf or txt
Download as pdf or txt
You are on page 1of 15

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT THÀNH PHỐ HỒ CHÍ MINH

KHOA CƠ KHÍ CHẾ TẠO MÁY


BỘ MÔN CƠ ĐIỆN TỬ


BÁO CÁO
Thực tập Vi xử lý _ Tuần 7-9

MÔN HỌC: Thực tập Vi Xử Lý


LỚP MÔN HỌC: Thứ 2_Tiết 7-12
GIẢNG VIÊN: Huỳnh Quang Duy

SVTH:
1. Mao Đình Huân 21146463

TP. Hồ Chí Minh, tháng 4 năm 2024


I. ĐIỀU KHIỂN CƯỜNG ĐỘ SÁNG CỦA LED SỬ DỤNG PWM
a. Bài toán: Sử dụng nút bấm để tăng/giảm giá trị PWM điều khiển
cường độ sáng của đèn Led, hiển thị giá trị lên Led 7. Nếu giá trị
PWM trên 95% sẽ có còi báo động.
b. Vi xử lý: STM32 F103VCT6, STM32F207VCT6
c. Thiết bị: Led 7 đoạn (IC74HC595), nút nhấn (IC74HC165), loa.
d. Giá trị I/O
Giá trị chân I/O Chức năng
PB3 Clock output
PB5 Data output
74HC595
PE0 Latch
PE2 GND
PB4 Data input
74HC165
PE1 Clock input
PE3 Còi
PB10 PWM TIM2_CH3

e. Chương trình
/* Private includes ----------------------------------------------------------*/
unsigned char Led_Code[10] = {0xAF, 0xA0, 0x6E, 0xEA, 0xE1,
0xCB, 0xCF, 0xA2, 0xEF, 0xEB};
unsigned char Led_Position[5] = {0x08, 0x10,0x20,0x40,0x80};

/* Private typedef -----------------------------------------------------------*/


char Data75HC165 = 0xFF;

unsigned B1=0;
unsigned B2=0;
unsigned B3=0;

unsigned Led_1=0;
unsigned Led_2=0;
unsigned PWM = 0;

/* Private variables ---------------------------------------------------------*/


TIM_HandleTypeDef htim2;

/* Private function prototypes ----------------------------------------------*/


void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
/* Private user code ---------------------------------------------------------*/
void Latch_Led ()
{
HAL_GPIO_WritePin(Latch_GPIO_Port, Latch_Pin, 0);
HAL_GPIO_WritePin(Latch_GPIO_Port, Latch_Pin, 1);
HAL_Delay(1);
}
//-------------------------------------------------------------------------------
void Shift_Led_Code_0(unsigned long d)
{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
Led_Code[d]&(1<<(7-i)));
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}
//-------------------------------------------------------------------------------
void Shift_Led_Code_1(unsigned long d)
{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
Led_Code[d]&(1<<(7-i)));
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}
//-------------------------------------------------------------------------------
void Shift_Led_Code_2(unsigned long d)
{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
Led_Code[d]&(1<<(7-i)));
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}
//-------------------------------------------------------------------------------
void Shift_Led_Code_3(unsigned long d)
{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
Led_Code[d]&(1<<(7-i)));
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}
//-------------------------------------------------------------------------------
void Shift_Led_Code_4(unsigned long d)
{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
Led_Code[d]&(1<<(7-i)));
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

//-------------------------------------------------------------------------------
void Shift_Led_Position (unsigned p)
{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
Led_Position[p]&(1<<(7-i)) );
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}
//-------------------------------------------------------------------------------
void Display_Quet_5_Led()
{
Shift_Led_Position(0);
Shift_Led_Code_5(count);
Latch_Led();

Shift_Led_Position(1);
Shift_Led_Code_4(count);
Latch_Led();

Shift_Led_Position(2);
Shift_Led_Code_3(0x40);
Latch_Led();

Shift_Led_Position(3);
Shift_Led_Code_2(count);
Latch_Led();

Shift_Led_Position(4);
Shift_Led_Code_1(count);
Latch_Led();
}
//-------------------------------------------------------------------------------
void Get_Data165()
{
HAL_GPIO_WritePin(SH165_GPIO_Port,SH165_Pin,1);
HAL_GPIO_WritePin(SH165_GPIO_Port,SH165_Pin,0);
HAL_GPIO_WritePin(SH165_GPIO_Port,SH165_Pin,1);

for (uint8_t i=0; i<8; i++)


{
if(HAL_GPIO_ReadPin(Input165_GPIO_Port,Input165_Pin) == 0)
Data75HC165 &= ~(1<<(7-i));
else
Data75HC165 |= (1<<(7-i));

HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);


HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}
//-------------------------------------------------------------------------------
void Get_Button_1()
{
if(((Data75HC165 & (1<<7)) == 0) && B1 == 0)
{
if (Led_1<10)
{
Led_1 ++;
}
else Led_1 = 0;
B1 = 1; //Ðã nhân
}
else if(((Data75HC165 & (1<<7)) == (1<<7)) && B1 == 1)
{
B1 = 0; //Chua nhân
}
}
//-------------------------------------------------------------------------------
void Get_Button_2()
{
if(((Data75HC165 & (1<<6)) == 0) && B2 == 0)
{
if (Led_1<10)
{
Led_1 ++;
}
else Led_1 = 0;
B2 = 1; //Ðã nhân
}
else if(((Data75HC165 & (1<<6)) == (1<<6)) && B2 == 1)
{
B2 = 0; //Chua nhân
}
}
//-------------------------------------------------------------------------------
void Get_Button_3()
{
if(((Data75HC165 & (1<<5)) == 0) && B3 == 0)
{
PWM = ((Led_2*10) + Led_1);
B3 = 1; //Ðã nhân
}
else if(((Data75HC165 & (1<<5)) == (1<<5)) && B3 == 1)
{
B3 = 0; //Chua nhân
}
}
//-------------------------------------------------------------------------------
int main(void)
{
HAL_Init();
SystemClock_Config();

/* Initialize all configured peripherals */


MX_GPIO_Init();
MX_TIM1_Init();
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);

/* Infinite loop */
while (1)
{
HAL_GPIO_WritePin(E2_GPIO_Port,E2_Pin,0);

Get_Data165();
Get_Button_1();
Get_Button_2();
Get_Button_3();

Display_Quet_5_Led();

_HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_3,(800*PWM)/100);
if (PWM > 95)
{
HAL_GPIO_WritePin(Loa_GPIO_Port,Loa_Pin,1);
}
else HAL_GPIO_WritePin(Loa_GPIO_Port,Loa_Pin,0); }

//-------------------------------------------------------------------------------
II. TRUYỀN DỮ LIỆU GIỮA TERMINAL VỚI VXL BẰNG USART
a. Bài toán: Truyền dữ liệu là số 0-9 từ terminal lên VXL, sau đó hiển
thị giá trị lên Led 7 đoạn.
b. Vi xử lý: STM32F207VCT6, STM32F207VCT6
c. Thiết bị: Motor vận hành băng tải, cảm biến S1 và S2, nút nhấn vật lý.
d. Giá trị I/O
Giá trị chân I/O Chức năng
PB3 Clock output
PB5 Data output
74HC595
PE0 Latch
PE2 GND
PB4 Data input
74HC165
PE1 Clock input
PA9 USART1_Tx
PA10 USART1_Rx

e. Cấu hình USART1


f. Chương trình
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/


/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <stdlib.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/


/* USER CODE BEGIN PTD */
unsigned char Led_Code[10] = {0xAF, 0xA0, 0x6E, 0xEA, 0xE1,
0xCB, 0xCF, 0xA2, 0xEF, 0xEB};
unsigned char Led_Position[5] = {0x08, 0x10,0x20,0x40,0x80};
char Data75HC165 = 0xFF;

unsigned B1=0;
unsigned B2=0;
unsigned B3=0;
unsigned B4=0;

int Led_Used_USART;
int Change_rx_Data;

char tx_Data [1];


char rx_Data [1];

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/


/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/


/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/


UART_HandleTypeDef huart1;

/* USER CODE BEGIN PV */

/* USER CODE END PV */


/* Private function prototypes -----------------------------------------------
*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/


/* USER CODE BEGIN 0 */
void Latch_Led ()
{
HAL_GPIO_WritePin(Latch_GPIO_Port, Latch_Pin, 0);
HAL_GPIO_WritePin(Latch_GPIO_Port, Latch_Pin, 1);
HAL_Delay(1);
}

void Shift_Led_Code_5(unsigned long d)


{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
(Led_Code[d])&(1<<(7-i)) );
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

void Shift_Led_Code_4(unsigned long d)


{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
(Led_Code[d])&(1<<(7-i)) );
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

void Shift_Led_Code_3(unsigned long d)


{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
(Led_Code[d])&(1<<(7-i)) );
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

void Shift_Led_Code_2(unsigned long d)


{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
(Led_Code[d])&(1<<(7-i)) );
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

void Shift_Led_Code_1(unsigned long d)


{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
(Led_Code[d])&(1<<(7-i)) );
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

void Shift_Led_Position (unsigned p)


{
for (uint8_t i=0; i<8; i++)
{
HAL_GPIO_WritePin(Data_GPIO_Port, Data_Pin,
Led_Position[p]&(1<<(7-i)) );
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);
HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

void Display_Quet_5_Led()
{
Shift_Led_Position(0);
Shift_Led_Code_5(Led_Used_USART);
Latch_Led();

Shift_Led_Position(1);
Shift_Led_Code_4(Led_Used_USART);
Latch_Led();

Shift_Led_Position(2);
Shift_Led_Code_3(Led_Used_USART);
Latch_Led();

Shift_Led_Position(3);
Shift_Led_Code_2(Led_Used_USART);
Latch_Led();

Shift_Led_Position(4);
Shift_Led_Code_1(Led_Used_USART);
Latch_Led();
}

void Get_Data165()
{
HAL_GPIO_WritePin(SH165_GPIO_Port,SH165_Pin,1);
HAL_GPIO_WritePin(SH165_GPIO_Port,SH165_Pin,0);
HAL_GPIO_WritePin(SH165_GPIO_Port,SH165_Pin,1);

for (uint8_t i=0; i<8; i++)


{

if(HAL_GPIO_ReadPin(Input165_GPIO_Port,Input165_Pin) ==
0)
Data75HC165 &= ~(1<<(7-i));
else
Data75HC165 |= (1<<(7-i));

HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 0);


HAL_GPIO_WritePin(Clock_GPIO_Port, Clock_Pin, 1);
}
}

void Get_Button_1() // Ngoài cùng bên phai


{
if(((Data75HC165 & (1<<7)) == 0) && B1 == 0)
{
B1 = 1; //Ðã nhân
}
else if(((Data75HC165 & (1<<7)) == (1<<7)) && B1 == 1)
{
B1 = 0; //Chua nhân
}
}
void Get_Button_2()
{
if(((Data75HC165 & (1<<6)) == 0) && B2 == 0)
{
B2 = 1; //Ðã nhân
}
else if(((Data75HC165 & (1<<6)) == (1<<6)) && B2 == 1)
{
B2 = 0; //Chua nhân
}
}

void Get_Button_3()
{
if(((Data75HC165 & (1<<5)) == 0) && B3 == 0)
{
B3 = 1; //Ðã nhân
}
else if(((Data75HC165 & (1<<5)) == (1<<5)) && B3 == 1)
{
B3 = 0; //Chua nhân
}
}

void Get_Button_4()
{
if(((Data75HC165 & (1<<0)) == 0) && B4 == 0)
{

B4 = 1; //Ðã nhân
}
else if(((Data75HC165 & (1<<0)) == (1<<0)) && B4 == 1)
{
B4 = 0; //Chua nhân
}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //


Hàm ngat USART
{
if(huart->Instance == USART1)
{
// Chuong trinh ngat USART
//Led_Used_USART = atoi(rx_Data);

Change_rx_Data = atoi(rx_Data);
//sprintf(tx_Data, "%d", Change_rx_Data);
HAL_UART_Transmit (&huart1, (unsigned
char*)tx_Data, sizeof(tx_Data), 100);
HAL_UART_Receive_IT (&huart1, (unsigned
char*)rx_Data, 1);

}
}
/* USER CODE END 0 */

/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------
*/

/* Reset of all peripherals, Initializes the Flash interface and the


Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */


SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */


MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(E2_GPIO_Port,E2_Pin,0);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */


HAL_UART_Receive_IT (&huart1, rx_Data, 1);

// HAL_UART_Receive_IT(&huart1, (unsigned
char*)rx_Data, 1);
// Display_Quet_5_Led();
}
/* USER CODE END 3 */
}

You might also like