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.

Timer 0 8051

12:15:00 AM Add Comment
Chào các bạn.
Hôm nay mình sẽ hướng dẫn các bạn cách sử dụng một số ứng dụng của bộ timer/counter trong 8051. 
Sau khi đọc xong bài viết này các bạn sẽ biết:
- Sử dụng timer ở mode 16bit để tạo bộ định thời.
- Tạo Baud Rate bằng timer 1.
- Tạo Baud Rate bằng timer 2.
1. Timer/Counter trong 8051:
- Trong 8051 có 2 hoặc 3(với AT89S52) bộ timer/counter 16 bit:



timer 0 8051

- Timer/Counter thường được sử dụng để tạo bộ định thời, hoặc bộ đếm sự kiện. Timer/Counter trong 8051 còn có thêm chức năng là tạo baud rate cho UART.
2. Định thời 16 bit:
- Để minh họa cho chế độ định thời 16 bit trong 8051 ta đi vào một ví dụ sau: Tạo bộ định thời gian 1s, sau mỗi giây giá trị biến x(x=0-9) sẽ tăng lên 1 đơn vị, hiển thị giá trị x lên màn hình LCD 16x2.



timer 0 8051

- Từ công thức trên để tạo định thời 1s với tần số thạch anh sử dụng là 11.0592Mhz thì giá trị timer sẽ tăng 921600 đơn vị. Timer 16 bit chỉ đếm được 65536 giá trị, vậy bộ timer sẽ cần tràn 15 lần, ứng với mỗi lần tràn thì nó sẽ đếm được 61440 giá trị.

Ảnh mô phỏng protues.



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

Đèn giao thông with 8051

2:35:00 AM Add Comment
Chào mọi người trong các bàu đăng trước mình có hướng dẫn các bạn về Led 7seg và led đơn rồi. Còn hôm nay mình sẽ các bạn ứng dụng nó để làm một số ứng dụng nhỏ. Cụ thể là làm đèn giao thông. Chương trình đơn giản thôi không có gì phức tạp hết.

Trong bài này sử dung Vi Điều Khiển 8051 để chạy mô phỏng chương trình cho các bạn xem. Các bạn xem lại các bài đắng trước để hiểu rõ hơn về Vi Điều Khiển 8051.

Trong chương trình có sử dụng 3 led đơn được nối với P0 và P2 để kết nối với led 7seg chục còn P3 kết nối với led 7seg đơn vị sơ đồ như hình bên dưới.



Code main.c

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

unsigned char code Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

// Khai bao ket noi
sbit DEN_DO = P0^0;
sbit DEN_VANG = P0^1;
sbit DEN_XANH = P0^2;
#define LED_CHUC P2
#define LED_DVI  P3

void main()
{
signed char i;

while(1)
{
// Den do
DEN_DO = 0; // Bat den do
DEN_XANH = 1;
DEN_VANG = 1;
for(i=20;i>=0;i--)
{
LED_CHUC = Code7Seg[i/10];
LED_DVI = Code7Seg[i%10]; 
Delay_ms(1000);
}

// Den xanh
DEN_DO = 1;
DEN_XANH = 0;
DEN_VANG = 1;
for(i=15;i>=0;i--)
{
LED_CHUC = Code7Seg[i/10];
LED_DVI = Code7Seg[i%10]; 
Delay_ms(1000);
}

// Den vang
DEN_DO = 1;
DEN_XANH = 1;
DEN_VANG = 0;
for(i=5;i>=0;i--)
{
LED_CHUC = Code7Seg[i/10];
LED_DVI = Code7Seg[i%10];
Delay_ms(1000);
}
}
}

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

Giới thiệu về IC 74LS47 8051

8:37:00 AM Add Comment

Mô tả

Đây là IC giải mã giành riêng cho LED 7 đoạn anode chung. IC chuyển đổi từ mã BCD sang mã LED 7 đoạn anode chung.
Ứng dụng khi ta cần hiện thị số trên LED 7 đoạn trong mạch số mà không cần dùng vi điều khiển, hoặc muốn tiết kiệm chân cho vi điều khiển.
74ls47

Sơ đồ chân

74ls47
LT: Lamp Test
BI: Blank Input
RBO: Ripple Blank Output
RBI: Ripple Blank Input

Hoạt động

