Chào các bạn trên cơ sở chia sẻ kiến thức mình biết về họ VĐK 8051 mình sẽ tổng hợp các bài viết theo chủ đề mức độ từ đơn giản đến phức tạp . Việc học qua ví dụ sẽ tiếp thu nhanh hơn đặc biệt với các bạn mới tìm hiểu về dòng vi điều khiển này .
Bài hôm nay chúng ta bắt đầu với led đơn , Cái này rất thú vị đây , xong bài này chắc mọi người có thể lập trình dc led trái tim hoành tráng hơn của mình đấy .
Nói qua về phần cứng tý nhỉ : mạch ghép nối rất đơn giản chỉ cần 1chip 89s52 vài con led+ trở => ok
nhưng mình chỉ chú ý mọi người vấn đề sau dòng phun( nghĩa là mức 1 sáng) vi điều khiển rất nhỏ tầm 1mA k đủ sáng led(~5mA)
vì vậy chúng ta sẽ lập trình led mức 0 sáng ( dòng hút ~10mA). thêm trở 330 or 470 hạn dòng cho led =>ok phần cứng chỉ có thế
Và bây giờ mình sẽ đi vào cách quét led đơn giản nhất (ai bắt đầu học chắc cũng phải gõ cái này) đó là điều khiển từng led 1 ( hay quét theo bit) . Ở đây mình sẽ kết nối led với chân P1.0 của vi điều khiển
Trích dẫn
#include "reg52.h"//khai bao thu vien cho ho 89x52
sbit led=P1^0;
void delay(unsigned int ms) //ham delay ms
{
unsigned int i,j; //vong for chay mat 8us
for(i=0;i for(j=0;j<125;j++); //tre 1s thi viet delay(1000)
}
main()
{
while(1)//vong lap vo tan
{
led=0; //led sang muc 0
delay(1000);
led=1;
delay(1000); //led tat
}}
Rất đơn giản phải k ? để tăng số led chỉ việc gán biến vd led1=P1^1....
Cái trên chắc ai nhìn cũng hiểu rồi , giờ để cả cổng P1 (8 led gắn với cổng P1) sáng tắt thì làm ntn?
Trích dẫn
#include "reg52.h"//khai bao thu vien cho ho 89x52
void delay(unsigned int ms) //ham delay ms
{
unsigned int i,j; //vong for chay mat 8us
for(i=0;i for(j=0;j<125;j++); //tre 1s thi viet delay(1000)
}
main()
{
while(1)//vong lap vo tan
{
P1=0; //led sang muc 0
delay(1000);
P1=1;
delay(1000); //led tat
}}
Cái này tương tự như trên thôi nhưng đây là điều khiển theo byte (8led 1 lúc)
Code trên còn có thể viết như sau:
Trích dẫn
main()
{
while(1)//vong lap vo tan
{
P1=0x00; //led sang muc 0
delay(1000);
P1=0xff;
delay(1000); //led tat
}}
Các bạn thấy khó hiểu rồi phải k => cái này là xuất theo mã hexa 0x00.
Ở đây là hexa 8 bit thứ tự đánh bit như sau 7 6 5 4 3 2 1 0
tương ứng với các chân vi điều khiển ở đây là P1,7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
0X00 đổi sang nhị phân là 00000000 vậy 8 led 0 nên sáng tương tự với 0xff. Các bạn nắm vững số hexa sẽ thấy cái này rất đớn giản !
Có 1 câu hỏi cho các bạn là P1= 0xb3 thì các led nào sẽ sáng ?????
0xb3=10110011 led mức 0 sáng sẽ là các led 6,3,2 led tắt là các led 7,5,4,1,0
đơn giản chưa ?? xuất 1 phát dc 8 led , và bây giờ là code lập trình sáng dần các led từ led 0->7 theo phương pháp mình hay dùng là mảng 1 chiều :
Trích dẫn
#include "reg52.h"//khai bao thu vien cho ho 89x52
void delay(unsigned int ms) //ham delay ms
{
unsigned int i,j; //vong for chay mat 8us
for(i=0;i for(j=0;j<125;j++); //tre 1s thi viet delay(1000)
}
main()
{
unsigned int k;
unsigned char maled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//mang chua ma led
while(1)//vong lap vo tan
{
for(k=0;k<8;k++)
{
P1=maled[k];
delay(1000);
}
}}
Rất hay phải k , bật mí là mình viết code led trái tim theo cách này đó , để cả 4 cổng đều sáng thì viết như sau:
Trích dẫn
for(k=0;k<8;k++)
{
P0=P1=P2=P3=maled[k];
delay(1000);
}
ok. giờ là phương pháp cuối cùng mình dùng sử dụng hàm trong thư viên "intrins.h"
Trích dẫn
#include "reg52.h"//khai bao thu vien cho ho 89x52
#include "intrins.h"
void delay(unsigned int ms) //ham delay ms
{
unsigned int i,j; //vong for chay mat 8us
for(i=0;i for(j=0;j<125;j++); //tre 1s thi viet delay(1000)
}
main()
{
unsigned int x,k;
unsigned char maled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//mang chua ma led
while(1)//vong lap vo tan
{
x=0xfe;//gan bien x
for(k=0;k<8;k++)
{
P1=x; //o day la led 0 sang
delay(1000);//tre
x=_crol_(x,1); // quay trai bien x 1 don vi
}
}}
Phù thế là xong led đơn chỉ có thể đơn giản k nào ?? Các bạn tự viết hiệu ứng cho led theo mấy cách này nha bạn nào viết dc code cho led trái tim thì gửi video cho mình coi nha .Hôm nay tạm nghỉ ở đây , bài sau chúng ta sẽ tìm hiểu về cách phương pháp quét led 7 thanh =>ok