Đề tài Thiết kế hệ vi xử lý 8 bit

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.

 

doc38 trang | Chia sẻ: huong.duong | Lượt xem: 1635 | Lượt tải: 0download
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:

  • docDAN378.doc
Tài liệu liên quan