7447 thường được sử dụng ở 4 chế độ hoạt động:
  1. Sáng bình thường đủ các trạng thái từ 0 ÷ 9 (thường dùng nhất). Chân BI/RBO phải bỏ trống hoặc nối lên mức cao, chân RBI phải bỏ trống hoặc nối lên mức cao, chân LT phải bỏ trống hoặc nối lên mức cao.
  2. Chân BI/RBO nối xuống mức thấp thì tất các các đoạn của LED đều không sáng bất chấp trạng thái của các ngõ vào còn lại.
  3. Bỏ trạng thái số 0 (khi giá trị BCD tại ngõ vào bằng 0 thì tất cả các đoạn của LED 7 đoạn đều tắt). Chân RBI ở mức thấp và chân BI/RBO phải bỏ trống (và nó đóng vai trò là ngõ ra).
  4. Chân BI/RBO phải bỏ trống hoặc nối lên mức cao và chân LT phải nối xuống mức thấp. Tất cả các thanh của LED 7 đoạn đều sáng, bất chấp các ngõ vào BCD. Dùng để Kiểm tra các đoạn của LED 7 đoạn (còn sáng hay đã chết).

Link download project.

Led 7seg 8051

8:22:00 AM Add Comment
Trong bài này mình sẽ giới thiệu các bạn giao tiếp với led 7seg. Led 7seg thì quá thông dụng rồi và ứng dung của nó cung rất nhiều. Như đã nói các bạn có thể tham khảo lý thuyết và led 7seg ở bên phần CCS hay XC8, Mikro C gì hoặc lên mạng tìm hiểu nha.



Code main.c

#include<main.h>
#include"..\lib\Delay.h" // chi den duong dan chua thu vien delay

unsigned char code Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};

void main()
{
unsigned char i;

while(1)
{
for(i=0;i<10;i++)
{
P2 = Code7Seg[i]; // Hien thi so i ra LED 7 doan
Delay_ms(1000);
}
}
}

Chương trình đơn giản vậy thôi các bạn có thể download project về tham khảo.

http://zo.ee/1WZx

Giao tiếp với nút nhấn 8051

8:12:00 AM Add Comment
Trong bài này mĩnh sẽ hướng dẫn các bạn làm thế này để giao tiếp với nút nhấn. Và để biết được nó hoạt động như thế nào thì ta thêm 1 led đơn để kiểm tra nó có hoạt động hay không.



- Code main.c
#include<main.h>
void main()
{
P2_0 = 0; // Tat LED

while(1)
{
if(P1_0 == 0) // Co nhan nut
{
P2_0 = 1;
}
else // Ko nhan nut
{
P2_0 = 0;
}
}
}
- Thư viện delay.c
#include"Delay.h"
#include"main.h"
#if(FREQ_OSC == 12000000)
void Delay_ms(unsigned int t)
{
unsigned int x,y;
for(x=0;x<t;x++)
{
for(y=0;y<123;y++);
}
}
#elif(FREQ_OSC == 11059200)
void Delay_ms(unsigned int t)
{
unsigned int x, y;
for(x = 0; x<t; x++)
{
for(y=0; y<113; y++);
}
}
#elif(FREQ_OSC == 8000000)
void Delay_ms(unsigned int t)
{
unsigned int x;
unsigned char y;
for(x = 0; x<t; x++)
{
for(y=0; y<218; y++);
}
}
#elif(FREQ_OSC == 4000000)
void Delay_ms(unsigned int t)
{
unsigned int x;
unsigned char y;
for(x = 0; x<t; x++)
{
for(y=0; y<106; y++);
}
}
#else
#error "Khong co ham Delay_ms nao tuong ung"
#endif
Thư viện delay.h
#ifndef _DELAY_H_
#define _DELAY_H_
void Delay_ms(unsigned int t);
#endif
Các bạn nhớ Add thư viện delay vào nha không là nó báo lỗi à.
Link download project Click here

HIỆU ỨNG LED 8051

8:00:00 AM Add Comment
Trong bài này mình hướng dẫn các bạn tạo 1 số hiệu ứng led đơn giản trên 8051. Led thì quá quen với chúng ta rồi không cần giới thiệu lại nưa. Trong các bài đăng ở bên phần XC8, CCS, Hitech C, Mikro C mình hướng dẫn lý thuyết về các phần này rồi các bạn có thể qua đó tham khảo thêm nha.
- Ảnh mô phỏng ptotues.


- Code main.c
#include <REGX52.H>
void Delay_ms(unsigned int t)
{
unsigned int x, y;
for(x = 0; x < t; x++)
{
for(y = 0; y < 123; y++); // Delay 1 ms
}
}

void main()
{
unsigned char i;
  while(1)
{
for(i=0;i<5;i++)
{
P0 = 0x00;
Delay_ms(500);
P0 = 0xFF;
Delay_ms(500);
}

for(i=0;i<5;i++)
{
P0 = 0x0F;
Delay_ms(500);
P0 = 0xF0;
Delay_ms(500);
}

// Hieu ung chop tat 3
for(i=0;i<5;i++)
{
P0 = 0x55;
Delay_ms(500);
P0 = 0xAA;
Delay_ms(500);
}
}
}
- Link download project  Click here