Tải bản đầy đủ (.docx) (36 trang)

BÀI TẬP LỚN HỆ THỐNG NHÚNG

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.17 MB, 36 trang )

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 HỆ THỐNG NHÚNG

Giảng viên: Nguyễn Ngọc Minh
Nhóm Sinh viên:

Vũ Văn Minh-B18DCDT159
Nguyễn Ngọc Quang-B18DCDT191
Trần Văn Quyến-B18DCDT199
Đặng Hà Phong-B18DCDT268

Chủ đề: 7
Nhóm lớp: 01
Nhóm BTL: 02

Hà Nội - 2021


MỤC LỤC
LỜI NĨI ĐẦU

1

Phần 1: Mạch chng báo tiết học tự động cho các trường học

2

1. Giới hạn của đề tài



2

1.1 Phân tích

2

1.2 Xây dựng phương án

2

1.3 Phạm vi và phương hướng mở rộng

3

2. Nội dung

3

CHƯƠNG I : SƠ ĐỒ KHỐI

3

1.Sơ đồ tổng quát

3

2.Chức năng các khối

4


2.1 Khối nguồn

4

2.2. Chức năng của khối RTC

4

2.3. Chức năng của khối điều chỉnh

4

2.4. Khối âm thanh

4

2.5. Khối hiển thị

4

2.6. khối xử lý (vi điều khiển 89c51)

4

CHƯƠNG II: THIẾT KẾ HỆ THỐNG

5

1.1 Sơ đồ callgraph


5

1.2 Sơ đồ đặc tả

5

1. các linh kiện sử dụng trong mạch

5

3.1 giới thiệu cấu trúc của vi điều khiển MCS-51

6

3.2. Tìm hiểu IC thời gian thực DS1307

6

3.2.1 Giới thiệu chung về DS1307

6

3.2.2 Cơ chế hoạt động và chức năng của DS1307

6

3.3 Giới thiệu LCD

7


CHƯƠNG III : THIẾT KẾ MẠCH
1.Sơ đồ nguyên lý

8
8

2.Khối nguồn

10

3.Khối hiển thị LCD

10

4.Khối xử lý AT89C51

11

5.Khối thời gian thực

12

6.khối thao tác

13

7.Khối chấp hành

13


8.Sơ đồ thuật toán

13

Chương IV : Thiết kế phần mềm
1.Chương trình cho vi điều khiển

14
15

Phần 2: Thiết kế máy tính đơn giản, sử dụng ma trận phím 4x4 thực hiện các phép tính cộng, trừ, nhân, chia
hiển thị kết quả lên led 7 thanh, nếu kết quả > 9999 hiển thị chữ "FULL"
16
ảnh-thực-tế:
LỜI CẢM ƠN

33
34


LỜI NĨI ĐẦU
Hệ thống nhúng có tên gọi tiếng Anh là embedded system. Đây là một thuật
ngữ để nói về một hệ thống có khả năng tự trị được nhúng vào trong một môi
trường hoặc hệ thống mẹ. Đây là hệ thống tích hợp giữa phần cứng và phần
mềm để giải đáp được các bài tốn chun dụng trong cơng nghiệp., tự động
hóa, truyền tin,…

1



Phần 1: Mạch chuông báo tiết học tự động cho các trường học
1. Giới hạn của đề tài
1.1 Phân tích
Mục đích:
- Hệ thống báo chng tại các thời điểm vào, ra của tiết học của trường.
+ Hệ thống có khả năng chỉnh lại giờ.
+ Thời gian kéo dài chuông vào tiết và nghỉ giải lao là khác nhau.
+ Hệ thống chuông được dùng đi dây điện đồng bộ 220V
Yêu cầu:
-Hệ thống làm việc ổn định, có khả năng đưa vào ứng dụng trong thực tế.
Với thực tế bài toán này chúng ta phải thiết kế 2 thành phần cơ bản:
-Hệ thống điều khiển và đồng hồ số
-Mạch đi dây và chng báo
1.2 Xây dựng phương án
Mỗi ngày có 2 buổi học mỗi buổi kéo dài 6 tiết. Thời gian của mỗi tiết là
45 phút.Thời gian nghỉ giải lao là 5 phút.Sau tiết thứ 3 của mỗi buổi nghỉ giải
lao 10 phút từ đó ta xây dựng được thời khóa biểu như sau:
Tiết

