PAGE \ MERGEFORMAT 3 BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG BÀI TẬP LỚN MÔN HỆ THỐNG NHÚNG Khoa Kỹ thuật điện điện tử Giảng viên TS Nguyễn Ngọc Minh Chủ Đề Ngã tư giao t.
PAGE \* MERGEFOR BỘ THÔNG TIN VÀ TRUYỀN THÔNG HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG BÀI TẬP LỚN MÔN HỆ THỐNG NHÚNG Khoa: Kỹ thuật điện - điện tử Giảng viên: TS Nguyễn Ngọc Minh PAGE \* MERGEFOR Chủ Đề: Ngã tư giao thông ⮚ Phần 1:Tổng quan chủ đề: ❖ Các linh kiện sử dụng ● Kít STM32F103R6 ● 7SEG-MP2X2-CA ● LED-GREEN ● LED-RES ● LED-YELLOW ● RES ● BUTTON ❖ Cách thực ● Kết nối STM32 với LED thông qua lệnh thuật toán ● Dữ liệu nhận từ code gửi đến STM32 để xử lí, sau gửi tín hiệu LED thơng qua giao tiếp với Button ● Ý tưởng, dùng BUTTON để điều chỉnh trạng thái hoạt động LED đèn tín hiệu Trạng thái – Cao điểm, đèn xanh 55s, đèn đỏ 60s, đèn vàng 5s; trạng thái – Bình thường, đèn xanh 25s, đèn đỏ 30s, đèn vàng 5s; trạng thái - Ban đêm, bật đèn vàng ❖ Có vấn đề chính: ● Lập trình sáng Led số ● Lập trình kết nối Button với chế độ sáng Led ⮚ Phần 2:Giải vấn đề mơ hình hoạt động I Lập trình Led số STM32F103R6 a 7SEG-MP2X2-CA ● Cách kết nối - - Kỹ thuật Quét LED thực theo nguyên tắc thời điểm bật LED với liệu cần hiển thị, LED cịn lại tắt Việc quét LED thực phiên sáng LED với yêu cầu Các bước kết nối với Led số PAGE \* MERGEFOR Bước 1: Xuất mã hiển thị Bước 2: Cấp nguồn cho LED muốn hiển thị Bước 3: Trễ khoảng thời gian để trì sáng Bước 4: Cắt nguồn LED vừa hiển thị ● Cài đặt 7SEG-MP2X2-CA ▪ Bước 1: Cấp lock khai báo định nghĩa // Cau hinh cac chan cho Led #define LED7SEG_A GPIO_Pin_0 #define LED7SEG_B GPIO_Pin_1 #define LED7SEG_C GPIO_Pin_2 #define LED7SEG_D GPIO_Pin_3 #define LED7SEG_E GPIO_Pin_4 #define LED7SEG_F GPIO_Pin_5 #define LED7SEG_G GPIO_Pin_6 #define LED7SEG_DP GPIO_Pin_7 // Cau hinh cho cac chân cua Led #define LED1 GPIO_Pin_1 #define LED2 GPIO_Pin_2 // Cau hinh cho cac chân cua den #define LED_Do GPIO_Pin_5 #define LED_Vang GPIO_Pin_6 #define LED_Xanh GPIO_Pin_7 #define LED_Do1 #define LED_Vang1 #define LED_Xanh1 GPIO_Pin_8 GPIO_Pin_9 GPIO_Pin_10 // Cap cac Port cho 7thanh va Led #define PORT_LED7SEG_CODE GPIOC #define PORT_LED GPIOA PAGE \* MERGEFOR #define PORT_LED7SEG_CODE_CLOCK RCC_APB2Periph_GPIOC #define PORT_LED_CLOCK RCC_APB2Periph_GPIOA Khởi tạo cấu hình cho GPIO, Output, Mode cho 7SEG LED đèn RCC_APB2PeriphClockCmd(PORT_LED7SEG_CODE_CLOCK | PORT_LED_CLOCK|, ENABLE); /*Configuration GPIO pin*/ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = LED7SEG_A|LED7SEG_B|LED7SEG_C| LED7SEG_D|LED7SEG_E|LED7SEG_F| LED7SEG_G|LED7SEG_A| LED7SEG_DP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(PORT_LED7SEG_CODE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LED1 | LED2; GPIO_Init(PORT_LED, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = LED_Do | LED_Vang | LED_Xanh | LED_Do1 | LED_Vang1 | LED_Xanh1 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(PORT_LED, &GPIO_InitStructure); PAGE \* MERGEFOR Để bật tắt LED ResetBits bật SetBits tắt ▪ Bước 2: Cấu hình bật tắt LED theo số 7SEG Ở trạng thái này, nhận lệnh từ vòng FOR(i) đèn XANH Đỏ1 Reset Trong vòng lặp FOR(j) trạng thái quét LED, mắt nhìn tối đa 24 ảnh/s số 24 tốc độ quét led, muốn nhanh hạ số xuống Dữ liệu đươc nhận từ LED7SEG sau cấp đền LED1 LED LED1 hàng chục i/10 LED2 hàng đơn vị chia dư i%10 Các trạng thái sau nhận lệnh tương tự II Nút nhấn (BUTTON) Giới thiệu Nút nhấn loại công tắc đơn giản điều khiển hoạt động của máy số loại trình Hầu hết, nút nhấn nhựa kim loại Hình dạng nút ấn phù hợp với ngón tay bàn tay để sử dụng dễ dàng Tất phụ thuộc vào thiết kế cá nhân Nút ấn có loại chính là nút nhấn thường mở nút nhấn thường đóng PAGE \* MERGEFOR Nguyên lý hoạt động Nút nhấn có ba phần: Bộ truyền động, các tiếp điểm cố định rãnh Bộ truyền động qua toàn cơng tắc vào xy lanh mỏng phía Bên tiếp điểm động lò xo Khi nhấn nút, chạm vào tiếp điểm tĩnh làm thay đổi trạng thái của tiếp điểm Trong số trường hợp, người dùng cần giữ nút nhấn liên tục để thiết bị hoạt động Với nút nhấn khác, chốt giữ nút bật người dùng nhấn nút lần Cấu hình Cấp ENABLE cho port A, đồng thời cấu hình cho mode chân hoạt động RCC_APB2PeriphClockCmd( PORT_BUTTON_CLOCK, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Pin = BUTTON|BUTTON1|BUTTON2; GPIO_Init(PORT_BUTTON,&GPIO_InitStructure); Khai báo hàm If (GPIO_ReadInputDataBit(PORT_BUTTON, BUTTON) == 0) //nhan xuong PAGE \* MERGEFOR while(GPIO_ReadInputDataBit(PORT_BUTTON, BUTTON) == 0); // nhan xuong chua tha thi khong thuc hien với BUTTON lại làm tương tự bt; for(i = 15; i >= 0; i ){ // Bât Led_Xanh Led_Do1 lai off GPIO_ResetBits(PORT_LED, LED_Xanh); GPIO_ResetBits(PORT_LED, LED_Do1); GPIO_SetBits(PORT_LED, LED_Xanh1); GPIO_SetBits(PORT_LED, LED_Do); GPIO_SetBits(PORT_LED, LED_Vang); GPIO_SetBits(PORT_LED, LED_Vang1); for(j = 0; j < 5; j++){ GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[i/10]); GPIO_SetBits(PORT_LED, LED1); // LED1 = delay(1); GPIO_ResetBits(PORT_LED, LED1); //LED1 = GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[i%10]); GPIO_SetBits(PORT_LED, LED2); //LED2 = delay(1); GPIO_ResetBits(PORT_LED, LED2); //LED2 = } } for(i = 5; i >= 0; i ){ GPIO_SetBits(PORT_LED, LED_Xanh); GPIO_SetBits(PORT_LED, LED_Do1); GPIO_SetBits(PORT_LED, LED_Xanh1); GPIO_SetBits(PORT_LED, LED_Do); GPIO_ResetBits(PORT_LED, LED_Vang); GPIO_ResetBits(PORT_LED, LED_Vang1); PAGE \* MERGEFOR for(j = 0; j < 5; j++){ GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[i/10]); GPIO_SetBits(PORT_LED, LED1); // LED1 = delay(1); GPIO_ResetBits(PORT_LED, LED1); //LED1 = GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[i%10]); GPIO_SetBits(PORT_LED, LED2); //LED2 = delay(1); GPIO_ResetBits(PORT_LED, LED2); //LED2 = } } for(i = 10; i >= 0; i ){ GPIO_ResetBits(PORT_LED, LED_Xanh1); // Bat Xanh1, Do lai off GPIO_ResetBits(PORT_LED, LED_Do); GPIO_SetBits(PORT_LED, LED_Vang); GPIO_SetBits(PORT_LED, LED_Vang1); GPIO_SetBits(PORT_LED, LED_Xanh); GPIO_SetBits(PORT_LED, LED_Do1); for(j = 0; j < 5; j++){ GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[i/10]); GPIO_SetBits(PORT_LED, LED1); // LED1 = delay(1); GPIO_ResetBits(PORT_LED, LED1); //LED1 = GPIO_Write(PORT_LED7SEG_CODE, LED7SEG[i%10]); GPIO_SetBits(PORT_LED, LED2); //LED2 = delay(1); GPIO_ResetBits(PORT_LED, LED2); //LED2 = } } goto bt; } PAGE \* MERGEFOR ⮚ Phần 3:CODE hoàn chỉnh Chương trình Main #include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "math.h" #define button1 GPIO_Pin_0 #define button2 GPIO_Pin_1 #define button3 GPIO_Pin_2 #define SDI GPIO_Pin_0 #define SCK GPIO_Pin_1 #define RCK GPIO_Pin_2 void config_7thanh(void); void Chay(int index,int val); void delay(int time); void config_timer2(void){ RCC-> APB1ENR |= 0x01; // bat Enable cua timer TIM2 ->ARR = 0xffff;//dem tu toi 65535 sau reset TIM2 ->PSC = 72 -1; // bo chia tan chia cho 72 ( ct la : CLK_PSC/ PSC +1) li do-1 la cai duoi cong TIM2 ->CR1 = 0x01; TIM2 ->EGR = 0x01; // can bat Enable de tao su kien reset Prescaler } // vi tan so chia la 1M vay tick (dem len) la 1/1M be hon 1000 de tao 1ms PAGE \* MERGEFOR void delay(int time){ while(time){ TIM2 -> CNT = 0U; // cho bien counter ban dau bang while((TIM2 -> CNT)< 1000); time ; } } void config_7thanh(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitTypeDef gpio; gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Pin = SDI | SCK | RCK; gpio.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOC, &gpio); } void config7thanh(){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef gpio; gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; gpio.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOA,&gpio); } void HC595(int val){ for(int i = 0; i< 8; i++){ GPIO_WriteBit(GPIOC,SDI,(val &(1 =0; i ){ int k = i-10; Play2(i,10); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOB,GPIO_Pin_9); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOA,GPIO_Pin_6); // GPIO_SetBits(GPIOA,GPIO_Pin_7); GPIO_SetBits(GPIOA,GPIO_Pin_8); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; Play(k,10); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOA,GPIO_Pin_7); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; //GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOB,GPIO_Pin_10); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; PAGE \* MERGEFOR GPIO_SetBits(GPIOB,GPIO_Pin_11); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; while(k==0){ Play(i,10); Play2(i,10); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; //delay(200); GPIO_SetBits(GPIOA,GPIO_Pin_7); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOA,GPIO_Pin_8); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; // GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOB,GPIO_Pin_10); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOB,GPIO_Pin_11); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; i ; if(i == 0) break; } GPIO_SetBits(GPIOA,GPIO_Pin_8); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; } GPIO_SetBits(GPIOB,GPIO_Pin_9); if(GPIO_ReadInputDataBit(GPIOB,button2)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; PAGE \* MERGEFOR } //hoat dong duoi su tac dong cua button void Binh_thuong(){ for(int i = 29; i>=0; i ){ int k = i-5; Play(i,10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOA,GPIO_Pin_6);// bat led tuyen if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOB,GPIO_Pin_9); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; //GPIO_SetBits(GPIOB,GPIO_Pin_10); GPIO_SetBits(GPIOB,GPIO_Pin_11); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; Play2(k,10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOB,GPIO_Pin_10);//bat led xanh tuyen //GPIO_SetBits(GPIOA,GPIO_Pin_6); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOA,GPIO_Pin_7); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOA,GPIO_Pin_8); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; while(k ==0){ PAGE \* MERGEFOR if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; Play(i,10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; Play2(i,10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOB,GPIO_Pin_10);// tat xanh tuyen if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOB,GPIO_Pin_11); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; //GPIO_SetBits(GPIOA,GPIO_Pin_6); GPIO_SetBits(GPIOA,GPIO_Pin_7); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOA,GPIO_Pin_8); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; i ; if(i == ) break; } GPIO_SetBits(GPIOB,GPIO_Pin_11); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; } GPIO_SetBits(GPIOA,GPIO_Pin_6); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; for(int i = 59; i>=0; i ){ PAGE \* MERGEFOR int k = i-10; Play2(i,10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOB,GPIO_Pin_9); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOA,GPIO_Pin_6); // GPIO_SetBits(GPIOA,GPIO_Pin_7); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOA,GPIO_Pin_8); Play(k,10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_ResetBits(GPIOA,GPIO_Pin_7); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; //GPIO_SetBits(GPIOB,GPIO_Pin_9); GPIO_SetBits(GPIOB,GPIO_Pin_10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; GPIO_SetBits(GPIOB,GPIO_Pin_11); while(k==0){ Play(i,10); Play2(i,10); if(GPIO_ReadInputDataBit(GPIOB,button1)==0 | GPIO_ReadInputDataBit(GPIOB,button3)==0) return; //delay(200); GPIO_SetBits(GPIOA,GPIO_Pin_7); ...PAGE \* MERGEFOR Chủ Đề: Ngã tư giao thông ⮚ Phần 1:Tổng quan chủ đề: ❖ Các linh kiện sử dụng ● Kít STM32F103R6 ● 7SEG-MP2X2-CA ● LED-GREEN... Cách thực ● Kết nối STM32 với LED thông qua lệnh thuật toán ● Dữ liệu nhận từ code gửi đến STM32 để xử lí, sau gửi tín hiệu LED thơng qua giao tiếp với Button ● Ý tư? ??ng, dùng BUTTON để điều chỉnh... cấp đền LED1 LED LED1 hàng chục i/10 LED2 hàng đơn vị chia dư i%10 Các trạng thái sau nhận lệnh tư? ?ng tự II Nút nhấn (BUTTON) Giới thiệu Nút nhấn loại công tắc đơn giản điều khiển hoạt động