Tải bản đầy đủ

vi xử lý trong đo lường điều khiển đề tài Điều khiển chiếu sáng theo giờ sử dụng DS1307 hiển thị LCD, có cài giờ , ngày tháng năm

Trường đại học công nghiệp Hà Nội
Khoa Ðiện

TÊN ĐỀ TÀI:Điều khiển chiếu sáng theo giờ sử dụng DS1307
hiển thị LCD
Môn học : Vi xử lý trong Đo lường và Điều khiển
I. ĐỀ TÀI:
Xây dựng ứng dụng chiếu sáng theo giờ. Nếu trong khoảng thời gian từ 6h
tối đến 21h, đèn hành lang sẽ bật sáng. Thời gian thực hiển thị lên LCD. Việc chỉnh
giờ,ngày và chỉnh khoảng thời gian đèn sang có thể thực hiện bằng các nút bấm
điều chỉnh:
BT1: Nút thiết lập thông số cần chỉnh (giờ hay phút, giây,ngày tháng, năm
,hẹn giờ)
BT2: Tăng
BT3: Giảm
BT4: thiết lập
II. YÊU CẦU VỀ NỘI DUNG
Chương 1: Tổng quan về Vi xử lý trong Đo lường và Điều khiển
1.1. Cấu trúc hệ thống đo lường điều khiển có sử dụng Vi xử lý
1.2. Cấu trúc chung họ 8052
1.3. Tổng quan về ngôn ngữ C và các hàm, kiểu dữ liệu hay dùng cho việc lập

trình cho Vi điều khiển
Chương 2: Tổng quan về DS1307 và nguyên lý giao tiếp theo chuẩn I2C
2.1. Tổng quan về DS1307
2.2. Nguyên lý giao tiếp Vi điều khiển với thiết bị ngoại vi theo chuẩn I2C
Chương 3: Xây dựngứng dụng trên cơ sở 8051
3.1 Lưu đồ thuật toán
3.2 Chương trình điều khiển xây dựng trên keil C
3.3. Kết quả mô phỏng, thiết kế mạch nguyên lý và Thực nghiệm trên mạch thực
Kết luận: Sinh viên tổng kết những vấn đề đã làm được và chưa làm được
III. YÊU CẦU VỀ HÌNH THỨC VÀ THỜI GIAN
+ Báo cáo in trên giấy A4, 2 mặt, in màu ảnh chụp mạch thực
+ Nội dung báo cáo (bản word) nộp về email: hungpv1812@gmail.com trước khi
bảo vệ ít nhất 2 ngày.
+ Về thời gian thực hiện:
Ngày giao đề:……………….

Trưởng bộ môn

Ngày hoàn thành : ………………..

Hà Nội, ngày……tháng…….năm……..
Giáo viên hướng dẫn
Trang: 1


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

Trang: 2


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
MỤC LỤC
Chương 1

TỔNG QUAN VỀ VI XỬ LÍ TRONG ĐO LƯỜNG VÀ ĐIỀU KHIỂN. .5

1.1 Cấu trúc hệ thống đo lường điều khiển có sử dụng vi xử lý........................................5
1.2 cấu trúc chung của họ 8051.........................................................................................7
1.3 Tổng quan về ngôn ngữ C và các hàm, kiểu dữ liệu hay dùng cho việc lập trình cho
Vi điều khiển......................................................................................................................9
1.3.1 Giới thiệu ngôn ngữ C..........................................................................................9
1.3.2 Ngôn ngữ C...........................................................................................................9
1.3.3 Các lệnh cơ bản trong C......................................................................................18
Chương 2

Tổng quan về DS1307 và nguyên lý giao tiếp theo chuẩn I2C.................20

2.1 Tổng quan về DS1307...............................................................................................20
2.1.1 Sơ đồ chân:.........................................................................................................20
2.1.2 Sơ đồ kết nối với các linh kiện ngoại vi.............................................................21
2.1.3 RAM lưu trữ và điều khiển DS1307 (RTC RAM).............................................21
2.1.4 Chuẩn truyền thông I2C:.....................................................................................22
2.1.5 Điều kiện để dữ liệu có thể truyền dẫn trên chuẩn I2C:......................................22
2.1.6 Cấu trúc dữ liệu:..................................................................................................22
2.2 Nguyên lý giao tiếp Vi điều khiển với thiết bị ngoại vi theo chuẩn I2C...................23
Chương 3

Xây dựng ứng dụng trên cơ sở 8051...........................................................30

3.1 Mạch Mô phỏng……………………………………………………………….30
3.2 Lưu đồ thuật toán……………………………………………………………...31
3.3 Chương trình điều khiển…………………………………………………........43

Kết luận: Sinh viên tổng kết những vấn đề đã làm được và chưa làm được……61

