Công nghệ vi điện tử

Chia sẻ: Manhson Son | Ngày: | Loại File: DOC | Số trang:23

1
301
lượt xem
134
download

Công nghệ vi điện tử

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Ngày nay với sự phát triển của công nghệ vi điện tử các hệ thống điều khiển dần dần được tự động hóa. Sự ra đời của các bộ vi xử lý nói chung và các bộ vi điều khiển nói riêng đã tạo ra một bước ngoặt lớn trong việc thiết kế các hệ thống xử lý thông tin, đo lường điều khiển, truyền thông…kết quả đã tạo ra những sản phẩm như máy ảnh số,máy nghe nhạc…ngày càng nhỏ gọn, hiện đại....

Chủ đề:
Lưu

Nội dung Text: Công nghệ vi điện tử

  1. Công nghệ vi điện tử 1
  2. LỜI NÓI ĐẦU Ngày nay với sự phát triển của công nghệ vi điện tử các hệ thống điều khiển dần dần được tự động hóa. Sự ra đời của các bộ vi xử lý nói chung và các bộ vi điều khiển nói riêng đã tạo ra một bước ngoặt lớn trong việc thiết kế các hệ thống xử lý thông tin, đo lường điều khiển, truyền thông…kết quả đã tạo ra những sản phẩm như máy ảnh số,máy nghe nhạc…ngày càng nhỏ gọn, hiện đại. Qua sự tìm hiểu cũng như kiến thức đã được học và sự giúp đỡ của thầy Nguyễn Anh Dũng chúng em đã hoàn thành đồ án của mình. Nhưng vì kiến thức có hạn đồ án vẫn không thể tránh khỏi sai sót, vậy mong sự cố vấn của các thầy để đồ án của chúng em được hoàn thiện hơn. 2
  3. I Giới thiệu linh kiện sử dụng. 1. Giới thiệu về 89s52. 89S52 là một vi điều khiển thông dụng giá rẻ và có nhiều tính năng hay,đặc biệt là có tích hợp mạch nạp ISP trên chíp giúp người sử dụng có thể dễ dàng thực hiện các thí nghiệm với chi phí thấp. AT89S52 gồm các chức năng chính sau: * CPU gồm: - Thanh ghi tích lũy A; - Thanh ghi tích lũy phụ B,dùng cho phép nhân và phép chia; - Đơn vị logic học (ALU: Arithmetic Logical Unit); - Thanh ghi từ trạng thái chương trình (PSW: Programe Status Word); - Bốn băng thanh ghi; - Con trỏ ngăn xếp. * Bộ nhớ chương trình (bộ nhớ ROM) gồm 8kbyte Flash. * Bộ nhớ dữ liệu (bộ nhớ RAM) gồm 256 byte. * Bộ UART (Universal Ansynchronous Receiver and Transmitter) có chức năng truyền nhận nối tiếp, AT89S52 có thể giao tiếp với cổng nối tiếp của máy tính thông qua bộ UART. * 3 bộ Timer/Counter 16 bit thực hiện chức năng định thời và đếm sự kiện. * WDM (Watch Dog Timer): WDM được dùng để phục hồi lại hoạt động của CPU khi nó bị treo bởi nguyên nhân nào đó. * Khối điều khiển ngắt với 2 nguồn ngắt ngoài và 4 nguồn ngắt trong. * Bộ lập trình (ghi chương trình lên Flash ROM) cho phép người sử dụng có thể nạp chương trình cho chíp mà không cần các bộ nạp chuyên dụng. * Bộ chia tần số với hệ số chia la 12. 3
  4. * 4 cổng xuất nhập với 32 chân. Sơ đồ khối : 4
  5. Port 0 (P0.0->P0.7) Ngoài chức năng xuất nhập, Port 0 còn là bus đa hợp dữ liệu và địa chỉ,chức năng này sẽ được sử dụng khi giao tiếp với các thiết bị ngoài có kiến trúc như các vi mạch nhớ. 1.2. Port 1 (P1.0->P1.7) Chức năng duy nhất của Port 1 là chức năng xuất nhập d ữ li ệu cũng nh ư các Port khác. Port có thể xuất nhập dữ liệu theo bit hoặc theo byte. Có 3 chân P1.5,P1.6,P1.7 được dùng để nạp ROM theo chuẩn ISP; hai chân P1.0,P1.1 được dùng cho bộ timer2. Port 2 (P2.0->P2.7) Ngoài chức năng là cổng xuất nhập còn là byte cao c ủa bus đ ịa ch ỉ khi s ử d ụng b ộ nhớ ngoài. Port 3(P3.0->P3.7) Mỗi chân trên Port 3 ngoài chức năng xuất nhập còn có m ột ch ức năng riêng c ụ th ể khác: Bit Tên Chức năng P3.0 RXD Dữ liệu nhận cho port nối tiếp P3.1 TXD Dữ liệu truyền cho port nối tiếp P3.2 INT0 Ngắt bên ngoài 0 P3.3 INT1 Ngắt bên ngoài 1 P3.4 T0 Ngõ vào của counter/timer 0 P3.5 T1 Ngõ vào của counter/timer 1 P3.6 /WR Xung ghi bộ nhớ dữ liệu ngoài P3.7 /RD Xung đọc bộ nhớ ngoài 1.5 Chân /PSEN (Program Store Enable) Là chân điều khiển đọc chương trình ở bộ nhớ ngoài, nó được n ối với chân /OE đ ể cho phép đọc các byte mã lệnh trên ROM ngoài. /PSEN sẽ ở m ức th ấp trong th ời gian đọc mã lệnh. Mã lệnh được đọc từ bộ nhớ ngoài qua bus d ữ li ệu (Port 0) , thanh ghi lệnh để được giải mã. Khi thực hiện chương trình trong ROM nội thì /PSEN ở mức cao. 1.6 Chân /ALE (Adress Latch Enable) ALE là tín hiệu điều khiển chốt địa chỉ có tần số bằng 1/6 tần số dao đ ộng c ủa vi điều khiển. Tín hiêu ALE được dùng cho phép vi m ạch ch ốt bên ngoài nh ư 74373,74573, chốt byte địa chỉ thấp ra khỏi bus đa hợp địa chỉ/ dữ liệu (Port 0). 1.7 Chân /EA (External access) 5
  6. Tín hiệu /EA cho phép chọn bộ nhớ chương trình là bộ nhớ trong hay ngoài vi đi ều khiển. Nếu /EA ở mức cao (đối với VCC ) thì vi điều khiển thi hành chương trình trong ROM nội. Nếu /EA ở mức thấp (đối với GND) thì vi điều khiển thi hành chương trình từ bộ nhớ ngoài. 1.8 Chân /RST (Reset) Ngõ vào /RST trên chân 9 là ngõ reset của 8051. Khi tín hi ệu này ở m ức cao (trong ít nhất 2 chu kỳ máy) các thanh ghi trong bộ vi đi ều khi ển đ ược tải nh ững giá tr ị thích hợp để khởi động hệ thống. 1.9 Chân /XTAL1, /XTAL2 AT89S52 có một bộ dao động trên chíp,nó thường được nối v ới b ộ dao đ ộng th ạch anh có tần số lớn nhất là 33 MHz, thông thường là 12MHz. 1.10 Chân /VCC và /GND 89S52 dùng nguồn một chiều có dải điện áp từ 4v đến 5.5v được cấp qua chân 40 và 20. 1.11 Bộ định thời/bộ đếm(timer/counter) 8051 có 2timer là timer0 và timer1. Các timer này đ ều là timer 16bit,giá tr ị đ ếm max do đó bằng 65536(đếm từ 0 đến 65335). Hai timer có nguyên lý hoạt động hoàn toàn giống nhau và độc lập. Sau khi cho phép chạy,mỗi khi có thêm một xung tại đầu vào đếm,giá trị của timer sẽ t ự đ ộng đ ược tăng thêm 1đơn vị,cứ như vậy cho đến khi giá trị tăng lên vượt quá giá trị max mà thanh ghi đếm có thể biểu diễn thì giá trị đếm lại được đưa v ề giá tr ị min(thông thường min=0).Điều này được hiểu là tràn timer (overflow) và có th ể gây ra ngắt n ếu ngắt tràn timer được cho phép. Việc cho timer chạy/dừng được thực hiện bởi các bit TR trong thanh ghi TCON 9 (đánh địa chỉ đến từng bit). 7 6 5 4 3 2 1 0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Khi bit TRx =1,timer x sẽ đếm,ngược lại khi TRx =0,timer sẽ không đếm mặc dù vẫn có xung đưa vào.Khi dừng không đếm,giá trị của timer được sẽ giữ nguyên. Các bit TFx là các cờ báo tràn timer.khi sự tràn timer x ảy ra,c ờ s ẽ đ ược t ự đ ộng đặt lên 1 và nếu ngắt tràn timer được cho phép,ngắt sẽ xảy ra.Khi CPU xử lý ngắt tràn timerx,cờ ngắt TFx tương ứng sẽ tự động được xóa về 0. Giá trị đếm 16bit của timer được lưu trong hai thanh ghi THx (byte cao) và TLx (byte thấp).Hai thanh ghi này có thể ghi/đọc được bất kỳ lúc nào.Tuy nhiên nhà s ản xu ất 6
  7. khuyến cáo rằng nên dừng timer (cho bit TRx=0) trước khi ghi/đọc các thanh ghi ch ứa giá trị đếm. Các thanh ghi có thể hoạt động ở nhiều chế độ,được quy định bởi các bit trong thanh ghi TMOD (không đánh địa chỉ đến từng bit). 7 6 5 4 3 2 1 0 GATE1 C/T1# M1 M0 GATE0 C/T0# M1 M0 Bit Tên Timer Mô tả 7 GATE1 1 Bit mở cổng cho timer 1,khi được đặt bằng 1 thì timer 1 chạy khi chân INT1 ở mức cao.Nếu bit này được là 0 thì hoạt động của timer 1 không bị ảnh hưởng bởi mức logic trên chân INT1. 6 C/T1# 1 Bit chọn chế độ counter/timer của timer 1. 1=bộ đếm sự kiện. 0=bộ định khoảng thời gian 5 M1 1 Bit 1 chọn chế độ (mode) của timer 1 4 M0 1 Bit 0 chọn chế độ của timer 1. 00:chế độ 0 – timer 13bit 01:chế độ 1 – timer 16bit 10:chế độ 2 – 8bit tự động nạp lại 11:chế độ 3 – tách timer 3 GATE0 0 Bit mở cổng cho timer 0,khi được đặt bằng 1 timer 0 chỉ hoạt động khi chân INT0 ở mức cao. 2 C/T0# 0 Bit chọn chế độ counter/timer của timer 0 1 M1 0 Bit 1 chọn chế độ của timer 0 0 M0 0 Bit 0 chọn chế độ của timer 0 Để xác định thời gian,người ta chọn nguồn xung nhịp (clock) đ ưa vào đ ếm trong timer là xung nhịp bên trong (dành cho CPU).Nguồn xung nhịp này th ường r ất đ ều đ ặn (có tần số ổn định),do đó từ số đếm của timer người ta có th ể nhân v ới chu kỳ xung nhịp để tính thời gian trôi qua.Timer lúc này được gọi chính xác với cái tên “timer” ,t ức bộ định thời. Để đếm các sự kiện bên ngoài,người ta chọn nguồn xung nhịp đưa vào đ ếm trong timer là tín hiệu từ bên ngoài (đã được chuẩn đoán về dạng xung vuông 0V/5V).Các tín hiệu này sẽ được nối với các bit cổng có dồn kênh thêm các tính năng T0/T1/T2.Khi có sự kiện bên ngoài gây ra thay đổi mức xung ở đầu vào đếm,timer sẽ tự động tăng lên 1 đơn vị giống như trường hợp đếm xung nhịp bên trong.Lúc này timer đ ược gọi v ới cái tên chính xác khác:”counter”,tức đếm (sự kiện). 7
  8. Nhìn vào bảng mô tả thanh ghi TMOD bên trên,ta có thể nhận th ấy có hai b ộ 4bit giống nhau (gồm GATEx,C/Tx,Mx0 và Mx1) dành cho hai timer 0 và 1.Ý nghĩa các bit là như nhau đối với mỗi timer. Bit GATEx quy định việc cho phép timer đếm (run timer).N ếu GATEx=0,timer x s ẽ đếm khi bit TRx bằng 1,dừng khi bit TRx = 0.N ếu GATEx =1,timer x s ẽ ch ỉ đ ếm khi bit TRx=1 và tín hiệu tại chân INTx=1,dừng khi một trong hai đi ều ki ện trên không còn thỏa mãn.Thông thường người ta dùng timer với GATE =0,chỉ dùng timer v ới GATE =1 khi muốn đo độ rộng xung vì lúc đó timer sẽ ch ỉ đ ếm th ời gian khi xung đ ưa vào chân INTx ở mức cao. Bit C/Tx quy định nguồn clock đưa vào đếm trong timer .N ếu C/Tx=0,timer sẽ đ ược cấu hình là bộ định thời,nếu C/Tx=1,timer sẽ được cấu hình là bộ đếm sự kiện. Hai bit còn lại (Mx0 và Mx1) tạo ra tổ hợp 4 gía tr ị (00,01,10,11) ứng v ới 4 ch ế đ ộ hoạt động khác nhau của timer x.Trong 4 chế độ đó thường ch ỉ dùng ch ế đ ộ timer/counter 16bit (Mx1=0,Mx0=1) và chế độ Auto Reload 8bit timer/couter (Mx1=1,Mx0=0). Trong chế độ timer/couter 16 bit, gia trị đếm (chứa trong 2 thanh ghi THx và TLx) t ự động được tăng lên 1 đơn vị mỗi lần nhận được thêm 1 xung nh ịp. Khi giá tr ị đ ếm vượt quá giá trị max = 65535 thì sẽ tràn về 0, cờ ngắt TFx được tự động đặt =1. Chế độ này được dùng trong các ứng dụng đếm thời gian và đếm sự kiện. Trong chế độ auto reload 8 bit giá trị đếm sẽ chỉ đ ược ch ứa trong thanh ghi TRx, còn giá trị của thanh ghi THx bằng một số n (0->255) do người l ập trình đ ưa vào. Khi có thêm một xung nhịp, giá trị đếm trong TLx đương nhiên cũng tăng lên 1 đ ơn v ị nh ư bình thường. Tuy nhiên trong trường hợp này giá trị đếm lớn nhất = 255 ch ứ không phải = 65535 như trường hợp trên vì timer/counter chỉ còn 8 bit. Do vậy s ự ki ện tràn lúc này xảy ra nhanh hơn, chỉ cần vượt quá 255 là giá trị đếm sẽ tràn. C ờ ngắt TFx vẫn được đặt bằng 1 như trong trường hợp tràn 16 bit. Đi ểm khác bi ệt là thay vì tràn về 0 giá trị THx sẽ được tự động nạp lại vào thanh ghi TLx, do đó timer/counter sau khi tràn sẽ có giá trị bằng n và đếm từ giá trị n trở đi. Ch ế đ ộ này đ ược dùng trong việc tạo Baud rate cho truyền thông qua cổng nối tiếp. Để sử dụng timer của 8051,ta thực hiện theo các bước sau: - Quy định chế độ hoạt động cho timer bằng cách tính toán và ghi giá tr ị cho các bit trong thanh ghi TMOD. - Ghi giá trị đếm khởi đầu mong muốn vào hai thanh ghi đếm THx và TLx. Đôi khi ta không muốn timer/counter bắt đầu đếm từ 0 mà từ một giá trị nào đó để thời điểm tràn gần hơn,hoặc chẵn hơn trong tính toán sau này.Ví dụ,nếu cho timer đếm từ 15535 thì sau 50000 xung nhịp (tức 50000 micro giây với thạch anh 12MHz) timer sẽ tràn,và thời gian 1giây có th ể d ễ dàng tính ra khá chính xác =20 lần tràn của timer (đương nhiên mỗi lần tràn l ại phải nạp lại giá trị 15535). - Đặt mức ưu tiên ngắt và cho phép ngắt tràn timer (nếu muốn). 8
  9. - Dùng bit TRx trong thanh ghi TCON để cho timer chạy hay d ừng theo ý muốn. 1.12 Cổng vào ra nối tiếp (Serial Port) Cổng nối tiếp trong 8051 chủ yếu được dung trong các ứng dụng có yêu c ầu truyền thông với máy tính,hoặc một vi điều khiển khác.Liên quan đến cổng n ối ti ếp ch ủ yếu có hai thanh ghi :SCON và SBUF.Ngoài ra một thanh ghi khác là thanh ghi PCON (không đánh địa chỉ bit) có 7bit tên là SMOD quy đ ịnh t ốc đ ộ truy ền c ủa c ổng n ối ti ếp có gấp đôi lên (SMOD = 1) hay không (SMOD = 0). Dữ liệu được truyền nhận nối tiếp thông qua hai chân cổng P3.0 (RXD) và P3.1 (TXD). Thanh ghi SBUF là thanh ghi 8bit chứa dữ liệu truyền ho ặc nhận.Về thực chất có hai thanh ghi dữ liệu khác nhau,một để chứa dữ liệu truyền đi,một để chứa dữ liệu nhận được.Cả hai thanh ghi này đều có chung tên SBUF,tuy nhiên CPU hàon toàn phân bi ệt được một cách dễ dàng.Khi ta muốn truyền dữ liệu đi,ta phải ghi vào thanh ghi SBUF (ví dụ viết lệnh mov SBUF ,a) còn khi muốn đọc,ki ểm tra dữ li ệu nhận ta phải ghi vào thanh ghi SBUF (ví dụ viết lệnh mov a,SBUF).CPU sẽ căn c ứ vào vi ệc thanh ghi SBUF nằm ở vị trí toán hạng đích (toán hạng bên trái) hay toán hạng ngu ồn (toán hạng bên phải) để quyết định sẽ truy nhập (đọc/ghi) thanh ghi SBUF nào.Người l ập trình không cần phải quan tâm xử lý vấn đề này. Thanh ghi quy định chế độ hoạt động và điểu khiển cổng nối ti ếp là thanh ghi SCON (đánh địa chỉ bit). SM0 SM1 SM2 REN TB8 RB8 TI RI Bit SM0,SM1,SM2 quy định chế độ hoạt động của cổng nối tiếp.Thông SM0 SM1 Chế độ Khung dữ liệu Baud rate 0 0 0 - đồng bộ 8bit SBUF Fosc/12 0 1 1 - dị bộ 8bit SBUF Thay đổi được 1 0 2 - dị bộ 8bit SBUF + RB8/TB8 Fosc/32 hoặc Fosc/64 1 1 3 - dị bộ 8bit SBUF + RB8/TB8 Thay đổi được thường để truyền thong giữa hai vi điều khiển hoặc giữa một vi điều khiển và m ột máy tính,giá trị của bit SM2 được đặt bằng 0.Khi truyền thông theo ki ểu m ạng đa vi xử lý (multiprocessor communication),SM2 được đặt bằng 1.Hai bit SM0 và SM1 th ực sự là các bit quy định chế độ hoạt động c ủa c ổng nối ti ếp,chúng t ạo ra 4 t ổ h ợp (00,01,10 và 11) ứng với 4 chế độ hoạt động mô tả trong bảng sau: Chế độ 0: là chế độ truyền đồng bộ duy nhất .Chân RXD sẽ là tín hi ệu truyền nh ận dữ liệu, chân TXD là tín hiệu xung nhịp.Bit LSB (bit 0) của d ữ li ệu đ ược truyền đi trước tiên.Tốc độ truyền cố định và bằng 1/12 giá trị thạch anh. 9
  10. Chế độ 1: là chế độ truyền dị bộ 8bit.Dữ liệu 8bit được đóng khung bởi 1bit Star (=0) ở đầu và bit Stop (=1) ở cuối trước khi dữ li ệu được truyền đi.T ốc đ ộ truyền có th ể thay đổi theo ý người lập trình. Chế độ 2: là chế độ truyền dị bộ 9 bit.Dữ liệu truyền 9 bit được ghép thành bởi 8 bit trong thanh ghi SBUF và bit RB8 (trường hợp nhận về) hoặc TB8 (tr ường h ợp truyền đi) trong thanh ghi SCON.Ngoài ra các bit Star và Stop v ẫn đ ược g ắn bình ở đ ầu và ở cuối khung truyền.Trong chế độ này,tốc độ truyền chỉ chọn 1 trong 2 m ức :1/32 ho ặc 1/64 giá trị của thạch anh. Chế độ 3: cũng là chế độ truyền dị bộ 9bit,khác với chế độ 2 ở chỗ tốc độ truyền có thể thay đổi được theo ý người lập trình như chế độ 1. Bit REN trong thanh ghi SCON là bit cho phép nhận dữ liệu.Dữ liệu chỉ được nhận qua cổng nối tiếp khi bit này bằng 1. Bit TB8 là bit dữ liệu thứ 9 trong trường hợp truyền đi 9bit (8 bit kia trong thanh ghi SBUF). Bit RB8 là bit dữ liệu thứ 9 trong trường hợp nhận về 9bit (8 bit kia trong thanh ghi SBUF). Bit TI là cờ ngắt truyền,báo hiệu việc truyền 1khung dữ liệu đã hoàn tất. Bit RI là cờ ngắt nhận,báo hiệu việc nhận 1khung dữ liệu đã hoàn tất. Để tạo ra tốc độ truyền (Baud rate) của cổng n ối ti ếp trong 8051,ph ải dùng đ ến timer 1 ở chế độ Auto Reload 8bit.Giá trị nạp lại chứa trong thanh ghi TH1 đ ược tính toán theo công thức sau (phụ thuộc vào Baud rate mong muốn và giá trị của thạch anh) Tóm lại để sử dụng cổng nối tiếp của 8051,ta thực hiện theo các bước sau: - Chọn chế độ cho cổng nối tiếp (đồng bộ/dị bộ,8bit/9bit…) từ đó chọn được giá trị cho các bit trong thanh ghi SCON.Lưu ý xoá các bit TI và RI. - Chọn tốc độ truyền mong muốn,từ đó tính ra giá trị c ủa thanh ghi TH1.Cho timer 1 chạy ở chế độ Auto Reload 8bit (không dung ngắt tràn timer 1). - Đặt mức ưu tiên ngắt và cho phép ngắt cổng nối tiếp nếu muốn. - Bắt đầu truyền dữ liệu bằng một lệnh ghi dữ li ệu muốn truyền vào thanh ghi SBUF.Quá trình truyền kết thúc thì cờ TI tự động đặt lên 1. - Khi một khung dữ liệu đã được nhận đầy đủ ,cờ RI sẽ tự động đặt lên và người lập trình lúc này có thể dùng lệnh đọc thanh ghi SBUF đ ể l ấy d ữ liệu nhận được ra xử lý. 10
  11. 1.13 Ngắt (interrupt) 8051 chỉ có một ssó lượng ít các nguồn ngắt (interrupt source),hoặc có thể gọi là nguyên nhân ngắt.Mỗi ngắt sẽ có một vector ngắt riêng, đó là một đ ịa ch ỉ c ố đ ịnh n ằm trong bộ nhớ chương trình.Khi ngắt xảy ra,CPU sẽ tự động nhảy đến th ực hi ện l ệnh tại địa chỉ này.Bảng tóm tắt các ngắt trong 8051 như sau: STT Tên ngắt Mô tả Cờ ngắt Thanh ghi Vector ngắt chứa cờ 1 INT0 Ngắt ngoài 0 khi IE0 TCON 0x0003 có tín hiệu tích cực thao kiểu đã chọn ở chân P3.2 . 2 Timer 0 Ngắt tràn timer 0 TF0 TCON 0x000B khi giá trị timer 0 tràn từ giá trị max về min. 3 INT1 Ngắt ngoài 1 khi IE1 TCON 0x0013 có tín hiệu tích cực thao kiểu đã chọn ở chân P3.3. 4 Timer 1 Ngắt tràn timer 1 TF1 TCON 0x001B khi giá trị timer 1 tràn từ giá trị max về min 5 Serial Ngắt cổng nối TI,RI SCON 0x0023 Port tiếp khi vi điều khiển nhận hoặc truyền xong 1byte bằng cổng nối tiếp Liên quan đến ngắt chủ yếu có 2 thanh ghi là thanh ghi cho phép ng ắt IE và thanh ghi ưu tiên ngắt IP. - Thanh ghi cho phép ngắt IE (Interrupt Enable): EA - ET2 ES ET1 EX1 ET0 EX0 Để cho phép một ngắt xảy ra,bit tương ứng với ngắt đó và bit EA phải đ ược dặt b ằng 1.Thanh ghi IE là thanh ghi đánh địa chỉ từng bit,do đó có thể dùng các lệnh tác động bit để tác động riêng rẽ lên từng bit mà không ảnh hưởng đ ến giá tr ị các bit khác.C ờ ngắt hoạt động độc lập với việc cho phép ngắt, điều đó có nghĩa là c ờ ngắt s ẽ t ự đ ộng đ ặt lên bằng 1 khi có sự kiện ngắt xảy ra,bất kể sự kiện đó có được cho phép ngắt hay không.Do vậy,trước khi cho phép một ngắt,ta nên xoá cờ của ngắt đó để đảm b ảo sau khi cho phép,các sự kiện gây ngắt trong quá khứ không thể gây ngắt nữa. 11
  12. - Thanh ghi ưu tiên thứ tự ngắt IP (Interrupt Priority): - - PT2 PS PT1 PX1 PT0 PX0 Các bit trong thanh ghi IP tương ứng v ới các ngắt đúng nh ư trong thanh ghi IE (bit PX0 dành cho ngắt ngoài 0,bit PT0 dành cho ngắt timer 0…) Một điều dễ nhận thấy là một ngắt được đ ặt m ức ưu tiên cao (bit t ương ứng trong thanh ghi IP bằng 1) thì sẽ không có ngắt nào xen vào quá trình xử lý nó đ ược nữa. Nói về mức ưu tiên ngắt,có thể dùng m ột ví d ụ t ổng quát sau,gi ả s ử hai ngắt timer 0 và ngắt cổng nối tiếp cùng được cho phép (các bit t ương ứng và bit EA trong thanh ghi IE được đặt bằng 1),bit PT0 =0,bit PS =1 thì: - Nếu hai ngắt cùng xảy ra ,ngắt timer 0 sẽ được xử lý trước. - Nếu ngắt cổng nối tiếp xảy ra trước và đang được xử lý thì ngắt timer 0 nếu có xảy ra cũng không thể chen vào,làm dừng quá trình xử lý c ổng n ối tiếp được. - Nếu ngắt timer 0 xảy ra trước và đang được xử lý ngắt mà ng ắt c ổng n ối tiếp xảy ra thì CPU sẽ phải dừng việc xử lý ngắt timer 0 l ại,chuyển sang xử lý ngắt cổng nối tiếp,xử lý xong mới quay lại xử lý tiếp ngắt timer 0. Như đã biết,8051 có hai ngắt ngoài là INT0 và INT1.Ngắt ngoài đ ược hi ểu là ng ắt được gây ra bởi sự kiện mức logic 0 (mức điện áp thấp,gần 0V) hoặc sườn xuống (sự chuyển mức điện áp từ mức cao về mức thấp) xảy ra ở chân ngắt tương ứng (P3.2 với ngắt ngoài 0 và P3.3 với ngắt ngoài 1).Vi ệc lựa chọn ki ểu ngắt đ ược th ực hi ện bằng bảng các bit IT (Interrupt type) n ằm trong thanh ghi TCON. Đây là thanh ghi đi ều khiển timer nhưng 4bit LSB được dung cho ngắt ngoài. 7 6 5 4 3 2 1 0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Khi bit ITx =1 thì ngắt ngoài tương ứng được chọn là ki ểu ngắt theo s ườn xuống,ngược lại nếu bit ITx=0 thì ngắt ngoài tương ứng sẽ là kiểu ngắt theo m ức thấp.Các bit IE là các bit cờ ngắt ngoài,chỉ có tác d ụng trong tr ường h ợp ki ểu ng ắt được chọn là ngắt theo sườn xuống. Khi kiểu ngắt theo sườn xuống được ch ọn thì ngắt s ẽ x ảy ra duy nh ất 1l ần khi có sườn xuống của tín hiệu.Sau đó khi tín hiệu ở mức thấp,ho ặc có s ườn lên,ho ặc ở mức cao thì cũng không có ngắt xảy ra cho đến khi có sườn xu ống ti ếp theo.C ờ ngắt IE sẽ được dựng lên khi có sườn xuống và tự động bị xoá khi CPU bắt đầu xử lý. Khi kiểu ngắt theo mức thấp được chọn thì ngắt sẽ xảy ra bất c ứ khi nào tín hi ệu t ại chân ngắt ở mức thấp.Nếu khi xử lý xong ngắt mà tín hiệu v ẫn ở m ức th ấp thì l ại 12
  13. ngắt tiếp,cứ như vậy cho đến khi xử lý xong ngắt n,tín hiệu đã lên m ức cao r ồi thì thôi,không ngắt nữa.Cờ IE trong trường hợp này không có ý nghĩa gì cả. Thông thường kiểu ngắt hay được chọn là ngắt theo sườn xuống. 2. Giới thiệu về Led 7 thanh 2.1 Khái quát về led 7 thanh Led 7 thanh được ứng dụng khá phổ biến khi cần hiển thị số tự nhiên ho ặc vài ch ữ cái nhất định. Led 7 thanh có thể có kích thước lớn nhỏ khác nhau, màu sắc khác nhau nhưng về hình dáng cơ bản như hình sau: Led 7 thanh bao gồm nhiều led tích hợp bên trong, các led đ ược n ối chung nhau 1 chân. Trong thực tế có 2 loại led 7 thanh là led 7 thanh A-nốt chung và led 7 thanh Ka-t ốt chung. Led loại A-nốt chung, các led sẽ có chung nhau chân ngu ồn (chân d ương), chân còn lại của led nào được nối đất thì led đó sẽ sáng. Led lo ại Ka-t ốt chung, các led s ẽ nối chung nhau chân đất (chân âm), chân còn lại c ủa led nào đ ược n ối ngu ồn thì led đó sẽ sáng. Trong đồ án sử dụng led 7 thanh anot chung. 2.2 Nguyên lý quét led Để điều khiển cho n led 7 thanh ta sử dụng n đường dây điều khiển c ấp nguồn cho các led và 8 đường dây số liệu chung cho tất cả các led ( 7 đường dây n ếu không c ần dấu chấm). Việc hiển thị được thực hiện bằng cách lần lượt cấp nguồn cho từng led và đưa số liệu tương ứng của led đó ra 8 đường dây số liệu. Nh ư v ậy th ực ch ất t ại 13
  14. một thời điểm chỉ có 1 led hoạt động còn các led khác không ho ạt đ ộng vì không đ ược cấp nguồn. Tuy nhiên do đặc tính lưu ảnh của m ắt người mà ta nhìn th ấy t ất c ả các led cùng hoạt động. 14
  15. I. SƠ ĐỒ NGUYÊN LÝ - MÔ PHỎNG TRÊN PROTUES 15
  16. II. SƠ ĐỒ MẠCH IN 16
  17. III. CODE CHƯƠNG TRÌNH #include #include #include unsigned char socham[10]={0x01,0x4f,0x12,0x06,0x4c,0x24,0x20,0x0f,0x00,0x04} //hien thi so co dau cham unsigned char so[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84}; //hien thi so khong co dau cham int ngay,thang,nam,gio,phut,giay, a,m,i,n,b,c,d,e,f,g,h; void delay() // ham tre { TMOD=0X02; TH0=-250; TL0=-250; TR0=1; while(!TF0); TF0=0; } void xoa(void) // ham xoa cho led deu tat { P2=0xFF; } //======================##-----cac ham dem---------##===================// //----- dem gio phut giay------- void dem(void) { giay++; if(giay==60) { phut++; if(phut==60) { gio++; if(gio==24) {m=1; gio=0; } phut=0; } giay=0; } } //-------- dem ngay thang nam----------- void dem1(void) // thang co 31 ngay {ngay++; if (ngay==32) {thang++; if (thang==13) {nam++; thang=1; } ngay=1; } } void dem2(void) // thang co 30 ngay {ngay++; if (ngay==31) {thang++; 17
  18. if (thang==13) {nam++; thang=1; } ngay=1; } } void dem3(void) //thang co 28 ngay {ngay++; if (ngay==29) {thang++; if (thang==13) {nam++; thang=1; } ngay=1; } } // =============$$$$$$==========$$---------ham hien thi ------$$======$$$$$======// //-------------------- hien thi ngay thang nam -----------------------// void hienthinam(void) { P2=so[ngay/10]; P0=0x01; delay();delay(); P0=0x00; delay(); P2=socham[ngay%10]; P0=0x02; delay();delay(); P0=0x00;delay(); P2=so[thang/10]; P0=0x04; delay();delay(); P0=0x00; delay(); P2=socham[thang%10]; P0=0x08; delay();delay(); P0=0x00; P2=so[nam/1000]; P0=0x10; delay();delay(); P0=0x00; P2=so[(nam%1000)/100]; P0=0x20; delay();delay(); P0=0x00; P2=so[((nam%1000)%100)/10]; P0=0x40; delay();delay(); P0=0x00; P2=socham[((nam%1000)%100)%10]; P0=0x80; delay();delay(); P0=0x00; delay(); } //--------------- hien thi gio phut giay ----------------- // void hienthi(void) 18
  19. { P2=so[gio/10]; P0=0x04; delay(); delay(); P0=0x00; delay(); P2=socham[gio%10]; P0=0x08; delay();delay(); P0=0x00; delay(); P2=so[phut/10]; P0=0x10; delay();delay(); P0=0x00; delay(); P2=socham[phut%10]; P0=0x20; delay();delay(); P0=0x00;delay(); P2=so[giay/10]; P0=0x40; delay();delay(); P0=0x00; delay(); P2=socham[giay%10];P0=0x80; delay(); delay(); P0=0x00; delay();delay();delay(); } //============================================================================== //******======== chuong trinh chinh ========*********// //============================================================================== void main() { giay=phut=gio=0; ngay=1; thang=1; nam=2009; while(1) { dem(); // vong dem gio phut giay while(m) // khi gio =24 thi chay 1 luot vong dem ngay thang nam { if (thang==1) dem1(); if (thang==2) dem3(); if (thang==3) dem1(); if (thang==4) dem2(); if (thang==5) dem1(); if (thang==6) dem2(); if (thang==7) dem1(); if (thang==8) dem1(); if (thang==9) dem2(); if (thang==10) dem1(); if (thang==11) dem2(); if (thang==12) dem1(); m=0; } //----------hien thi va chinh sua gio phut giay---------------- if(n==0) { for(i=0;i
  20. hienthi(); if(P1==0xfe) {b=1;} if(P1==0xfd) {c=1;} if(P1==0xfb) {d=1;} if(P1==0xF7) n=1; } if(b==1) { giay=0; b=0; } if(c==1) {++phut; if(phut==60) {phut=0;} c=0; } if(d==1) {++gio; if(gio==24) {gio=0;} d=0; } } // --------hien thi va chinh sua ngay thang nam -------------- if(n==1) { for(i=0;i
Đồng bộ tài khoản