Tải bản đầy đủ (.doc) (51 trang)

Một Số Bài Toán Ứng Dụng Cho Trình biên dịch Keil C pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (803.7 KB, 51 trang )

Một Số Bài Toán Ứng Dụng Cho Trình biên
dịch Keil C (compiler)
Điều khiển Led đơn, Led 7 thanh và nút nhấn
I. Hiển thị Led đơn
Bài toán:Ghép nối LED dơn với chân P1.0 của vi điều khiển, viết chương trình điều
khiển LED nhấp nháy với thời gian trễ là 1s.
+ Lưu đồ thuật toán của bài LED nháy:

+ Chương trình điều khiển:
*/==================Bo tien xu li===================*/
#include<AT89x51.h> // Dinh kem file thu vien
#define bat 1 // Dinh nghia gia tri bat den Led
#define tat 0 // Dinh nghia gia tri tat den Led
/*==================khai bao bien==================*/
sbit Led = P1^0;
// Khai bao bien Led kieu bit chan P1.0
void delay(long time)
{
while(time );
}
/* ham chinh */
void main(void)
{
while(1)
{
Led = bat; // bat Led
delay(25000); // tre 1s
Led = tat; // tat Led
START
Khởi tạo hệ thống
Sáng Led


Trễ 1S
Tắt Led
Trễ 1S
delay(25000); //tre 1s
}
}
II. Phối hợp Led và nút nhấn
1. Phối hợp Led đơn và nút nhấn
Bài toán: Một đèn Led được nối với chân P1.0 của vi điều khiển. Một công tắc
START nối với chân P3.0 và công tắc STOP nối với chân P3.1 của vi điều khiển. hãy viết
chương trình điều khiển để khi bật công tắc START thì Led sáng, khi bật công tắc STOP thì
Led tắt.
+ Lưu đồ thuật giải của bài toán:
+ Chương trình điều khiển:
*/==================Bo tien xu li===================*/
#include<AT89x51.h> // Dinh kem file thu vien
#define bat 1 // Dinh nghia gia tri bat den Led
#define tat 0 // Dinh nghia gia tri tat den Led
/*==================khai bao bien==================*/
sbit Led = P1^0; // Khai bao bien Led kieu bit chan P1.0
sbit STOP = P3^0; // cong tac STOP de tat Led
sbit START = P3^1; // cong tac START de bat Led
/*=================== ham chinh==================*/
void main(void)
{
Led = tat; //ban dau tat Led
while(1){
if((START==0)&&(STOP==1)) {
Led = bat;
Start

Led = tat
Start =
0
Stop =
0
Led = tat
Led = bat
}
if((START==1)&&(STOP==0)){
Led = tat;
}
}
}
2. Phối hợp Led 7 thanh và nút nhấn
Các số
hiển
thị
P1.0
g
P1.1
f
P1.2
e
P1.3
d
P1.4
c
P1.5
b
P1.6

a dp
số nạp hex
mov P1,#
0 1 0 0 0 0 0 0 1 81
1 1 1 1 1 0 0 1 1 cf
2 0 1 0 0 1 0 0 1 92
3 0 1 1 0 0 0 0 1 86
4 0 0 1 1 0 0 1 1 cc
5 0 0 1 0 0 1 0 1 a4
6 0 0 0 0 0 1 0 1 a0
7 1 1 1 1 0 0 0 1 8f
8 0 0 0 0 0 0 0 1 80
9 0 0 1 0 0 0 0 1 84
Bài toán:
Một Nút bấm được nối với chân P3.4, hãy lập trình điều khiển đếm số lần ấn phím
từ 0 đến 9 và hiển thị trên Led 7 thanh.
+ Lưu đồ thuật giải:
START
Dem=0;
ctac==0?
dem++;
dem<=10?
dem=0;
hiển thi ra Led 7 thanh
+ Chương trình điều khiển:
/*==================Bo tien xu li===================*/
#include<AT89x51.h> // Dinh kem file thu vien
/*=================Khai bao bien toan cuc=============*/
sfr dataP = 0x90; // du lieu la P1
// ma 7 thanh tu 0 den 9 la

