Chân LE được nối với ALE của 8051. Xung chốt ALE được phát 2 lần trong một chu kỳ máy nhằm chốt 8 bit thấp của địa chỉ được lấy ra từ Port 0 cộng với 8 bit cao của địa chỉ được xuất ra từ Port 2 tạo thành địa chỉ 16 bit.
5. Cổng vào ra - vi mạch PPI 8255.
- Vi mạch 8255 A là vi mạch cỡ lớn ISI thường được gọi là mạch phối ghép vào/ra song song lập trình được. Do khả năng mềm dẻo trong các ứng dụng thực tế, nó là mạch phối ghép được dùng rất phổ biến cho các hệ VXL 8_16_32bit. 8255 có các chân được bố trí như trên hình vẽ trong đó có chứa 24 đường dẫn lớn vào ra được xếp thành 3 cổng song song (port A, port B, portC). Một nửa của cổng Port C (PC4 . . . PC7) thuộc vào nhóm A còn nửa kia thuộc nhóm B.
38 trang |
Chia sẻ: huong.duong | Lượt xem: 1635 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Đề tài Thiết kế hệ vi xử lý 8 bit, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ộng ổn định .
Trước đây khi ngành vật liệu chưa tìm ra các vật liệu mới, thì các dụng cụ đo thường được làm bằng cơ khí có độ chính xác không cao, dải đo hẹp, không làm việc được trong các môi trường đòi hỏi độ bền cơ học cao. Khi ngành vật liệu tìm ra được các vật liệu mới, công nghệ chế tạo phát triển đã có thể tạo ra các thiết bị đo thông minh, có độ chính cao, làm việc được trong các môi trường khắc nghiệt như : đo nhiệt độ lò nung, đo nồng độ các chất hoá học … nhờ các thiết bị đo thông minh này người ta có thể kiểm soát các thông số của hệ thống một cách chặt chẽ .
Khi khoa học công nghệ ngày càng phát triển việc đo không chỉ là biết giá trị của đại lượng cần đo mà những giá trị này còn là những thông tin cần được lưu trữ và xử lý . Để cho quá trình thu thập các thông tin đo một cách tự động người ta gắn vào các thiết bị đo các bộ vi điều khiển nhằm điều khiển các quá trình đo, xử lý và có thể là phải truyền đi .
Theo như yêu cầu của bài toán đặt ra là xây dung một hệ đo, thu thập nhiệt độ. Với 8 kênh đo nhiệt độ ở những vị trí khác nhau và những dải nhiệt độ khác nhau thì việc sử dụng một bộ vi điều khiển trong hệ là một điều cần thiết. Hiện nay, trên thị trường có rất nhiều họ vi điều khiển như : 8051, 68HC11, PIC, AVR… vì vậy việc lựa chọn một bộ vi điều khiển cho hệ thống cần phải có giá thành rẻ nhưng vẫn đáp ứng được yêu cầu của bài toán tối ưu. ở đây ta sử dụng bộ vi điều khiển 8051 là đủ để điều khiển hệ thống hoạt động tốt.
I.Bộ Vi Xử Lý 8051
a. Giới thiệu:
Bộ VXL 8051 là bộ VXL đầu tiên thuộc họ VXL x51 được sản xuất bởi công ty Intel, Siemens, Advanced Micro Devices, Fujitsu, Philips.
Các đặc điểm chung của bộ VXL này:
4KB ROM
128 B RAM
4 cổng I/O 8 bit
2 Timer 16 bit
Có khả năng quản lý được 64 KB bộ nhớ mã chương trình ngoài (ROM ngoài).
Có khả năng quản lý được 64 KB bộ nhớ dữ liệu ngoài (RAM ngoài)
Có bộ xử lý logic riêng (thao tác trên các bit)
Có thể thao tác trực tiếp được 210 bit (các bit này đã được địa chỉ hoá)
Sơ đồ khối của 8051 là như sau:
b. Bên trong VXL8051.
ỉ RAM.
RAM trong của 8051 bao gồm cả các thanh ghi và các thanh ghi có thể lập trình và xoá từng bit như là RAM đa mục đích. RAM được dùng như là vùng làm việc đa năng. RAM On-chip có địa chỉ từ 00h đến 7Fh.
ỉ Các thanh ghi:
Khối RAM từ [ 0..1Fh ] được dùng cho các thanh ghi. Có 4 banks với 8 thanh ghi trong mỗi bank(s) đó từ R0 đến R7.
Bank 0: Từ 00h đến 07h
Bank 1: Từ 08h đến 0Fh
Bank 2: Từ 10h đến 17h
Bank 3: Từ 18h đến 1Fh
Để chọn địa chỉ các thanh ghi, đầu tiên các register bank(s) phải được kích hoạt (active). Việc lựa chọn được làm bởi cờ trong PSW. Sau khi đã được chọn thanh ghi i được ký hiệu là Ri
ỉ Bản đồ của bộ nhớ:
Khối nhớ trong khoảng [20h..2Fh] gồm 16 bytes = 128 bits có thể đánh địa chỉ theo từng bit. Mỗi bit có địa chỉ từ 0h đến 7Fh. Bit 0 của byte 20 là bit địa chỉ 0 và bit 7 của byte 2Fh là bit địa chỉ 7Fh.
Hình 1. Bản đồ bộ nhớ trong vi xử lý 8051
ỉ Những thanh ghi chức năng đặc biệt: SFR (Special Function Registers)
SFR bao gồm các thanh ghi dữ liệu và các thanh ghi điều khiển. Chúng nằm trong các cổng, time hoặc là các thanh ghi điều khiển ngắt... Ví dụ: Cổng nối tiếp được điều khiển bởi SFR SCON, trong khi dữ liệu vào và ra cổng này đi qua thanh ghi SFR SBUF. Những bit riêng lẻ của SCON xác lập những chế độ khác nhau của cổng nối tiếp. SCON có thể được xem như thanh ghi điều khiển và SBUF được gọi là thanh ghi dữ liệu. SFR có byte địa chỉ trong khoảng [80h..FFh] (Tiếp theo phần địa chỉ của RAM trong từ 00h..07h như đã nói ở trên ). 8051 có thể truy nhập RAM và SFR bằng chế độ địa chỉ gián tiếp thanh ghi.
SFR bao gồm cả thanh ghi a, thanh ghi b và PSW. PSW bao gồm cả cờ hệ thống như cờ carry có 2 bit để kích hoạt register bank.
ỉ ROM:
Một vài thành viên của họ 8051 có chứa ROM ở ngay trong chúng:
- 8051 có 4KB.
- 8052 có 8KB.
- 80C517A-5 và 80C515-A có 32KB.
8751 và 8752 là EPROM là phiên bản sau của 8051 và 8052, 8031, 8032, 80C535A và 80C537A là ROM phiên bản sau của 8051, 8052, 80C515A và 80C517A.
Trong bộ nhớ ROM trong chiếm khối nhớ thấp nhất của bộ nhớ chương trình. Chân EA# (External Enable) của vi điều khiển được cấp +5V để cho phép chương trình có thể được tìm và đọc trực tiếp từ ROM trong. Tuy nhiên những chương trình có khối nhớ trên 4K hoặc 8K thì sẽ tìm và đọc lệnh từ bộ nhớ chương trình ngoài. Các chương trình sẽ được đọc từ bộ nhớ bên ngoài khi chân EA# được nối đất (Khi đặt ký hiệu # ở phía sau toán hạng thì sẽ hiểu là tín hiệu đó được kích hoạt khi ở mức thấp).
ỉ Bộ đếm chương trình:
Bộ đếm chương trình (Program Counter) được dùng để chỉ đến byte lệnh tiếp theo sẽ được đọc. Nó không bị ảnh hưởng trực tiếp nhưng sẽ bị thay đổi bằng những lệnh rẽ nhánh như lệnh Jmp hoặc Call. Nó cũng có thể dùng như địa chỉ cơ sở cho chỉ số địa chỉ khi đọc từ bộ nhớ chương trình.
ỉ Cổng vào ra song song:
8051 có 4 cổng vào ra song song (Parallel input/output port). Khi cổng được dùng là cổng ra, dữ liệu được để trong SFR tương ứng. Giá trị được viết đến SFR tương ứng sẽ được chốt và phát ra tín hiệu sau khi quá trình ghi kết thúc. Giá trị của cổng ra thay đổi khi giá trị mới được chốt.
Khi cổng được dùng là cổng vào, đầu tiên giá trị FFh sẽ được ghi lên cổng, sau đó tất cả các cổng vào làm cho chân điện thế thấp sẽ được đặt bằng 0. Việc đọc các SFR tương ứng sẽ đọc giá trị của cổng. Bộ chốt cửa ra sẽ điều khiển chân cổng lên mức logic 1 nếu không có dòng điện của mạch ngoài hạ xuống trên chân.
Mặc dù cùng 1 SFR đang được dùng, nhưng bên trong vẫn có hai thao tác được tiến hành khi cổng đang được đọc và đang được ghi. Các thao tác đó được thực hiện hoàn toàn bằng phần cứng, bảo vệ giúp người dùng từ việc giữ hướng khi dữ liệu được vận chuyển.
Một điều chú ý nữa là mặc dù tất cả các thao tác đọc mà đọc giá trị từ chân cổng có 1 vài thao tác đọc vẫn ngầm đọc giá trị của cổng chốt, gọi là thao tác read-modify-write
Để tiến hành lựa chọn các chức năng thì các SFR tương ứng phải được thiết lập (Đặt bằng 1).
ỉ Bộ phát dao động:
8051 có 1 bộ phát dao động dùng tinh thể thạch anh ngoài. Bộ tạo dao động tần số giống như tần số của tinh thể và được chia cho 12, nó có thể được dùng làm đầu vào của timer.
Dùng 12 MHz crystal thì timer input sẽ là 1 MHz. 8051 có 12 chu kỳ dao động trên 1 chu kỳ máy. Nó có 255 thao tác những nhóm mã lệnh, tương đương 111 chỉ thị. Ví dụ có15 mã thao tác cụ thể phụ thuộc vào byte đích, byte nguồn và chế độ địa chỉ. Thêm vào đó, có 2 lệnh dịch chuyển bit và 1 lệnh dịch chuyển word, lệnh đó dịch chuyển 16 bit vào con trỏ dữ liệu (data pointer). Trong 255 mã thao tác đó, 159 thao tác hết 1 chu kỳ máy, 51 thao tác cần 2 chu kỳ máy, 43 thao tác cần 3 chu kỳ máy và 2 thao tác cần 4 chu kỳ máy. Từ khi có nhiều thao tác chỉ cần 1 chỉ thị máy, 8051 đã xem xét đến khả năng có thể thực hiện hàng triệu lệnh trong 1 giây (Million Instruction Per Second: MIPS). Rất nhiều hệ thống 8051 dùng dao động tinh thể 11.0592 MHz, sở dĩ có sự lựa chọn này vì trong thực tế có rất nhiều dao động đồng hồ có thể phát ra tốc độ Baud rất cao. Với đồng hồ 12 MHz tốc độ Baud lớn nhất là 4800, còn dùng dao động tinh thể 11.0592MHz tốc độ có thể lên tới 19200baud.
ỉ Cổng nối tiếp:
Cổng nối tiếp được điều khiển bởi SFR SCON. Dữ liệu vào và ra cổng nối tiếp đều đi qua SFR SBUF. Khi cổng nối tiếp đã được khởi tạo, ta có thể dễ dàng ghi dữ liệu vào SBUF để khởi đầu cho việc truyền nối tiếp. Tương tự nhận dữ liệu cũng được đọc từ SBUF. Mặc dù SBUF được nói ở trên giống như là SFR riêng lẻ nhưng phần cứng của nó bao gồm hai buffer tách biệt, một buffer để truyền và một buffer để nhận dữ liệu. Truyền và nhận nối tiếp có thể diễn ra đồng thời (full duplex operation).
ỉ Timer/Counter.
8051 có hai Timer/Counter, mỗi Timer/Counter được dành cho hai SFR. Timer/Counter 0 là TH0 và TL0, còn Timer/Counter 1 là TH1 và TL1. Các thanh ghi dành cho Timer/Counter là các thanh ghi 16 bit. Khi hoạt động, mỗi khi có xung vào thì số đếm xung lưu trong 1 hoặc 2 SFR sẽ tăng lên. Timer dùng tín hiệu đồng hồ hệ thống làm nguồn của những xung vào. Counter dùng xung ngoài để tăng số lượng xung. Xung ngoài được nhận qua 2 bit của cổng 3. Số xung hiện tại của Timer/Counter có thể đọc từ TH0 và TL0 hoặc TH1 và TL1. Timer/Counter cũng phát ra ngắt với điều kiện là những ngắt đó không bị IE chắn. Khi bộ đếm bị tràn (và lại quay về 0) thì ngắt được phát ra. Trạng thái của các ngắt đó được quan sát qua SFR TCON.
Hoạt động của Timer/Counter được điều khiển bởi khối xung ngẫu nhiên từ nguồn tới thanh ghi đếm dữ liệu. Nguồn dữ liệu sẽ tới thanh ghi dữ liệu của Timer 0 nếu điều kiện (GATE# or INT0#) And TR0 đúng. GATE# là bit điều khiển Timer 0 của TMOD. 8051 coi bit điều khiển là GATE. Tuy nhiên khi Timer/Counter hoạt động trong lúc GATE đang ở mức logic thấp thì sẽ giống như trên, chứng tỏ bit điều khiển là GATE#. TR0 cũng là bit điều khiển của Timer 0 trong thanh ghi TMOD, INT0# là chân P3.2 của 8051. Điều kiện trên đã chỉ rõ rằng những thanh ghi dữ liệu của Timer 0 đã được cập nhật nguồn khi bit điều khiển TR0 được thiết lập và cả bit điều khiển GATE# bị xoá hoặc Port P3.2 ở mức logic 1.
Timer/Counter có 4 chế độ hoạt động. Hoạt động của cả hai Timer được quyết định bởi SFR TMOD. 4 bit thấp của TMOD điều khiển Timer 0, 4 bit cao của TMOD điều khiển Timer 1.
ỉ Điều khiển ngắt:
8051 có 5 ngắt TF0, TF1, INT0#, INT1# và kết quả của cổng nối tiếp. TF0 và TF1của thanh ghi TCON tạo ra 2 ngắt Timer/Counter, chúng phát ra ngắt khi bộ đếm bị tràn.
II.Thiết kế hệ vi xử lý dùng 8051
Sơ đồ khối của hệ vi xử lý như sau:
Sơ đồ khối hệ vi sử lý 8 bít
1.Thiết kế bộ nhớ.
* Hệ VXL sử dụng 8Kx8bit bộ nhớ chương trình ngoài và 8Kx8bit bộ nhớ dữ liệu.
ROM 8Kx8bit: 2764
RAM 8Kx8bit: 6264
* Các chân dữ liệu AD0-AD7 của RAM và ROM được nối với Bus dữ liệu của hệ thống (cổng Port 0 của 8051)
* ROM: - Chân OE của ROM 2764 được nối với PSEN của 8051
- Vpp với Vcc
- PGM nối với GND
* RAM: - Các chân OE và WE lần lượt được nối với các chân RD và WR của 8051
- CS2 nối với Vcc
* Tín hiệu chọn chíp (chọn giữa RAM và ROM) được lấy từ dây CS0 CS1 của mạch giải mã .
* Đối với thiết kế hệ VXL này ta sử dụng hoàn toàn bộ nhớ chương trình ngoài do vậy chân /EA của 8051 sẽ được nối đất.
* Địa chỉ bộ nhớ ngoài: ROM: 0000h - 1FFFh
RAM: 2000h - 3FFFh
2.Mạch chuyển đổi số tương tự ADC 0809 (8 kênh x 8 bit)
a.Các thông số cơ bản
* Bộ biến đổi ADC 0809 là ADC thông dụng được sử dụng rộng rãi có tám đầu vào tương tự từ IN_0->IN7 và đầu ra 8 bit số chuyển đổi theo phương pháp xấp xỉ liên tiếp.
* Các đặc trưng cơ bản của ADC 0809:
- Đầu ra có bộ điện 3 trạng thái để ghép trực tiếp vào kênh dữ liệu của hệ VXL.
- Giải tín hiệu ra vào tương tự SV khi nguồn nuôi là +5V. Có thể mở rộng thang đo bằng các giải pháp kỹ thuật cho từng mạch cụ thể.
- Không đòi hỏi điều chỉnh “0”.
- Thời gian biến đổi 100ms.
- Sai số tổng cộng ±1/2LSB.
- Sử dụng nguồn nuôi đơn +5V, hiệu suất cao.
- Đảm bảo sai số tuyến tính trang dải nhiệt đồ từ -40oC-+85oC.
b.Ghép nối
* ADC 0809 được ghép với hệ VXL được thể hiện như trên hình vẽ.
- Đầu ra dữ liệu 2.1-2.7 được nối với Port 0 của 8051
- Các kênh vào anolog được nối với các đầu IN_0->IN7 tương ứng của ADC.
- Mỗi kênh vào có địa chỉ riêng do tổ hợp 3 bit ADD_A, ADD_B, ADD_C quy định. 3 đầu địa chỉ này được nối tương ứng với 3 dây A0, A1, A2 của Address Bus.
- Chân EOC của ADC 0809 được nối với của 8051 sau khi đã qua một khâu đảo.
- Tín hiệu RD_ADC qua mạch đảo sẽ được nối với Enable của ADC nhằm chốt dữ liệu đã biến đổi xong ở đầu ra.
- Tương tự WR_ADC sẽ được đưa vào ALE và Start nhằm khởi động ADC và chốt địa chỉ của kênh hiện hành có giá trị là 3 bit ABC.
3. Mạch giải mã địa chỉ 74HC138
A B C
CS0 CS1 CS2 CS3 CS4 CS5 CS6 CS7
/CS
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
0 1 1 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 0 1 1 1 1 1
1 1 1 0 1 1 1 1
1 1 1 1 0 1 1 1
1 1 1 1 1 0 1 1
1 1 1 1 1 1 0 1
1 1 1 1 1 1 1 0
CS0 : ROM
CS1 : RAM
CS2 : WR_ADC
CS3 : RD _ADC
CS4 : Chọn 8255
CS5
CS6
CS7
- Giải mã địa chỉ sử dụng IC74HC138 có 3 đầu vào ABC được nối tương ứng với 3 dây Port 2.5, 2.6, 2.7 của 8051. Sử dụng các đầu ra làm tín hiệu /CS để chọn chíp. Byte mã xuất ra từ cổng P2 của 8051 có giá trị tương ứng với chế độ chọn chíp như sau:
P2(#40H)->/CS2: WR_ADC
P2(#60H)->/CS3: RD_ADC
P2(#80H)->/CS4: Chọn 8255
-Các chân E1, E2 của 74HC138 được nối với GND
- E3 nối với Vcc
4.Mạch chốt 74LS373
/OE /LE IN OUT
Chức năng
L L D Q-1
L H D D
H X Hi-z Hi-z
Chốt đệm
Chốt đệm
Trở kháng cao
- Khi 8051 truy nhập bộ nhớ ngoài, luôn sử dụng địa chỉ 16 bit thông qua cổng Port 0 và Port 2 -> Dùng chốt để tạo Address Bus 16 bit.
- Sử dụng chốt là IC 74LS373 có bảng trạng thái được thể hiện như trên hình vẽ.
Chân OE được nối đất.
Chân LE được nối với ALE của 8051. Xung chốt ALE được phát 2 lần trong một chu kỳ máy nhằm chốt 8 bit thấp của địa chỉ được lấy ra từ Port 0 cộng với 8 bit cao của địa chỉ được xuất ra từ Port 2 tạo thành địa chỉ 16 bit.
5. Cổng vào ra - vi mạch PPI 8255.
- Vi mạch 8255 A là vi mạch cỡ lớn ISI thường được gọi là mạch phối ghép vào/ra song song lập trình được. Do khả năng mềm dẻo trong các ứng dụng thực tế, nó là mạch phối ghép được dùng rất phổ biến cho các hệ VXL 8_16_32bit. 8255 có các chân được bố trí như trên hình vẽ trong đó có chứa 24 đường dẫn lớn vào ra được xếp thành 3 cổng song song (port A, port B, portC). Một nửa của cổng Port C (PC4 . . . PC7) thuộc vào nhóm A còn nửa kia thuộc nhóm B.
- Các chân của 8255 được ghép với hệ VXL như trên hình.
+ Các chân vào dữ liệu từ D0-D7 được nối với Port 0 của 8051.
+ Các chân RD, WE được nối tương ứng với các chân RD, WR của 8051.
+ Các chân A0, A1 là các tín hiệu chọn 4 thanh ghi bên trong của 8255 được nối với 2 chân A0, A1 tương ứng của Address Bus.
+ Chân CS được nối với CS4 (đầu ra của giải mã địa chỉ).
* Chế độ làm việc:
Có hai loại từ điều khiển cho 8255A:
- Từ điều khiển định nghĩa cấu hình cho các cổng PA, PB, PC
- Từ điều khiển lập/xoá từng bit ở đầu ra của PC
Tuỳ theo từng lệnh được ghi vào thanh ghi điều khiển khi ???(kd) vi mạch mà ta có Port A, B, C hoạt động ở các chế độ 0,1,2 khác nhau.
* Trong hệ VXL này 8255 được dùng làm việc ở chế độ 0.
- Chế độ 0 hay còn gọi là chế độ vào ra cơ số. Trong chế độ này mỗi cổng PA, PB, PCH, PCL đều có thể định nghĩa là các cổng vào hoặc ra.
- ở đây sử dụng 8255 như các cổng ra (Số liệu ra được chốt).
* Xác định địa chỉ các thanh ghi, chế độ và chiều của cửa.
- Do dùng hai bit thấp nhất A0, A1 của Address Bus làm tín hiệu chọn thanh ghi bên trong 8255 tên ta có.
PA có địa chỉ 00h (A1=A0=0)
PB có địa chỉ 01h (A1=0, A0=1)
PC có địa chỉ 02h (A1=1, A0=0)
Thanh ghi điều khiển có địa chỉ 03h (A1=1, A0=1)
* Xác định lỗi điều khiển:
Vì PA là cửa ra -> D4=0, chế độ 0 -> D5=D6=0
PB là cửa ra -> D1=0, chế độ 0 -> D2=0
1/2 C thấp là của ra -> D0=0
1/2 C cao là cửa ra -> D3=0. Vậy từ điều khiển chế độ là:
D7
D6
D5
D4
D3
D2
D1
D0
1
0
0
0
0
0
0
0
80h
*8255 có PA dùng để hiển thị 2 LED 7 thanh biểu diễn hàng đơn vị và hàng chục.
- PC dùng để hiển thị LED báo kênh hiện hành ở mức thấp
- PB dùng để hiển thị LED báo kênh hiện hành ở mức cao
6. Lập bản đồ bộ nhớ.
* Bản đồ bộ nhớ của hệ VXL được thể hiện như trên hình vẽ
- 8K x 8bit ROM ngoài có địa chỉ từ 0000h -> 1FFFh
- 8K x 8bit RAM ngoài có địa chỉ từ 2000h -> 3FFFh
- 128byte RAM trong được chia thành 3 vùng nhớ chính có địa chỉ từ 00h -> 7Fh
* Trang thiết kế hệ VXL này dùng hoàn toàn bộ nhớ chương trình ngoài (ROM ngoài) và bộ nhớ dữ liệu trong (RAM trong)
* Phân vùng địa chỉ cụ thể.
- Sử dụng băng thanh ghi R0 để khai báo biến hằng địa chỉ, chốt cổng, các biến đếm, quá. Cụ thể.
R0: Địa chỉ đầu vùng chứa dữ liệu
R1: Biến đếm kênh
R3: Địa chỉ chốt WR_ADC
R4: Địa chỉ chốt RD_ADC
- Số liệu của từng kênh lấy từ ADC 0809 được lưu giữ lần lượt tại ô nhớ có địa chỉ:
Kênh 1: 30H
2: 31H
3: 32H
…
8: 37H
- Giá trị trung bình dạng mã Hexa được chứa trong hai ô nhớ
Phần nguyên Hexa: 38H
Phần dư Hexa: 39H
Giá trị BCD của TB: 3AH
Báo động cao :20H
Báo động thấp :21H
Sai lệch : 40H
Min : 41H
Max : 42H
Số chia : 50H
Byte thấp (của số bị chia hoặc của kết quả) : 51H
Byte cao (của số bị chia hoặc của kết quả) : 52H
- Sử dụng ngắt ngoài INTO khi vào dữ liệu từ ADC
+ Địa chỉ vector ngắt IEO: 0003H
- Sử dụng ngắt ngoài INT1 khi vào dữ liệu từ bàn phím
+ Địa chỉ vector ngắt INT1 : 0013H
8.Lưu đồ chương trình
TB-Kênh > sai lệch
Kênh-TB > sai lệch
9.Soạn thảo chương trình bằng mã ngữ của 8051.
----------------------------------------------------------------------------------------
Thủ tục thực hiện lệnh Reset
----------------------------------------------------------------------------------------
ORG 0000H
SJMP MAIN
----------------------------------------------------------------------------------------
Thủ tục thực hiện ngắt INT0 :
----------------------------------------------------------------------------------------
ORG 0003H
ACALL ADC
RETI
----------------------------------------------------------------------------------------
Thủ tục thực hiện ngắt INT1 :
----------------------------------------------------------------------------------------
ORG 0013H
ACALL BPHIM
RETI
----------------------------------------------------------------------------------------
Chương trình chính MAIN :
----------------------------------------------------------------------------------------
ORG 0030H
MAIN : SETB TCON0 ;INT0 theo sườn
SETB TCON2 ;INT1 theo sườn
MOV IE,#85H ;cho phép ngắt ngoài 0 ,1
MOV DPTR,#8003H ;lấy địa chỉ thanh ghi điều khiển 8255
MOV A,#80H ;chon PA, PB, PC là cổng ra
MOVX @DPTR,A
MOV DPTR,#8000H ;chọn cổng PA
MOV A,#00H ;khởi tạo LED7
MOVX @DPTR,A ;khởi tạo LED16
MOV DPTR,#8001H
MOVX @DPTR,A
MOV DPTR,#8002H
MOVX @DPTR,A
MOV R0,#30H ;địa chỉ đầu vùng dữ liệu ADC
MOV R1,#00H ;địa chỉ kênh đầu
MOV R3,#40H ;địa chỉ Write_ADC
MOV R4,#60H ; địa chỉ Read_ADC
MOV 40H,#20H ;mặc định sai lệch là 20H
MOV 41H,#00H ; mặc định min là 00H
MOV 42H,#0FFH ; mặc định max là FFH
MOV P0,R1 ;khởi tạo kênh 0 ADC
MOV P2,R3 ;
LAP : JCN HERE ;đợi cờ C=1
CLR C
ACALL TBINH ;tính trung bình
ACALL BCD ;biến đổi về BDC
MOV A,3AH ;lấy giá trị này
ACALL LED7 ;cho hiển thị
ACALL BLOI ;gọi báo lỗi
SJMP LAP ;lặp lại
END.
Sơ đồ ADC
----------------------------------------------------------------------------------------
Thủ tục thực hiện CTC ADC
----------------------------------------------------------------------------------------
ORG
CLR C
ADC : MOV P2,R4 ;đọc
MOV A,P0 ;P0 vào A
MOV @R0,A ;chuyển đến địa chỉ ở R0
INC R0 ;chỉ đến ô nhớ kênh tiếp theo
INC R1 ; chỉ đến kênh tiếp theo
CJNE R1,#08H,ACD1 ;nếu R1=8
MOV R1,#00H ;thì xoá R1
MOV R0,#30H ;R0=30H
SETB C ;C=1
ADC1: MOV P0,R1 ;nếu không ,khởi động kênh tiếp theo
MOV P2,R3
RET
Sơ đồ chia 16bit
----------------------------------------------------------------------------------------
Thủ tục thực hiện CTC chia 1 số 16bit cho số 8bit
----------------------------------------------------------------------------------------
ORG
CHIA: PUSH R0
PUSH R1
PUSH R3
PUSH R4
MOV R3,52H ;lấy byte cao vào R3
MOV R2,51H ; lấy byte thấp vào R2
MOV R0,50H ;lấy số chia vào R0
MOV R4,#00H ;phần nguyên
MOV A,R0 ;lấy bù 2 của số chia
CPL A
MOV R0,A
MOV R1,#0FFH ;byte cao số chia
INC R0
NEXT : CLR C
CJNE R3,#00H,CH1 ;nếu R3ạ0
MOV A,R2
CJNE A,50H,CH2 ;so sánh R2 với số chia
INC R4 ; nếu =, thì tăng phần nguyên lên1
MOV 52H,R4 ;chuyển phần nguyên vào ô 52H
MOV 51H,#00H ;phần dư vào ô 51H
SJMP CH3
CH2 : JNC CH1 ;nếu R2 >, thì nhảy đến CH1
MOV 52H,R4 ;nếu R2<, chuyển phần nguyên vào ô
MOV 51H,R2 ; 52H , phần dư vào ô 51H
SJMP CH3
CH1 : INC R4
MOV A,R2 ;lấy số bị chia cộng với số bù hai của
ADD A,R0 ;số chia
MOV R2,A
MOV A,R3
ADDC A,R1
MOV R3,A
SJMP NEXT
CH3 : POP R4
POP R3
POP R1
POP R0
RET
Sơ đồ tính giá trị trung bình
----------------------------------------------------------------------------------------
Tính Trung bình(phần nguyên cất vào 38H,phần dư cất vào 39H)
----------------------------------------------------------------------------------------
ORG
TBINH : PUSH R0
PUSH R1
PUSH R3
MOV R0,#30H
MOV R1,#00H ;byte thấp của tổng
MOV R3,#08H
MOV R2,#00 ; byte cao của tổng
TONG : MOV A,R1 ;A=R1
ADD A,@R0 ;A=A+nội dung kênh ở R0
MOV R1,A ;R1=A
MOV A,R2 ;A=R2
ADDC A,#00H ;A=A+cờ nhớ
MOV R2,A ;R2=A
CLR C
INC R0 ;chỉ đến kênh tiếp theo
DJNZ R3,TONG
MOV 50H,#08H ;số chia =8
MOV 51H,R1 ;byte thấp số bị chia =R1
MOV 52H,R2 ; byte cao số bị chia =R2
ACALL CHIA ;gọi lệnh chia
MOV R1,51H
MOV R2,52H
MOV 38H,R2 ;cất phần nguyên vào ô 38H
MOV 39H,R1 ; cất phần dư vào ô 39H
POP R3
POP R1
POP R0
RET
Sơ đồ chuyển TB sang BCD
----------------------------------------------------------------------------------------
Lấy BCD của giá trị trung bình
----------------------------------------------------------------------------------------
ORG
BCD : MOV A,38H ;lấy giá trị TB
MOV B,#100 ;
MUL AB ;nhân với 100
MOV 50H,0FFH ;chia cho FFH
MOV 51H,A
MOV 52H,B
ACALL CHIA
MOV A,52H
MOV B,#10
DIV AB ;lấy kết quả chia cho10
AWAP A ;chuyển 4bít thấp lên 4 bít cao
ADD A,B ;cộng với phần dư
MOV 3AH,A ;cất vào ô 3AH
RET
----------------------------------------------------------------------------------------
Hiển thị giá trị trung binh trong ACC lên LED 7 thanh
----------------------------------------------------------------------------------------
ORG
LED7 : MOV DPTR,#8000H ;chọn cổng PA
MOVX @DPTR,A
RET
----------------------------------------------------------------------------------------
Hiển thị các kênh có báo động cao thấp lên 16 LED
----------------------------------------------------------------------------------------
ORG
LED16 : MOV DPTR,#8001H ; chọn cổng PB
MOV A,20H ;byte báo động cao
MOVX @DPTR,A
INC DPTR ; chọn cổng PC
MOV A,21H ; byte báo động thấp
MOVX @DPTR,A
RET
----------------------------------------------------------------------------------------
Còi báo động 5 KHz
----------------------------------------------------------------------------------------
ORG
COI : MOV TMOD,#02H ;chọn chế độ 2
MOV TH0,#-100 ;tần số âm 5Khz
SETB TR0
LOOP : JNB TF0,LOOP
CLR TF0
CPL P3.4
SJMP LOOP
RET
----------------------------------------------------------------------------------------
Báo động
----------------------------------------------------------------------------------------
ORG
BDONG : PUSH R0
PUSH R1
PUSH R3
PUSH R4
MOV R0,#30H ;lấy địa chỉ đầu vùng ADC
MOV R1,#00H ; lấy địa chỉ đầu byte 20H(báo động cao)
MOV R2,#08H ; lấy địa chỉ đầu byte 21H(báo động thấp)
MOV R3,#08H ;biến đếm kênh
MOV R4,#00H ;biến đếm số kênh lỗi
MOV 20H,#00H ;xoá nội dung ô nhớ 20H
MOV 21H,#00H ;xoá nội dung ô nhớ 21H
CLR C ;xoá cờ
BD1 : MOV A,38H ;lấy giá trị trung bình ở ô 38H
SUBB A,@R0 ;lấy hiệu với kênh ở R0
JNC BD2 ;nếu lớn hơn nhảy đến BD2
MOV A,@R0 ;nếu nhỏ hơn thì lấy hiệu của kênh
CLR C
SUBB A,38H ;ở R0 với giá trị trung bình
SUBB A,40H ;so sánh hiệu này với giá trị sai lệch ở
JC BD3 ;40H, nếu nhỏ hơn nhảy đến BD3
SETB @R1 ;nếu không báo động cao ở kênh tương ứng
INC R4 ;tăng số lỗi lên1
SJMP BD3 ;nhảy đến BD3
BD2 : SUBB A,40H ;so sánh với sai lệch
JC BD3 ; nếu nhỏ hơn nhảy đến BD3
SETB @R2 ;nếu không báo động thấp ở kênh tương ứng
INC R4 ;tăng số lỗi lên1
BD3 : INC R0 ;chỉ đến kênh tiếp theo
INC R1 ;chỉ đến bit tiếp theo của 20H
INC R2 ;chỉ đến bit tiếp theo của 21H
DJNZ R3,BD1 ;lặp lại và giảm R3 đi 1
ACALL LED16 ;hiển thị 16 đèn LED
CJNE R4,#03H,BD4 ;so sánh R4 với 3
BD4 : JNC BD7 ;nếu lớn hơn nhảy đến BD7
MOV A,38H ;nếu nhỏ hơn lấy giá trị TB
CJNE A,42H,BD5 ;so sánh với max ở 42H
BD5 : JNC BD7 ;nếu lớn hơn nhảy đến BD7
CJNE A,41H,BD6 ;nếu nhỏ hơn, so sánh với min ở 41H
BD6 : JNC EXIT ;nếu lớn hơn thì thoát
BD7 : ACALL COI ;báo động còi
EXIT : POP R4
POP R3
POP R1
POP R0
RET
---------------------------------------------------------------------------------------
Các chương trình con về bàn phím :
----------------------------------------------------------------------------------------
IN_HEX :lấy mã hexa của một phím được ấn chắc chắn
----------------------------------------------------------------------------------------
ORG
IN_HEX : MOV R2, #50 ; số đếm
BACK : CALL GET_KEY ; phím được ấn ?
JNC IN_HEX ; không : kiểm tra lại
DJNZ R2, BACK ; có : lặp lại 50 lần
PUSH A ; lưu mã số hex
BACK2 : MOV R2, #50 ; chờ phím nhả
BACK3 : ACALL GET_KEY ; phím được ấn ?
JC BACK2 ; có : kiểm tra lại
DJNZ R2, BACK3 ; không : lặp lại 50 lần
POP A ; khôi phục số hex
RET ; quay về
----------------------------------------------------------------------------------------
GET_KEY :lấy mã của một phím được ấn
----
Các file đính kèm theo tài liệu này:
- DAN378.doc