Trang: 3


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
LỜI NÓI ĐẦU
Ngày nay với sự phát triển không ngừng công nghệ khoa học kỹ thuật, việc ứng
dụng các thành tựu khoa học vào cuộc sống ngày càng mạnh mẽ dần giải thoát lao
động chân tay cho con người. Ngàng công nghệ kỹ thuật điện tử là một trong những
ngành phát triển với tốc độ chóng mặt với rất nhiều ứng dụng rộng rãi trong cuộc
sống hàng ngày. Từ hệ thống internet toàn cầu đến những dây chuyền sản xuất tự
động hóa hiện đại và những thiết bị điện tử dân dụng rất tiện ích và đa dạng.
Sau một thời gian học tập trên giảng đường của trường Đại Học công nghiệp
HÀ Nội ,chúng em đã được tiếp cận với những kiến thức khoa học và công nghệ
hiện đại. Cùng với kinh nghiệm thực tế, chúng em đã có cơ hội chuyển những kiến
thức lý thuyết đã học được thành sản phẩm thực tế qua đề tài đồ án môn học tích
hợp mức một ,với nội dung là “Hiển thị thời gian thực trên LCD có hẹn giờ”,dùng
vi điều khiển.
Trong quá trình thực hiện đề tài nêu trên ,chúng em đã nhận được sự quan
tâm và chỉ bảo tận tình của thầy Đặng Văn Khanh ,cùng với sự giúp đỡ của các thầy
cô giáo trong khoa và bạn bè chúng em đã hoàn thành được sản phẩm của mình .
Song với khả năng được học tập nghiên cứu và tự nghiên cứu còn hạn chế về
nội dung và kiến thức trong phạm vi đồ án ,sẽ không tránh khỏi những thiếu sót và
hạn chế .Thông qua đồ án này ,chúng em rất mong được các thầy cô chỉ bảo thêm,
để chúng em có điều kiện nâng cao trình độ ,hiểu biết cũng như kỹ năng của bản
thân.Chúng em rất mong được tiếp thu những ý kiến đóng góp của các thầy cô!
Chúng em xin chân thành cảm ơn!

Trang: 4


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

Chương 1 TỔNG QUAN VỀ VI XỬ LÍ TRONG ĐO LƯỜNG VÀ
ĐIỀU KHIỂN
1.1 Cấu trúc hệ thống đo lường điều khiển có sử dụng vi xử l ý
Chương 1
Việc ứng dụng máy tính vào kỹ thuật đo lường và điều khiển đã đem
lại các kết quả đầy ưu việt. Các thiết bị hệ thống đo lường và điều khiển ghép
nối với máy tính có độ chính xác cao, thời gian thu thập số liệu ngắn, nhưng còn
đáng quan tâm hơn là mức độ tự động hóa trong việc thu thập và xử lý các kết
quả cả việc lập bảng thống kê và việc in ra giấy.
Vi xử lý (viết tắt là µP hay uP),
đôi khi còn được gọi là bộ vi xử lý, là
một linh kiện điện tử được chế tạo từ
các tranzito thu nhỏ tích hợp lên trên
một vi mạch tích hợp hơn. Khối xử
lý trung tâm (CPU) là một bộ vi xử lý
được nhiều người biết đến nhưng
ngoài ra nhiều thành phần khác trong
máy tính cũng có bộ vi xử lý riêng của
nó, ví dụ trên card màn hình (video
card) chúng ta cũng có một bộ vi xử lý
Chữ "vi " trong khái niệm trên có nguồn gốc từ chữ "micro" ký hiệu là "μ", có ý
nghĩa là "một phần triệu" hoặc "rất nhỏ". Vi xử lý (Microprocessor) có nghĩa là "bộ
xử lý rất nhỏ", được ký hiệu là "μP".
Trước khi xuất hiện các bộ vi xử lý, các CPU được xây dựng từ các mạch tích
hợp cỡ nhỏ riêng biệt, mỗi mạch tích hợp chỉ chứa khoảng vào chục tranzito. Do
đó, một CPU có thể là một bảng mạch gồm hàng ngàn hay hàng triệu vi mạch tích
hợp.
Ngày nay, công nghệ tích hợp đã phát triển, một CPU có thể tích hợp lên một hoặc
vài vi mạch tích hợp cỡ lớn, mỗi vi mạch tích hợp cỡ lớn chứa hàng ngàn hoặc hàng
triệu tranzito. Nhờ đó công suất tiêu thụ và giá thành của bộ vi xử lý đã giảm đáng
kể.
Vi điều khiển là một máy tính được tích hợp trên một chíp, nó thường được sử
dụng để điều khiển các thiết bị điện tử. Vi điều khiển, thực chất, là một hệ thống
bao gồm một vi xử lý có hiệu suất đủ dùng và giá thành thấp (khác với các bộ vi xử
lý đa năng dùng trong máy tính) kết hợp với các khối ngoại vi như bộ nhớ,
các mô đunvào/ra, các mô đun biến đổi số sang tương tự và tương tự sang số,... Ở
máy tính thì các mô đun thường được xây dựng bởi các chíp và mạch ngoài.
.
Sơ đồ khối một máy tính cổ điển
Trang: 5


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

- ALU (đơn vị logic số học): thực hiện các bài toán cho máy tính bao gồm: +, *, /,-,
phép toán logic, …
- Control (điều khiển): điều khiển, kiểm soát các đường dữ liệu giữa các
thành
phần của máy tính.
- Memory (bộ nhớ): lưu trữ chương trình hay các kết quả trung gian.
- Input (nhập), Output (Xuất): xuất nhập dữ liệu (còn gọi là thiết bị ngoại vi).
Về cơ bản kiến trúc của một vi xử lý gồm những phần cứng sau:
Đơn vị xử lý trung tâm CPU (Central Processing Unit).
Các bộ nhớ (Memories).
Các cổng vào/ra (song song (Parallel I/O Ports), nối tiếp (Serial I/O Ports))
Các bộ đếm/bộ định thời (Timers).
Hệ thống BUS (Địa chỉ, dữ liệu, điều khiển)
Ngoài ra với mỗi loại vi điều khiển cụ thể còn có thể có thêm một số phần cứng
khác như bộ biến đổi tương tự-số ADC, bộ biến đổi số-tương tự DAC, các mạch
điều chế dạng sóng WG, điều chế độ rộng xung PWM…Bộ não của mỗi vi xử lý
chính là CPU, các phần cứng khác chỉ là các cơ quan chấp hành dưới quyền của
CPU. Mỗi cơ quan này đều có một cơ chế hoạt động nhất định mà CPU phải tuân
theo khi giao tiếp với chúng.

