1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

vi điều khiển họ 8051 với ngôn ngữ c

29 839 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 29
Dung lượng 183,68 KB

Nội dung

họ 8051 là họ VDK cổ ñiển nhưng nó khá phổ cập ở Việt Nam. Với họ này các bạn sẽ ñược học ở trường, vànó sẽ trở thành tiền ñề ñể học các họ khác. Khi bắt tay vào học VDK, bạn có 2 hướng ñi: dùng ngôn ngữ Assembler hoặc sử dụng ngôn ngữ cấp cao như Pacal, C... nhưng cái nào cũng có thế mạnh riêng của nó. As thì sẽ gần với phần cứng nhất nên chương trình sẽ chạy nhanh nhất, ngôn ngữ cấp cao thì tiện cho người sử dụng hơn nhưng sẽ chạy chậm hơn. Ở ñây chúng ta sẽ cùng tham gia bàn luận về họ 8051với ngôn ngữ cấp cao như C, sử dụng chương trình Keil ñể lập trình

PDA tranpic tranpic tranpic Welcome www.khongtenmien.com > http://khongtenmien.com/forum/archive/index.php/f-9.html > ðiện - Tự ñộng > Vi ñiều khiển > 8051 family > vi ñiều khiển họ 8051! với ngôn ngữ C View Full Version : vi ñiều khiển họ 8051! với ngôn ngữ C 10-28-2007, 03:27 PM họ 8051 là họ VDK cổ ñiển nhưng nó khá phổ cập ở Việt Nam. Với họ này các bạn sẽ ñược học ở trường, và nó sẽ trở thành tiền ñề ñể học các họ khác. Khi bắt tay vào học VDK, bạn có 2 hướng ñi: dùng ngôn ngữ Assembler hoặc sử dụng ngôn ngữ cấp cao như Pacal, C nhưng cái nào cũng có thế mạnh riêng của nó. As thì sẽ gần với phần cứng nhất nên chương trình sẽ chạy nhanh nhất, ngôn ngữ cấp cao thì tiện cho người sử dụng hơn nhưng sẽ chạy chậm hơn. Ở ñây chúng ta sẽ cùng tham gia bàn luận về họ 8051 với ngôn ngữ cấp cao như C, sử dụng chương trình Keil ñể lập trình. ðể học VDK chúng ta cần mạch nạp và kit hoặc chương trình mô phỏng(bên PROTEUS), nhưng tốt hơn hết là phải có một cái kit thí nghiệm có thể tự làm hoặc mua, có như vậy chúng ta mới có thể nhanh tiến bộ ñược, có nhiều lỗi mà trong mô phỏng chúng ta không thấy ñược Link down Keil: >>> ([Only registered and activated users can see links]) 10-28-2007, 03:55 PM sau khi cài ñặt,chon Project/close Project sau ñó bắt ñầu tạo Project mới như sau: Project/New Project chọn chip ở ñây mình sử dụng chip 89S52 của ATMEL [Only registered and activated users can see links] sau ñó bạn chon File/New rồi chọn Save ñặt tên cho nó nhớ phải có phần mở rộng là .c tiếp tục nhấn chuột phải vào Source Group 1 chọn Add File To Group rồi chọn File *.c bạn vừa lưu ở trên [Only registered and activated users can see links] tạo File .hex ñể nạp cho VDK [Only registered and activated users can see links] [Only registered and activated users can see links] rồi bây giờ viết chương trình và ñể dịch sang File .hex thì ta nhấn F7. chúng ta bắt ñầu viết chương trình cho VDK #include< *.h > ‘khai báo thư viện cần dùng void ten() { ‘chương trình con } void ngat() interrupt 0 using 0 ‘chương trinh phục vụ ngắt { } void main() ‘chương trình chính cho VDK { } 10-28-2007, 04:03 PM Việc viết hàm delay có thời gian chuẩn là rất cần thiết trong lập trình VDK;) Các vấn ñề liên quan ñến việc sử dụng Timer: • Thanh ghi TMOD là thanh ghi 8 bit dùng ñể thiết lập bộ ñịnh thời. Bit Tên Bộ ñịnh thời Mô tả 7 GATE 1 Bit ñiều khiển cổng. Khi ñược set lên 1, bộ ñịnh thời chỉ hoạt ñộng khi INT1 ở mức 1. 6 C/T 1 Bit chọn chức năng ñếm hoặc ñịnh thời; 1 là ñếm sự kiện, 0 là ñịnh thời trong 1 khoảng thời gian. 5 M1 1 Bit chọn chế ñộ thứ nhất. 4 M0 1 Bit chọn chế ñộ thứ hai. 3 GATE 0 Bit ñiều khiển cổng cho bộ ñịnh thời 0. 2 C/T 0 Bit chọn chức năng ñếm hay ñịnh thời cho bộ ñịnh thời 0. 1 M1 0 Bit chọn chế ñộ thứ nhất. 0 M0 0 Bit chọn chế ñộ thứ hai. vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 1 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= tranpic • Việc xác ñịnh chế ñộ làm việc của bộ ñịnh thời dựa vào giá trị của 2 bit M0 và M1: M1 M0 Chế ñộ Mô tả 0 0 0 Chế ñộ ñịnh thời 13 bit 0 1 1 Chế ñộ ñịnh thời 16 bit 1 0 2 Chế ñộ tự ñộng nạp lại 8 bit 1 1 3 Chế ñộ ñịnh thời chia xẻ Chế ñộ 0: (chế ñộ ñịnh thời 13 bit). Chế ñộ này tương thích với bộ vi ñiều khiển tiền nhiệm 8048. Chế ñộ này không ñược dùng cho các thiết kế mới. Chế ñộ1: (chế ñộ ñịnh thời 16 bit). Là chế ñộ xung clock ñặt vào cả thanh ghi ñịnh thời cao và thấp kết hợp(TLxTHx),khi có xung clock ñến thì bộ ñịnh thời ñếm lên : 0000H…FFFFH, khi từ FFFFH xuống 0000H thì cờ tràn ñược set lên 1, cờ tràn là bit TFx trong thanh ghi ñiều khiển ñịnh thờiTCON. Ở chế ñộ ñịnh thời 16 bit này cờ tràn sau khi ñưa lên 1 thì sẽ tự ñưa về 0. Chế ñộ 2: (chế ñộ tự nạp lại 8 bit). Chế ñộ này byte thấp của bộ ñịnh thời (TLx) hoạt ñộng ñịnh thời 8 bit còn byte cao của bộ ñịnh thời làm nhiệm vụ lưu giữ giá trị nạp lại. Khi bộ ñịnh thời ñếm từ FFH xuống 00H, không chủ cờ tràn của bộ ñịnh thời ñược set lên 1 mà giá trị trong THx còn ñược nạp vào TLx, việc ñếm tiếp tục ñược thực hiện Chế ñộ 3: (chế ñộ ñịnh thời chia xẻ). Nó hoạt ñộng khác nhau ở các bộ ñịnh thời khác nhau. Bộ ñịnh thời 0 ở chế ñộ 3 ñược chia làm 2 bộ ñịnh thời 8 bit hoạt ñộng riêng lẻ TL0 và TH0, mỗi bộ ñịnh thời lúc này sẽ set cờ tràn tương ứng là TF0 và TF1khi xảy ra tràn. Bộ ñịnh thời 1 không hoạt ñộng ở chế ñộ 3. • Thanh ghi TCON là thanh ghi ñiều khiển hoạt ñộng ñịnh thời. Bit Ký hiệu ðịa chỉ Mô tả 7 TF1 8FH Cờ tràn của bộ ñịnh thời 1, ñược set và clear bởi phần cứng. 6 TR1 8EH Bit ñiều khiển hoạt ñộng của bộ ñịnh thời 1, ñược set và clear bằng phần mềm. 5 TF0 8DH Cờ tràn của bộ ñịnh thời 0. 4 TR0 8CH Bit ñiều khiển hoạt ñộng của bộ ñịnh thời 0. 3 IE1 8BH Cờ ngắt ngoài 1. 2 IT1 8AH Cờ ngắt ngoài 1, ñiều khiển ngắt cạnh hoặc mức. 1 ET0 89H Cờ ngắt ngoài 0. 0 IT0 88H Cờ ngắt ngoài 0, ñiều khiển ngắt cạnh hoặc mức. • Cách tính thời gian cho một hàm delay như sau: Sử dụng nguồn clock ngoài 12MHz, khi ñó clock của bộ ñịnh thời là 1MHz suy ra thời gian mỗi lần bộ ñịnh thời tăng lên 1 là 1µs. 10-28-2007, 04:25 PM ví dụ khi bạn cần hàm delay 1ms=1000us như vậy bạn cần dùng ở chế ñộ 1(16 bit 65536) nếu sử dụng thạch anh ngoài là 12MHz thì thời gian của mỗi lần tăng lên của Timer sẽ là 12000000/12=1us. tính thời gian delay: thời gian delay=(65536-THx,TLXx+1). tính toán rồi ñổi ra số HEX ta ñược THx,TLx+1=FC18, như vậy mình nạp giá trị vào cho THx=FC và TLx=17; chương trình ñược viết như sau: void delay() { TMOD=0x01; //sử dụng Timer0 ở chế ñộ 1 TL0=17; TH0=FC; TR0=1; //cho phép Timer0 chạy while (TF0);//chờ TF0 lên mức 1 TR0=0; //cấm Timer } như vậy mỗi lần cần delay 1ms bạn gọi hàm này ra như sau: delay(); Nếu như bạn cần delay là bội của 1ms thì có thể viết chương trình có thể nhập giá trị cần delay vào luôn: void delay(unsigned char time) { unsigned char x; for(x=0;x<=time;x++) { TMOD=0x01; //sử dụng Timer0 ở chế ñộ 1 TL0=17; TH0=FC; TR0=1; //cho phép Timer0 chạy vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 2 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= vitcon tranpic tranpic while (TF0);//chờ TF0 lên mức 1 TR0=0; //cấm Timer } } Ở ñây vì khai báo là unsigned char nên time có giá trị từ 0>>255; 10-29-2007, 10:11 PM ví dụ khi bạn cần hàm delay 1ms=1000us như vậy bạn cần dùng ở chế ñộ 1(16 bit 65536) nếu sử dụng thạch anh ngoài là 12MHz thì thời gian của mỗi lần tăng lên của Timer sẽ là 12000000/12=1us. tính thời gian delay: thời gian delay=(65536-THx,TLXx+1).1 tính toán rồi ñổi ra số HEX ta ñược THx,TLx+1=FC18, như vậy mình nạp giá trị vào cho THx=FC và TLx=17; chương trình ñược viết như sau: void delay() { TMOD=0x01; //sử dụng Timer0 ở chế ñộ 1 TL0=17; TH0=FC; TR0=1; //cho phép Timer0 chạy while (TF0);//chờ TF0 lên mức 1 TR0=0; //cấm Timer } như vậy mỗi lần cần delay 1ms bạn gọi hàm này ra như sau: delay(); Nếu như bạn cần delay là bội của 1ms thì có thể viết chương trình có thể nhập giá trị cần delay vào luôn: void delay(unsigned char time) { unsigned char x; for(x=0;x<=time;x++) { TMOD=0x01; //sử dụng Timer0 ở chế ñộ 1 TL0=17; TH0=FC; TR0=1; //cho phép Timer0 chạy while (TF0);//chờ TF0 lên mức 1 TR0=0; //cấm Timer } } Ở ñây vì khai báo là unsigned char nên time có giá trị từ 0>>255; pác sinhvien chăm chỉ nhẩy!!!thax pác phát nhá!Nhưng em lở iu avr ùi!Sống chết j em cũng quyết tâm lấy avr làm ñồ án!hehe. 10-30-2007, 04:46 PM pác sinhvien chăm chỉ nhẩy!!!thax pác phát nhá!Nhưng em lở iu avr ùi!Sống chết j em cũng quyết tâm lấy avr làm ñồ án!hehe. haha cố lên Jimmy, vậy thì chúng mình thêm vào một box AVR nữa nha. 11-03-2007, 12:56 PM câu hỏi ñặt ra: tại sao phải quét led?????? 1. khi chúng ta sử dụng nhiều led ñể hiển thị không lẻ cho tất cả các led ñều sáng-> tổn hao công suất. 2. cứ 1 led ta phải tốn 7 chân như vậy nếu dùng 6 led thì tốn 42 chân -> không ñủ chân ñiều khiển, nếu dùng 4 led thì tốn 28 chân vậy vdk chỉ ñể hiển thị thôi sao,,,phí!!!!!!!!!!!!! 3. khi dùng quét led bạn chỉ cần 2 port ñể ñiều khiển hiển thị 8 led 7 ñoạn. Nếu dùng giải mã và encoder bạn chỉ tốn 1 port ñể ñiều khiển hiển thị 16 led 7 ñoạn. Phương pháp này là dựa trên hiện tượng lưu ảnh của mắt người, ta cho mỗi led sáng lên trong một khoảng thời gian ñủ lâu cho mắt người lưu lại rồi tắt ñi cho led tiếp theo sáng lên cứ như vậy(giống cái ti vi ñó mà). vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 3 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= Thanh Hai tranpic tranpic vd: chương trình cho hiển thị từ 0 ñến 7 trên 8 led 7 ñoạn dùng quét led. #include<AT89X52.h> //bảng mã led 7 ñoạn unsigned char ma[8]={64,121,36,48,25,18,2,120}; //chương trình con tạo thời gian trễ, do không cần chính xác nên không cần dùng ñến Timer, ở //ñây gây trễ khoảng 1ms. void delay(unsigned char loop) { unsigned char x,y; for(x=0;x<=loop;x++) { for(y=0;y<33;y++); } } //chương trình con cho hiển thị void h_thi() { unsigned char x; P2=1; for(x=0;x<8;x++) { P0=ma[x]; delay(10); P0=255; delay(2); P2=P2<<1; } } //chương trình chính void main() { h_thi(); } 11-08-2007, 07:34 PM Ai viet bai nay ma noi sai roi do. Nhung phan mem chay tren OS cua may tinh moi tinh den chay nhanh hay cham khi su dung Ngon ngu lap trinh nao! Con doi voi ho VDK 8051, no kg co OS, tat ca moi ngon ngu khi nap cho 8051 deu bien dich ra 'ma may' roi moi nap cho 8051. Do do, viet bang bat ky ngon ngu nao cung chay voi toc do nhu nhau thoi. Ngon ngu cap cao chi de tien loi cho nguoi lap trinh thoi, hihi. Chao mung duoc den voi dien dan cua 08TDT, xin dc lam thanh vien nhe. Cac ban lam tot lam, hay chung suc xay dung de cho dien dan cua minh ngay cang lon manh nha. Tui xin dc ho tro ca ve mat tinh than lan van de kinh te, OK kg nao! Thay Hai. 11-08-2007, 09:31 PM chào thầy, cảm ơn thầy ñã tham gia với tụi em. Em viết mấy cái này bữa giờ chẳng thấy ai nói năng gì hết nên buồn quá trời luôn :(. Em nói chậm ở ñây là có lý do của em. Khi em dùng Keil và assem ñể viết 1 chương trình với giải thuật như nhau, thì việc mà em nói các ngôn ngữ cấp cao sẽ làm cho VDK chậm hơn ñó chính là 2 file .hex dich ra không có cùng một dung lượng(thường thì file .hex của ngôn ngữ cấp cao lớn hơn). ðiều ñó cho thấy khi dịch sang mã máy thì ngôn ngữ cấp cao tốn bộ nhớ hơn, hay sẽ nhiều lệnh hơn ->chạy chậm hơn. Việc này giống như lúc soạn thảo văn bản, nếu mình dùng notepad và word ñể viết 1 câu "chào bạn"với cùng fon chữ, cở chữ; khi lưu lại chắc chắn file do word tạo ra sẽ lớn hơn file do notepad tạo ra. không biết em có ñi lạc ñường khôg nhưng em nghĩ như vậy. Mong thầy hướng dẫn thêm. 11-10-2007, 03:58 PM Phím nhấn là 1 công cụ giúp con người giao tiếp với máy tính cũng như VDK. Cũng như vơi led ñể tiết kiệm chân vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 4 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= tranpic ta cũng dùng phương pháp là quét phím. Với ma trận phím thì ta có thể xác ñịnh ñược phím thông qua số thứ tự hàng và cột của phím ñó, cho nên ta sẽ viết chương trình nhận biết phím nào ñược nhấn thông qua 2 thông số ñó là hàng và cột. Ví dụ với ma trận 16 phím (4 hàng 4 cột) ta có bảng giá trị như sau: 0 1 2 3 4 5 6 7 8 9 A B C D E F Cột 1 2 3 4 phím số + + + + + + hàng1 1 1 1 0 3 1 1 0 1 2 1 0 1 1 1 0 1 1 1 0 hàng2 1 1 1 0 7 1 1 0 1 6 1 0 1 1 5 0 1 1 1 4 hàng3 1 1 1 0 B 1 1 0 1 A 1 0 1 1 9 0 1 1 1 8 hàng4 1 1 1 0 F 1 1 0 1 E 1 0 1 1 D 0 1 1 1 C Các vị trí của số 0 tương ứng với các phím trên bàn phím như (phím số) Phương pháp thực hiện là ta sẽ cho các cột hoặc các hàng thứ tự cao-thấp-cao. Nếu có phím ñược nhấn thì hàng hoặc cột tương ứng còn lại của phím ñó cũng sẽ xuống mức thấp, như vậy khi có phím nhấn thì sẽ có 1 cột và 1 hàng ở mức 0. Dựa vào bảng trên ta biết ñược ñó là phím nào ñược nhấn. 11-10-2007, 10:43 PM ñây là bài viết ñơn giản. Dựa trên phương pháp ñã nêu ở trên. #include<AT89X52.h> unsigned char ma=0; void delay(unsigned char timer) { unsigned char x,y; for (x=0;x<timer;x++) for(y=0;y<13;y++); } void display() { switch (ma) { case 0: P2=255; break; case 215: P2=64; //so 0 break; case 235: P2=121;//so 1 break; case 219: P2=36; //so 2 break; case 187: P2=48; //so 3 break; case 237: P2=25; //so 4 break; case 221: P2=18; //so 5 break; case 189: P2=2; //so 6 break; case 238: P2=120;//so 7 break; case 222: P2=128;//so 8 break; vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 5 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= tranpic tranpic tiger tranpic case 190: P2=16; //so9 break; } } void button() { unsigned char loop=0,get=0,bh=0; for (loop=0;loop<=3;loop++) { P3=~(1<<loop);//quet ma=0; bh=P3>>4; if (bh!=15) { ma=P3; while(P3==ma) { display(); } } } } void main() { P3=255; while(1) { P2=255;//tat led khi ko nhan button(); } } 11-10-2007, 11:05 PM [Only registered and activated users can see links] 11-10-2007, 11:18 PM tìm cái host free mòn mỏi luôn mới up ñược cái hình lên, ví dụ ở trên là giải mã bàn phím. còn mấy cái mã cho mấy phím dấu + - nữa nhưng buồn ngủ quá thôi nhờ các bạn ghi vào dùm. Ghi vào chỗ switch case ñó mà :D có thể các bạn có cách lấy mã hay hơn, xin gốm ý nha. 11-20-2007, 08:12 AM Noi nhu vay la chưa ñúng hẳn rồi. Dùng Assembly có thế mạnh là người dùng có thể ngày càng hiểu rõ phần cứng hơn, còn dùng C thì dễ mất ñi cấu trúc phần cứng. Trong giai ñoạn các bạn chưa phải là chuyên gia nên học Assembly cho thật vững, có thể xem ass là 70% và C là 30%, chủ yếu học cách viết ass sao cho có cấu trúc là ñưoc. ass hỗ trợ tất cả các kỹ năng viết ass có cấu trúc giống như C thôi. Cái hay của C là khi chuyển ñổi qua vdk khác tập lệnh ass thì dễ dàng hơn. phải vậy không thày? Vi dụ như trong C ta dung lênh for hoặc while thì trong ass ta dùng djnz hoặc cjne. Trong C ta goi ct con thi trong ass ta cung goi ct con (call), trong C ta co macro thi trong ass ta cung co macro (dung lệnh #define). Vấn ñề là phai luyện tập thui. Chuc moi nguoi thanh cong 01-14-2008, 04:01 PM chương trình sử dụng timer ñê tính thời gian. Nhưng cũng không thể chạy ñúng ñược, ñể chạy ñúng thì cần dùng IC thời gian thực của Dallat hoặc ñơn giản là kiếm ñồng hồ báo thức nào ko dùng nữa tháo ra lấy con IC của nó ta thấy có phần nối với 2 sợi dây của cuộn dây, ñó là xung chuẩn 1s, lấy cấp vào cho chân T0, hoặc T1 của VDK chuyển Timer thành Counter thế là chính xác ngay. /* vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 6 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= noi 4 bit thap cua P0 vao BCD-7SEG noi P2 vao 7SEG_CONTROL */ #include<AT89X52.h> unsigned int over=0; //bien tinh timer tran unsigned char second=0,min=0;hour=0; //bien gio, phut, giay unsigned char cod[8]={0,0,0,0,0,0,0,0}; //mang chua so hien thi //chuong trinh con tao thoi gian tre cho quet led void delay(unsigned char time) { unsigned char x,y; for(x=0;x<time;x++) { for(y=0;y<13;y++); } } //chuong trinh phuc vu ngat timer0 void time0() interrupt 1 { //cu 200 us thi tran 1 lan over++; if(over==4950) //gia tri tinh toan la 5000, tinh chinh lai 4950 { over=0; second++; } } //chuong trinh tinh toan void cal() { if(second==60) { second=0; min++; } if(min==60) { min=0; hour++; } if(hour==12) { hour=0; } //doan duoi la tach cac so gio, phut, giay ra thanh tung co so de hien thi cod[0]=second%10; cod[1]=second/10; cod[3]=min%10; cod[4]=min/10; cod[6]=hour%10; cod[7]=hour/10; } //chuong trinh con hien thi void disp() { unsigned char k; for(k=0;k<8;k++) { P0=cod[k]; if((k==2)||(k==5)) { P0=255; } P2=~(1<<k); delay(1); P2=255; } vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 7 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= tranpic } //chuong trinh chinh void main() { P0=255; P2=255; TMOD=2; //timer0 o che do 2 tu nap lai TH0=54; //gia tri nap lai TR0=1; //cho phep timer0 chay ET0=1; //cho phep ngat timer0 EA=1; //cho phep ngat toan cuc while(1) { cal(); //goi chuong trinh tinh toan disp(); //goi chuong trinh hien thi } } 01-14-2008, 04:18 PM chương trình giải mã ma trận phím hiển thị LCD giống như chương trình giải mã ma trận phím ñã viết ở trên chỉ thêm vào phần hiển thị LCD. ðể hiển thị LCD cần xem phần ñiều khiển LCD kèm theo. /* P0 noi voi LCD data*/ /* ma tran phim noi voi P3*/ /* noi 4 bit thap cua P2 voi chan cam LCD_CONTROL*/ /* co the su dung board thi nghiem 89_v2 de chay chuong trinh*/ /* lien he 0902902287*/ #include<AT89X52.h> sbit rs=P2^0; //P2_0 sbit rw=P2^1; //P2_1 sbit e=P2^2; //P2_2 sbit li=P2^3; //P2_3 dieu khien den cua LCD unsigned char dem=0; //chuong trinh con tao thoi gian tre void delay(unsigned int time) { unsigned int x,y; for(x=0;x<time;x++) { for(y=0;y<33;y++); } } // //chuong trinh con kiem tra lcd co ban ko void busy() { rs=0; rw=1; P0_7=1; //phai set chan nay de kien tra LCD co ban khong while(P0_7!=0) { e=0; e=1; } } // //chuong trinh con xuat lenh len LCD void lenh(unsigned char ma) { busy(); rs=0; rw=0; //phai tao xung o chan E nhu sau LCD moi chay e=1; P0=ma; vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 8 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= e=0; } // //chuong trinh con xuat du lieu len LCD void dat(unsigned char ma) { busy(); rs=1; rw=0; //phai tao xung o chan E nhu sau LCD moi chay e=1; P0=ma; e=0; } // //chuong trinh con cai dat LCD void int_lcd() { delay(30); //doi lenh(56); //8bit, 2 line lenh(15); //display on, cursor on,blinking on lenh(1); //clear display lenh(2); //return home } // //chuong trinh con su ly ma tran phim va hien thi ra LCD void key() { unsigned char k=0,temp=0; for(k=0;k<4;k++) { P3=~(1<<k); temp=P3>>4; if(temp!=15) { if(dem==0) lenh(1); //xoa man hinh cho lan nhan dau va cho khi bat dau nhan lai switch(P3) { case 119: while(temp!=15) //vong lap doi tha phim { temp=P3>>4; } delay(100); //chong nay phim dat(48); //xuat so 0 len LCD break; case 123: while(temp!=15) //vong lap doi tha phim { temp=P3>>4; } delay(100); //chong nay phim dat(49); //xuat so 1 len LCD break; case 125: while(temp!=15) { temp=P3>>4; } delay(100); dat(50); break; case 126: while(temp!=15) vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 9 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= { temp=P3>>4; } delay(100); dat(51); break; // case 183: while(temp!=15) { temp=P3>>4; } delay(100); dat(52); break; case 187: while(temp!=15) { temp=P3>>4; } delay(100); dat(53); break; case 189: while(temp!=15) { temp=P3>>4; } delay(100); dat(54); break; case 190: while(temp!=15) { temp=P3>>4; } delay(100); dat(55); break; // case 215: while(temp!=15) { temp=P3>>4; } delay(100); dat(56); break; case 219: while(temp!=15) { temp=P3>>4; } delay(100); dat(57); break; case 221: while(temp!=15) { temp=P3>>4; } delay(100); vi ñiều khiển họ 8051! với ngôn ngữ C [Lưu Trữ] - Welcome www.khong file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh/8051/vi%20 10 of 29 3/18/2010 12:36 =™‾£ø√ε‾™= [...]... chú thích r t kĩ r i mà, b n nên ñ c c c chú thích n a ch 02-18-2008, 10:53 PM tranpic c th nói ñây là ví d siss hay cho c c b n nghi n ng m v c ch l p trình b ng ngôn ng c 02-18-2008, 11:35 PM p c sv c th nói rõ hơn dc ko mình r t mu n h c ñó ch ng h n như là :vi t 1 ño n chương trình ñ mình hi u thêm:confused: vì mình chưa bit.pac vi t assem thì c ng hay con ko thì vi t c cũng dc, như " p c tiger... h c t p nha.e m i h c vñk nên bi t ít l m .C m ơn c c b c ñã b t chút th i gian quan tâm và tr l i cho em N u c th thì send cho em code và sơ ñ m ch nguyên lý cho em qua mai nha.Mail c a em là gaconkieman@gmail.com ho c tinh_yeu_tham_kin_nq@yahoo.com M t l n n a thank all.:-/ HERRO_AVR_PIC 07-08-2009, 09:12 PM c c b c có th ch cho e l p trình 32 led t t sáng th nào c ng c. ý c a e là xem c c b c có... ơi trong sơ ñ nguyên lý c a mình không c c ng not ý mình là c phương pháp nào thay cho c i c ng not ñó không,không dùng c ñư c không? n u không dùng thì ph i như th nào c i c ng nót ñó thay cho con transistor ch j ch này dùng led anode (+) chung, b n dùng m c th p ñ kích led qua con PNP như v y con PNP l c này c vai trò như c ng not r i c n j.( t c kích m c - mà nó cho ra m c + ñ sáng led) trantuan25187... break; case 253: while(P1!=255); delay(10); dem=0; P2-=chinh; break; } } } mình vi t như v y chưa th t s là hay nh t b n hãy vi t l i và tìm c ch kh c ñ c ñư c 1 chương trình hoàn thi n nha Ch c b n thành c ng 08-20-2008, 03:19 PM HERRO_AVR_PIC ñây là chương trình ñ ng h báo gi s d ng timer c a 8051 ñ ch y th i gian nên ko chính x c v th i gian c c b n c th s d ng c c ic realtime ñ c th i gian chính... c th v n d ng và vi t nhi u ki u theo ý mình .C th s d ng ít port c ng t t .c c b c post c hình nh lên cho em d xem và h c t p nha.e m i h c vñk nên bi t ít l m .C m ơn c c b c ñã b t chút th i gian quan tâm và tr l i cho em N u c th thì send cho em code và sơ ñ m ch nguyên lý cho em qua mai nha.Mail c a em là gaconkieman@gmail.com ho c tinh_yeu_tham_kin_nq@yahoo.com M t l n n a thank all.:-/ c i c. .. =™‾£ø√ε‾™= vi ñi u khi n h 8051! v i ngôn ng C [Lưu Tr ] - Welcome www.khong 12 of 29 file:///D:/HOC%20TAP/THUC%20HANH/Lap%20trinh /8051 /vi% 20 P3=255; int_lcd(); //goi chuong trinh cai dat LCD while(1) //vong lap vo tan { key(); //goi chuong trinh con xu ly ma tran phim } } //b n c th s d ng file sau làm thư vi n cho LCD xem k t n i và c u l nh s d ng trong c c b n ch c n copy nó vào C: \Keil \C5 1\INC r i... ghi dich, ghi d ch+ch t (74595), phân kênh, port m r ng (m t 2 port) (chưa nghĩ ra) t t nh t là dùng 74595 v a r v a vi t ñư c nhi u hi u ng daoxuankien 07-07-2009, 09:22 PM c c b c có th ch cho e l p trình 32 led t t sáng th nào c ng c. ý c a e là xem c c b c có gi i thu t như th nào ñ t ñó e c th v n d ng và vi t nhi u ki u theo ý mình .C th s d ng ít port c ng t t .c c b c post c hình nh lên cho em... sáng t t như th nào ch nói không không ai mà bi t c Sao giúp b n ñư c Ai c c ch nào ñk 32led mà ch dùng 1 port thôi c kg ? 06-29-2009, 09:18 PM tranpic Ph i nói là 32 c i led ñó nó sáng t t như th nào ch nói không không ai mà bi t c Sao giúp b n ñư c Ai c c ch nào ñk 32led mà ch dùng 1 port thôi c kg ? ch c n m y chân thôi ch c n j 1 port c r t nhi u c ch ñ ñi u khi n ñư c 32 hay nhi u hơn b... mình vi t như v y chưa th t s là hay nh t b n hãy vi t l i và tìm c ch kh c ñ c ñư c 1 chương trình hoàn thi n nha Ch c b n thành c ng c m ơn b n nhi u nhé tranpic 08-31-2008, 10:31 AM ko c j, ñây c ng là c h i cho mình h c h i mà vanhungesdk 09-06-2008, 07:38 AM b n tranpic ơi cho mình h i m t tí, trong thư vi n LCD mà b n post trên di n ñàn c ham mov 'void mov(unsigned char row, unsigned char col)... mình chưa bit.pac vi t assem thì c ng hay con ko thì vi t c cũng dc, như " p c tiger " nói vi t assem thì hi u ph n c ng hơn ñi u ñó là ñúng vì trong l p ña s ch hi u ass thôi nên p c vi t gì thì t i nó c hi u ñâu mà góp ý vì c ch dành cho nh ng ngư i ñã rành vi t i mình ch h c vdk m i 4 tháng thôi vì th t i fai t h c ñ góp ý cho p c nha ñ ng bu n t i này nha:D 01-19-2008, 11:30 AM tranpic mình ñã chú . 8051! với ngôn ngữ C View Full Version : vi ñiều khiển họ 8051! với ngôn ngữ C 10-28-2007, 03:27 PM họ 8051 là họ VDK c ñiển nhưng nó khá phổ c p ở Vi t Nam. Với họ này c c bạn sẽ ñư c h c ở trường,. và C là 30%, chủ yếu h c cách vi t ass sao cho c c u tr c là ñưoc. ass hỗ trợ tất c c c kỹ năng vi t ass c c u tr c giống như C thôi. C i hay c a C là khi chuyển ñổi qua vdk kh c tập lệnh ass. ñể h c c c họ kh c. Khi bắt tay vào h c VDK, bạn c 2 hướng ñi: dùng ngôn ngữ Assembler ho c sử dụng ngôn ngữ c p cao như Pacal, C nhưng c i nào c ng c thế mạnh riêng c a nó. As thì sẽ gần với

Ngày đăng: 12/10/2014, 10:38

TỪ KHÓA LIÊN QUAN

w