Vào

Ra

Tiết

Vào

Ra


1

6h45

7h30

7

12h30

13h15

2

7h35

8h20

8

13h20

14h05

3

8h25

9h10


9

14h10

14h55

4

9h20

10h05

10

15h05

15h50

5

10h10

10h55

11

15h55

16h40


6

11h00

11h45

12

16h45

17h30

- Thời gian báo:

2


+, thời gian báo là 10 giây đối với những tiết bắt đầu ,ra tiết thứ 3 vào tiết
thứ tư của mỗi buổi,kết thúc của mỗi buổi
+,còn lại thời gian báo cho các thời điểm khác là 5 giây
- Cách báo : sử dụng chuông điện 220V
- Phạm vi báo: Tất cả khu vực trong trường. bằng cách xây dựng hệ thống
chuông đến từng khu nhà,từng giảng đường.
1.3 Phạm vi và phương hướng mở rộng
+, Thiết kế hệ thống chuông báo cho thời khóa biểu 2 mùa.mùa đơng và
mùa hè. Trong đó giờ mùa hè buổi sáng vào sớm hơn 15 phút ,buổi chiều vào
muộn hơn 30 phút so với giờ mùa đơng.và thêm thời khố biểu buổi tối cho các
trường học theo hệ thống tín chỉ.
+, Thiết kế Module điều chỉnh bằng quét phím ma trận hoặc giao tiếp bàn
phím máy tính có thể lập trình thời khóa biểu theo ý muốn và giờ giấc của từng

trường cũng như nơi làm việc.
+. Xây dựng Hệ thống chuông báo không dây sử dụng bộ thu phát sóng.
2. Nội dung
CHƯƠNG I : SƠ ĐỒ KHỐI
1.Sơ đồ tổng quát
-Sơ đồ khối tổng quát
Khối nguồn

alam
Nút nhấn
Vi XỬ LÝ
AT89C51

Hiển Thị
LCD 16x2

Hình 1: Sơ đồ khối tổng quát
Thời Gian Thực
DS1307

3


2.Chức năng các khối
2.1 Khối nguồn
-Cung cấp nguồn nuôi tất cả linh kiện trong mạch
2.2. Chức năng của khối RTC
-Khối này thực chất là một chíp thời gian thực(Real Time Clock), được sử
dụng với ý nghĩa thời gian tuyệt đối mà con người đang sử dụng.Nó có pin cấp
riêng , như vậy nếu như mất nguồn điện thì RTC vẫn có thể hoạt động bình

thường và chính xác theo thời gian đã được thiết lập ban đầu . Trong sơ đồ này
nó sẽ đảm nhiệm chức năng cấp time chính xác cho vi điều khiển xử lý các công
việc mà người sử dụng yêu cầu.
2.3. Chức năng của khối điều chỉnh
-Chức năng của khối này là sử dụng ngắt của 89c51 để yêu cầu việc điều
chỉnh time theo ý của người sử dụng , cài đặt time ban đầu cho đồng hồ thời
gian thực RTC.Tác động bởi các phím bấm (BUTTON).
2.4. Khối âm thanh
-Khối này gồm có transistor thơng dịng cho loa kêu khi có mức điện áp thay đổi
liên tục ở chân ra của vi điều khiển
2.5. Khối hiển thị
- Khối này thực chất là LCD 16x2 để hiển thị time và các thơng tin mà lập trình
viên cần hiển thị .
2.6. khối xử lý (vi điều khiển 89c51)
-Vi điều khiển 89C51 là trung tâm xử lý các thông tin của mạch.
Cụ thể là :
AT89C51 đảm nhiệm việc đọc thời gian từ DS1307, chuyển đổi dữ liệu qua lại
giữa RTC với LCD để có thể hiển thị lên LCD , đồng thời cập nhật time từ
DS1307
Điều khiển LCD
Kiểm tra phím bấm
Điều khiển loa
- Nói tóm lại là, VĐK làm nhiệm vụ đọc time trên DS1307 sau đó nó kiểm tra
xem ngắt được tác động hay khơng? nếu có thì điều chỉnh time, hiển thị time lên
LCD , kiểm tra xem giờ hiện tại có bằng giờ báo chng hay khơng ? nếu có thì
gọi chương trình điều khiển chng kêu !