Để có thể giao tiếp và điều khiển các cơ quan chấp hành (các ngoại vi), CPU sử
dụng 03 loại tín hiệu cơ bản là tín hiệu địa chỉ (Address), tín hiệu dữ liệu (Data) và
tín hiệu điều khiển (Control). Về mặt vật lý thì các tín hiệu này là các đường nhỏ
dẫn điện nối từ CPU đến các ngoại vi hoặc thậm chí là giữa các ngoại vi với nhau.
Trang: 6


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Tập hợp các đường tín hiệu có cùng chức năng gọi là các bus. Như vậy ta có các
bus địa chỉ, bus dữ liệu và bus điều khiển.
Về cơ bản, μP thường có cấu trúc được thể hiện trong hình trên. Tùy từng loại μP,
chúng có thể có thêm một vài đơn vị chức năng khác nữa, nhưng cấu trúc tối thiểu
của chúng bao giờ cũng có:
Khối xử lý trung tâm (CPU): CPU có cấu tạo gồm có đơn vị xử lý số học và lôgic
(ALU), các thanh ghi, cáckhối lôgic và các mạch giao tiếp. Chức năng của CPU là
tiến hành các thao tác tính toán xử lý, đưa ra các tín hiệu địa chỉ, dữ liệu và điều
khiển nhằm thực hiện một nhiệm vụ nào đó do người lập trình đưa ra thông qua các
lệnh (Instructions).
Hệ thống bus: Là các đường tín hiệu song song 1 chiều nối từ CPU đến bộ nhớ, bao
gồm:
- Bus địa chỉ
- Address bus
Độ rộng bus: là số các đường tín hiệu, có thể là 8, 18, 20, 24, 32 hay 64.
CPU gửi giá trị địa chỉ của ô nhớ cần truy nhập (đọc/ghi) trên các đường tín hiệu
này.
1 CPU với n đường địa chỉ sẽ có thể địa chỉ hoá được 2n ô nhớ.
1.2 cấu trúc chung của họ 8051
Họ vi điều khiển MCS-51 do Intel sản xuất đầu tiên vào năm 1980 là các IC
thiết kế cho các ứng dụng hướng điều khiển. Các IC này chính là một hệ thống
vi xử lý hoàn chỉnh bao gồm các các thành phần của hệ vi xử lý: CPU, bộ nhớ,
các mạch giao tiếp, điều khiển ngắt.
MCS-51 là họ vi điều khiển sử dụng cơ chế CISC (Complex Instruction Set
Computer), có độ dài và thời gian thực thi của các lệnh khác nhau. Tập lệnh
cung cấp cho MCS-51 có các lệnh dùng cho điều khiển xuất/nhập tác động đến
từng bit. MCS 51 bao gồm nhiều vi điều khiển khác nhau, bộ vi điều khiển đầu
tiên là 8051 có 4KB ROM, 128 byte RAM và 8031, không có ROM nội, phải sử
dụng bộ nhớ ngoài. Sau
này, các nhà sản xuất khác như Siemens, Fujitsu, … cũng được cấp
phép làm nhà cung cấp thứ hai. MCS-51 bao gồm nhiều phiên bản khác nhau,
mỗi phiên bản sau tăng thêm một số thanh ghi điều khiển hoạt động của MCS51.
8051 là vi điều khiển đầu tiên của họ vi điều khiển MCS51 được Intel sản xuất
vào năm 1980. Họ MCS51 là họ 8-bit có khả năng định địa chỉ 64KB bộ nhớ
chương trình và 64KB bộ nhớ dữ liệu.


Không
ROM
RAM
Các
Các
UART
ROM EPROM

(byte)
(byte)
cổng
mạch
Trang: 7


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
trong

trong

ROM
trong

80C51
80C52

87C51
87C52

80C31
80C32

I/O 8
bit
4K
8K

128
253

4
4

định
thì/B ộ
đếm 8
bit
2
3




Chú ý:
- Loạt 80C3X không có ROM/EPROM trong chip.
- Loạt 80C5X có từ 2KB đến 8KB ROM/EPROM trong chip.
- Loạt 89XX có bộ nhớ trong chương trình bên trong là “Flash
EPROM”.
- Lo ạt 80CX1 có 128 byte RAM nội.
- Loạt 80CX2 có 256 byte Ram nội.
- Về công nghệ chế tạo: loạt 8XXXX với công nghệ NMOS, loạt
8XCXX với công nghệ CMOS.

Hình 3-1.Kiến trúc vi điều khiển 8051
AT89C51 là vi điều khiển do Atmel sản xuất, chế tạo theo công nghệ CMOS có
các đặc tính như sau:
+ 4 KB PEROM (Flash Programmable and Erasable Read Only Memory), có
khả năng tới 1000 chu kỳ ghi xoá
+ Tần số hoạt động từ: 0Hz đến 24 MHz
+ 3 mức khóa bộ nhớ lập trình
+ 128 Byte RAM nội.
+ 4 Port xuất /nhập I/O 8 bit.
+ 2 bộ Timer/counter 16 Bit.
+ 6 nguồn ngắt.
+ Giao tiếp nối tiếp điều khiển bằng phần cứng.
+ 64 KB vùng nhớ mã ngoài
Trang: 8


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
+ 64 KB vùng nhớ dữ liệu ngoài.
+ Cho phép xử lý bit.
+ 210 vị trí nhớ có thể định vị bit.
+ 4 chu kỳ máy (4 µs đối với thạch anh 12MHz) cho hoạt động nhân hoặc chia.
+ Có các chế độ nghỉ (Low-power Idle) và chế độ nguồn giảm (Power-down).
+ Ngoài ra, một số IC khác của họ MCS-51 có thêm bộ định thời thứ 3 và
256byte RAM nội.