// 0x81h,0xcfh,0x92h,0x86h,0xcch,0xa4,0xa0h,0x8fh,0x80h,0x84h.
sbit ctac = P3^4;
unsigned char dem=0;
/*====================Khai bao ham==================*/
/* ham delay========================*/
void delay(long time)
{
while(time );
}
/* chuong trinh con kiem tra co phim nhan */
void phim_an(void)
{
if(ctac==0) //co phim nhan
{
delay(500); //chong rung phim
while(ctac==0); //Cho nha phim
delay(500); // chong rung phim
dem++; //tang bien dem
if(dem==10) dem=0;
}
}
/* hien thi so lan an phim */
void solan_an(void)
{
switch(dem)
{
case 0: {dataP=0x81;break;}
case 1: {dataP=0xcf;break;}
case 2: {dataP=0x92;break;}
case 3: {dataP=0x86;break;}

case 4: {dataP=0xcc;break;}
case 5: {dataP=0xa4;break;}
case 6: {dataP=0xa0;break;}
case 7: {dataP=0x8f;break;}
case 8: {dataP=0x80;break;}
case 9: {dataP=0x84;break;}
};
}
/* chuong trinh chinh */
void main(void)
{
dataP = 0x81; // ban dau la so 0
while(1){
phim_an();
solan_an();
}
}
Bài 3 Hiển thị LCD, Giao tiếp bàn phím Hex, Hiển thị ma trận Led
I. LCD
1. Ghép nối vi điều khiển với LCD 16x2.
- Bảng mô tả sơ đồ chân của LCD 16x2:
Chân Ký hiệu I/O Mô tả
1 V
ss
- Mass
2 V
cc
- Dương nguồn 5v
3 V
EE

- Cấp nguồn điều khiển tương phản
4 RS I RS=0 chon thanh ghi lệnh
RS=1 chon thanh ghi dữ liệu
5 R/W I R/W=1 đọc dữ liệu, R/W=0 ghi
6 E I/O Cho phép
7 DB0 I/O Bit dữ liệu
8 DB1 I/O Nt
9 DB2 I/O Nt
10 DB3 I/O Nt
11 DB4 I/O Nt
12 DB5 I/O Nt
13 DB6 I/O Nt
14 DB7 I/O Nt
Chân 15 và 16 là A và K. Nó được nối với 2 chân của 1 con Led dùng để sáng LCD
trong bóng tối chúng ta không sử dụng.
- Sơ đồ ghép nối LCD với vi điều khiển:
2. Nguyên lí hoạt động của LCD.
- Chân V
CC
, V
ss
, và V
EE
: các chân V
CC
và V
SS
cáp dương nguồn 5v và mass tương ứng.
Chân V
EE

được dùng để điều khiển độ tương phản.
- Chân chọn thanh ghi RS(Register Select): có 2 thanh ghi trong LCD chân RS được
dùng để chọn thanh ghi. nếu RS=0 thì thanh ghi mã lệnh được chọn để cho phép người
dùng gửi 1 lệnh lên chẳng hạn như xoá màn hình, đưa con trỏ về đầu dòng… Nếu RS=1 thì
thanh ghi dữ liệu được chọn cho phép người dùng gửi dữ liệu cần hiển thị lên LCD.
- Chân đọc/ghi (R/W): đầu vào đọc/ghi cho phép người dùng đọc thông tin từ LCD khi
R/W=1 hoặc ghi thông tin lên LCD.
- Chân cho phép E(Enable): chân cho phép được sử dụng bởi LCD để chốt dữ liệu của
nó. Khi dữ liệu được cấp đến chân dữ liệu thì 1 xung mức cao xuống thấp phải được áp đến
chân này để LCD chốt dữ liệu trên các chân dữ liệu. Xung này có độ rộng tối thiểu 450ns.
- Chân DB0-DB7: đây là đường dữ liệu 8 bít, được dùng để gửi thông tin lên LCD hoặc
đọc nội dung các thanh ghi trong LCD. Để hiển thị các chữ cái và các con số, chúng ta gửi
mã ASCII của các chữ cái từ A đến Z , a đến z và các chữ số từ 0 đến 9 đến các chân này
khi bật RS=1.
- Bảng mã lệnh của LCD:
Mã (HEX) Lệnh đến thanh ghi của LCD
01 Xoá màn hình hiển thị
02 Trở về đầu dòng
04 Giảm con trỏ(dịch con trỏ sang trái )
06 Tăng con trỏ(dịch con trỏ sang phải)
05 Dịch hiển thị sang phải
07 Dịch hiển thị sang trái
08 Tắt con trỏ, tắt hiển thị
0a Tắt hiển thị, bật con trỏ
0c Bật hiển thi, tắt con trỏ
0e Bật hiển thị, nhấp nháy con trỏ
0f Tắt con trỏ, nhấp nháy con trỏ
10 Dịch vị trí con trỏ sang trái
14 Dịch vị trí con trỏ sang phải
18 Dịch toàn bộ hiển thị sang trái