4



CHƯƠNG II: THIẾT KẾ HỆ THỐNG
1.1 Sơ đồ callgraph

Chương Trình
Điều
Khiển

Module Xử Lý
Điều Chỉnh

Hình 2: Sơ đồ Callgraph

Nút Ấn

Module xử lý
chương trình

Chấp Hành

Hiển Thị

1.2 Sơ đồ đặc tả

Bật/Tắt Chng

Hiển Thị
Gửi thơng tin

Gửi thông tin


KIỂM TRA THỜI GIAN
Tác động

Gửi dữ liệu
Điều khiển

Điều Chỉnh

Kiểm Tra thời
gian thực

Hình 3: Sơ đồ Đặc tả
1. các linh kiện sử dụng trong mạch
5


3.1 giới thiệu cấu trúc của vi điều khiển MCS-51
-Đặc điểm và chức năng hoạt động của các IC họ MSC-51 hoàn toàn
tương tự như nhau. Ở đây giới thiệu IC8951 là một họ IC vi điều khiển do hãng
Intel của Mỹ sản xuất. Chúng có các đặc điểm chung như sau:
+ 4K Bytes Flash rom
+ 128 Bytes Ram
+ 4 port 8 bit
+ 2 bộ định thời 16 bit
+ Có port nối tiếp
+ Có thể mở rộng bộ nhớ chương trình ngồi 64 K Byte
+ Bộ xử lý bit
- AT89C51 là một bộ vi xử lý 8 bit, loại CMOS, có tốc độ cao và cơng suất thấp
với bộ nhớ Flash có thể lập trình được. Nó được sản xuất với công nghệ bộ nhớ
không bay hơi mật độ cao của hãng Atmel, và tương thích với họ MCS-51TM về

chân ra và tập lệnh.
- AT89C51 có các đặc trưng cơ bản như sau: 4 K byte Flash, 128 byte RAM, 32
đường xuất nhập, hai bộ định thời/đếm 16-bit, một cấu trúc ngắt hai mức ưu tiên
và 5 nguyên nhân ngắt, một port nối tiếp song công, mạch dao động và tạo xung
clock trên chip.
3.2. Tìm hiểu IC thời gian thực DS1307
3.2.1 Giới thiệu chung về DS1307
-IC thời gian thực là họ vi điều khiển của hãng dalat
DS1307 có một số đặc trưng cơ bản sau
- DS1307 là IC thời gian thực với nguồn cung cấp nhỏ dùng để cập nhật
thời gian và ngày tháng
- SRAM :56bytes
-Địa chỉ và dữ liệu được truyền nối tiệp qua 2 đường bus 2 chiều
- DS1307 có mơt mạch cảm biến điện áp dùng để dị các điện áp lỗi và tự
động đóng ngắt với nguồn pin cung cấp 3v
- Cơ chế hoạt động :DS1307 hoạt động với vai trò slave trên đường bus
nối tiếp.Việc truy cập được thi hành với chỉ thị start và một mã thiết bị nhất định
được cung cấp bởi địa chỉ các thanh ghi.tiếp theo đó các thanh ghi sẽ được truy
cập liên tụcđến khi chỉ thị stop đươc thực thi
3.2.2 Cơ chế hoạt động và chức năng của DS1307
- Vcc: nối với nguồn
- X1,X2: nối với thạch anh 32,768 kHz
- Vbat: đầu vào pin 3V
- GND: đất
- SDA: chuỗi data
6


- SCL: dãy xung clock
- SQW/OUT: xung vng/đầu ra driver