1.3 Tổng quan về ngôn ngữ C và các hàm, kiểu dữ liệu hay dùng cho việc lập
trình cho Vi điều khiển
1.3.1 Giới thiệu ngôn ngữ C
Trong kỹ thuật lập trình vi điều khiển nói chung, ngôn ngữ lập trình được sử dụng
thường chia làm 2 loại: Ngôn ngữ bậc thấp và Ngôn ngữ bậc cao.
Ngôn ngữ bậc cao là các ngôn ngữ gần vơi ngôn ngữ con người hơn, do đó việc lập
trình bằng các ngôn ngữ này trở nên dễ dàng và đơn giản hơn. Có thể kể đến một số
ngôn ngữ lập trình bậc cao như C, Basic, Pascal… trong dó C là ngôn ngữ thông
dụng hơn cả trong kỹ thuật vi điều khiển. Về bản chất, sử dụng các ngôn ngữ này
thay cho ngôn ngữ bậc thấp là giảm tải cho lập trình viên trong việc nghiên cứu các
tập lệnh và xây dựng các cấu trúc giải thuật. Chương trình viết bằng ngôn ngữ bậc
cao cũng sẽ được một phần mềm trên máy tính gọi là trình biên dịch (Compiler)
chuyển sang dạng hợp ngữ trước khi chuyển sang mã máy.
Khi sử dụng ngôn ngữ C người lập trình không cần hiểu sâu sắc về cấu trúc của bộ
vi điều khiển. Có nghĩa là với một người chưa quen với một vi điểu khiển cho trước
sẽ xây dựng được chương trình một cách nhanh chóng hơn, do không phải mất thời
gian tìm hiểu kiến trúc của vi điều khiển đó. Và việc sử dụng lại các chương trình
đã xây dựng trước đó cũng dễ dàng hơn, có thể sử dụng toàn bộ hoặc sửa chữa một
phần.
1.3.2 Ngôn ngữ C
a. Kiểu dữ liệu trong C
Kiểu

Số Byte

Khoảng giá trị

Char

1

-128 – +127

Unsigned char

1

0 – 255

Int

2

-32768 - +32767

Unsigned int

2

0 - 65535

Long

4

-2147483648 - +2147483647
Trang: 9


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

Unsigned long

4

Float

4

0 – 4294967295

* Khai báo biến:
- Cú pháp: Kiểu_dữ_liệu Vùng_nhớ Tên_biến _at_ Đia_chỉ;
Ví dụ:
Unsigned char data x;
- Khi khai báo biến có thể gán luôn cho biến giá trị ban đầu.
Ví dụ:

Thay vì:

unsigned char x;
x = 0;
Ta chỉ cần: unsigned char x = 0;
- Có thể khai báo nhiều biến cùng một kiểu một lúc.
Ví dụ: Unsigned int x,y,z,t;
- Chỉ định vùng nhớ: từ khoá “Vùng_nhớ” cho phép người dùng có thể chỉ ra vùng
nhớ sử dụng để lưu trữ các biến sử dụng trong chương trình. Các vùng nhớ có thể
sử dụng là:
CODE, DATA, DATAB, IDATA, PDATA, XDTA. Khi không khai báo vùng nhớ
trình dịch Keil C sẽ mặc định đó là vùng nhớ DATA.
Vùng nhớ

Ý nghĩa

CODE

Bộ nhớ mã nguồn chương trình

DATA

Bộ nhớ dữ liệu gồm 128 Byte thấp của RAM trong vi điều khiển

BDATA

Bộ nhớ dữ liệu có thê định địa chỉ bit, nằm trong vùng nhớ DATA

IDATA

Bộ nhớ dữ liệu gồm 128 Byte cao của RAM trong vi điều khiển chỉ có
ở một số dòng vi điều khiển sau này

PDATA

Bố nhớ dữ liệu ngoài gồm 256 Byte, được truy cập bởi địa chỉ đặt trên
P0

XDATA

Bộ nhớ dữ liệu ngoài có dung lượng có thể lên đến 64 KB, được truy
cập bởi địa chỉ đặt trên P0 và P2

Trang: 10


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
* Định nghĩa lại kiểu
- Cú pháp: Typedef Kiễu_dữ_liệu Tên_biến;
- Tên_biến sau này sẽ được sử dụng như một kiểu dữ liệu mới và có thể dùng để
khai báo các biến khác.
Ví dụ: Typedef int m5[5];
Dùng tên m5 khai báo hai biến tên a và b có kiểu dữ liệu là mảng 1 chiểu 5
phần tử:
m5 a,b;
Kiểu dữ liệu trong Keil C
Kiểu

Số bit

Bit

1

Sbit

1

Sfr

8

Sfr16

16

