| anh em tham khảo bài tập nhúng | |
|
|
Tác giả | Thông điệp |
---|
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: anh em tham khảo bài tập nhúng Mon Jan 03, 2011 1:26 pm | |
| để anh em có chút về pic 18f452 tớ nghĩ đề thi chỉ cần như thế này thôi, trong đây là mấy dạng đơn giản, anh em nào cảm thấy không hiểu thì tớ sẽ hướng dẫn sau, nếu ko hiểu nữa thì học thuộc là tốt nhất hihi ảnh: http://666kb.com/i/bpsjjlkhc69m8bv4g.jpgở đây tớ dùng chân D của pic18f452 để bật tắt LED đơn. sau đây là code: - Code:
-
#include <18F452.h> #use delay(clock=20000000) int8 mang1[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; void main() { while(1) { int8 i,j,x=0x01;y=0x80; set_tris_D(0x00); //////1 led chạy từ trên xuống for(i=0;i<=7;i++) { output_D(x);delay_ms(50); rotate_left(&x,1); } //////1 led chạy từ dưới lên output_D(0x00);//delay_ms(200); for(j=0;j<=7;j++) { output_D(y);delay_ms(50); rotate_right(&y,1); } ////sáng tù trên sáng dần output_D(0x00); for(i=0;i<=7;i++) { output_D(mang1[i]);delay_ms(50); } /// tắt dần từ dưới lên output_D(0x00); for(i=8;i>=1;i--) { output_D(mang1[i-1]);delay_ms(50); } } }
ưu điểm của lệnh : rotate_right và rotate_left : rất ngắn gọnđây trính là hay lệnh quay bit trong pic dùng C hôm trước hỏi thầy Huy nhưng thầy bảo là không có, nhưng không ngờ hôm trước lại tìm được trong help của CCS, các bạn tốt nhất là vào help tìm các lệnh; mình thấy rất nhiều lệnh hay. tuy viết bằng tiếng anh nhưng ta cố gắng đọc là hiểu. ví dụ về rotate_left: - Code:
-
#include <18F452.h> #use delay(clock=20000000) int8 i,x=0x03,y=0x00; void main() { while(1){ int8 x=0x03; set_tris_D(0x00); output_D(x);delay_ms(50); for(i=0;i<=14;i++) { rotate_left(&x,1);//quay tròn output_D(x);delay_ms(50); } } }
với đoạn code này thì anh em có thể thay phần chương trình giống như trên cũng được. và có thể thay biến x là 0x07, hay là ........... thì tùy, và nó sẽ quay rất hay nếu như các bạn dùng hết các chân của pic . và cũng có thể dùng với AT98c51. nếu các bạn dùng AT89c51 thì các bạn viết với Keil C và dùng lệnh: _crol_(x,a) trong đó x: là biến mà các bạn muốn quay; a là số bước nhảy của một lần quay. ví dụ: x=0x03 => 00000011 a=1 -> suy ra một lần quay thì x=00000110; a=3-> suy ra một lần quay thì x=00011000; tương tự như vậy thì trong pic C với 18f453 thì các bạn cũng làm như thế nhé cấu trúc: rotate_left(&x,a) , rotate_right(&x,a) chúc các bạn thi tốt, nếu ai có thắc mắc gì thì liên hệ với mình, mình sẽ giúp các bạn thân!!!!!!!
Được sửa bởi vudinhthang1989 ngày Wed Jan 05, 2011 11:13 am; sửa lần 4. |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Mon Jan 03, 2011 1:42 pm | |
| chú thích: - Code:
-
#include <18F452.h> #use delay(clock=20000000) int8 mang1[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; void main() { while(1) { int8 i,j,x=0x01;y=0x80;[i]// khởi tạo giá trị ban đầu cho biến x=00000001; y=10000000;[/i] set_tris_D(0x00);[i]// cho D là chân xuất tín hiệu ra[/i] [i]//////1 led chạy từ trên xuống[/i] for(i=0;i<=7;i++)[i]// lặp lại 8 lần[/i] { output_D(x);delay_ms(50);[i]// chân D bằng giá trị x=00000001;[/i] rotate_left(&x,1);[i]// với mỗi lần quay x dịch một bít về bên trái, [/i] [i]// lần 1: x=00000010, lần 2: x=00000100;....tương tự ---lần 8: x=10000000;[/i] } [i]//////1 led chạy từ dưới lên; giải thích tương tự như phần trên, có điều là quay xang phải[/i] output_D(0x00);//delay_ms(200); for(j=0;j<=7;j++) { output_D(y);delay_ms(50); rotate_right(&y,1);[i]// quay giá trị bit xang phải[/i] } [i]////sáng tù trên sáng dần[/i] output_D(0x00); for(i=0;i<=7;i++) { output_D(mang1);delay_ms(50);[i]// cho giá trị của cổng D lần lượt bằng các giá trị của[/i] [i]//mang1[/i] } [i]/// tắt dần từ dưới lên[/i] output_D(0x00); for(i=8;i>=1;i--) { output_D(mang1[i-1]);delay_ms(50);[i] //// đây là phần [b]chú ý[/b] : chúng ta ko nên cho i=7 rồi giảm dần xuống 0, vì khi đó giá trị của i sẽ nùi dần ///về 255 chứ không còn là 0 như chúng ta mong muốn nữa, // nếu không tin thì các bạn hãy đổi [b]for(i=8;i>=1;i--)[/b] thành [b]for(i=7;i>=0;i--)[/b] và ///[b]output_D(mang1[i-1])[/b] thành [b]output_D(mang1[i])[/b] chương trình sẽ không chạy được tiếp[/i] } } } hi vọng các bạn sẽ hiểu phần trên nếu không hiểu thì mình sẽ hướng dẫn tiếp thân!!!!!
Được sửa bởi vudinhthang1989 ngày Wed Jan 05, 2011 11:20 am; sửa lần 1. |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Mon Jan 03, 2011 2:19 pm | |
| trên đấy là tổng hợp của một số dạng cơ bản, anh em nào có yêu cầu gì thêm về LED đơn thì cứ yêu cầu nhé, mình sẽ giúp nhưng mình sẽ không gửi thẳng file mà mình làm cho các bạn, vì như thế thì các bạn sẽ không hiểu mà lại lười thêm nếu trường hợp khó quá thì mình sẽ gửi file cho các bạn sau
chú ý: tất cả các bài của mình, mình làm với hình ảnh ở trên, dùng pic18f452, sử dụng chân D để bặt tắt LED
Được sửa bởi vudinhthang1989 ngày Mon Jan 03, 2011 3:11 pm; sửa lần 1. |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Mon Jan 03, 2011 3:06 pm | |
| giải thích thêm nhé:#include <18F452.h> #use delay(clock=20000000) int8 i; void main() { while(1){ int8 x=0x03;// - Trích dẫn :
- cho giá trị ban đầu của x = 00000011
set_tris_D(0x00); - Trích dẫn :
- //cổng D là cổng xuất tín hiệu
output_D(x);delay_ms(50);// - Trích dẫn :
- cho cổng D bằng x=00000011
for(i=0;i<=14;i++)// - Trích dẫn :
- các bạn có thể chỉ cần lặp lại 7 lần là được
{ rotate_left(&x,1);// - Trích dẫn :
- cho quay tròn, cũng như từ trên xuống
output_D(x);delay_ms(50); - Trích dẫn :
- //xuất ra cổng D giá trị của x
} } } - Trích dẫn :
- với bài này thì các bạn có thê thay x=0x01 để có được LED chay từ trên xuống dưới hoặc từ trái qua phải.
đấy là một cách , các bạn có thể sử dụng cách: khai báo từ đầu một mảng : mang[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80} và cho vòng for chay từ đầu đến cuối sau đây là chương trình: - Code:
-
#include <18F452.h> #use delay(clock=20000000) int8 i,mang[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void main() { while(1) { for(i=0;i<=7;i++) { output_D(mang[i]);delay_ms(50); } } } phải công nhận một điều là ngắn hơn dùng lệnh quay nhưng tớ vẫn thích lệnh quay hơn, vì lệnh quay ko làm mất nhiều bộ nhớ, nếu như chúng ta làm những chương trình liên quan đến dung lương. cải biên đê lệnh quay ngắn gọn: #include <18F452.h> #use delay(clock=20000000) void main() { while(1){ int8 i,x=0x03; set_tris_D(0x00); for(i=0;i<=14;i++) { output_D(x);delay_ms(50); rotate_left(&x,1);//quay tròn } } } [/code] cho dù gì thì tớ vẫn thích dùng lệnh rotate_left và rotate_right vì nó hay, hihi vì một phần mình tìm thấy nó ở trong keil C cũng có CCS cũng có, ngày trước thầy Huy bảo ko có , mình nghĩ mãi mà không biết làm cách nào để cho nó quay được, bây giờ thì ............. |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Mon Jan 03, 2011 9:59 pm | |
| thông báo anh em : hệ thống nhúng được xử dụng tài liệu thầy Huy nói thế yên tâm nhéquả này thì đúng là học ít ngu ít học nhiều ngu nhiều không học không ngu rồi |
|
| |
†»»™Çhí * ]²h€() ™««† Biết nói
Tổng số bài gửi : 84 Điểm số : 326 Thanked : 4 Đến từ : Góc khuất của trái tim :P. Phần dùng để yêu thương chăm sóc người khác ... :X
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Tue Jan 04, 2011 9:43 am | |
| thanksss nhưng tui chẳng pýt j hjx hjx ( ( |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Tue Jan 04, 2011 10:22 am | |
| không hiểu phần nào thì bảo tớ, tớ sẽ hướng dẫn kỹ hơn |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 6:40 am | |
| chào các bác, e cũng mới mò mẫm cái môn này thấy hay hay, em thấy nếu để chạy lần lượt như vậy thì dùng lệnh dịch bit cũng ok mà, ngắn hơn, đỡ tốn bộ nhớ hơn cái lệnh quay kia
#include<18f452.h> #use delay(clock=20M) int8 i; void main() { while(1){ for(i=0;i<8;i++) {output_d(1<
for(i=0;i<8;i++) {output_d(1<<7-i);delay_ms(100);} } }
vậy là nó nháy từ đầu đến cuối và ngược lại, nếu muốn nó chạy 2 bóng 1 lúc thì thay giá trị ban đầu là ok, cái chỗ clock viết 20M cho nhanh chứ nháy mấy cái led đơn mà dùng mảng thi hới phí, mà lại phức tạp hơn hì hì,!! e có ý kiến vậy thôi!
không hiểu sao không viết được cái lệnh " 1< " vào nhỉ?
|
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 7:47 am | |
| có ý kiến ròi đây, dùng 2 vòng for thì sẽ tốn bộ nhớ đấy, dùng quay thì chẳng có tốn chút nào, nó chỉ là quay bit mà không nhớ, hiểu chưa?đúng là dịch bit hay, nhưng em vẫn thích quay bit |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 7:56 am | |
| nhắc anh em một chút là nếu paste nguyên bài của bác @ thienthach_pro9x thì có lẽ là không chay được đâu - Code:
-
#include<18f452.h> #use delay(clock=20M) int8 i; void main() { while(1){
for(i=0;i<8;i++) {output_d(1<
for(i=0;i<8;i++) {output_d(1<<7-i);delay_ms(100);}
} }
vì bác ý copy thiếu một chút nếu dùng thì có thể copy cái đơn giản hơn một chút, em cũng chẳng hiểu bác ý viết đoạn for(i=0;i<8;i++) {output_d(1<để làm gì nữa nhưng mà em thấy chẳng có ý nghĩa gì, và chẳng chay được ý, các bắc tham khảo đoạn sau nha: - Code:
-
#include<18f452.h> #use delay(clock=20M) int8 i; void main() { while(1) { for(i=0;i<8;i++) { output_d(1); for(i=0;i<8;i++) { output_d(1<<7-i); delay_ms(100); }
} }}
mà em ko hiểu bác ý bảo là muốn 2 bóng, 3 bóng , 4 bóng sáng cùng một lúc thì làm như nào ý nhỉ? có thể cho em xin code được ko? em ko biết chỗ ý, em chỉ biết ở trong lệnh quay rotate đơn giản thôi |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 8:09 am | |
| vừa rồi là lệnh dịch bit em sửa lại một chút cho bác @ thienthach_pro9x . nếu em mà làm dịch bit thì em chẳng bao giờ viết với 2 vòng for như mọi người cũng biết viết với 2 vòng for vừa tốn bộ nhớ, vừa lâu, nếu như các bác thích đơn giản, thuận tiện thì em nghĩ các bác nên sử dụng một cách đơn giản , và dễ hiểu hơn, đó là dùng một for thôi sau đây là code của em: vừa ngắn vừa dễ hiểu. nếu không hiểu chỗ nào thì hỏi để em hướng dẫn lại nhé - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x01; for(i=1;i<=8;i++) { output_D(x);delay_ms(20); x=x<<1; } } }
ở đây em có để ở dạng code để nó hiện nguyên cấu trúc từ trên xuống dưới cho các bác dễ phân tích, đề nghị các bác viết code thì để nguyên ở dạng code nhé, để anh em có thể phân tích được chương trình luôn mà không cần phải paste vào CCS anh em có thể khai báo biến là x=1, không cần khai báo biến x=0x01 như em, tại em quen tay viết với cơ số 16 nên mới thế. thân!!!!! |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 8:58 am | |
| sau đây tôi hướng dẫn cho anh em hiểu một chút về dịch bit:tôi sử dụng hình ảnh sau: http://farm2.anhso.net/pic/o/119102/1E870740D87DAC34EC6F656C9BA8C2A0EAEFC323C6ED1914/4.jpgsáng dần từ trái sang phải: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x80; for(i=1;i<=8;i++) { output_D(x);delay_ms(50); x=x>>1; } } }
đoạn đầu: chắc là các bắc cũng hiểu hết rồi: #include <18f452.h> nạp thư viện của 18f452 #use delay(clock=20mhz) khai báo tần số int8 i,x; khai báo biến set_tris_D(0x00); là để cho chân D là đầu xuất dữ liệu, các bác có thể không cần làm như thế, bỏ đi cũng được nhưng em quen rồi. đoạn sau thì em có một chút khác ở khởi tạo giá trị ban đầu của biến: x=0x80; đoạn này với hình ảnh mới ở link ảnh trên thì em có ý định sẽ cho chân D là đầu ra và có giá trị của x, tức là từ D7-> D0 có giá trị là 10000000 vậy là em sẽ cho sáng lần lượt từ trái sang phải nếu các bác muốn 2 led sáng lần lượt từ trái qua phải thì chỉ việc khai báo giá trị ban đầu cho biến x=0xc0: 11000000, hay là x=0xe0 nhưng em chỉ tiếc là nó không quay được vòng tròn như rotate_left hay là rotate_rightđoạn có tác dụng quan trọng nhất: - Code:
-
for(i=1;i<=8;i++) { output_D(x);delay_ms(50); x=x>>1; }
for: vòng for thì ai cũng biết, ở đây em cho nó làm đi làm lại 8 lần, cho chay từ 1 đến 8 lần thì dừng lại. em phân tích vòng for nhé: vòng thứ nhất: i=1 thì: output_D(x) có nghĩa là đầu tiên thì xuất ra cổng D giá trị của x=0x80=10000000, rồi cho trễ x=x>>1 tức là em cho dịch phải 1 bit, khi đó x sẽ có giá trị x=01000000 vòng thứ hai: [/b] i=2 thì: output_D(x) có nghĩa là lần thứ 2 của vònh for thì xuất ra cổng D giá trị của x=0x70=01000000, do x đã được tự động dịch bít từ vòng for thứ nhất, rồi cho trễ rồi x lại được dịch bit: x>> lại xang phải, x=00100000 cứ như vậy for làm 8 lần -> x=00000001; đến đây thì hết, lẽ ra chương trình sẽ dừng lại nhưng may quá, có anh while(1) thế là chương trình lại chay từ đầu như em phân tích. theo C thì 1 là đúng, true, 0 là sai vì thế nếu while(1) tức là luôn đúng vậy là chương trình luôn chay, cho dù hết for thì nó lại chạy từ ban đầu ở đây em dùng for(i=1;i<=8;i++) các bác có thể dùng for(i=0;i<=7;i++) |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 9:10 am | |
| vừa rồi là chúng ta cho sáng lần lượt từ bên trái, nếu sáng lần lượt từ bên phải thì giờ có thể thay đổi một chút từ biến x, nếu ở trên thì anh x=0x80=10000000 thì ở đây chúng ta cho anh x=0x01=00000001. và thay đổi lệnh dịch bit: ở trên chúng ta cho x=x>>1 tức là dịch sang phải thì giờ đây chúng ta cho x dịch sang trái thế là được, khi đó cho anh x=x<<1 thế là được rồi sau đây chúng ta viết lại như thế này: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x01; for(i=1;i<=8;i++) { output_D(x);delay_ms(50); x=x<<1; } } }
thế là các bác chỉ cần copy rồi paste vào CCS là ok nhé, nếu không quen với CCS thì chỉ cần phân tích vòng for như trên là ok, cũng chẳng cần dùng máy tính, tốn điện, và chỉ cần học thuộc đoạn code trên là vào phòng thi ok (nếu như đề thi vào như trên hihi)nếu thầy cô có yêu cầu phân tích thì chúng ta chỉ cần phân tích như trên là được |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 9:32 am | |
| nếu chúng ta kết hợp hai cái ở trên: dịch bit sang trái và dịch bit sang phải với 2 vòng for, mỗi vòng lặp 8 lần thì chúng ta có yêu cầu sau: cho led sáng lần lượt từ trái qua phải rồi quay lại từ phải về trái: chúng ta có code sau: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x80; for(i=1;i<=8;i++) { output_D(x);delay_ms(10); x=x>>1; } x=0x01; for(i=8;i>=1;i--) { output_D(x);delay_ms(10); x=x<<1; } } }
chú ý là hết vòng thú nhất thì chúng ta nên tạo giá trị mới cho biến x=0x01 thì mới được, còn không thì với code trên sẽ không được vì : nếu hết vòng for biến x sẽ từ 1 thành 256 em nghĩ là nó về 0 luôn, để ý cái lệnh dịch bit ở trên ý x=x>>1; phân tích vòng for thì sẽ hiểu đó để không cần khai báo lại giá trị của x=0x01 ở vòng for thứ 2: chúng ta làm theo code sau: có khác một chút đó nha: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x80; output_D(x);delay_ms(10); for(i=1;i<=7;i++) { x=x>>1; output_D(x);delay_ms(10); } for(i=8;i>=1;i--) { output_D(x);delay_ms(10); x=x<<1; } } }
|
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 9:50 am | |
| không hiểu chỗ nào thì hỏi lại nhé, em sẽ phân tích kỹ từng phần cho.
THÂN!!!!!!!!!!!! |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 10:16 am | |
| chúng ta có thể hiểu thêm một chút về lệnh dịch bit và quay bít trong C như sau: với 8 bít và bít ban đầu là x=0xc0=11000000dịch bít với 8 bít: cấu trúc x=0xC0>>1 đấy là dịch trái, dịch phải thì tường tự - Code:
-
lần 1:x=01100000 lần 2:x=00110000 lần 3:x=00011000 lần 4:x=00001100 lần 5:x=00000110 lần 6:x=00000011 lần 7:x=00000001 lần 8:x=00000000 lần 9:x=00000000 ------------------- thế là nó về 0 ở lần thứ 8 vì thế mà ở trên có một bài em nói là phải khởi tạo lại giá trị của x sau vòng for đầu vì 8 lần thì nó sẽ làm cho x=0, các bác hiểu rồi chứ?
lệnh quay: 8 bít: cấu trúc rotate_left(&x,1) là lệnh quay trái, quay phải thì tương tự , chỉ cần thay đổi câu lệnh rotate_right(&x,1) - Code:
-
lần 1:x=01100000 lần 2:x=00110000 lần 3:x=00011000 lần 4:x=00001100 lần 5:x=00000110 lần 6:x=00000011 lần 7:x=10000001 lần 8:x=11000000 lần 9:x=01100000 -------------------
thế là các bác hiểu rồi chứ, em không đọc sách nên chỉ có thể viết được như thế thôi, bác nào thấy sai thì sửa cho em nhé, thanks!!! THÂN!!! |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 11:00 am | |
| có người yêu cầu mình thêm bài LED sáng từ trong ra ngoài rồi từ ngoài vào trong hihi phân tích nhé: mình cho sáng bằng chân D sáng từ trong ra ngoài , rồi từ ngoài vào trong: chúng ta sẽ cho led sáng như sau: - Code:
-
D7.D6.D5.D4.D3.D2.D1.D0 lần 1: 0 0 0 1 1 0 0 0 lần 2: 0 0 1 0 0 1 0 0 lần 3: 0 1 0 0 0 0 1 0 lần 4: 1 0 0 0 0 0 0 1 lần 5: 0 1 0 0 0 0 1 0 lần 6: 0 0 1 0 0 1 0 0 lần 7: 0 0 0 1 1 0 0 0 lần 8: 0 0 0 0 0 0 0 0
với yêu cầu của bạn thì mình chỉ có thể làm theo mảng rồi truy suất đến từng giá trị của mảng thôi, chứ mình ko thể làm bằng cách khác được, bạn nào biết cách khác thì bảo mình với nhé /thanks!!!!!/ như phân tích ở trên thì ta cho các giá trị của mảng như sau: - Code:
-
D7.D6.D5.D4.D3.D2.D1.D0 lần 1: 0 0 0 1 1 0 0 0 || 0x18 lần 2: 0 0 1 0 0 1 0 0 || 0x24 lần 3: 0 1 0 0 0 0 1 0 || 0x42 lần 4: 1 0 0 0 0 0 0 1 || 0x81 lần 5: 0 1 0 0 0 0 1 0 || 0x42 lần 6: 0 0 1 0 0 1 0 0 || 0x24 lần 7: 0 0 0 1 1 0 0 0 || 0x18 lần 8: 0 0 0 0 0 0 0 0 || 0x00
vậy thì ta có mảng sau: mang[]={0x18,0x24,0x42,0x81,0x42,0x24,0x18,0x00} mảng có 8 phần tử, ta lần lượt truy suất từng phần tử thông qua một biến, phần tử đầu tiên là ở vị trí số 0 , lần lượt đến 1, 2, 3,...,7. sau đây là chương trình: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,mang[]={0x18,0x24,0x42,0x81,0x42,0x24,0x18,0x00}; void main() { set_tris_D(0x00); while(1) { set_tris_D(0x00); for(i=0;i<=7;i++) { output_D(mang[i]);delay_ms(50); } } }
anh em không hiểu thì hỏi nhé |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 2:06 pm | |
| yêu cầu : cho led sáng dần từ trái quá phải rồi tắt :phân tích: chúng ta cho led sáng ở chân D từ D7->D0: 10000000 11000000 11100000 11110000 11111000 11111100 11111110 11111111 00000000 11111111 00000000 dùng mảng, truy suất từng phần tử của mảng: khai báo mảng: mang[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0x00,0xff,0x00,0xff}do mảng có 12 phần tử, nên chúng ta truy cập đến từng giá trị của mảng thì cho biến i đi từ 0->11 ta có code như sau: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,mang[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0x00,0xff,0x00,0xff}; void main() { set_tris_D(0x00); while(1) { set_tris_D(0x00); for(i=0;i<=11;i++) { output_D(mang[i]);delay_ms(50); } } }
nếu có thêm yêu cầu sáng lần lượt từ phải rồi tắt hết, sáng hết rồi lại sáng lần lượt từ trái rồi lại sáng hết thì ta chỉ cần cho thêm vào mảng rồi truy suất đến từng phần tử của mảng: chúng ta có thể làm theo code sau: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,mang[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0x00,0xff,0x00,0xff,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff,0x00,0xff,0x00}; void main() { set_tris_D(0x00); while(1) { set_tris_D(0x00); for(i=0;i<=22;i++) { output_D(mang[i]);delay_ms(50); } } }
code trên chỉ khác một chút ở phần mảng, chúng ta cho thêm mấy phần tử ở mảng rồi cho chân D các giá trị của mảng, cách này khá tốn bộ nhớ, nhưng đành phải chịu, vì đơn giản, và nhanh |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 2:19 pm | |
| anh em có thể tham khảo chương trình sau: đơn giản và cũng hay hihi - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i; void main() { set_tris_D(0x00); while(1) { set_tris_D(0x00); for(i=0;i<=256;i++) { output_D(i);delay_ms(50); } } }
|
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 3:09 pm | |
| sáng dần từ phải qua trái mà không cần dùng đến mảng (mới nghĩ ra hihi) vì có một số yêu cầu về bộ nhớ và nhanh nên đành phải tìm cách không cần mảng thôi anh em tham khảo chút nhé code như sau: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x01; set_tris_D(0x00); for(i=0;i<=7;i++) { output_D(x);delay_ms(50); x=(x<<1)+1; } } }
phân tích cho anh em hiểu nhéđoạn đầu chắc là anh em hiểu rồi nhỉ? nếu chưa hiểu thì xem ở trên mình có hướng dẫn rồi đó phần quan trọng: - Code:
-
x=0x01; set_tris_D(0x00); for(i=0;i<=7;i++) { output_D(x);delay_ms(50); x=(x<<1)+1; } trong đó x=0x01 khởi tạo giá trị ban đầu cho biến x, biến x cũng là biến để gán cho chân D, khi đó D=x=00000001. set_tris_D(0x00) để cho cổng D là cổng đầu ra. các bạn có thể lược bỏ lệnh này - Code:
-
for(i=0;i<=7;i++) { output_D(x);delay_ms(50); x=(x<<1)+1; } là phần khó nhất. chúng ta xem nhé: trong vòng for thì các lệnh thực hiện từ trên xuốngvòng for đầu tiên: i=0 thì output_D(x) tức là xuất ra cổng D giá trị của x=00000001; rồi cho trễ để hiển thị ; sau đó xuống đến lệnh x=(x<<1)+1; đây là lệnh khó x=(x<<1)+1; thực hiện dịch bít trước rồi mới cộng giá trị 1 vào ban đầu x=00000001sau khi dịch bit x=00000010sau khi cộng x=00000011
thật là ngắn gọn mà nhiều chức năng vậy său lệnh x=(x<<1)+1; tức là sau vòng for đầu tiên thì x=00000011 vòng for thứ hai: i=1 thì output_D(x) tức là xuất ra cổng D giá trị của x=00000011; rồi cho trễ để hiển thị ; sau đó xuống đến lệnh x=(x<<1)+1; x=(x<<1)+1; thực hiện dịch bít trước rồi mới cộng giá trị 1 vào ban đầu x=00000011sau khi dịch bit x=00000110sau khi cộng x=00000111
vậy său lệnh x=(x<<1)+1; tức là sau vòng for thứ hai thì x=00000111 tương tự như vậy, chúng ta đã thực hiện cho LED sáng lần lượt từ phải qua trái mà không cần dùng đến mảng |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 3:28 pm | |
| tương tự như thế ta có sáng dần từ phải qua trái mà không dùng mảng:chỉ cần thay đổi khác một chút đó là : ở trên thì khởi tạo giá trị ban đầu của x=0x01 và dùng lệnh x=(x<<1)+1bây giờ chúng ta sẽ khởi tạo giá trị của x=0x80 và dùng lệnh x=(x>>1)+0x80phân tích như trên vòng for 1: D7->0 = x = 10000000 sau lệnh x=(x>>1)+0x80 thì x=11000000 vòng for 2: D7->0 = x = 11000000 sau lệnh x=(x>>1)+0x80 thì x=11100000 vòng for 3: D7->0 = x = 11100000 sau lệnh x=(x>>1)+0x80 thì x=11110000 vòng for 4: D7->0 = x = 11110000 sau lệnh x=(x>>1)+0x80 thì x=11111000 vòng for 5: D7->0 = x = 11111000 sau lệnh x=(x>>1)+0x80 thì x=11111100 vòng for 6: D7->0 = x = 11111100 sau lệnh x=(x>>1)+0x80 thì x=11111110 vòng for 7: D7->0 = x = 11111110 sau lệnh x=(x>>1)+0x80 thì x=11111111 vòng for 8: D7->0 = x = 11111111 sau lệnh x=(x>>1)+0x80 thì x=111111111tức là sau lần thứ 8 thì giá trị của x đã vượt ra khỏi 8 bít rồi đó các bạn viết thì để ý một chút nhé, không thì hay sảy ra hiện tượng không hiển thị đúng theo cái mà chúng ta mong muốn ở bài này thì sau vòng for thứ 8 là hết, D không hiển thị lần thứ 8 mà chỉ hiển thị lần thứ 7 thôi nên không ảnh hưởng gì cả đây là code của bài: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x80; set_tris_D(0x00); for(i=0;i<=7;i++) { output_D(x);delay_ms(50); x=(x>>1)+0x80; } } }
không hiểu thì hỏi nhé THÂN!!!!
Được sửa bởi vudinhthang1989 ngày Thu Jan 06, 2011 3:01 pm; sửa lần 1. |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 4:35 pm | |
| thế là song rồi nhé chắc là có nhiều người thích file hơn là làm, vì thế những người không thích làm có thể vào đây để download phần tớ làm về, trong đó có một số ví dụ đơn giản cho mọi người tham khảo, chúng ta cũng có thể chỉ cần protell mà không cần CCS những vẫn thấy chương trình chay nhưng mà nhớ nạp file *.hex* vào đó nhé download về đi rồi học cho tốt chúc anh em thi tốt, và hị vọng thi vào những phần này |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Wed Jan 05, 2011 10:00 pm | |
| nếu hay thì nhấn vào dấu cộng ở bên phải nhé hihi |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:03 am | |
| - vudinhthang1989 đã viết:
- nhắc anh em một chút là nếu paste nguyên bài của bác @ thienthach_pro9x thì có lẽ là không chay được đâu
- Code:
-
#include<18f452.h> #use delay(clock=20M) int8 i; void main() { while(1){
for(i=0;i<8;i++) {output_d(1<
for(i=0;i<8;i++) {output_d(1<<7-i);delay_ms(100);}
} }
vì bác ý copy thiếu một chút nếu dùng thì có thể copy cái đơn giản hơn một chút, em cũng chẳng hiểu bác ý viết đoạn for(i=0;i<8;i++) {output_d(1< để làm gì nữa nhưng mà em thấy chẳng có ý nghĩa gì, và chẳng chay được ý, các bắc tham khảo đoạn sau nha: - Code:
-
#include<18f452.h> #use delay(clock=20M) int8 i; void main() { while(1) { for(i=0;i<8;i++) { output_d(1); for(i=0;i<8;i++) { output_d(1<<7-i); delay_ms(100); }
} }}
mà em ko hiểu bác ý bảo là muốn 2 bóng, 3 bóng , 4 bóng sáng cùng một lúc thì làm như nào ý nhỉ? có thể cho em xin code được ko? em ko biết chỗ ý, em chỉ biết ở trong lệnh quay rotate đơn giản thôi đúng rồi, dùng 2 cái for sẽ tốn hơn , chính vì vậy e mới viết nv, để mng cùng phân tích, nhưng mục đích của em là để chương trình dễ hiều nhất, nghĩa là với mỗi kiểu nháy ta cho 1 vòng for, nhìn dễ nhất, dễ phân tích nhất. cái chỗ ( 1 dịch trái x) kia e viết vào no không hiện chứ bác phải hiểu chứ sao lại không hiểu còn nếu muốn 2 bóng sáng thì cho giá trị dịch ban đầu khác đi thôi, thay vì 0x01 thì mình cho nó là 0x03 rồi cho dịch trái tương tự thì cho là 0x07 rồi cho dịch thì được 3 bóng sáng chạy lần lượt còn nếu muốn nó sang dần thì 1 vòng for này là nó sáng dần nè : [code] for(x=1;x<255;output_d(x=1+2*x),delay_ms(50)); |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:09 am | |
| sáng dần thì ở bên trên mình có làm rồi đấy hihi xem kỹ đi nhé, có cả phân tích từng vòng for đó àh xem và so sánh xem có phải là lệnh quay hay ko? tuy cách nhớ lệnh khó những mà mình nghĩ lênh đó hay, nó sẽ rất có ích nếu bạn thích làm những thứ linh tinh để tặng bạn gái đó |
|
| |
trungtuan1989 Biết đi
Tổng số bài gửi : 35 Điểm số : 162 Thanked : 1 Đến từ : que huong vai thieu
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:15 am | |
| bai viet hay day! nhung tiec la dua len hoi muộn, các ban muon hoc hoi cung kho. chan! |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:21 am | |
| - vudinhthang1989 đã viết:
- sáng dần từ phải qua trái mà không cần dùng đến mảng (mới nghĩ ra hihi) vì có một số yêu cầu về bộ nhớ và nhanh nên đành phải tìm cách không cần mảng thôi
anh em tham khảo chút nhé code như sau: - Code:
-
#include <18f452.h> #use delay(clock=20mhz) int8 i,x; void main() { set_tris_D(0x00); while(1) { x=0x01; set_tris_D(0x00); for(i=0;i<=7;i++) { output_D(x);delay_ms(50); x=(x<<1)+1; } } }
phân tích cho anh em hiểu nhé đoạn đầu chắc là anh em hiểu rồi nhỉ? nếu chưa hiểu thì xem ở trên mình có hướng dẫn rồi đó phần quan trọng: - Code:
-
x=0x01; set_tris_D(0x00); for(i=0;i<=7;i++) { output_D(x);delay_ms(50); x=(x<<1)+1; } trong đó x=0x01 khởi tạo giá trị ban đầu cho biến x, biến x cũng là biến để gán cho chân D, khi đó D=x=00000001. set_tris_D(0x00) để cho cổng D là cổng đầu ra. các bạn có thể lược bỏ lệnh này - Code:
-
for(i=0;i<=7;i++) { output_D(x);delay_ms(50); x=(x<<1)+1; } là phần khó nhất. chúng ta xem nhé: trong vòng for thì các lệnh thực hiện từ trên xuống vòng for đầu tiên: i=0 thì output_D(x) tức là xuất ra cổng D giá trị của x=00000001; rồi cho trễ để hiển thị ; sau đó xuống đến lệnh x=(x<<1)+1; đây là lệnh khó x=(x<<1)+1; thực hiện dịch bít trước rồi mới cộng giá trị 1 vào ban đầu x=00000001 sau khi dịch bit x=00000010 sau khi cộng x=00000011
thật là ngắn gọn mà nhiều chức năng vậy său lệnh x=(x<<1)+1; tức là sau vòng for đầu tiên thì x=00000011
vòng for thứ hai: i=1 thì output_D(x) tức là xuất ra cổng D giá trị của x=00000011; rồi cho trễ để hiển thị ; sau đó xuống đến lệnh x=(x<<1)+1; x=(x<<1)+1; thực hiện dịch bít trước rồi mới cộng giá trị 1 vào ban đầu x=00000011 sau khi dịch bit x=00000110 sau khi cộng x=00000111
vậy său lệnh x=(x<<1)+1; tức là sau vòng for thứ hai thì x=00000111
tương tự như vậy, chúng ta đã thực hiện cho LED sáng lần lượt từ phải qua trái mà không cần dùng đến mảng cái này chỉ cần 1 vòng for là đủ nè bác for(x=1;x<255;output_d(x=1+2*x),delay_ms(50)); thế là ok còn muốn nó tắt dần thì có 2 cách 1 là : for(x=255;x>1;output_d(x=(x-1)/2),delay_ms(50)); 2 là: dùng lệnh dịch : for(x=0;x<8;x++){output_D(255< nếu muốn nó tắt theo chiều ngược lại thì cho nó dịch phải cái sáng dần dùng lệnh dịch cũng ok : for(x=0;x<8;x++){output_d(255<<7-x);delay_ms(50);} code trong ccs đây: - Code:
-
#include<18f452.h> #use delay(clock=20M) int8 x; void main() { while(1){ for(x=0;x<8;x++){output_d(255>>x);delay_ms(100);} for(x=0;x<8;x++){output_d(255<<x);delay_ms(100);} for(x=0;x<8;x++){output_d(255>>7-x);delay_ms(100);} } }
|
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:27 am | |
| đây là đoạn code có 4 kiểu sáng dần và tắt dần, theo e thấy là dễ hiểu và dễ học nhất, dễ phân tích nhất , viết cũng ngắn - Code:
-
#include<18f452.h> #use delay(clock=20M) int8 x; void main() { while(1){ for(x=0;x<8;x++){output_d(255>>x);delay_ms(100);}// tat dan tu tren xuong for(x=0;x<8;x++){output_d(255<<x);delay_ms(100);}// tat dan tu duoi len for(x=0;x<8;x++){output_d(255>>7-x);delay_ms(100);}// sang dan tu tren xuong for(x=0;x<8;x++){output_d(255<<7-x);delay_ms(100);}// sang dan tu duoi len } }
|
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:30 am | |
| lần sau mình sẽ dút kinh nghiệm đưa bài lên sớm hơn. tại bây giờ mới có chút thời gian, nên mới viết nhiều bài được. thông cảm cho mình nhé
hihi khen cho bạn tìm tòi cũng như nhau cả mà
cảm ơn nhiều vì đã vào góp ý nhé
Được sửa bởi vudinhthang1989 ngày Thu Jan 06, 2011 9:23 am; sửa lần 1. |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:34 am | |
| còn để giải thích cho cái lệnh (255<<7-x ) thì rất đơn giản 255d=1111 1111 b (d=dec (mã thập phân) b=bin(mã nhị phân)) khi x=0 suy ra 255 dịch trái 7 sẽ là 0000 0001 khi x=1 suy ra 255 dịch trí 6 sẽ là 0000 0011
tương tự cho đến khi dịch trái 0 sẽ là 1111 1111
như vậy nó sẽ sáng dần khi cho nó dịch phải thì nó sẽ sáng dần theo chiều ngược lại ok!
cái chỗ khi x=0 thì do lệnh là (255 dịch trái 7-x) nên là nó sẽ dịch trái 7
e giải thích vậy các bác thấy có đúng không các bác cho ý kiến
Được sửa bởi thienthach_pro9x ngày Thu Jan 06, 2011 9:15 am; sửa lần 2. |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:41 am | |
| bài của anh bạn đúng rồi không có ý kiến nào khác ngoài ý kiến là nếu như bạn làm với PIC thì chưa chắc đã sáng đâu, set_tris_D(xxx) nhé chắc chắn sẽ ok vì như thế thì với thực tế bạn đã xác định nó là cổng ra. em cũng ko chắc chắn lắm, nhưng nghe phong phanh là như thế |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:48 am | |
| - thienthach_pro9x đã viết:
- còn để giải thích cho cái lệnh (255<<7-x ) thì rất đơn giản
255d=1111 1111 b (d=dec (mã thập phân) b=bin(mã nhị phân)) khi x=0 >> 255 dịch trái 7 sẽ là 0000 0001 khi x=1 >> 255 dịch trái 6 sẽ là 0000 0011
e giải thích vậy các bác thấy có đúng không các bác cho ý kiến chỉ có một chút ý kiến với bác: - thienthach_pro9x đã viết:
khi x=0 >> 255 dịch trái 7 sẽ là 0000 0001 khi x=1 >> 255 dịch trái 6 sẽ là 0000 0011
khi x=0 >> 255 dịch phải 7 sẽ là 0000 0001 dịch phải nhé anh bạn >> dịch bit phải << dịch bit trái để ý chiều của mũi tên nhé |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:53 am | |
| - vudinhthang1989 đã viết:
- thienthach_pro9x đã viết:
- còn để giải thích cho cái lệnh (255<<7-x ) thì rất đơn giản
255d=1111 1111 b (d=dec (mã thập phân) b=bin(mã nhị phân)) khi x=0 >> 255 dịch trái 7 sẽ là 0000 0001 khi x=1 >> 255 dịch trái 6 sẽ là 0000 0011
e giải thích vậy các bác thấy có đúng không các bác cho ý kiến chỉ có một chút ý kiến với bác:
- thienthach_pro9x đã viết:
khi x=0 >> 255 dịch trái 7 sẽ là 0000 0001 khi x=1 >> 255 dịch trái 6 sẽ là 0000 0011
khi x=0 >> 255 dịch trái 7 sẽ là 0000 0001
dịch phải nhé anh bạn >> dịch bit phải << dịch bit trái
để ý chiều của mũi tên nhé bác không hiểu ý e rồi, cái >> ở đây e dùng nghĩa là (suy ra ) ấy không phải lệnh dịch, lệnh dịch viết hẳn ra kia kìa thjxhjx viết thiếu cái dấu gạch ngang thôi mà đã bị bắt lỗi ! |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 8:57 am | |
| biện hộ !!!!! biện hộ như thế thì thành ngụy biện ý
anyways!!!!!! thankyou!!!! đóng góp nhiều bài vào nhé. thi song thì mình sẽ vào đóng góp nhiều bài thêm về hệ thống nhúng |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:01 am | |
| - vudinhthang1989 đã viết:
- bài của anh bạn đúng rồi
không có ý kiến nào khác ngoài ý kiến là nếu như bạn làm với PIC thì chưa chắc đã sáng đâu, set_tris_D(xxx) nhé chắc chắn sẽ ok vì như thế thì với thực tế bạn đã xác định nó là cổng ra. em cũng ko chắc chắn lắm, nhưng nghe phong phanh là như thế hehe về khoản này thì e đã làm, chả giấu gì bác e có 1 con 16f877a vẫn cho nó chạy suốt cái lệnh set tris kia quan trọng khi trong mình dùng port đó với 2 chức năng và chức năng của nó thay đổi trong ct, chứ nếu chức năng mà cố định thì không cần thiết lắm, e đã thử, chạy ok còn về mấy cái lệnh thì nếu mình làm mạch thật thì thường dịnh nghĩa lại chứ viết mấy lệnh output_d dài ghê e toàn portx= thôi trisx= nữa chứ set_tris thì hơi dài |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:05 am | |
| - vudinhthang1989 đã viết:
- biện hộ !!!!!
biện hộ như thế thì thành ngụy biện ý
anyways!!!!!! thankyou!!!! đóng góp nhiều bài vào nhé. thi song thì mình sẽ vào đóng góp nhiều bài thêm về hệ thống nhúng không phải biên hộ hay ngụy biện gì hết, bác để ý lại xem thực tế là em viết cái >> ở đó nghĩa là " suy ra " vì lệnh là 255<<7-x nên khi x=0 thì thành 255<<7(255 dịch trái 7)x=0 >> 255 dịch trái 7 = 0000 0001 nghĩa là với x=0 ta suy ra 255 dịch trái 7 = 0000 0001 cái chữ " dịch trái " e đã viết hẳn ra nếu nói là e biện hộ thì nghĩa là e chưa hiểu rõ về cái chiều mũi tên tương ứng với cái lệnh dịch à cái này đọc qua về c là hiểu ngay thôi chứ e cũng hiểu quay sang phải là dịch phải quay sang trái là dịch trái |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:09 am | |
| tại mình mới chỉ dùng AT98c51 chứ chưa dùng pic bao giờ, chắc là ra tết mình làm đến đề tài khóa số với sản phẩm thực tế thì phải dùng đến PIC nhưng mình nghĩ nếu làm theo nguyên tắc : cái nào là đầu vào, nhận tín hiệu = 1 và cái nào đầu ra, xuất tín hiệu =0 thì hay hơn cách viết thì là thói quen và sở thích của từng người thôi |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:13 am | |
| dùng với PIC sẽ linh hoạt hơn nhiều với lại mạch nạp cho pic làm dễ hơn nhiều so với mạch nạp 89 giá cũng rẻ nữa chứ, linh kiện dễ kiếm, mỗi tội PIC thì đắt hơn 89 |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:16 am | |
| - Code:
-
dùng với PIC sẽ linh hoạt hơn nhiều với lại mạch nạp cho pic làm dễ hơn nhiều so với mạch nạp 89 giá cũng rẻ nữa chứ, linh kiện dễ kiếm, mỗi tội PIC thì đắt hơn 89 hehe tất nhiên rồi thanks!!! thôi mình học bài đây, chiều thi song thì mình sẽ lên diễn đàn tiếp, cũng may chiều nay thi một môn được dùng tài liệu nên mới có thòi gian lên đây chém gió |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 2:54 pm | |
| một điều không thể phủ nhận rằng - thienthach_pro9x đã viết:
- viết chương trình rất hay
đoạn mã mà cậu ý viết có một cái hay là sử dụng một biến, như thế thì sẽ không tốn bộ nhớ mấy đoạn mã của bạn ý: với hình ảnh ở trên - Code:
-
#include <18f452.h> #use delay(clock=20M) int8 x; void main() { set_tris_D(0x00); while(1) { for(x=0;x<=7;x++) { output_d(0xff>>x);delay_ms(50);// tắt dần từ bên trái } for(x=0;x<=7;x++) { output_d(0xff<<x);delay_ms(50);// tắt dần từ bên phải } for(x=0;x<=7;x++) { output_d(0xff>>7-x);delay_ms(50);// sáng dần từ bên trái } for(x=0;x<=7;x++) { output_d(0xff<<7-x);delay_ms(50);// sáng dần từ bên phải } for(x=0;x<=7;x++) { output_d(0x01<<x);delay_ms(50);// sáng lần lượt từ bên phải
} for(x=0;x<=7;x++) { output_d(0x80>>x);delay_ms(50);// sáng lần lượt từ bên trái } } }
phân tích nhé: nếu bài thi có yêu cầu phân tích thì các bạn phân tích như mình sẽ okđoạn đầu thì chắc là ai cũng biết rồi, nếu không biết thì xem ở trên nhé, giờ mình sẽ phân tích chương trình chính: có tất cả 6 vòng for, mình sẽ phân tích lần lượt . do trong C hay trong các chương trình nếu ko có chương trình con , và ngắt thì nó sẽ chạy từ trên xuống dưới. nếu ở trên khó nhìn vòng for thì cá bạn nhìn code sau: - Code:
-
for(x=0;x<=7;x++){output_d(0xff>>x);delay_ms(20);} for(x=0;x<=7;x++){output_d(0xff<<x);delay_ms(20);} for(x=0;x<=7;x++){output_d(0xff>>7-x);delay_ms(20);} for(x=0;x<=7;x++){output_d(0xff<<7-x);delay_ms(20);} for(x=0;x<=7;x++){output_d(0x01<<x);delay_ms(50);} for(x=0;x<=7;x++){output_d(0x80>>x);delay_ms(50);}
ở vòng for thứ nhất : for(x=0;x<=7;x++){output_d(0xff>>x);delay_ms(20);}
-lần 1: x=0 output_d(0xff>>x) =output_d(0xff>>0)= 11111111, đến đây thì trễ -lần 2: x=1 output_d(0xff>>x) =output_d(0xff>>1)= 01111111, đến đây thì trễ -lần 2: x=2 output_d(0xff>>x) =output_d(0xff>>2)= 00111111, đến đây thì trễ ---------------------------------------------------------//cứ như vậy cho đến lần thứ 8 -lần 8: x=7 output_d(0xff>>x) =output_d(0xff>>7)= 00000000, đến đây thì trễ , kết thúc vòng for thứ nhất ở vòng for thứ hai : for(x=0;x<=7;x++){output_d(0xff< < x );delay_ms(20);}
-lần 1: x=0 output_d(0xff< =output_d(0xff<<0)= 11111111, đến đây thì trễ -lần 2: x=1 output_d(0xff<=output_d(0xff<<1)= 11111110, đến đây thì trễ -lần 2: x=2 output_d(0xff<=output_d(0xff<<2)= 11111100, đến đây thì trễ ---------------------------------------------------------//cứ như vậy cho đến lần thứ 8 -lần 8: x=7 output_d(0xff<=output_d(0xff<<7)= 00000000, đến đây thì trễ , kết thúc vòng for thứ hai
cứ như vậy, chắc là mọi người phân tích được, cái hay là không phải dùng nhiều biến, dùng luôn một biến trong for |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 3:16 pm | |
| ở bài trên nếu mỗi vòng for các bạn muốn cho D0->D7 tắt hết thì nhớ cho nó chay đến bằng 8 nhé for(x=0;x<=8;x++) |
|
| |
chem_cac_sieu_nhan Biết đi
Tổng số bài gửi : 29 Điểm số : 129 Thanked : 0
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 3:59 pm | |
| - vudinhthang1989 đã viết:
- tại mình mới chỉ dùng AT98c51 chứ chưa dùng pic bao giờ, chắc là ra tết mình làm đến đề tài khóa số với sản phẩm thực tế thì phải dùng đến PIC nhưng mình nghĩ nếu làm theo nguyên tắc : cái nào là đầu vào, nhận tín hiệu = 1 và cái nào đầu ra, xuất tín hiệu =0 thì hay hơn
cách viết thì là thói quen và sở thích của từng người thôi Đây không phải là thói quen : con 89c51 xuất tín hiệu mức 1 với dòng khoảng 5mA=>không sáng nổi LED mức 0 thì khảng 15mA (P1=>P3) riêng P0 thì được 25mA Con 89 cũng chẳng có chỗ nào để quy định vào ra cả , vào chẳng qua mình xét trạng thái chân thay đổi hay không PIC ra mức 1 hay mức 0 đều đc khoảng 25mA => Trong datashit có PIC thì khác có thanh ghi TRIS_X đấy...Set_tris_x(); |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 4:23 pm | |
| |
|
| |
Pig_07 Biết đi
Tổng số bài gửi : 42 Điểm số : 198 Thanked : 4
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:21 pm | |
| - vudinhthang1989 đã viết:
- thế là song rồi nhé
chắc là có nhiều người thích file hơn là làm, vì thế những người không thích làm có thể vào đây để download phần tớ làm về, trong đó có một số ví dụ đơn giản cho mọi người tham khảo, chúng ta cũng có thể chỉ cần protell mà không cần CCS những vẫn thấy chương trình chay nhưng mà nhớ nạp file *.hex* vào đó nhé
download về đi rồi học cho tốt chúc anh em thi tốt, và hị vọng thi vào những phần này Protell chạy thế nào đc cái chỗ kia chỉ tớ với. Tớ chỉ biết dùng Proteus thôi |
|
| |
Pig_07 Biết đi
Tổng số bài gửi : 42 Điểm số : 198 Thanked : 4
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:34 pm | |
| - thienthach_pro9x đã viết:
e toàn portx= thôi trisx= nữa chứ set_tris thì hơi dài def_877a.h |
|
| |
Pig_07 Biết đi
Tổng số bài gửi : 42 Điểm số : 198 Thanked : 4
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 9:36 pm | |
| - chem_cac_sieu_nhan đã viết:
Đây không phải là thói quen : con 89c51 xuất tín hiệu mức 1 với dòng khoảng 5mA=>không sáng nổi LED mức 0 thì khảng 15mA (P1=>P3) riêng P0 thì được 25mA
Sáng được nhưng mà sáng yếu |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Thu Jan 06, 2011 10:36 pm | |
| thôi đi ông tướng, cái protell là em viết nhầm bắt lỗi với vẩn, tôi bảo ông vào để viết chương trình nào mới chứ ko bảo ông vào làm cái việc này |
|
| |
thienthach_pro9x Biết đi
Tổng số bài gửi : 37 Điểm số : 186 Thanked : 1
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Fri Jan 07, 2011 7:11 am | |
| hjxhjx! protell là gói phần mềm chuyên dụng để thiết kế mạch điện tử, hiện nay phiên bản mới nhất thuộc gói pm này là Altium designer với version mới nhất theo mình bit hiện nay là : 9.0.0.17654 |
|
| |
vudinhthang1989 Biết lái máy bay
Tổng số bài gửi : 444 Điểm số : 2308 Thanked : 16 Đến từ : Hải Dương
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Fri Jan 07, 2011 7:16 am | |
| cái đó toi biết, đã nói đây là một sự nhầm lẫn rồi mà quan trọng là bạn hoàng hiểu được ý của tớ, va linh cũng biết nên có bài đã tô đậm chữ lên rồi đấy |
|
| |
Pig_07 Biết đi
Tổng số bài gửi : 42 Điểm số : 198 Thanked : 4
| Tiêu đề: Re: anh em tham khảo bài tập nhúng Sat Jan 08, 2011 2:10 am | |
| - vudinhthang1989 đã viết:
- cái đó toi biết, đã nói đây là một sự nhầm lẫn rồi mà
quan trọng là bạn hoàng hiểu được ý của tớ, va linh cũng biết nên có bài đã tô đậm chữ lên rồi đấy Vấn đề ở đây là forum ko chỉ có 2 hay 3 người. Và chắc là ko phải ai cũng hiểu đó chỉ là viết nhầm. Cần chính xác 1 chút |
|
| |
Sponsored content
| Tiêu đề: Re: anh em tham khảo bài tập nhúng | |
| |
|
| |
| anh em tham khảo bài tập nhúng | |
|