Hình 9: Sơ đồ DS1307
• DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật
thời gian và ngày tháng với 56 bytes SRAM. Địa chỉ và dữ liệu được truyền nối
tiếp qua 2 đường bus 2 chiều. Nó cung cấp thơng tin về giờ,phút,giây
,thứ,ngày ,tháng, năm.Ngày cuối tháng sẽ tự động được điều chỉnh với các tháng
nhỏ hơn 31 ngày,bao gồm cả việc tự động nhảy năm. Đồng hồ có thể hoạt động
ở dạng 24h hoặc 12h với chỉ thị AM/PM. DS1307 có một mạch cảm biến điện
áp dùng để dò các điện áp lỗi và tự động đóng ngắt với nguồn pin cung cấp
3.3 Giới thiệu LCD
-LCD được giới thiệu ở đây 14 chân (hình dưới). Chức năng các chân được cho
trong bảng dưới:

3.3.1 Chức năng các chân của Module LCD 16x2

7


Chân
số
1
2
3
4


hiệu
Vss
Vdd
Vee

RS

Mức
logic
0/1

I/O

Chức năng

I
I

5

R/W

0/1

I

6
7
8
9
10
11
12
13
14

15
16

E
DB1
DB2
DB3
DB4
DB5
DB6
DB7
DB8
Vcc
GND

1,1=>0
0/1
0/1
0/1
0/1
0/1
0/1
0/1
0/1
-

I
I/O
I/O
I/O

I/O
I/O
I/O
I/O
I/O
-

Nguồn cung cấp(GND)
Nguồn cung cấp(+5V)
Điện áp để điều chỉnh độ tương phản
Lựa chọn thanh ghi
0= thanh ghi lệnh
1=thanh ghi dữ liệu
0=ghi vào LCD module
1=đọc từ LCD module
Tín hiệu cho phép
Data bus line 0(LSB)
Data bus line1
Data bus line2
Data bus line3
Data bus line4
Data bus line5
Data bus line6
Data bus line7(MSB)
Nguồn cung cấp
mass

CHƯƠNG III : THIẾT KẾ MẠCH
1.Sơ đồ nguyên lý
-sơ đồ nguyên lý cụ thể như sau:


8


- Khi đã đảm bảo cấp nguồn cho các mạch ổn định , mạch sẽ hoạt đông
như sau:
Ban đầu khi khởi động nó sẽ thực hiện việc đọc dữ liêu trên DS1307 và hiển thị
ngày giờ hiện tại lên LCD.
Kế tiếp nếu có ngắt gọi đến tức tác động vào phím KEY_TIME để điều chỉnh
thời gian (Tăng-INC_KEY button, Giảm-DEC_KEY button) cho RTC , khi đó
vi điều khiển sẽ điều khiển việc tăng hay giảm time (ngày , tháng , năm , thứ ,
giờ , phút ), theo ý muốn của người sử dụng, bằng cách nhấn phím INC_KEY
hoặc phím DEC_KEY. Set xong thì LCD sẽ trở về màn hình lúc trước và hiển
thị thời gian theo time đã cài đặt và hoạt động.
- Trong quá trình time hiện tại được hiển thị trên LCD mà ta thấy thì vi điều
khiển luôn thực hiển kiểm tra (lặp lại việc kiểm tra ) time hiện tại xem xem có
trùng với mốc thời gian vào tiết học hay kết thúc tiết học hay khơng ? Nếu có ,
thì nhảy tới chương trình báo chuông và đổ chuông báo , thời gian chuông dài
hay ngắn có thể thay đổi trên code, là do người lập trình thiết lập, thiết lập mốc
thời gian theo ý muốn. Tức là, cứ thỏa mãn điều kiện time hiện tại bằng với time
hẹn trước sẽ có chng reo.
- Sau khi đã thiết kế sơ đồ khối của từng khối chúng ta bắt đầu đi thiết kế
sơ đồ nguyên lý cho từng khối như sau:

9


2.Khối nguồn
- Nguồn cung cấp cho toàn mạch là +5v dc.Do đó mạch nguồn chỉ cần sử
dụng vi mạch ổn áp 7805 với dòng 0.5 A. Mạch được thiết kế như sau