- bit : dùng để khai báo các biến có giá trị 0 hoặc một hay các biến logic trên vùng
RAM của vi điều khiển. Khi khai báo biến kiểu bit trình dịc Keil C sẽ mặc định
vùng nhớ sử dụng là BDATA.
- sbit, sfr, sfr16: dùng để định nghĩa các cho các thanh ghi chức năng hoặc các
cổng trên vi điều khiển dùng để truy nhập các đoạn dữ liệu 1 bit, 8 bit, 16 bit.
Mảng
Mảng là một tập hợp nhiều phần tử cùng một kiểu giá trị và chung một tên.
Các phần tử của mảng phân biệt với nhau bởi chỉ số hay số thứ tự của phần tử trong
dãy phẩn tử. Mỗi phần tử có vai trò như một biến và lưu trữ được một giá trị độc
lập với các phần tử khác của mảng.
Mảng có thể là mảng một chiều hoặc mảng nhiều chiều.
Khai báo:
- Cú pháp: Tên_kiểu Vùng_nhớ Tên_mảng[số_phần_tử_mảng];
Khi bỏ trống số phần tử mảng ta sẽ có mảng có số phần tử bất kì.
Ví dụ:
Unsigned int data a[5],b[2] [3];
Với khai báo trên ta sẽ có: mảng a là mảng một chiều 5 phần tử. Mảng b là
mảng hai chiều, tổng số phần tử là 6.
Trang: 11


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Chỉ số của mảng bắt đầu từ số 0. Mảng có bao nhiêu chiều phải cung cấp đầy
đủ bấy nhiêu chỉ số.
Ví du:
Phần tử mảng 2 chiều:
b[0] [1] là đúng
Khi viết:
b[0] là sai
Con trỏ
Khi ta khai báo một biến, biến đó sẽ được cấp phát một khoảng nhớ bao gồm
một số byte nhất định dùng để lưu trữ giá trị. Địa chỉ đầu tiên của khoảng nhớ đó
chính là địa chỉ của biến được khai báo.
Con trỏ là một biến dùng để chứa địa chỉ mà không chứa giá trị, hay giá trị
của con trỏ chính là địa chỉ khoảng nhớ mà nó trỏ tới.
Với các vùng nhớ cụ thể con trỏ tới vùng nhớ đó chiếm dung lượng phụ
thuộc vào độ lớn của vùng nhớ đó. Con trỏ tổng quát khi không xác định trước
vùng nhớ sẽ có dung lượng lớn nhất vì vậy tốt nhất nên sử dụng con trỏ cụ thể.
Loại con trỏ

Kích thước

Con trỏ tổng quát

3 byte

Con trỏ XDATA

2 byte

Con trỏ CODE

2 byte

Con trỏ DATA

1 byte

Con trỏ IDATA

1 byte

Con trỏ PDATA

1 byte

Khai báo biến con trỏ:
- Cú pháp: Kiểu_Dữ_liệu Vùng_nhớ *Tên_biến;
- Ví dụ:

int *int_ptr;
long data *long_ptr;

- khi không chỉ rõ vùng nhớ con trỏ sẽ được coi là con trỏ tổng quát.
kiểu dữ liệu cấu trúc
Kiểu dữ liệu cấu trúc là một tập hợp các biến, các mảng và cả các kiểu cấu
trúc khác được biểu thị bởi một tên duy nhất. kiểu dữ liệu cấu trúc dùng để lưu trữ
các giá trị, thông tin có liên quan đến nhau.
Trang: 12


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Định nghĩa và khai báo biến cấu trúc:
- Định nghĩa:

Typedef struct {

Khai báo các biến thành phần;
} Tên_kiểu_cấu_trúc;
- Khai báo: Tên_kiểu_cấu_trúc Vùng_nhớ Tên_biến;
Ví dụ:

Typedef struct {
char day;
char month;
int year;
} Date_type;
Date_type date,date_arr[5];

b. Phép toán
Phép gán kí hiệu: “=”.
- Cú pháp: Biến_1 = Biến_2;
Trong đó Biến_2 có thể là giá trị xác định cũng có thể là biến.
Phép toán số học
Phép toán

Ý nghĩa

Ví dụ

+

Phép cộng

X = a+b;

-

Phép trừ

X = a-b;

*

Phép nhân

X = a*b;

/

Phép chia lấy phần nguyên

X = a/b;
(a=9, b=2 → X=4)

%

Phép chia lấy phần dư

X = a%b;
(a=9, b=2 → X=1)

Phép toán Logic
Chức năng

Phép toán

Trang: 13


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
AND

&&

OR

||

NOT

!

Các phép toán so sánh:
Phép toán

ý nghĩa

>

So sánh lớn hơn

Ví dụ
a>b
4>5 sẽ trả ra giá trị 0

>=

So sánh lớn hơn hoặc bằng

a>=b
6>=2 sẽ trả ra giá trị 1

<

So sánh nhỏ hơn

a6<7 sẽ trả ra giá trị 1

<=

So sánh nhỏ hơn hoặc bằng

a<=b
8<=5 sẽ trả ra giá trị 0

==

So sánh bằng nhau

a==b
6==6 sẽ trả ra giá trị 1

!=

So sánh khác nhau

a!=b
9!=9 sẽ trả ra giá trị 0

Phép toán thao tác Bit
Phép toán

Ý nghĩa

Ví dụ

&

Phép và (AND)

Bit_1 & Bit_2

|

Phép hoặc (OR)

Bit_1 | Bit_2
Trang: 14


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

!

Phép đảo (NOT)

!Bit_1

^

Phép hoặc loại trừ (XOR)

Bit_1 ^ Bit_2

<<

Dịch trái

a<<3

>>

Dịch phải

a>>4

Lấy bù theo bit

~a

~

Phép toán kết hợp
Phép toán

Ví dụ

+=

a+=5 <=> a=a+5

-=

a-=5 <=> a=a-5

*=

a*=5 <=> a=a*5

/=

a/=5 <=> a=a/5

%=

a%=5 <=> a=a%5