1c Dịch toàn bộ hiển thị sang phải
80 Ép con trỏ về đầu dòng thứ nhất
0c0 Ép con trỏ về đầu dòng thứ 2
38 Hai dòng và ma tận 5x7.

3. Phần luyện tập:
Hãy viết chương trình hiển thị trên LCD:
Dòng 1 chữ “VIETNAM” bằng cách hiển thị tưng kí tự
Dòng 2 chữ "VI DIEU KHIEN" bằng cách hiển thị cả chữ. Với sơ đồ mạch
cho dướí đây.
Chương trình:
/*=========bo tien xu li===============*/
#include<AT89x51.h>
#include<string.h>
/*===========khai bao bien toan cuc============*/
sfr LCDdata = 0xA0; // cong P2, 8 bit du lieu.
sbit BF = 0xA7; // co ban, bit DB7.
sbit RS = P3^0; // chon thanh ghi
sbit RW = P3^1; // doc/ghi
sbit EN = P3^2; //cho phep chot du lieu
/*===========cac chuong trinh con cua LCD==========*/
/* kiem tra su san sang cua LCD */
void delay(unsigned int ms)
{
unsigned char k;
while (ms )
{
for (k = 0; k < 114; k++);
}
}

void wait(void)
{
RS=0;
RW=1;
LCDdata=0xff;
while(BF)
{
EN=0;
EN=1;
}
}
/* thiet lap lenh cho LCD */
void LCDcontrol(unsigned char x)
{
RS=0;//chon thanh ghi lenh
RW=0;//ghi len LCD.
LCDdata=x ;// gia tri x
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
wait();//đoi LCD san sang.
}
/* Khoi tao LCD */
void LCDinit(void)
{
LCDcontrol(0x38);//2 dong va ma tran 5x7
LCDcontrol(0x0e);//bat man hinh, bat con tro
LCDcontrol(0x01);//xoa man hinh
}
/* thiet lap du lieu cho LCD */
void LCDwrite(unsigned char c)

{
RS=1;//ghi du lieu
RW=0;//ghi du lieu len LCD
LCDdata=c;//gia tri C
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
wait();//cho
}
void LCDwrites(unsigned char *s)
{
unsigned char data lens,count;
lens=strlen(s);// lay do dai bien duoc tro boi con tro
for(count=0;count<lens;count++)
{
LCDwrite(*(s+count));
}
}
/*=====================chuong trinh tre================*/

/*========================ham chinh==================*/
void main(void)
{
LCDinit(); // khoi tao LCD
LCDcontrol(0x82);// dua con tro den vi tri thu 4 dong 1
LCDwrite(‘V’);
LCDwrite(‘I’);
LCDwrite(‘E’);
LCDwrite(‘T’);
LCDwrite(‘ ’);
LCDwrite(‘N’);

LCDwrite(‘A’);
LCDwrite(‘M’);
LCDcontrol(0xC0);//dua con tro ve dau dong thu 2
LCDwrites("VI DIEU KHIEN");
while(1); //vong lap vo han
}
II. Giao tiếp bàn phím Hex (ma trận phím 4x4)
1. Thuật toán đọc bàn phím
Cột
i
= 0 (i=1-4)
Begin
Hàng
i
= 0
(i =1-4)
Sai
2. Chương trình
Hãy viết chương trình đọc ma trận phím và hiển thi số thứ tự phím trên LCD.
Chương trình:
/*=========bo tien xu li===============*/
#include<AT89x51.h>
#include<string.h>
#define H1 P1_0
#define H2 P1_1
#define H3 P1_2
#define H4 P1_3
/*===========khai bao bien toan cuc============*/
sfr LCDdata = 0xA0; // cong P2, 8 bit du lieu.
sbit BF = 0xA7; // co ban, bit DB7.