- Đối Với role ta sử dụng nguồn nuôi riêng 12 V. Có thể điều chế theo
nhiều cách khác nhau.
- Đối với chuông ta sử dụng nguồn 220 mắc riêng rẽ
*, Chi chú ý nguồn nuôi cho mạch điều khiển cần giữ sự ổn định vì vậy ta
sử dụng ổn áp LM7805 cho nó.
3.Khối hiển thị LCD
- LCD 16x2 và giao tiếp với vi điều khiển :
VEE của LCD được nối với biến trở và nguồn 5V để diều chỉnh độ sáng
của LCD
- Hiển thị time 1 ngày của RTC lên LCD
+ 3 chân điều khiển (RS,RW,E )
+ Đường dữ liệu D0 đến D7
+ Chân điều khiển độ sáng tối của LCD chân VEE ta sử dụng 1 biến trở
để điều chỉnh thích hợp

10


4.Khối xử lý AT89C51
- Sử dụng ic số là một bất lợi cho quá trình thiết kế từ việc thiết kế, kết nối
cho tới chọn linh kiện và khắc phục nhiễu.
Một lựa chọn để khắc phục nhược điễm của ic số là dùng bộ vi điều khiển
AT89C51 với dòng điện tiêu thụ thấp và có thể lập trình được
Vi điều khiển sử dụng thạch anh dao động là 12Mhz. Nút ấn kết hợp với tụ C để
thực hiện reset

11



5.Khối thời gian thực
-Ta chọn ic DS 1307 vì đây là ic chạy thời gian thực,có độ chính xác rất cao,và
đặt biệt là dữ liệu thời gian cũng không bị mất khi chúng ta bị mất nguồn hoặc
cúp điện.Nên đồng hồ ta chạy vẫn chính xác ngay cả khi mất điện. Được nuôi
bằng nguồn nuôi pin 3V

12


6.khối thao tác
-Sử dụng nút nhấn để tạo tín hiệu vào để điều chỉnh thời gian .Nút nhấn được
kết nối vối module giao tiếp để tiết kiệm chân và dơn giản khi thực hiện ,và 1
chân nút nhấn treo xuống mass để tạo sự thay đổi tín hiệu khi nhấn nút.

7.Khối chấp hành
- Có nhiều phương án để điều khiển cơ cấu chấp hành ,ở đây chúng ta sử dụng
Transistor A1015 để điều khiển relay 12V/10A .Điện trở R =10K để phân cực và
hạn dòng cho Transistor
- Diode 2N4148 dùng để bảo vệ Transistor khi trong mạch xuất hiện áp ngược từ
cuộn dây sinh ra .Relay dùng để điều khiển chng điện

8.Sơ đồ thuật tốn

13


Bắt Đầu

Lấy data từ RTC
Set phút

Hiển thị lên LCD

No

Tác Động Phím Bám

Set giờ

Yes

Set
ngay,tháng,năm,thứ
No
Up =?
No

Kiểm tra time =time đổ chng
Yes

Tăng ơ nhớ lên 1

yes

Đổ Chng

Đặt gt cho RTC

Hình 12: Sơ đồ thuật tốn

No


Down=?
Yes

Đặt gt cho RTC

yes

Giảm gt ơ nhớ
1

Chương IV : Thiết kế phần mềm
Các phần mềm dùng trong đồ án
Lap_trinh_Pic_CCS PCWH v4.023
Keil 4
Proteus 7.7 SP2
ORCAD 10.5
14


1.Chương trình cho vi điều khiển
#include "ports.h"
#include "lcd.h"
#include "rtc.h"
/*===================================================*/
/*= DE TAI : Thiet ke he thong chuong bao lop hoc =*/
/*=-------------------------------------------------=*/
/*===================================================*/
/*=======Khai bao bien ========*/
bit flag=0,aon=0,aoff=0;