Cấu trúc chương trình C
Cấu trúc chương trình
* Cấu trúc:
1. Khai báo chỉ thị tiền xử lý
2. Khai báo các biến toàn cục
3. Khai báo nguyên mẫu các hàm
4. Xây dựng các hàm và chương trình chính
* Ví dụ:
// Khai báo chỉ thị tiền xử lý:
#include
#include
#define Led1 P1_0
//*********************************
// Khai báo biến toàn cục:
Trang: 15


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Unsigned char code Led_arr[3];
Unsigned char data dem;
Unsigned int xdata X;
//*********************************
// Khai báo nguyên mẫu hàm
Void delay(unsigned int n);
bit kiemtra(unsigned int a);
//*********************************
// Xây dựng các hàm và chương trình chính:
void delay(unsigned int n)
{
Khai báo biến cục bộ;
Mã chương trình trễ;
}
Void main() // Chương trình chính
{
Khai báo biến cụ bộ;
Mã chương trình chính;
}
Bit kiemtra(unsigned int a)
{
Khai báo biến cục bô;
Mã chương trình kiểm tra biến a;
}
Chú ý: Hàm không khai báo nguyên mẫu phải được xây dựng trước hàm có lời gọi
hàm đó. Ở ví dụ trên do hàm “bit kiemtra(unsigned int a)” đã được khai báo nguyên
mẫu hàm ở trên nên có thể xây dựng hàm ở bất kì vị trí nào trong chương trình.
Tuy nhiên chúng ta nên khai báo nguyên mẫu hàm trước hàm main, và xây
dựng các hàm phụ ở sau hàm main. Như thế sẽ tạo thói quen lập trình gọn gàng
hơn, và cũng tạo thuận lợi hơn cho việc xem lại code, tìm kiếm và sửa lỗi sau này.
Chỉ thị tiền xử lý
Các chỉ thị tiền sử lý không phải là các lệnh của ngôn ngữ C mà là các lệnh giúp
cho việc soạn thảo chương trình nguồn C trước khi biên dịch. Khi dịch một chương
trình C thì không phải chính bản chương trình nguồn mà ta soạn thảo được dịch.
Trước khi dịch, các lệnh tiền xử lý sẽ chỉnh lý bản gốc, sau đó bản chỉnh lý này sẽ
được dịch. Có ba cách chỉnh lý được dùng là:
+ Phép thay thế #Define
+ Phép chèn tệp #Include
+ Phép lựa chọn biên dịch #Ifdef

Trang: 16


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Các chỉ thị tiền xử lý giúp ta viết chương trình ngắn gọn hơn và tổ chức biên
dịch, gỡ rối chương trình linh hoạt, hiệu quả hơn.
* Chỉ thị #Define: Chỉ thị #define cho phép tạo các macro thay thế đơn giản.
- Cú pháp: #Define Tên_thay_thế dãy_kí_tự
Một Tên_thay_thế có thể được định nghĩa lại nhiều lần, nhưng trước khi định nghĩa
lại phải giải phóng định nghĩa bằng chỉ thị:
#Undef Tên_thay_thế
- Ví dụ:

#define N 100

* Chỉ thị #Include: Chỉ thị #include báo cho trình biên dịch nhận nội dung của tệp
khác và chèn vào tệp chương trình nguồn mà ta soạn thảo.
- Cú pháp:
Cách 1:
Cách 2:

#include
#include“tên_tệp”

- Ví dụ:
Cách 1: #include
Ở cách này tệp regx51.h sẽ được tìm trong thư mục INC để chèn vào chương trình
nguồn.
Cách 2: #include“regx51.h”
Ở cách này tệp regx51.h sẽ được tìm trong thư mục chứa chương trình nguồn nếu
không có mới tìm trong thư mục INC.
Khi muốn chèn tệp ngoài thư viện hoặc ngoài thư mục chứa chương trình nguồn
thìtên_tệp sẽ bao gồm cả đường dẫn thư mục chứa tệp.
* Chỉ thị #Ifdef: Chỉ thị #ifdef này thường dùng để biên dịch các tệp thư viện.
- Cú pháp:
Cách 1:
Cách 2:

#Ifdef ten_macro
//Đoạn chương trình
#endif
#ifdef ten_macro
//Đoạn chương trình 1
#else
//Đoạn chương trình 2
#endif

Trang: 17


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Ở cách 1: nếu tên_macro đã được định nghĩa thì “Đoạn chương trình” sẽ được
dịch, ngược lại thì “Đoạn chương trình” sẽ bị bỏ qua.
* Chỉ thị #Ifndef: Chỉ thị #ifndef này thường dùng để biên dịch các tệp thư viện.
- Cú pháp:
Cách 1:
#ifndef ten_macro
//Đoạn chương trình
#endif
Cách 2:
#ifndef ten_macro
//Đoạn chương trình 1
#else
//Đoạn chương trình 2
#endif
Ở cách 1: nếu tên_macro chưa được định nghĩa thì “Đoạn chương trình” sẽ được
dịch, ngược lại thì “Đoạn chương trình” sẽ bị bỏ qua.
Chú thích trong chương trình
Việc viết chú thích trong trình nhằm mục đích giải thích ý nghĩa của câu
lệnh, đoạn chương trình hoặc hàm hoạt động như thế nào và làm gì. Viết chú thích
sẽ giúp cho người đọc có thể hiểu được chương trình dễ dàng và nhanh chóng hơn,
sửa lỗi đơn giản hơn hoặc giúp cho ta xem lại chương trình cũ mà ta đã làm trở lên
nhanh hơn.
Chú thích trong chương trình sẽ không ảnh hưởng đến chương trình mà ta
soạn thảo vì trình dịch sẽ bỏ qua tất cả lời chú thích khi biên dịch chương trình sang
mã máy.
Lời giải thích được đặt sau dấu “//” nếu chú thích chỉ viết trên một dòng
hoặc trong cặp dấu “\*” và “*\”.
1.3.3 Các lệnh cơ bản trong C
+ Câu lệnh rẽ nhánh - if:
- Cấu trúc 1:

if(dieu_kien)
{
// Đoạn chương trình
}

Giải thích: nếu dieu_kien đúng thì xử lí các câu lệnh bên trong còn sai thì
nhảy qua.
- Cấu trúc 2:

