Showing posts with label 8051. Show all posts
Showing posts with label 8051. Show all posts

THÔNG BÁO !

6:43:00 AM Add Comment
Xin chào các bạn Blog này bị lỗi quá nhiều và bài viết cũng sơ xài nên mình đã tạo 1 Blog mới và tất cả bài đăng trong Blog này mình sẽ chuyển dần sang Blog mới nên Blog này mình sẽ không đăng bài đăng mới nữa nha ! Mong các bạn thông cảm và ủng hộ Blog mới ! Các bạn có thể xem Blog mới Tại Đây ! Thanks you !


Blog mới sẽ được đầu tư về bài viết kỹ càng hơn ! Blog mới có tên là  Programming PIC ! Các bạn đăng ký làm thành viên và Share Blog để tiếp cạn nhiều người hơn để blog này ngày càng phát triển ! Link  xem Blog mới http://xcvn.blogspot.com/

ĐẾM TỪ 000000 ĐẾN 999999 8051

8:23:00 AM Add Comment
Chào các ban trong bài đăng này mình sẽ hướng dẫn các bạn đếm từ 000000 đến 999999 sử dụng 8051 !
- Đây là ảnh mô phỏng protues.


đếm từ 000000 đến 999999

- Đây là code chương trình.
#include <REGX51.H>
unsigned long int x=0;
unsigned char so[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned char tramnghin,chucnghin,nghin,tram,chuc,donvi;
void delay (void)
 {
   int i;
   for (i=0;i<500;i++);
 }
void ngatngoai0 (void) interrupt 0
 {
   x++;
   tramnghin=x/100000;
   chucnghin=(x%100000)/10000;
   nghin=((x%100000)%10000)/1000;
   tram=(((x%1000000)%10000)%1000)/100;
   chuc=((((x%100000)%10000)%1000)%100)/10;
   donvi=((((x%100000)%10000)%1000)%100)%10;
   if (x>999999) 
     { 
  x=0;
}
 }
void main()
 {
   IE=0x81;
   TCON=0x01;

  while (1)
    { 
 
 P0=so[donvi];
 P2_7=0;delay();
 P2_7=1;
 P0=so[chuc];
 P2_6=0;delay();
 P2_6=1;
 P0=so[tram];
 P2_5=0;delay();
 P2_5=1;
 P0=so[nghin];
 P2_4=0;delay();
 P2_4=1;
 P0=so[chucnghin];
 P2_3=0;delay();
 P2_3=1;
 P0=so[tramnghin];
 P2_2=0;delay();
 P2_2=1;
}
 }

- Đây là link download project Click here

Đếm từ 0 - 9 hiển thị LED MATRIX 5X7 8051

3:09:00 AM Add Comment
Chào các bạn trong bài đăng này mình sẽ hướng dẫn các bạn về matrix 5x7 với 8051 cụ thể là đếm từ 0 - 9.

- Đây là ảnh mô phỏng protues.



- Đây là code chương trình.

#include"main.h"
#include"..\lib\delay.h"

unsigned char code Font5x7[10][7]={{0x0E,0x11,0x13,0x15,0x19,0x11,0x0E}, // Font cua so 0
  {0x1F, 0x04, 0x04, 0x04, 0x14, 0x0C, 0x04}, // Font cua so 1
  {0x1F, 0x08, 0x04, 0x02, 0x01, 0x11, 0x0E},
  {0x0E, 0x11, 0x01, 0x06, 0x01, 0x11, 0x0E},
  {0x02, 0x1F, 0x12, 0x08, 0x04, 0x02, 0x01},
  {0x1E, 0x01, 0x01, 0x01, 0x1E, 0x10, 0x1F},
  {0x0E, 0x11, 0x11, 0x1E, 0x10, 0x11, 0x0E},
  {0x04, 0x04, 0x04, 0x02, 0x01, 0x01, 0x1F},
  {0x0E, 0x11, 0x11, 0x0E, 0x11, 0x11, 0x0E},
  {0x0E, 0x01, 0x01, 0x0F, 0x11, 0x11, 0x0E}};


void main()
{
unsigned char i;
unsigned char cnt;
unsigned char j;

while(1)
{
for(cnt=0;cnt<10;cnt++)
{
for(j=0;j<142;j++)
{
for(i=0;i<7;i++)
{
P0 = Font5x7[cnt][i];
P3 = 0x01<<i;
Delay_ms(1);
P3 = 0x00;
}
}
}
}
}

- Link download project. Click here

PWM 8051

8:26:00 AM Add Comment
Chào các bạn trong bài đăng này mình sẽ giới thiệu với các bạn về PWM 8051.

Ảnh mô phỏng proteus.



#include<reg51.h>

// PWM_Pin
sbit PWM_Pin = P2^0;   // Pin P2.0 is named as PWM_Pin

// Function declarations
void cct_init(void);
void InitTimer0(void);
void InitPWM(void);

// Global variables
unsigned char PWM = 0;  // It can have a value from 0 (0% duty cycle) to 255 (100% duty cycle)
unsigned int temp = 0;    // Used inside Timer0 ISR

// PWM frequency selector
/* PWM_Freq_Num can have values in between 1 to 257 only
 * When PWM_Freq_Num is equal to 1, then it means highest PWM frequency
 * which is approximately 1000000/(1*255) = 3.9kHz
 * When PWM_Freq_Num is equal to 257, then it means lowest PWM frequency
 * which is approximately 1000000/(257*255) = 15Hz
 *
 * So, in general you can calculate PWM frequency by using the formula
 *     PWM Frequency = 1000000/(PWM_Freq_Num*255)
 */
#define PWM_Freq_Num   1 // Highest possible PWM Frequency


// Main Function
int main(void)
{
   cct_init();         // Make all ports zero
   InitPWM();              // Start PWM

   PWM = 127;              // Make 50% duty cycle of PWM

   while(1)                // Rest is done in Timer0 interrupt
   {}
}

// Init CCT function
void cct_init(void)
{
P0 = 0x00;   
P1 = 0x00;   
P2 = 0x00;   
P3 = 0x00;  
}

// Timer0 initialize
void InitTimer0(void)
{
TMOD &= 0xF0;    // Clear 4bit field for timer0
TMOD |= 0x01;    // Set timer0 in mode 1 = 16bit mode

TH0 = 0x00;      // First time value
TL0 = 0x00;      // Set arbitrarily zero

ET0 = 1;         // Enable Timer0 interrupts
EA  = 1;         // Global interrupt enable

TR0 = 1;         // Start Timer 0
}

// PWM initialize
void InitPWM(void)
{
PWM = 0;         // Initialize with 0% duty cycle
InitTimer0();    // Initialize timer0 to start generating interrupts
// PWM generation code is written inside the Timer0 ISR
}

// Timer0 ISR
void Timer0_ISR (void) interrupt 1   
{
TR0 = 0;    // Stop Timer 0

if(PWM_Pin) // if PWM_Pin is high
{
PWM_Pin = 0;
temp = (255-PWM)*PWM_Freq_Num;
TH0  = 0xFF - (temp>>8)&0xFF;
TL0  = 0xFF - temp&0xFF;
}
else     // if PWM_Pin is low
{
PWM_Pin = 1;
temp = PWM*PWM_Freq_Num;
TH0  = 0xFF - (temp>>8)&0xFF;
TL0  = 0xFF - temp&0xFF;
}

TF0 = 0;     // Clear the interrupt flag
TR0 = 1;     // Start Timer 0
}

Link download project.
http://zo.ee/1WaL

Timer 1 8051

11:14:00 PM Add Comment
Chào các bạn, do một thời gian bận làm mấy cái project lên hôm nay mình mới có thời gian viết bài, mong mọi người thông cảm.

Hôm nay chúng ta sẽ tìm hiểu về ngắt vi điều khiển, thực ra trên club đã có tài liệu rồi nhưng một số bạn vẫn còn bỡ ngỡ về viết code ntn thì hôm nay m sẽ hướng dẫn code và tìm hiểu xem ngắt là cái quái gì mà nó lại quan trọng vậy.

Đầu tiên các bạn sẽ thắc mắc ngắt là gì.... nếu mà cứ theo cái định nghĩa của nó chắc chẳng ai hình dung rõ lên m sẽ chuẩn bị một ví dụ để minh họa cho cái định nghĩa thô cứng đó:
VD như bạn đang vặt rau sauđó rửa rau rùi cho vào luộc, công việc có vẻ rất trôi chảy nhưng trong lúc đang vặt rau bỗng nhiên mama gọi "Con ơi đi ra ngoài tạp hóa mua cho mẹ gói bột nêm" Thế là ngay lập tức bạn dừng công việc vặt rau lại cất gọn vào một chỗ nào đó rồi chạy ngay ra cửa hàng để mua đồ cho mẹ, khi bạn mua xong gói bột nêm về thì bạn lại quay lại công việc đang dang dở đó là vặt rau và cứ như vậy.......... =>> Đó chính là ngắt.

Trong vi điều khiển cũng vậy, chương trình dc chạy từ trên xuống dưới trong hàm main() - Hàm ctr chính. Bình thường (đang vặt rau) thì như vậy nhưng khi có ngắt xảy ra (mẹ sai đi mua bột nêm), tức sẽ có ngoại lệ, sẽ ra lệnh cho VDK biết là đang có một ngắt xuất hiệu và yêu cầu VDK phải xử lý nó, thế là VDK bảo “Biết rồi khổ lắm nói mãi” rồi thực hiện xong nốt câu lệnh đang chạy dở =>> Cất dữ liệu địa chỉ của câu lệnh tiếp theo vào một chỗ nào đó gọi là ngăn xếp (ô nhớ trên RAM)  xong quay sang phục vụ chương trình ngắt (Chính là việc chạy đi mua bột nêm đó)  khi phục vụ xong rồi thì nó lại vào ngăn xếp lấy cái địa chỉ của ô nhớ tiếp theo cần được xử lý. Công việc của VDK là như vậy khi có ngắt xảy ra.

Bình thường thì vi điều khiển chỉ xử lý dc một lệnh duy nhất, thực hiện xong thì nhảy đến lệnh kế tiếp, ko có khái niệm 3 đầu 6 tay đâu nha chỉ làm dc duy nhất một việc trong 1 khoảng thời gian, đó chính là chu kì máy dc định bởi bộ dao động, thường thấy là thạch anh(như quả tim vậy nó mà ngừng đập là VDK sẽ chết), VDK sẽ chia 12 lần xung nhịp thạch anh để ra chu kì máy VD sd thạch anh 12Mhz thì ta có chu kỳ máy là 1us  (1/1.000.000 giây). Thế là đã hiểu sơ sơ rồi, thế là đủ cho ngôn ngữ C ko cần lắm quá nhiều về cấu trúc VDK lên việc học lập trình rất nhanh, tôi đảm bảo với bạn sẽ dễ hơn với ASM vì ASM là hợp ngữ còn C là ngôn ngữ bậc cao gần với con ng hơn.

Trước khi đi vào phần code ta sẽ tìm hiểu xem con VDK của ta có những gì để sài: Họ 8051 có tất cả 5 ngắt và 1 ngắt Reset và 2 bộ định thời Timer0 và Timer1, riêng chíp 8052 là có thêm Timer 2.

Ngắt reset là ngắt phần cứng khi ta kích mức cao vào chân Reset, còn 5 ngắt kia gồm: Ngắt Timer0, Timer 1, Ngắt ngoài 0, Ngắt ngoài 1, Ngắt UART ta sẽ xét từng ngắt một:
-Ngắt timer: Cơ bản timer0 và timer1 như nhau chỉ khác khai báo lên nhóm chung vào một mục
Ta xét thanh ghi hoạt động của timer: Thanh ghi 8bit TMOD:
 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
 Bôi đỏ là của Timer1 và còn lại là của Timer0, nhưng ta chỉ quan tâm tới bit M0 và M1 – đây là bit set chế độ hoạt động cho timer.

M1M0Chế độ
00Định thời 13bit
01Định thời 16bit
10Định thời 8bit tự nạp lại
11Định thời chia sẻ

Nhưng để cho nhanh ta có thể khai báo tắt như sau:
TMOD=0x01; Tương đương TMOD=0000 0001 là chọn timer0 và chế độ 16bit
TMOD=0x10; Tương đương TMOD=0001 0000 là chọn timer1 và chế độ 16bit
TMOD=0x21; Tương đương TMOD=0010 0001 là chọn timer0 chế độ 16bit và timer1 chế độ 8bit nạp lại tự động
.v.v..
Thanh ghi TH0, TL0(timer0), TH1,TL1(timer1) nạp giá trị ban đầu để đếm, bộ định thời sẽ đếm lên 1 với mỗi chu kì máy, như vậy ta phải tính toán giá trị nạp vì khi bộ định thời tràn tức đã đếm đủ 8bit, 16bit thì ngắt mới xảy ra
Chú ý thanh ghi TH0, TH1 có tác dụng khi ở chế độ 16bit vì nó lưu 8bit cao 
Thanh ghi IE(thanh ghi khai báo ngắt) có 2 bit ET0 và ET1 tương ứng ngắt timer0 và ngắt timer1.
Mình giới thiệu vậy thôi có gì lên mạng tìm hiểu thêm nha !

Ảnh mô phỏng protues.


Link download project.