void main()
{
alarm_port=0;
LCD_INI(); //khoi tao cho LCD
rtc_check();//kiêm tra RTC
disp_intro();//hien thi time len LCD
ENABLE_INT//cho phep ngat
wrt_cmd(0x1);//xoa man hinh LCD
wrt_cmd(0x1);
start_rtc();//dieu kien START cho RTC
send_adr(0xd0);//dia chi ghi cho RTC
send_adr(0x00);//gui dia chi bat dau
start_rtc();
send_adr(0xd1);//gui dia chi doc RTC
recv_data();//nhan du lieu tu vi dieu khien
while(1)
{
start_rtc();
send_adr(0xd0);
send_adr(0x00);
start_rtc();
send_adr(0xd1);
15


recv_data();
disp_rtc();
if(_testbit_(flag))

//kiem tra co ngat


{
DISABLE_INT
rtc_set();

//cam ngat

//goi chuong trinh set cho rtc

ENABLE_INT //cho phep ngat
flag=0; //xoa co ngat
}
aon=1;//dieu kien de luon so sanh time hen voi time hien tai
if(aon)
check_alarm(); // kiem tra
if(aoff)

//bao chuong

ring_alarm();
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
****chuong trinh phuc vu ngat ngoai 0 ****
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void set_flag() interrupt 0

//chuong trinh ngat cho rtc_set

{

flag=1;
}
/*========== THE END ================*/

Phần 2: Thiết kế máy tính đơn giản, sử dụng ma trận phím 4x4 thực hiện
các phép tính cộng, trừ, nhân, chia hiển thị kết quả lên led 7 thanh, nếu kết
quả > 9999 hiển thị chữ "FULL"
1.1 Mô phỏng

16


1.2 Linh kiện và chức năng
Mạch sử dụng 1 Module bàn phím 4x4, 2 IC 74HC595, 1 led 7 đoạn 4 số anot chung,
4 transistor npn C1815.
● Kỹ thuật quét bàn phím 4x4:
● Sử dụng thuật tốn qt bàn phím, tức là tại một thời điểm chỉ có đầu
vào một cột bàn phím có tín hiệu mức thấp, vi điều khiển thực hiện việc
kiểm tra đầu vào ứng với 4 hàng của module bàn phím 4x4, nếu chân
đầu vào nào của vi điều khiển nhận được mức trạng thái logic thấp và
ứng với cột đang có mức logic thấp thì sẽ nhận được ký tự tại nút được
lập trình trong phần mềm.
● Kỹ thuật quét led 7 đoạn:
● tại một thời điểm chỉ có một led 7 đoạn trong led 7 đoạn được sáng nhờ
sự điều khiển đóng mở của transistor npn C1815 thơng qua tín hiệu từ vi
điều khiển.
● Lý do là module led 7 đoạn được nối chung các chân cùng ký hiệu và
được truyền tín hiệu bằng cách dịch tín hiệu qua IC 74HC595.
● Việc sử dụng chung một IC 74HC595 sẽ giúp chúng ta giảm bớt được số
chân I/O cần sử dụng cho việc xuất tín hiệu ra led 7 đoạn.

● Chỉ có 1 IC 74HC595 được lập trình theo tín hiệu đầu ra của vi điều khiển
stm32f103c8t6, là thanh ghi dùng để dịch dữ liệu mong muốn xuất ra điều
17


khiển 4 transistor bật tắt 4 led 7 đoạn thay phiên nhau, và 3 tín hiệu làm đầu vào
của IC 74HC595 còn lại thực hiện việc biểu diễn ký tự hiển thị trên led 7 đoạn.
● Chức năng chính của mạch:
● Thực hiện phép tính cộng, trừ, nhân, chia trên cà số nguyên và số thực
● Do đơn vị hiển thị chỉ có 4 led 7 đoạn nên đã lược bỏ thực hiện các phép
tính cho số âm
● Nếu kết quả phép tính ra âm hoặc lớn hơn 9999 sẽ hiện chữ FULL
● Mạch có 4 nút chức năng:
o 1 nút chọn chế độ phép tính
o 1 nút quay lại phép tính cũ
o 1 nút xóa 1 phần tử vừa nhập
o 1 nút thoát khỏi chế độ nhập hoặc hiển thị kết quả

1.3 code
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_tim.h"
#include "stdio.h"
#include "string.h"
#include "math.h"
/****************************Khai

bao


ban

dau*******************************************************************************
*******/
#define chot GPIO_Pin_7
#define shift GPIO_Pin_6
#define dulieu GPIO_Pin_5
#define shift_high GPIO_SetBits(GPIOB,shift);
#define shift_low GPIO_ResetBits(GPIOB,shift);
#define dulieu_high GPIO_SetBits(GPIOB,dulieu);
#define dulieu_low GPIO_ResetBits(GPIOB,dulieu);
#define chot_high GPIO_SetBits(GPIOB,chot);
#define chot_low GPIO_ResetBits(GPIOB,chot);
/
*************************Khaibaobien***********************************************
******************************************/
unsigned int mang_bien1[7] = {0, 0, 0, 0, 0, 0, 0};
unsigned int mang_bien2[7] = {0, 0, 0, 0, 0, 0, 0};
unsigned int mang_math[7] = {0, 0, 0, 0, 0, 0, 0};
18


unsigned int phep[5] = {0, 0, 0, 0, 0};
unsigned int minh_data[8] = {1, 1, 1, 1, 1, 1, 1, 1};
unsigned int so_lan_bang[4] = {0, 0, 0, 0};
float bien1=0;
float bien2=0;
float math=0;
char key;
uint8_t so_co_cham[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};

uint8_t so[10]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
uint8_t chu_full[4] = {0x8E, 0xC1, 0xC7, 0xC7};
/
**********************************************************************************
********************************/
/
****************************Hamcauhinh********************************************
******************************************/
void GPIO_Config(void);
void Timer2_config(void);
void delay(uint16_t time_delay);
/
****************************Hamtutao**********************************************
****************************************/
char check();
float gia_tri_bien(unsigned int* mang);
void hien_thi_1_so(uint8_t bien_so, unsigned fulll, unsigned int so_n_sau_dot);
void xuat(unsigned int* mang_bien, unsigned int full);
void tach_math(float mathh);
void xoa_phan_tu(unsigned int* mang_xoa);

int main(){
SystemInit();
SystemCoreClockUpdate();
Timer2_config();
GPIO_Config();
for(unsigned int m = 0; m <= 6; m++){
if(m == 4){
mang_bien1[4] = 4;
19



mang_bien2[4] = 4;
}
else{
mang_bien1[m] = 0;
mang_bien2[m] = 0;
}
}
while(1){
key = check();
/*luu so nhap tu ban phim vao bien*/
if( key == '0' || key == '1' || key == '2' || key == '3' || key == '4' || key == '5' || key == '6' || key ==
'7' || key == '8' || key == '9'){
/*nhap bien 1*/
if(so_lan_bang[0] == 0){
bien1 = gia_tri_bien(mang_bien1);
}
/*nhap bien 1*/
else if(so_lan_bang[0] == 1 && so_lan_bang[1] == 1 && so_lan_bang[2] == 0){
bien2 = gia_tri_bien(mang_bien2);
}
}
/*Dau dot cham phay*/
if(key == '.'){
if(mang_bien1[6] == 0 && so_lan_bang[0] == 0 && mang_bien1[5]>0){
mang_bien1[6] = 1;
}
else if(mang_bien2[6] == 0 && so_lan_bang[1] == 1 && so_lan_bang[1] == 1 &&
so_lan_bang[2] == 0&& mang_bien2[5]>0){

mang_bien2[6] = 1;
}
}
/*luu dau can tinh toan*/
else if(so_lan_bang[0] == 1 && so_lan_bang[1] == 0 && key =='c'){
if( (phep[0] == 0 && phep[1] == 0 && phep[2] == 0 && phep[3] == 0) || (phep[0]
== 1 && phep[1] == 0 && phep[2] == 0 && phep[3] == 0) ){
phep[0] = 0;
phep[3] = 1;
20


}
else if(phep[1] == 0 && phep[1] == 0 && phep[2] == 0 && phep[3] == 1){
phep[2] = 1;
phep[3] = 0;
}
else if(phep[0] == 0 && phep[1] == 0 && phep[2] == 1 && phep[3] == 0){
phep[1] = 1;
phep[2] = 0;
}
else if(phep[0] == 0 && phep[1] == 1 && phep[2] == 0 && phep[3] == 0){
phep[0] = 1;
phep[1] = 0;
}
}
/*bam q de thoat che do tinh toan*/
else if(key == 'Q'){
for(unsigned int xoa = 0; xoa < 4; xoa++){
so_lan_bang[xoa] = 0;

phep[xoa] = 0;
}
for(unsigned int m = 0; m < 7; m++){
if(m == 4){
mang_bien1[4] = mang_bien2[4] = 4;
}
else{
mang_bien1[m] = 0;
mang_bien2[m] = 0;
mang_math[m] = 0;
}
}
xuat(mang_bien1,0);
}
/*nut xoa phan tu khi nhap bien*/
else if(key == 'D'){
/*Khi dang nhap bien 1*/
if(so_lan_bang[0] == 0){
xoa_phan_tu(mang_bien1);
}
21


/*Khi dang nhap bien 2*/
else if(so_lan_bang[0] == 1 && so_lan_bang[1] == 1 && so_lan_bang[2] == 0){
xoa_phan_tu(mang_bien2);
}
}
/*Nut quay lai tung buoc truoc*/
else if(key == 'B'){

/*quay lai bien 2*/
if((so_lan_bang[0] == 1) && (so_lan_bang[1] == 0) && (so_lan_bang[2] == 0) &&
(so_lan_bang[3] == 0)){
so_lan_bang[0] = 0;
}
/*quay lai phep tinh*/
else if((so_lan_bang[1] == 1) && (so_lan_bang[2] == 0) && (so_lan_bang[3] == 0))
{
so_lan_bang[1] = 0;
}
/*quay lai bien 1*/
else if((so_lan_bang[2] == 1) && (so_lan_bang[3] == 1)){
so_lan_bang[2] = 0;
so_lan_bang[3] = 0;
}
}
/*chuyen che do nhap ban phim */
if(key == '='){
/*nhap xong bien 1*/
if( (so_lan_bang[0] == 0) && (so_lan_bang[1] == 0) && (so_lan_bang[2] == 0)){
so_lan_bang[0] = 1;
}
/*nhap xong phep tinh*/
else if( (so_lan_bang[0] == 1) && (so_lan_bang[1] == 0) && (so_lan_bang[2] == 0))
{
so_lan_bang[1] = 1;
}
/*nhap xong bien 2 ---->Thuc hien tinh toan*/
else if( (so_lan_bang[0] == 1) && (so_lan_bang[1] == 1) && (so_lan_bang[2] == 0))
{

so_lan_bang[2] = 1;
22


if(phep[3] == 1){
math = bien1 + bien2;
}
else if(phep[2] == 1){
math = bien1 - bien2;
}
else if(phep[1] == 1){
math = bien1 * bien2;
}
else if(phep[0] == 1){
math = bien1 / bien2;
}
/*tach lay tung so trong ket qua vao mang_ket_qua*/
tach_math(math);
/*Kiem tra ket qua co am hoac lon hon 9999 hay ko*/
if(math>0 && math<9999){
so_lan_bang[3] = 1;
}
/*neu ket qua math tinh duoc am hoac lon hon 9999*/
else so_lan_bang[3] =2;
}
}
/*hien_thi_full*/
if(mang_bien1[4] == 5 || mang_bien2[4] == 5 || so_lan_bang[3] == 2){
xuat(mang_bien1,1);
}

/*hien thi bien 1*/
if(mang_bien1[4] != 5 && so_lan_bang[0] == 0 && so_lan_bang[1] == 0 &&
so_lan_bang[2] == 0){
xuat(mang_bien1,0);
}
/*hien thi bien 2*/
else if(mang_bien2[4] != 5 && so_lan_bang[0] == 1 && so_lan_bang[1] == 1 &&
so_lan_bang[2] == 0){
xuat(mang_bien2,0);
}
/*hien thi gia tri tinh toan cuoi cung*/
else if(so_lan_bang[3] == 1){
23


×