sbit RS = P3^0; // chon thanh ghi
Trả lại kết quả phím đã
nhấn
Đúng
sbit RW = P3^1; // doc/ghi
sbit EN = P3^2; //cho phep chot du lieu
/*chuong trinh con*/
void wait(void)
{
RS=0; //chon thanh ghi lenh
RW=1; //đoc tu LCD
LCDdata=0xff; //gia tri 0xff
while(BF) //kiem tra co ban
{
EN=0; //dua xung cao xuong thap đe chot.
EN=1; //dua chan cho phep len cao
}
}
/* thiet lap lenh cho LCD */
void LCDcontrol(unsigned char x)
{
RS=0;//chon thanh ghi lenh
RW=0;//ghi len LCD.
LCDdata=x ;// gia tri x
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
wait();//đoi LCD san sang.
}
/* Khoi tao LCD */
void LCDinit(void)

{
LCDcontrol(0x38);//2 dong va ma tran 5x7
LCDcontrol(0x0e);//bat man hinh, bat con tro
LCDcontrol(0x01);//xoa man hinh
}
/* thiet lap du lieu cho LCD */
void LCDwrite(unsigned char c)
{
RS=1;//ghi du lieu
RW=0;//ghi du lieu len LCD
LCDdata=c;//gia tri C
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
wait();//cho
}
void LCDwrites(unsigned char *s)
{
unsigned char data lens,count;
lens=strlen(s);// lay do dai bien duoc tro boi con tro
for(count=0;count<lens;count++)
{
LCDwrite(*(s+count));
}
}
/*=====================chuong trinh tre================*/
void delay(long time)
{
Long n;
For (n=0;n++;n<time)
{;}

}
/* ham doc phim nhan tu ma tran phim 4x4 */
unsigned char Phim(void)
{
unsigned char phimnhan, dem, chot;
phimnhan=0;
chot=128;
dem=4;
while(dem ){
P1=~chot;
if(!H1){
delay(500);
phimnhan=dem+1;
delay(500);
}else if(!H2){
delay(500);
phimnhan=dem+5;
delay(500);
}else if(!H3){
delay(500);
phimnhan=dem+9;
delay(500);
}else if(!H4){
delay(500);
phimnhan=dem+13;
delay(500);
}
chot>>=1;
}
return phimnhan;

}
void viewphim(unsigned char phimnhan)
{
if(phimnhan<10){
LCDwrite(phimnhan+48);
}else{
LCDwrite(phimnhan/10+48);
LCDwrite(phimnhan%10+48);
}
}
void main(void)
{
unsigned char phimnhan=0;
LCDinit();
LCDwrites("Hay Nhan Phim");
LCDcontrol(0xC0);
while(1){
phimnhan=Phim();
if(phimnhan){
LCDcontrol(0x01);
LCDwrites("Hay Nhan Phim");
LCDcontrol(0xC0);
viewphim(phimnhan);
}
}
}
III. Hiển thị ma trận Led
1. Thuật toán
2. Xây dựng chương trình
Bài toán: Viết chương trình hiển thị ma trận LED bằng phương pháp quét cột hiển thị

dong chữ "LAP TRINH VI DIEU KHIEN BANG NGON NGU C", với dong chữ chạy từ trái
sang phải.
+ Chương trình:
// Khai bao chi thi tien xu ly
#include<AT89x51.h>
// Dinh nghia cac cong va cac chan dieu khien
#define CLOCK P3_2
#define DATA P3_3
#define CLEAR P3_4
#define Pxanh P1
#define Pdo P2
// Dinh nghia cac hang so
#define Nhanh 10
#define Trungbinh 25
#define Cham 50
#define Cuccham 75
#define Sieucham 150
#define Mxanh 1
#define Mdo 2
#define Mcam 3
// Khai bao mang chu hien thi
unsigned char code Mcode[256]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,255,1,1,1,1,/* L */
0,63,72,136,72,63,/* A */
0,255,144,144,144,96,/* P */
0,
0,128,128,255,128,128,/* T */
0,255,144,144,144,111,/* R */
0,129,129,255,129,129,/* I */