if(dieu_kien)
{
// Đoạn chương trình 1
Trang: 18


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
}
else
{
// Đoạn chương trình 2
}
Giải thích: nếu dieu_kien đúng thì xử lí “Đoạn chương trình 1” bên trong còn
sai thì xử lý “Đoạn chương trình 2”.
+ Câu lệnh lựa chọn - Switch:
Cấu trúc:

switch(biến)
{
case gia_tri_1:

//các câu lệnh
break;
case gia_tri_2:
//các câu lệnh
break;
……………………………………...
case gia_tri_n:
//các câu lệnh
break;
Default:
//các câu lệnh
}
Giải thích: Tuỳ vào biến có giá trị bằng giá trị của Case nào thì thực hiện các
câu lệnh tương ứng trong Case đó, sau đó thoát khỏi cấu trúc nhờ câu lệnh “break;”.
Nếu không có Case nào phù hợp thì thực hiện các câu lệnh trong default.
+ Vòng lặp xác định - For:
Cấu trúc:

for( x=n ; điều_kiện ; phép_toán )
{
// các câu lệnh xử lí
}

Giải thích: x là biến, n là giá trị xác định. Trước tiên vòng lặp sẽ gán giá trị
ban đầu cho biến: x=n, rồi kiểm tra nếu điều_kiện đúng thì thực hiện các câu lệnh
xử lý, sau đó thực hiện Phép_toán nhằm tác động đến điều kiện. Sau đó lại kiểm tra
lại điều_kiện, nếu còn đúng thì thực hiện tiếp, nếu sai sẽ thoát khỏi vòng lặp.
Các thành phần trong vòng for có thể không cần khai báo,for sẽ bỏ qua phần
đó, nhưng vẫn phải có đủ 2 dấu “;”.
Trang: 19


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
+ Vòng lặp không xác định - while:
Cấu trúc:

while(dieu_kien)
{
// các câu lệnh
}

Giả thích: Trước tiên chương trình sẽ kiểm tra điều_kiện, nếu đúng thì thực hiện
các câu lệnh, sau đó quay lại kiểm tra điều_kiện. Còn nếu điều_kiện sai thì thoát
khỏi vòng lặp ngay.
+ Vòng lặp không xác định - do while:
Cấu trúc:

do
{
// các câu lệnh
} while(dieu_kien);

Giả thích: Trước tiên đoạn chương trình thực hiện các câu lệnh sau đó kiểm
trađiều_kiện nếu đúng thì lặp lại thực hiện các câu lệnh tiếp, nếu sai thì thoát khỏi
vòng
lặp.

Trang: 20


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

Chương 2 Tổng quan về DS1307 và nguyên lý giao tiếp theo chuẩn
I2C
2.1 Tổng quan về DS1307
2.1.1 Sơ đồ chân:

X1, X2: Kết nối với
thạch anh tạo xung dao động
VBAT : Ngõ ra kết nối
với Pin để duy trì bộ đếm thời
gian thực.
GND : Nối đất, nguồn âm.
Vcc
: Nối nguồn (Nguồn để truyền dữ liệu)
SQW/OUT: Chân xuất xung vuông từ DS1307 ra ngoài
SCL : Chân clock để truyền dữ liệu
SDA : Chân dữ liệu.

2.1.2

Sơ đồ kết nối với các linh kiện ngoại vi

Chân SQW/OUT nếu không sử dụng có thể để trông không kết nối với các
bộ phận ngoại vi khác.
Nguồn sử dụng: Nguồn DC điện áp nằm trong khoảng 4.5V đến 5.5V.
Thạch anh có độ lớn 32.768 kHz.

2.1.3 RAM lưu trữ và điều khiển DS1307 (RTC RAM)
Trang: 21


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

2.1.4

RTC RAM có địa chỉ từ 00H-08H
Dữ liệu được lưu trữ dưới dạng BCD.
Có thể hiển thị dưới dang 12h/24h.
Truyền dữ liệu thông qua chuẩn truyền thông I2C.
Chuẩn truyền thông I2C:

