Cơ sở lý thuyết
Tổng quan về họ vi điều khiển 8051 ( 89S52)
89S52 là vi điều khiển 8 bit thuộc họ 8051, cho phép xử lý dữ liệu 8 bit tại một thời điểm Với công nghệ CMOS chất lượng cao và công suất thấp, 8051 tích hợp 4 KB PEROM (bộ nhớ chỉ đọc có thể lập trình và xóa).
Các đặc điểm của 8951 đời đầu được tóm tắt như sau:
- 4KB bộ nhớ, có thể lập trình lại nhanh, có khả năng ghi xóa tới 1000 chu kỳ
- Tần số hoat động từ 0 Hz đến 24 MHz
- 3 mức khóa bộ nhớ lập trình
- 64 KB vùng nhớ mã ngoài.
- 64 KB vùng nhớ dữ liệu ngoài
- Xử lý Boolean (hoạt động trên bit đơn)
- 210 vị trí nhớ có thể định vị bit
- 4s cho hoạt động nhân hoặc chia
2 Sơ đồ khối và sơ đồ chân của AT89C51
Hình 1: Sơ đồ khối của AT89S52
Hình 2 - Sơ đồ chân và hình dạng thực tế của 8051 (89S52)
Port 0 không chỉ có chức năng xuất nhập dữ liệu mà còn hoạt động như một bus đa hợp dữ liệu và địa chỉ (AD0-AD7) Chức năng này được sử dụng khi vi điều khiển AT89C51 giao tiếp với các thiết bị bên ngoài có kiến trúc bus.
Có chức năng xuất nhập theo bit và byte Ngoài ra, 3 chân P1.5, P1.6, P1.7 được dùng để nạp ROM theo chuẩn ISP, 2 chân P1.0 và P1.1 được dùng cho bộ Timer2
Là một port có công dụng kép Là đường xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ mở rộng
Mỗi chân trên port 3 ngoài chức năng xuất nhập ra còn có một số chức năng đặc biệt sau:
Để thực hiện quá trình reset, cần cung cấp mức điện áp 5V cho chân tích cực 1 trong thời gian tối thiểu là 2 chu kỳ máy, tương đương với 2às khi sử dụng thạch anh 12MHz.
AT89S52 được trang bị một bộ dao động tích hợp trên chip, thường được kết nối với một bộ dao động thạch anh với tần số tối đa lên đến 33MHz, trong đó tần số phổ biến nhất là 12MHz.
EA thường được thiết lập ở mức cao (+5V) hoặc thấp (GND) Khi ở mức cao, bộ vi điều khiển thực hiện chương trình từ ROM nội, trong khi ở mức thấp, chương trình chỉ được thực hiện từ bộ nhớ mở rộng.
- ALE (Address Latch Enable - chân 30):
ALE là tín hiệu dùng để xác định địa chỉ vào một thanh ghi bên ngoài trong nửa đầu chu kỳ bộ nhớ Tiếp theo, trong nửa chu kỳ sau, các đường port 0 sẽ được sử dụng để xuất hoặc nhập dữ liệu.
- PSEN (Program Store Enable - chân 29):
PSEN là chân điều khiển quan trọng cho phép mở rộng bộ nhớ chương trình, thường được kết nối với chân /OE của EPROM để đọc mã lệnh Trong quá trình đọc lệnh, PSEN sẽ ở mức thấp, cho phép các mã nhị phân được truyền từ EPROM qua Bus và được lưu vào thanh ghi lệnh của bộ vi điều khiển để giải mã Khi chương trình trong ROM nội được thực thi, PSEN sẽ chuyển sang mức thụ động (mức cao).
AT89S52 dùng nguồn một chiều có dải điện áp từ 4V - 5.5V được cấp qua chân 40 (Vcc) và chân 20 (GND).
Màn hình LCD 16x2
Trên thị trường hiện nay, có đa dạng loại màn hình LCD với nhiều mẫu mã và hình dạng khác nhau LCD có thể được phân loại thành hai loại chính dựa trên kích cỡ và khả năng hiển thị: hiển thị ký tự và hiển thị đồ họa.
Loại hiển thị ký tự (character LCD) có các kích cỡ: 16x1, 16x2, 16x4…mỗi ký tự được tạo thành bởi một ma trận các điểm sáng kích thước 5x7 hoặc 5x10 điểm ảnh.
Hình 3: Ảnh minh hoạ sơ đồ chân và hình dạng thực tế của LCD 16x2
LCD được chúng em sử dụng là loại có 16 chân, chức năng của các chân được cho trong bảng 3.
Bảng 2: Mô tả các chân của LCD
Chân Ký hiệu I/O Mô tả
3 Vee - Cấp nguồn cho vi điều khiển
4 RS I RS= 0 chọn thanh ghi lệnh RS= 1 chon thanh ghi dữ liệu.
5 R/W I R /W = 1 đọc dữ liệu R/W= 0 ghi dữ liệu
7 DB0 I/O Các bit dữ liệu
8 DB1 I/O Các bit dữ liệu
9 BD2 I/O Các bit dữ liệu
10 DB3 I/O Các bit dữ liệu
11 DB4 I/O Các bit dữ liệu
12 DB5 I/O Các bit dữ liệu
13 DB6 I/O Các bit dữ liệu
14 DB7 I/O Các bit dữ liệu
2 Chức năng các chân của LCD
- Chân Vcc, Vss và Vee
Cấp dương nguồn 5V và đất tương ứng thì Vee được dùng để điều khiển độ tương phản của LCD.
- Các chân chọn thanh ghi RS (Register select)
Trong LCD, hai thanh ghi quan trọng là thanh ghi mã lệnh và thanh ghi dữ liệu Chân RS được sử dụng để chọn giữa hai thanh ghi này: khi RS = 0, thanh ghi mã lệnh được chọn, cho phép người dùng gửi các lệnh như xoá màn hình hoặc di chuyển con trỏ về đầu dòng.
RS= 1 thì thanh ghi dữ liệu được chọn cho phép người dùng gửi dữ liệu cần hiển thị trên LCD.
- Chân đọc/ghi (R/W) Đầu đọc/ghi cho phép người dùng ghi thông tin trên LCD Khi R/W = 0 thì ghi, R/W = 1 thì đọc.
Chân E của LCD cho phép chốt thông tin hiện tại trên chân dữ liệu Khi dữ liệu được cung cấp, một xung từ cao xuống thấp cần được áp dụng vào chân E để chốt dữ liệu Độ rộng của xung này phải đạt tối thiểu 450ns.
Chân D0 – D7 là 8 chân dữ liệu 8 bit, dùng để truyền thông tin tới LCD hoặc đọc nội dung từ các thanh ghi của nó Để hiển thị chữ cái và số, chúng ta gửi mã ASCII tương ứng của các ký tự từ A đến Z, a đến z và số từ 0 đến 9 qua các chân này khi RS=1 Ngoài ra, còn có các mã lệnh để xóa màn hình, đưa con trỏ về đầu dòng hoặc làm nhấp nháy con trỏ.
Để kiểm tra trạng thái sẵn sàng của LCD, cần sử dụng RS = 0 nhằm kiểm tra cờ bận (D7) Khi R/W = 1 và RS = 0, nếu D7 = 1, có nghĩa là LCD đang bận với các tác vụ bên trong và không thể nhận thông tin mới Ngược lại, nếu D7 = 0, LCD đã sẵn sàng để tiếp nhận dữ liệu Việc kiểm tra cờ bận trước khi ghi dữ liệu lên LCD là rất quan trọng.
3 Bảng mã lệnh của LCD
Mỗi lệnh gửi đến LCD cần một khoảng thời gian nhất định để hoàn tất, có thể lâu do tốc độ của MPU, vì vậy cần kiểm tra cờ BF hoặc sử dụng delay để đảm bảo LCD thực hiện xong lệnh trước khi ra lệnh tiếp theo Địa chỉ RAM sẽ tự động tăng hoặc giảm 1 đơn vị mỗi khi có lệnh ghi vào RAM, giúp rút ngắn chương trình.
Các lệnh của LCD có thể chia thành 4 nhóm như sau:
- Các lệnh về kiểu hiển thị
Ví dụ: Kiểu hiển thị (1 hàng/2 hàng), chiều dài dữ liệu (8 bit/4 bit),…
- Chỉ định địa chỉ RAM nội.
- Nhóm lệnh truyền dữ liệu trong RAM nội
Bảng 3: Một số mã lệnh thường gặp của LCD
Mã HEX Lệnh đến các thanh ghi của LCD
1 Xoá màn hình hiển thị
4 Giảm con trỏ (Con trỏ dịch sang trái)
6 Tăng con trỏ (con trỏ dịch sang phải)
5 Dịch hiển thị sang phải
7 Dịch hiển thị sang trái
8 Tắt con trỏ, tắt hiển thị
A Tắt hiển thị, bật con trỏ
C Bật hiển thị, tắt con trỏ
E Bật hiển thị, nhấp nháy con trỏ
F Tắt con trỏ, nhấp nháy con trỏ
10 Dịch vị trí con trỏ sang trái
14 Dịch vị trí con trỏ sang phải
18 Dịch toàn bộ hiển thị sang trái
1C Dịch toàn bộ hiển sang phải
80 Ép con trỏ về đầu dòng thứ nhất
C0 Ép con trỏ về đầu dòng thứ hai
38 Hai dòng và ma trận 5x7
IC hiển thị thời gian thực DS1307
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 ngày tháng.
- Đị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 cấp 3V:
+ DS1307 có 7 byte dữ liệu nằm từ địa chỉ 0x00 tới 0x06, 1 byte điều khiển và
56 byte lưu trữ (dành cho người dùng).
Khi xử lý dữ liệu từ DS1307, thiết bị tự động chuyển đổi dữ liệu sang dạng BCD Ví dụ, khi đọc dữ liệu từ địa chỉ 0x04 (ngày trong tháng) và 0x05 (tháng), ta nhận được giá trị 0x15 cho tháng và 0x11 cho ngày.
Chân SQW/OUT của DS1307 đóng vai trò quan trọng trong việc phát xung ra với 4 chế độ tần số khác nhau: 1 Hz, 4.096 Hz, 8.192 Hz và 32.768 Hz Các chế độ này được xác định thông qua các bit trong thanh ghi Control Register tại địa chỉ 0x07.
+ Địa chỉ của DS1307 là 0xD0.
DS1307 hoạt động như một thiết bị slave trên bus nối tiếp, với việc truy cập được thực hiện thông qua các chỉ thị start và mã thiết bị được xác định bởi địa chỉ của các thanh ghi Sau đó, các thanh ghi sẽ được truy cập liên tục cho đến khi chỉ thị stop được thực hiện.
2 Cơ chế hoạt động và chức năng của DS1307
- X1, X2: nối với thạch anh 32,768 kHz.
- SQW/OUT: dãy xung clock.
DS1307 là một IC thời gian thực hoạt động với nguồn cấp nhờ vào khả năng cập nhật thời gian và ngày tháng, cùng với 56 bytes SRAM Địa chỉ và dữ liệu được truyền qua hai đường bus 2 chiều IC này cung cấp thông tin về giờ, phút, giây, thứ, ngày, tháng và năm, đồng thời tự động điều chỉnh ngày cuối tháng cho các tháng có ít hơn 31 ngày, bao gồm cả việc nhảy năm Đồng hồ có thể hoạt động ở chế độ 24 giờ.
DS1307 hoạt động như một thiết bị phụ (slave) trên đường truyền 12 giờ với chỉ thị AM/PM Nó tích hợp mạch cảm biến điện áp để phát hiện các lỗi điện áp và tự động ngắt nguồn pin cung cấp Việc truy cập vào DS1307 diễn ra thông qua chỉ thị START cùng với mã thiết bị xác định từ địa chỉ các thanh ghi, và các thanh ghi sẽ được truy cập liên tục cho đến khi chỉ thị STOP được thực hiện.
Mô tả hoạt động của các chân:
Vcc và GND là các chân cung cấp nguồn một chiều cho thiết bị, với Vcc là đầu vào 5V Khi nguồn 5V được kết nối, thiết bị có thể thực hiện đầy đủ chức năng đọc và ghi dữ liệu Tuy nhiên, nếu pin 3V được sử dụng và Vcc giảm xuống dưới 1,25 Vbat, quá trình đọc và ghi sẽ không thực hiện được, nhưng chức năng giữ thời gian vẫn hoạt động bình thường Khi Vcc thấp hơn Vbat, RAM và bộ giữ thời gian sẽ được ngắt nguồn và chuyển sang sử dụng nguồn 3V.
Vbat là đầu vào pin cho các chuẩn pin 3V, yêu cầu điện áp pin phải duy trì trong khoảng từ 2,5V đến 3V để đảm bảo thiết bị hoạt động hiệu quả.
- 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.
- SDA (Serial Data Input/Output): 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.
SQW/OUT (Square Wave/Output Driver) là chân đầu ra phát tín hiệu vuông, khi được kích hoạt, bit SQWE sẽ được thiết lập thành 1, cho phép chân SQW/OUT phát ra một trong bốn tần số: 1 Hz, 4 kHz, 8 kHz hoặc 32 kHz Chân này có thiết kế cực máng hở, do đó cần có một điện trở kéo trong để hoạt động hiệu quả Để chân SQW/OUT hoạt động, cả Vcc và Vbat phải được cấp điện.
- X1, X2: được nối với thạch anh tần số 32,768 kHz, với ccaaufs hình này thì chân X1 sẽ được nối vào tín hiệu dao động trong còn X2 thì để hở.
Hình 4: Sơ đồ chân của DS1307
Bên trong DS1307, cấu trúc bao gồm các thành phần chính như mạch nguồn, mạch dao động, mạch điều khiển logic, mạch giao diện IC, con trỏ địa chỉ và các thanh ghi (RAM).
3 Sơ đồ địa chỉ RAM và RTC
Bộ nhớ DS1307 có 64 thanh ghi 8 bit, được đánh địa chỉ từ 0 đến 63 (00H đến 3FH theo hệ Hexa) Trong số đó, chỉ có 8 thanh ghi đầu tiên phục vụ cho chức năng đồng hồ thời gian thực (RTC), trong khi 56 thanh ghi còn lại có thể được sử dụng như RAM để chứa biến tạm Bảy thanh ghi đầu chứa thông tin thời gian, bao gồm giây (SECONDS), phút (MINUTES), giờ (HOURS), thứ (DAY), ngày (DATE), tháng (MONTH) và năm (YEAR).
Thông tin về thời gian và ngày tháng được lấy và thiết lập thông qua việc đọc và ghi các byte thanh ghi thích hợp Nội dung của các thanh ghi được mã hóa dưới dạng BCD Đặc biệt, bít 7 của thanh ghi giây là bít clock halt (CH); khi bít này được thiết lập thành 1, dao động sẽ bị vô hiệu hóa.
0 thì dao động được thiết lập.
Chú ý: Enable dao động trong suốt quá trình cấu hình thiết lập (CH=0) Thanh ghi thời gian thực được mô tả như sau:
Hình 6: Tổ chức bộ nhớ của DS1307
Bảng 4: Tổ chức các thanh ghi thời gian
Thanh ghi giây (SECONDS) của DS1307 là thanh ghi đầu tiên trong bộ nhớ, có địa chỉ 0x00 Bốn bit thấp của thanh ghi này lưu trữ mã BCD 4-bit cho chữ số hàng đơn vị của giây Vì giá trị cao nhất của chữ số hàng chục là 5, chỉ cần 3 bit để mã hóa.
Thanh ghi phút (MINUTES): có địa chỉ 01H, chứa giá trị phút của đồng hồ.
Tương tự như thanh ghi SECONDS, chỉ có 7 bit của thanh ghi này được dùng để lưu mã BCD của phut, bit 7 luôn bằng 0.
Thanh ghi giờ (HOURS) có địa chỉ 02H, với bốn bit thấp dùng để biểu diễn chữ số hàng đơn vị của giờ DS1307 hỗ trợ cả chế độ 24h và 12h, trong đó bit thứ 6 xác định chế độ hoạt động Khi bit này ở mức cao, chế độ 12h được chọn, và bit 5 sẽ chỉ định AM/PM, với mức cao tương ứng với PM Ngược lại, trong chế độ 24h, bit 5 biểu thị giờ từ 20h đến 23h, trong khi bit 7 luôn bằng 0.
Thanh ghi thứ (DAY): nằm ở địa chỉ 03H Thanh ghi DAY chỉ mang giá trị từ
1 đến 7 tương ứng từ Chủ Nhật đến thứ 7 trong tuần Vì thế chỉ có 3 bit thấp trong thanh ghi này có nghĩa.
Các thanh ghi còn lại có cấu trúc tương tự, DATE chứa ngày trong tháng (từ
1 đến 31), MONTH chứa tháng (từ 1 đến 12) và YEAR chứa năm (từ 00 đến
99) Trong DS1307 chỉ dùng cho 100 năm, nên giá trị năm chỉ có 2 chữ số, phaand đầu của năm do người dùng tự thêm vào.
Ngoài các thanh ghi này trong bộ nhớ DS1307 cồn có một thanh ghi khác nằm riêng gọi là con trỏ địa chỉ.
Khi thực hiện chỉ thị START trong quá trình truy cập dữ liệu, dòng thời gian sẽ được chuyển tới thanh ghi thứ hai và thông tin thời gian sẽ được đọc từ thanh ghi này, trong khi đồng hồ vẫn tiếp tục chạy DS1307 có một thanh ghi điều khiển để quản lý hoạt động của chân SQW/OUT.
OUT (Điều khiển đầu ra): Bit này quản lý mức tín hiệu tại chân SQW/OUT khi đầu ra xung vuông bị ngắt Nếu SQWE = 0, chân SQW/OUT sẽ có mức logic bằng 1 khi OUT = 1 và sẽ có mức logic bằng 0 khi OUT = 0.
IC ADC 0804
Bộ chuyển đổi ADC là bộ chuyển đổi tín hiệu ở dạng tương tự sang dạng số để có thể làm việc được với CPU.
Các máy tính số hoạt động dựa trên giá trị nhị phân, trong khi thế giới vật lý lại chứa đựng nhiều đại lượng liên tục như nhiệt độ, áp suất, độ ẩm và vận tốc Để chuyển đổi các đại lượng vật lý này thành tín hiệu điện, người ta sử dụng các bộ biến đổi hay còn gọi là bộ cảm biến Những bộ cảm biến này, bao gồm cảm biến nhiệt, tốc độ, áp suất và ánh sáng, cung cấp tín hiệu điện hoặc điện áp ở dạng liên tục Để vi điều khiển có thể đọc được các tín hiệu này, cần có bộ chuyển đổi tương tự sang số, trong đó chip ADC0804 là một trong những lựa chọn phổ biến.
Hình 7: Sơ đồ chân và hình dạng thực tế của IC ADC0804
Chip ADC0804 là bộ chuyển đổi tương tự số 8 bit thuộc họ ADC800 của National Semiconductor, được sản xuất bởi nhiều hãng khác Chip hoạt động với điện áp nuôi +5V, trong đó thời gian chuyển đổi là yếu tố quan trọng bên cạnh độ phân giải Thời gian chuyển đổi được xác định là thời gian cần thiết để chuyển đổi tín hiệu tương tự thành số nhị phân, với ADC0804 có thời gian chuyển đổi không nhỏ hơn 110 µs, phụ thuộc vào tần số đồng hồ tại chân CLK và CLK IN Các chân khác của ADC0804 đảm nhận các chức năng riêng biệt trong quá trình hoạt động.
Chân số 1 của ADC0804, gọi là CS (Chip select), là chân chọn chip với đầu vào tích cực mức thấp, được sử dụng để kích hoạt chip Để có thể truy cập vào ADC0804, chân CS cần được đặt ở mức thấp.
Chân RD (Read) của bộ chuyển đổi ADC0804 là chân nhận tín hiệu vào tích cực ở mức thấp Nó có chức năng chuyển đổi đầu vào tương tự thành số nhị phân và lưu trữ trong một thanh ghi Khi chân CS = 0, nếu có xung từ cao xuống thấp tại chân RD, dữ liệu đã được chuyển đổi sẽ được xuất ra dưới dạng số 8 bit tại các chân dữ liệu (DB0 – DB7).
- WR (Write): Chân số 3, đây là chân vào tích cực mức thấp được dùng báo cho
Bộ chuyển đổi ADC0804 khởi động quá trình chuyển đổi khi tín hiệu CS bằng 0 và WR tạo ra xung cao xuống thấp Quá trình này chuyển đổi giá trị đầu vào tương tự Vin thành số nhị phân 8 bit Khi quá trình chuyển đổi hoàn tất, chân INTR sẽ được hạ xuống thấp bởi bộ ADC.
CLK IN (chân số 4) là chân kết nối với đồng hồ ngoài để tạo thời gian, trong khi CLK R (chân số 19) cũng có thể được sử dụng ADC0804 có bộ tạo xung đồng hồ riêng, và để sử dụng bộ tạo xung này, CLK IN và CLK R cần được nối với một tụ điện và một điện trở Tần số được xác định theo biểu thức cụ thể.
Với R = 10 kΩ, C = 150 pF , tần số f = 606 kHz , thời gian chuyển đổi 110 às
Chân số 5 của INTR (Interupt) hoạt động như một chân ra tích cực mức thấp, thường ở trạng thái cao Khi quá trình chuyển đổi tương tự số hoàn tất, chân này sẽ chuyển xuống mức thấp để thông báo cho CPU rằng dữ liệu đã sẵn sàng để được lấy Sau khi INTR chuyển xuống mức thấp, cần thiết lập CS = 0 và gửi một xung từ cao xuống thấp tới chân RD để xuất dữ liệu.
Vin (+) và Vin (-) là hai đầu vào tương tự vi sai nằm ở chân số 6 và chân số 7, với công thức Vin = Vin(+) – Vin(-) Thông thường, Vin(-) được kết nối với đất, trong khi Vin(+) được sử dụng làm đầu vào tương tự và sẽ được chuyển đổi thành dạng số.
- Vcc: Chân số 20, là chân nguồn nuôi +5V Chân này còn được dùng làm điện áp tham chiếu khi đầu vào Vref/2 để hở.
Chân Vref/2 (chân số 9) là chân điện áp đầu vào dùng làm điện áp tham chiếu cho ADC0804 Khi chân này không được kết nối, điện áp đầu vào tương tự sẽ nằm trong dải 0 đến +5V Tuy nhiên, trong nhiều ứng dụng, điện áp đầu vào có thể khác dải 0 đến +5V Do đó, chân Vref/2 được sử dụng để thực hiện các điện áp đầu ra khác ngoài dải này.
Bảng 5: Quan hệ điện áp Vref/2 với Vin Vref/2 (V) Vin (V) Kích thước bước (mV)
Chân D0 - D7, từ chân số 18 đến 11, là các chân ra dữ liệu số, trong đó D7 là bit cao nhất (MSB) và D0 là bit thấp nhất (LSB) Các chân này hoạt động với ba trạng thái, và dữ liệu chỉ có thể được truy cập khi chân CS ở mức 0 và chân RD ở mức thấp Để tính điện áp đầu ra, ta sử dụng công thức cụ thể.
Dout = Vin / Kích thước bước.
IC cảm biến LM35
Cảm biến nhiệt độ tích hợp của hãng National Semiconductor có độ chính xác cao, với điện áp đầu ra tỉ lệ tuyến tính với nhiệt độ theo thang Celsius Mỗi sự thay đổi nhiệt độ sẽ làm điện áp ngõ ra thay đổi 10mV.
1 o C Chúng không yêu cầu cân chỉnh ngoài.
LM35 có 4 dạng: TO-46, SO-8, TO-92, TO-220 Nhưng thường dùng nhất là dạng TO-92 như hình dưới.
Hình 8: Sơ đồ chân LM35 dạng TO-92 Đặc điểm cơ bản của LM35:
- Điện áp nguồn từ -0.2V đến +35V.
- Điện áp ra từ -1V đến +6V.
- Dải nhiệt độ đo được từ -55°C đến +150°C.
- Điện áp đầu ra thay đổi 10mV mỗi khi có sự thay đổi 1°C.
Thiết kế sản phẩm
Mạch in
Hình 10: Sơ đồ chân linh kiện
Hình 11: Sơ đồ mạch in.
Mạch làm thực tế
Hình 11: Hình ảnh mạch thực tế
- Mạch hiển thị thời gian thực và nhiệt độ trên LCD
Hình 12: Hình ảnh mặt sau của mạch khi đã hàn
Code lập trình
The code snippet initializes various variables and settings for an embedded system using the DS1307 real-time clock It defines pins for ADC (Analog-to-Digital Converter) control, including write, read, and interrupt signals Additionally, it sets up control pins for user inputs such as setting the time, adjusting values, and changing modes The program also declares variables to store time and date information, including hours, minutes, seconds, and the current date, while managing flags for user interactions.
*/ void chuyendoi() // chuyển đổi tương tự sang số
WR_ADC = 0; //bắt đầu quá trình chuyển đổi delay_short();
WR_ADC = 1; //set WR for next change while (!INTR_ADC); //đợi ADC chuyển đổi xong,khi INTR xuống mức thấp thì chuyển đổi xong
//delay_short(); x=P1; temp = x; //giá trị chuyển đổi đưa vào biến temp } void writeds()
{ //ghi giá trị thời gian vào ds1307 rtc_write(0x00, second); rtc_write(0x01, minute); rtc_write(0x02, hour); rtc_write(0x04, date); rtc_write(0x05, month); rtc_write(0x06, year);
} void readds() // đọc giá trị từ ds1307
{ if(kt==0) //chế độ bình thường ,chỉ đọc { if(a==1) // nếu ở chế độ hiệu chỉnh { writeds(); // ghi vào DS1307 a=0;
// sau đó tiếp tục đọc giá trị từ DS1307 second = rtc_read(0x00); minute = rtc_read(0x01); hour = rtc_read(0x02); date = rtc_read(0x04); month =rtc_read(0x05); year = rtc_read(0x06);
{ set0=set1; set1=set; if((set0==1)&&(set1==0))/ /nếu phím set được ấn
{ kt++; // chọn chế độ hiệu chỉnh tương ứng với kt=1, 6 if(kt>8)kt=0;
} switch(kt) //hiệu chỉnh các biến thời gian
{ case 0:break; //chế độ bình thường case 1: //ở chế độ chỉnh giờ
{ up0=up1;//nếu phím up được ấn up1=up; a=1; if((up0==1)&&(up1==0))
{ hour++; //tăng giờ if(hour>23)hour=0;
} down0=down1; down1=down; if((down0==1)&&(down1==0)) { hour ; //giảm giờ if(hour==-1) hour#;
{ up0=up1; up1=up; a=1; if((up0==1)&&(up1==0))
} down0=down1; down1=down; if((down0==1)&&(down1==0)) { minute ; if(minute==-1) minuteY;
{ up0=up1; up1=up; a=1; if((up0==1)&&(up1==0))
} down0=down1; down1=down; if((down0==1)&&(down1==0)) //ấn phím down thì cho luôn giây về 0 { second=0;
{ up0=up1; up1=up; a=1; if((up0==1)&&(up1==0))
} down0=down1; down1=down; if((down0==1)&&(down1==0))
{ up0=up1; up1=up; a=1; if((up0==1)&&(up1==0))
} down0=down1; down1=down; if((down0==1)&&(down1==0)) { month ; if(month==0) month;
{ up0=up1; up1=up; a=1; if((up0==1)&&(up1==0))
} down0=down1; down1=down; if((down0==1)&&(down1==0)) { year ; if(year==-1) year;
} case 7: //ở chế độ chỉnh giờ hẹn { up0=up1;//nếu phím up được ấn up1=up; a=1; if((up0==1)&&(up1==0))
{ hour1++; //tăng giờ if(hour1>24)hour1=0;
} down0=down1; down1=down; if((down0==1)&&(down1==0)) { hour1 ; //giảm giờ if(hour1==-1) hour1$;
{ up0=up1; up1=up; a=1; if((up0==1)&&(up1==0))
} down0=down1; down1=down; if((down0==1)&&(down1==0))
} mode0=mode1; mode1=mode; if((mode0==1)&&(mode1==0)) //nếu mode được ấn b++; //b =0,1 tương ứng 24h và12h if(b>1)b=0;
{ if(kt==0) //ở chế độ bình thường
Để hiển thị thời gian, đầu tiên bạn cần sử dụng hàm `ghi_nhanh_chuoi("TIME ");` để ghi chữ "TIME" lên dòng đầu tiên Sau đó, sử dụng `ghi_so_nguyen(hour);` để ghi giờ vào cột thứ 5 của dòng đầu tiên Tiếp theo, chèn dấu ":" bằng cách gọi `ghi_nhanh_chuoi(":");` và ghi phút với `ghi_so_nguyen(minute);` Tương tự, bạn sẽ chèn dấu ":" lần nữa trước khi ghi giây bằng `ghi_so_nguyen(second);` Cuối cùng, thêm dấu "-" và ghi số 24 với `ghi_nhanh_chuoi("24");` để hoàn thiện việc hiển thị thời gian.
Đoạn mã này thực hiện việc ghi dữ liệu lên màn hình với các lệnh ghi cụ thể Đầu tiên, nó ghi số nguyên vào dòng thứ hai, sau đó ghi chuỗi "oC" tại cột thứ hai Tiếp theo, nó ghi khoảng trắng và ngày tháng năm, với ngày được ghi từ biến `date`, tháng từ biến `month`, và năm cố định là "20" trước khi ghi giá trị của biến `year`.
//ghi gio ghi_lenh(0x80); ghi_nhanh_chuoi("TIME "); // hien thi gio o che do 12h if(hour12)
{ ghi_lenh(0x80+5); ghi_so_nguyen(hour-12); ghi_lenh(0x80+13); ghi_nhanh_chuoi("-"); ghi_lenh(0x80+14); ghi_nhanh_chuoi("PM"); }
//////////////////////// ghi_lenh(0x80+7); ghi_nhanh_chuoi(":"); ghi_lenh(0x80+8); ghi_so_nguyen(minute); ghi_lenh(0x80+10); ghi_nhanh_chuoi(":");ghi_lenh(0x80+11); ghi_so_nguyen(second);
Đoạn mã này thực hiện việc ghi ngày và nhiệt độ ở chế độ 12h Đầu tiên, nó ghi nhiệt độ bằng cách sử dụng hàm ghi_so_nguyen(temp), sau đó thêm đơn vị "oC" Tiếp theo, mã ghi ngày tháng năm bằng cách sử dụng các hàm ghi_so_nguyen và ghi_nhanh_chuoi để định dạng ngày tháng theo định dạng DD/MM/YYYY.
} if(kt==1) //o che do chinh gio
{ ghi_lenh(0x80); ghi_nhanh_chuoi("SET TIME "); ghi_lenh(0xc0); ghi_nhanh_chuoi("HOUR: "); ghi_lenh(0xc0+9); ghi_so_nguyen(hour); ghi_lenh(0xc0+11); ghi_nhanh_chuoi(" ");
} if(kt==2) //che do chinh phut
{ ghi_lenh(0x80); ghi_nhanh_chuoi("SET TIME "); ghi_lenh(0xc0); ghi_nhanh_chuoi("MINUTE: "); ghi_lenh(0xc0+9); ghi_so_nguyen(minute);
} if(kt==3) //che do chinh phut
{ ghi_lenh(0x80); ghi_nhanh_chuoi("SET TIME "); ghi_lenh(0xc0); ghi_nhanh_chuoi("SECOND: "); ghi_lenh(0xc0+9); ghi_so_nguyen(second);
} if(kt==4) //che do chinh ngay
{ ghi_lenh(0x80); ghi_nhanh_chuoi("SET TIME "); ghi_lenh(0xc0); ghi_nhanh_chuoi("DATE: "); ghi_lenh(0xc0+9); ghi_so_nguyen(date);
} if(kt==5) //cd chinh thang
{ ghi_lenh(0x80); ghi_nhanh_chuoi("SET TIME "); ghi_lenh(0xc0); ghi_nhanh_chuoi("MONTH: "); ghi_lenh(0xc0+9); ghi_so_nguyen(month);
} if(kt==6) //cd chinh nam
Để thiết lập thời gian, đầu tiên, chúng ta sử dụng lệnh ghi để khởi động quá trình Sau đó, chúng ta ghi chuỗi "SET TIME" và tiếp theo là "YEAR: " Tiếp theo, chúng ta ghi lệnh để chỉ định năm bắt đầu bằng cách thêm "20" vào đầu và sau đó ghi số nguyên của năm cần thiết.
} if(kt==7) //o che do chinh gio hen
{ ghi_lenh(0x80); ghi_nhanh_chuoi("ALARM "); ghi_lenh(0xc0); ghi_nhanh_chuoi("HOUR: "); ghi_lenh(0xc0+9); ghi_so_nguyen(hour1); ghi_lenh(0xc0+11); ghi_nhanh_chuoi(" ");
} if(kt==8) //che do chinh phut hen
{ ghi_lenh(0x80); ghi_nhanh_chuoi("ALARM "); ghi_lenh(0xc0); ghi_nhanh_chuoi("MINUTE: "); ghi_lenh(0xc0+9); ghi_so_nguyen(minute1);
} void khong_che() //khong che de canh bao nhiet do
{ if(temp>40) speak=1; if(temp 58))
{ minute1 = 0; i = 0; hour1 = hour1 + 1; if (hour1 >23) hour1 = 0; j ;
} if(mode == 0) // nhan giu mode de tat chuong bao thuc
//unsigned char al=0; speak = 0; //tat loa lcd_init(); //khoi tao LCD
RD_ADC = 0; //cho phep dua du lieu chuyen doi toi dau ra cua ADC
WR_ADC = 0; // bat dau qua trinh ADC
INTR_ADC = 1; // dat ban dau o trang thai cao,khi chuyen doi xong thi no xuong muc thap delay_ms(10); ghi_lenh(0x0c); //bat hien thi,tat con tro while(1)
{ chuyendoi();//chuyen doi ADC readds(); //doc gia tri tu DS1307 ktphim(); hien_thi(); khong_che(); hen_gio();