0,255,96,24,6,255,/* N */
0,255,16,16,16,255,/* H */
0,
0,252,2,3,2,252,/* V */
0,129,129,255,129,129,/* I */
0,
0,255,129,129,129,126,/* D */
0,129,129,255,129,129,/* I */
0,255,145,145,145,129,/* E */
0,254,1,1,1,254,/* U */
0,
0,255,24,36,66,129,/* K */
0,255,16,16,16,255,/* H */
0,129,129,255,129,129,/* I */
0,255,145,145,145,129,/* E */
0,255,96,24,6,255,/* N */
0,
0,255,145,145,145,110,/* B */
0,63,72,136,72,63,/* A */
0,255,96,24,6,255,/* N */
0,126,129,129,137,78,/* G */
0,
0,255,96,24,6,255,/* N */
0,126,129,129,137,78,/* G */
0,126,129,129,129,126,/* O */
0,255,96,24,6,255,/* N */
0,
0,255,96,24,6,255,/* N */
0,126,129,129,137,78,/* G */
0,254,1,1,1,254,/* U */

0,
0,126,129,129,129,70,/* C */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
// Khai bao bien toan cuc
unsigned char data Start,End,Tocdolap,i,j,k;
unsigned char data Mdata1[32],Mdata2[32],Mau;
unsigned char data Dk1,Dk2,Dk3,Dk4,Dk5;
// Khai bao nguyen mau cac ham
void delay(unsigned long time);
unsigned char Mu2(unsigned char somu);
void Do(unsigned char chiso);
void Xanh(unsigned char chiso);
void Cam(unsigned char chiso);
void Dobyte(unsigned char chiso);
void Xanhbyte(unsigned char chiso);
void Cambyte(unsigned char chiso);
void Chaychudo(void);
void Chaychuxanh(void);
void Chaychucam(void);
void Chaychu(void);
void Taomangnhapnhay(void);
void Nhapnhayxanh(void);
void Nhapnhaycam(void);
void Nhapnhaydo(void);
void Taomanglen(void);
void Lxanh(void);
void Ldo(void);
void Lcam(void);
void Len(void);

/******************Ma nguon cac ham*************************/
// Ham tao tre
void delay(unsigned long time)
{
while(time );
}
// Khoi ham hien thi chu chay tu trai sang phai
void Xanh(unsigned char chiso)
{
CLOCK=1;
DATA=0;
CLOCK=0;
Pxanh=Mcode[chiso];
delay(12);
Pxanh=0;
}
void Do(unsigned char chiso)
{
CLOCK=1;
DATA=0;
CLOCK=0;
Pdo=Mcode[chiso];
delay(12);
Pdo=0;
}
void Cam(unsigned char chiso)
{
CLOCK=1;
DATA=0;
CLOCK=0;

Pxanh=Mcode[chiso];
Pdo=Pxanh;
delay(12);
Pdo=0;
Pxanh=0;
}
void Chaychucam(void)
{
for(i=Start+1;i<Dk1;i++)
{
Tocdolap=Nhanh;
while(Tocdolap )
{
DATA=1;
Dk2=i+32;
for(j=i;j<Dk2;j++)Cam(j);
}
}
}
void Chaychuxanh(void)
{
for(i=Start+1;i<Dk1;i++)
{
Tocdolap=Nhanh;
while(Tocdolap )
{
DATA=1;
Dk2=i+32;
for(j=i;j<Dk2;j++)Xanh(j);
}

}
}
void Chaychudo(void)
{
for(i=Start+1;i<Dk1;i++)
{
Tocdolap=Nhanh;
while(Tocdolap )
{
DATA=1;
Dk2=i+32;
for(j=i;j<Dk2;j++)Do(j);
}
}
}

void Chaychu(void)
{
Dk1=End-31;
if(Mau==Mxanh)Chaychuxanh();
else if(Mau==Mdo)Chaychudo();
else Chaychucam();
}

×