Một thiết bị gửi dữ liệu trên một dây đẫn được định nghĩa là thiết bị truyền và
thiết bị nhận dữ liệu là thiết bị nhận. Thiết bị điều khiển dữ liệu gửi được gọi là
Master. Thiết bị chịu sự điều khiển của Master gọi là Slave.
Dây dẫn phải được điều khiển bởi Master phát một xung clock (SCL), xung
clock gồm có Start bit, và Stop bit. DS1307 hoạt động như một Slave.
2.1.5 Điều kiện để dữ liệu có thể truyền dẫn trên chuẩn I2C:
Những điều kiện:
Đường truyền rảnh: Cả hai dây dẫn SCL (clock) và SDA (dữ liệu) ở mức
cao (HIGH).
Bắt đầu truyền dữ liệu (Start bit): Thay đổi trạng thái ở dây dữ liệu
(SDA), từ Cao xuống Thấp.
Dừng việc truyền dữ liệu (Stop bit): Thay đổi trạng thái ở dây dữ liệu
(SDA), ở mức thấp (LOW) sang mức cao (HIGH).
Dữ liệu hợp lệ: Dữ liệu chỉ có giá trị sau khi co điều kiện truyền dữ liệu
(Start bit), Dữ liệu có mức không thay đổi (mức logic không đổi) trong khi
xung clock (SCL) ở mức Cao, Dữ liệu có thể thay đổi mức logic khi xung
clock (SCL) ở mức Thấp, 1 xung clock tương đương với 1 bit dữ liệu.
Dữ liệu truyền không giới hạn.
Khi nhận được dữ liệu, sẽ có một tín hiệu phản hồi (Acknowledges,
ACK) trên dây SDA nhằm xác nhận việc đã nhận dữ liệu thành công.
2.1.6 Cấu trúc dữ liệu:
Trang: 22


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Có 2 loại truyền dữ liệu có khả năng:
a.
Slave nhận dữ liệu:
Dữ liệu nối tiếp nhận được thông qua 2 chân SCL và SDA. Sau khi mỗi
Byte đữ liệu được nhận sẽ có 1 ACK (bit xác nhận) được truyền đi. Start và
Stop được công nhận như bắt đầu và kết thúc của việc truyền dữ liệu nối tiếp.
Phần mềm sẽ xác định địa chỉ Slave và bit điều khiển. Byte địa chỉ là byte đầu
tiên nhận được sau khi có điều kiện Start. Địa chỉ Slave bao gồm 7 bit đia chỉ
Ds1307, với 1101000, theo sau đó là bit điều khiển đọc/ghi, ghi là 0, đọc là 1.
Sau khi nhận và giải mã byte địa chỉ Slave. Ds1307 xuất ra 1 tín hiệu xác nhân
(ACK) trên SDA. Sau khi xác nhận (ACK) địa chỉ Slave và bit điều khiển
(ghi), Master truyền dữ liệu trên chân SDA Ds1307. Khi kết thúc việc gửi dữ
liệu Master sẽ gửi một Stop bit để kết thúc việc gửi.
b.
Slave truyền dữ liệu:
Byte đầu tiên đã được nhận và xử lý trên Slave. Trong trường hợp này, bit điều
khiển sẽ được cho biết rằng điều khiển truyền được đảo ngược ( Dữ liệu sẽ bị đảo
ngược khi nhận được, MSB bit sẽ được truyền đầu tiên). Ds1307 sẽ truyền dữ liệu
nối tiếp trên SDA khi nhận được xung clock ở SCL. Điều kiện Start and Stop được
công nhận như là bắt đầu và kết thúc của truyền nối tiếp. Byte địa chỉ Slave sẽ là
byte đầu tiên nhận được sau khi điều kiện Start được phát ra bởi Master. Địa chỉ
Slave là 1101000, theo sau là bit điều khiển đọc/ghi, nó là 1 khi đọc dữ liệu từ
Slave. Sau khi nhận và giải mã địa chỉ Slave, Ds1307 sẽ xuất một xung xác nhận
(ACK) trên SDA. Ds1307 sẽ bắt đầu truyền dữ liệu bắt đầu với con trỏ dữ liệu, nếu
con trỏ dữ liệu không được ghi trước khi bắt đầu đọc dữ liệu thì dữ liệu sẽ được
truyền ở địa chỉ đầu tiên mà nó đã đọc lần cuối cùng mà nó có sẵn trên con trỏ dữ
liệu (đọc từ vị trí 00H). Ds1307 phải nhận được một tín hiệu “Không xác nhận”
(NOT ACK) để kết thúc việc đọc.

2.2 Nguyên lý giao tiếp Vi điều khiển với thiết bị ngoại vi theo chuẩn I2C

2.2.3. IC thời gian thực DS1307

 Chức năng các chân:

Hình 2.9: Sơ đồ chân DS1307
X1,X2: nối với thạch anh 32,768 kHz
Trang: 23


Trường đại học công nghiệp Hà Nội
Khoa Ðiện
Vcc,GND: nguồn một chiều được cung cấp tới các chân này. Vcc là đầu vào 5V.
Khi 5V được cung cấp thì thiết bị có thể truy cập hoàn chỉnh và dữ liệu có thể đọc
và viết. Khi pin 3V được nối tới thiết bị này và Vcc nhỏ hơn 1,25Vbat thì quá trình
đọc và viết không được thực thi,tuy nhiên chức năng timekeeping không bị ảnh
hưởng bởi điện áp vào thấp. Khi Vcc nhỏ hơn Vbat thì RAM và timekeeper sẽ được
ngắt tới nguồn cung cấp trong (thường là nguồn 1 chiều 3V).
Vbat: Đầu vào pin cho bất kỳ một chuẩn pin 3V. Điện áp pin phải được giữ trong
khoảng từ 2,5 đến 3V để đảm bảo cho sự hoạt động của thiết bị.
SDA(serial data input/out): là chân vào ra cho 2 đường dây nối tiếp. Chân SDA
thiết kế theo kiểu cực máng hở , đòi hỏi phải có một điện trở kéo trong khi hoạt
động.
SCL(serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên
đường dây nối tiếp
SQW/OUT(square wave/output driver)- khi được kích hoạt thì bit SQWE được
thiết lập, chân SQW/OUT phát đi 1 trong 4 tần số (1Hz, 4kHz, 8kHz, 32kHz). Chân
này cũng được thiết kế theo kiểu cực máng hở vì vậy nó cũng cần có một điện trở
kéo trong. Chân này sẽ hoạt động khi cả Vcc và Vbat được cấp.

 Một vài thông số kỹ thuật:
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
gianvà ngày tháng với 56 bytes NV 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. DS 1307 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.



Sơ đồ khối của DS1307:

Trang: 24


Trường đại học công nghiệp Hà Nội
Khoa Ðiện

Hình 2.10: Sơ đồ khối của DS1307
Địa chỉ Ram và RTC: Thông tin về thời gian và ngày tháng được lấy ra bằng cách
đọc các byte thanh ghi thích hợp. Thời gian và ngày tháng được thiết lập cũng
thông qua các byte thanh ghi này bằng cách viết vào đó những giá trị thích hợp. nội
dung của các thanh ghi dưới dạng mã BCD(binary coded decreaseimal). Bit 7 của
thanh ghi seconds là bit clock halt(CH), khi bit này được thiết lập 1 thì dao động
disable, khi nó được xoá về 0 thì dao động được enable.

Trang: 25


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay

×

×