Trang ChínhThành viênĐăng kýĐăng NhậpPhotoShop OnLine

Share | 
 

 anh em tham khảo bài tập nhúng

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Chuyển đến trang : 1, 2  Next
Tác giảThông điệp
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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_rightrotate_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.
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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 aaa
thân!!!!!


Được sửa bởi vudinhthang1989 ngày Wed Jan 05, 2011 11:20 am; sửa lần 1.
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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.
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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 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ì ............. yk
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
bl
Về Đầu Trang Go down
Xem lý lịch thành viên
†»»™Çhí * ]²h€() ™««†
Biết nói
Biết nói
avatar

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

Bài gửiTiê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 Sad( Sad(
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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ỉ?

Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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!!!!!
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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.jpg


sá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++)
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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;
      }
  }
}
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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!!!!!!!!!!!!
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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 quay bít trong C như sau: với 8 bít và bít ban đầu là x=0xc0=11000000
dị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!!!
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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é
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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);       
      } 
  }
}
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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ố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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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)+1
bây giờ chúng ta sẽ khởi tạo giá trị của x=0x80 và dùng lệnh x=(x>>1)+0x80
phâ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=111111111

tứ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.
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
CL
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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));
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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 đó
Về Đầu Trang Go down
Xem lý lịch thành viên
trungtuan1989
Biết đi
Biết đi
avatar

Tổng số bài gửi : 35
Điểm số : 162
Thanked : 1
Đến từ : que huong vai thieu

Bài gửiTiê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!
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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);}
}
}
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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
}
}
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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.
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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.
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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. yk
em cũng ko chắc chắn lắm, nhưng nghe phong phanh là như thế
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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é
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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 !
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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. yk
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
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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 = 1cái nào đầu ra, xuất tín hiệu =0 thì hay hơn
cách viết thì là thói quensở thích của từng người thôi
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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ó
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
5yoyo34
đ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 haykhông phải dùng nhiều biến, dùng luôn một biến trong for
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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++)
Về Đầu Trang Go down
Xem lý lịch thành viên
chem_cac_sieu_nhan
Biết đi
Biết đi
avatar

Tổng số bài gửi : 29
Điểm số : 129
Thanked : 0

Bài gửiTiê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 = 1cái nào đầu ra, xuất tín hiệu =0 thì hay hơn
cách viết thì là thói quensở 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
PIC thì khác có thanh ghi TRIS_X đấy...Set_tris_x();
Về Đầu Trang Go down
Xem lý lịch thành viên http://www.k43ddk.net
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiêu đề: Re: anh em tham khảo bài tập nhúng   Thu Jan 06, 2011 4:23 pm

ờ cảm ơn linh xoăn
Về Đầu Trang Go down
Xem lý lịch thành viên
Pig_07
Biết đi
Biết đi
avatar

Tổng số bài gửi : 42
Điểm số : 198
Thanked : 4

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
Pig_07
Biết đi
Biết đi
avatar

Tổng số bài gửi : 42
Điểm số : 198
Thanked : 4

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
Pig_07
Biết đi
Biết đi
avatar

Tổng số bài gửi : 42
Điểm số : 198
Thanked : 4

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
thienthach_pro9x
Biết đi
Biết đi


Tổng số bài gửi : 37
Điểm số : 186
Thanked : 1

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
vudinhthang1989
Biết lái máy bay
Biết lái máy bay
avatar

Tổng số bài gửi : 444
Điểm số : 2308
Thanked : 16
Đến từ : Hải Dương

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
Pig_07
Biết đi
Biết đi
avatar

Tổng số bài gửi : 42
Điểm số : 198
Thanked : 4

Bài gửiTiê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
Về Đầu Trang Go down
Xem lý lịch thành viên
Sponsored content




Bài gửiTiêu đề: Re: anh em tham khảo bài tập nhúng   

Về Đầu Trang Go down
 

anh em tham khảo bài tập nhúng

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 2 trangChuyển đến trang : 1, 2  Next

Permissions in this forum:Bạn không có quyền trả lời bài viết
 :: Nơi lưu trữ-
Forumotion.com | © phpBB | Free forum support | Report an abuse | Sosblogs