You are on page 1of 81

cng ng dng lp trnh C cho vi iu khin 8051

Bi 1: Ngn ng C Trnh dch Keil C


I. Ngn ng C cho vi iu khin
1, Gii thiu ngn ng C
Trong k thut lp trnh vi iu khin ni chung, ngn ng lp trnh c s dng
thng chia lm 2 loi: Ngn ng bc thp v Ngn ng bc cao.
Ngn ng bc cao l cc ngn ng gn vi ngn ng con ngi hn, do vic lp
trnh bng cc ngn ng ny tr nn d dng v n gin hn. C th k n mt s ngn
ng lp trnh bc cao nh C, Basic, Pascal trong d C l ngn
ng thng dng hn c trong k thut vi iu khin. V bn cht, s dng cc ngn ng ny
thay cho ngn ng bc thp l gim ti cho lp trnh vin trong vic nghin cu cc tp lnh
v xy dng cc cu trc gii thut. Chng trnh vit bng ngn ng bc cao cng s c
mt phn mm trn my tnh gi l trnh bin dch (Compiler) chuyn sang dng hp ng
trc khi chuyn sang m my.
Khi s dng ngn ng C ngi lp trnh khng cn hiu su sc v cu trc ca b vi
iu khin. C ngha l vi mt ngi cha quen vi mt vi iu khin cho trc s xy
dng c chng trnh mt cch nhanh chng hn, do khng phi mt thi gian tm hiu
kin trc ca vi iu khin . V vic s dng li cc chng trnh xy dng trc
cng d dng hn, c th s dng ton b hoc sa cha mt phn.
2. Ngn ng C
2.1 Kiu d liu
2.1.1 Kiu d liu trong C
Kiu
Char
Unsigned char
Int
Unsigned int
Long
Unsigned long
Float

S Byte
1
1
2
2
4
4
4

Khong gi tr
-128 +127
0 255
-32768 - +32767
0 - 65535
-2147483648 - +2147483647
0 4294697295

* Khai bo bin:
- C php: Kiu_d_liu Vng_nh Tn_bin _at_ ia_ch;
V d:
Unsigned char data x;
- Khi khai bo bin c th gn lun cho bin gi tr ban u.
V d:
Thay v: unsigned char x;
x = 0;
Ta ch cn: unsigned char x = 0;
- C th khai bo nhiu bin cng mt kiu mt lc.
V d: unsigned int x,y,z,t;
- Ch nh vng nh: t kho Vng_nh cho php ngi dng c th ch ra vng nh s
dng lu tr cc bin s dng trong chng trnh. Cc vng nh c th s dng l:
CODE, DATA, DATAB, IDATA, PDATA, XDTA. Khi khng khai bo vng nh trnh dch
Keil C s mc nh l vng nh DATA.
Vng nh
CODE
DATA
BDATA
IDATA
PDATA
XDATA

ngha
B nh m ngun chng trnh
B nh d liu gm 128 Byte thp ca RAM trong vi iu khin
B nh d liu c th nh a ch bit, nm trong vng nh DATA
B nh d liu gm 128 Byte cao ca RAM trong vi iu khin ch c mt
s dng vi iu khin sau ny
B nh d liu ngoi gm 256 Byte, c truy cp bi a ch t trn P0
B nh d liu ngoi c dung lng c th ln n 64 KB, c truy cp bi
a ch t trn P0 v P2

* nh ngha li kiu
- C php: typedef Kiu_d_liu Tn_bin;
- Ten_bin sau ny s c s dng nh mt kiu d liu mi v c th dng khai bo
cc bin khc
V d: typedef int m5[5];
Dng tn m5 khai bo hai bin tn a v b c kiu d liu l mng 1 chiu 5 phn t:
m5 a,b;
2.1.2 Kiu d liu trong Keil C

Kiu
Bit
Sbit
Sfr
Sfr16

S bit
1
1
8
16
- bit : dng khai bo cc bin c gi tr 0 hoc mt hay cc bin logic trn vng
RAM ca vi iu khin. Khi khai bo bin kiu bit trnh dc Keil C s mc nh vng nh s
dng l BDATA.
`
- sbit, sfr, sfr16: dng nh ngha cc cho cc thanh ghi chc nng hoc cc cng
trn vi iu khin dng truy nhp cc on d liu 1 bit, 8 bit, 16 bit
2.1.3 Mng
Mng l mt tp hp nhiu phn t cng mt kiu gi tr v chung mt tn. Cc phn
t ca mng phn bit vi nhau bi ch s hay s th t ca phn t trong dy phn t. Mi
phn t c vai tr nh mt bin v lu tr c mt gi tr c lp vi cc phn t khc ca
mng.
Mng c th l mng mt chiu hoc mng nhiu chiu
Khai bo:
- C php: Tn_kiu Vng_nh Tn_mng[s_phn_t_mng];
Khi b trng s phn t mng ta s c mng c s phn t bt k.
V d:
Unsigned int data a[5],b[2] [3];
Vi khai bo trn ta s c: mng a l mng mt chiu 5 phn t. Mng b l mng hai
chiu, tng s phn t l 6.
Ch s ca mng bt u t s 0. Mng c bao nhiu chiu phi cung cp y by
nhiu ch s
V du: phn t mng b[0] [1] l ng
Khi vit b[0] l sai
2.1.4. Con tr
Khi ta khai bo mt bin, bin s c cp pht mt khong nh bao gm mt s
byte nht nh dng lu tr gi tr. a ch u tin ca khong nh chnh l a ch
ca bin c khai bo.
Con tr l mt bin dng cha a ch m khng cha gi tr, hay gi tr ca con tr
chnh l a ch khong nh m n tr ti.

Vi cc vng nh c th con tr ti vng nh chim dung lng ph thuc vo


ln ca vng nh . Con tr tng qut khi khng xc nh trc vng nh s c dung lng
ln nht v vy tt nht nn s dng con tr c th.
Loi con tr
Con tr tng qut
Con tr XDATA
Con tr CODE
Con tr DATA
Con tr IDATA
Con tr PDATA

Kch thc
3 byte
2 byte
2 byte
1 byte
1 byte
1 byte

Khai bo bin con tr:


- C php: Kiu_D_liu Vng_nh *Tn_bin;
- V d:
int *int_ptr;
long data *long_ptr;
- khi khng ch r vng nh con tr s c coi l con tr tng qut.
2.1.5 Kiu d liu cu trc
Kiu d liu cu trc l mt tp hp cc bin, cc mng v c cc kiu cu trc khc
c biu th bi mt tn duy nht. kiu d liu cu trc dng lu tr cc gi tr, thng tin
c lin quan n nhau.
nh ngha v khai bo bin cu trc:
- nh ngha: typedef struct {
Khai bo cc bin thnh phn;
} Tn_kiu_cu_trc;
- Khai bo: Tn_kiu_cu_trc Vng_nh Tn_bin;
V d: typedef struct {
char day;
char month;
int year;
} Date_type;
Date_type date,date_arr[5];
2.2 Php ton
Php gn k hiu: =.
- C php: Bin_1 = Bin_2;

Trong Bin_2 c th l gi tr xc nh cng c th l bin.


2.2.1 Php ton s hc
Php ton
ngha
V d
+
Php cng
X=a+b
Php tr
X=a-b
*
Php nhn
X=a*b
/
Php chia ly phn
X=a/b
nguyn
(a=9, b=2 X=4)
%
Php chia ly phn d
a%b
(a=9, b=2 X=1)
2.2.2 Php ton Logic
AND: &&
OR: ||
NOT: !
2.2.3 Cc php ton so snh:

Php
ton
>

ngha

V d

So snh ln hn

>=

So snh ln hn hoc bng

<

So snh nh hn

a>b
4>5 cc gi tr
0
a>=b
6>=2 cc gi
tr 1
a<b
6<7 cc gi tr
1

<=

So snh nh hn hoc bng

==

So snh bng nhau

!=

So snh khc nhau

a<=b
8<=5 cc gi
tr 0
a==b
6==6 cc gi
tr 1
a!=b
9!=9 cc gi tr
0

2.2.4 Php ton thao tc Bit


Php ton
&
|
!
^
<<
>>
~

ngha
Php v (AND)
Php hoc (OR)
Php o (NOT)
Php hoc loi tr (XOR)
Dch tri
Dch phi
Ly b theo bit

2.2.5 Php ton kt hp


Php ton
+=

V d
a+=5 <=> a=a+5

V d
Bit_1 & Bit_2
Bit_1 | Bit_2
!Bit_1
Bit_1 ^ Bit_2
a<<3
a>>4
~a

-=
*=
/=
%=

a-=5 <=> a=a-5


a*=5 <=> a=a*5
a/=5 <=> a=a/5
a%=5 <=> a=a%5

2.3 Cu trc chng trnh C


2.3.1 Cu trc chng trnh
* Cu trc
1. Khai bo ch th tin x l
2. Khai bo cc bin ton cc
3. Khai bo nguyn mu cc hm
4. Xy dng cc hm v chng trnh chnh
* V d:
#include<regx51.h>
Khai bo ch th tin x l
#include<string.h>
#define Led1 P1_0
Unsigned char code Led_arr[3];
Unsigned char data dem;
Unsigned int xdata X;
Void delay(unsigned int n);
bit kiemtra(unsigned int a);
void delay(unsigned int n)
{
Khai bo bin cc b;
M chng trnh tr;
}
Void main()
{
Khai bo bin c b;
M chng trnh chnh;
}

Khai bo bin ton cc

Khai bo nguyn mu hm

Xy dng cc hm v chng
trnh chnh

Bit kiemtra(unsigned int a)


{
Khai bo bin cc b;
M chng trnh kim tra bin a;
}
Ch : Hm khng khai bo nguyn mu phi c xy dng trc hm c li gi
hm . v d trn do hm bit kiemtra(unsigned int a) c khai bo nguyn mu hm
trn nn c th xy dng hm bt k v tr no trong chng trnh.
2.3.2 Ch th tin x l
Cc ch th tin s l khng phi l cc lnh ca ngn ng C m l cc lnh gip cho
vic son tho chng trnh ngun C trc khi bin dch. Khi dch mt chng trnh C th
khng phi chnh bn chng trnh ngun m ta son tho c dch. Trc khi dch, cc
lnh tin x l s chnh l bn gc, sau bn chnh l ny s c dch. C ba cch chnh l
c dng l:
+ Php thay th #define
+ Php chn tp #include
+ Php la chn bin dch #ifdef
Cc ch th tin x l gip ta vit chng trnh ngn gn hn v t chc bin dch, g
ri chng trnh linh hot, hiu qu hn.
* Ch th #define
Ch th #define cho php to cc macro thay th n gin
- C php: #define Tn_thay_th dy_k_t
Mt Tn_thay_th c th c nh ngha li nhiu ln, nhng trc khi nh ngha
li phi gii phng nh ngha bng ch th:
#undef Tn_thay_th
- V d:
#define N 100
* Ch th #include
Ch th #include bo cho trnh bin dch nhn ni dung ca tp khc v chn vo tp
chng trnh ngun m ta son tho.
- C php:
Cch 1: #include<tn_tp>
Cch 2: #includetn_tp

- V d:
Cch 1: #include<regx51.h>
cch ny tp regx51.h s c tm trong th mc INC chn vo chng
trnh ngun.
Cch 2: #includeregx51.h
cch ny tp regx51.h s c tm trong th mc cha chng trnh ngun
nu khng c mi tm trong th mc INC
Khi mun chn tp ngoi th vin hoc ngoi th mc cha chng trnh ngun th
tn_tp s bao gm c ng dn th mc cha tp.
* Ch th #ifdef
Ch th #ifdef ny thng dng bin dch cc tp th vin.
- C php:
Cch 1: #ifdef ten_macro
on chng trnh
#endif
Cch 2: #ifdef ten_macro
on chng trnh 1
#else
on chng trnh 2
#endif
cch 1 nu tn_macro c nh ngha on chng trnh s c dch ngc
li on chng trnh s b b qua.
* Ch th #ifndef
Ch th #ifndef ny thng dng bin dch cc tp th vin.
- C php:
Cch 1: #ifndef ten_macro
on chng trnh
#endif
Cch 2: #ifndef ten_macro
on chng trnh 1
#else

on chng trnh 2
#endif
cch 1 nu tn_macro cha c nh ngha on chng trnh s c dch
ngc li on chng trnh s b b qua.
2.3.3 Ch thch trong chng trnh
Vic vit ch thch trong trnh nhm mc ch gii thch ngha ca cu lnh, on
chng trnh hoc hm hot ng nh th no v lm g. Vit ch thch s gip cho ngi
c c th hiu c chng trnh d dng v nhanh chng hn, sa li n gin hn hoc
gip cho ta xem li chng trnh c m ta lm tr ln nhanh hn.
Ch thch trong chng trnh s khng nh hng n chng trnh m ta son tho v
trnh dch s b qua tt c li ch thch khi bin dch chng trnh sang m my.
Li gii thch c t sau du // nu ch thch ch vit trn mt dng hoc trong
cp du \* v *\.
3 Cc lnh c bn trong C
+ Cu lnh r nhnh if:
- Cu trc: if(dieu_kien)
{
// on chng trnh
}
Gii thch: nu dieu_kien ng th x l cc cu lnh bn trong cn sai th nhy qua.
- Cu trc: if(dieu_kien)
{
// on chng trnh 1
}
else
{
// on chng trnh 2
}
Gii thch: nu dieu_kien ng th x l on chng trnh 1 bn trong cn sai th x
l on chng trnh 1

+ Cu lnh la chn:
Cu trc:
switch(bien)
{
case gia_tri_1: {//cc cu lnh break;}
case gia_tri_2: {//cc cu lnh break;}
case gia_tri_3: {//cc cu lnh break;}
...
case gia_tri_n: {//cc cu lnh break;}
}
Gii thch: tu vo bin c gia_tri_1 th thc hin cc cu lnh tng ng ri sau thot
khi cu trc nh cu lnh break.
Bin c gia_tri_2 th thc hin cu lnh tng ng ri thot.
.
Bin c gia_tri_n th thc hin cc cu lnh tng ng ri thot.
+ Vng lp xc nh:
Cu trc: for(n=m;n<l;n++)
{
// cc cu lnh x l
}
Gii thch:
m,l l gi tr(m>l), cn n l bin.
thc hin lp cc cu lnh (l-m) ln.
+ Vng lp khng xc nh while:
Cu trc: while(dieu_kien)
{
// cc cu lnh
}
Gi thch: thc hin lp cc cu lnh khi iu kin ng nu iu kin sai th thot khi
vng lp.
+ Vng lp khng xc nh do while:
Cu trc: do
{
// cc cu lnh

} while(dieu_kien);
Gi thch: thc hin lp cc cu lnh sau kim tra iu kin nu ng, nu sai th
thot khi vng lp.
II. Trnh bin dch Keil C (compiler)
2.1. Khi to cho Project.

to 1 project mi chn project New project nh sau:

Hp thoi create new project hin ra nh sau:

nh tn v chuyn n th mc bn lu project.bn nn to mi mt th mc cho 1 project.


ri chn save.
Hp thoi sau hin ra:

Trong ny c 1 lot cc hng in t sn xut 8051. bn lp trnh cho con no th chn con
y, kch chut vo du + m rng cc con IC ca cc hang. y ta lp trnh cho
AT89C51 ca hang ATMEN nn ta chn nh trn.
Khi chn chip th ngay lp tc 1 bng hin ra 1 s tnh nng ca chip cc bn c th nhn
thy: 8051 based fully static 24Mhz . nhp OK, ch cu tr li NO khi c hi copy
standard 8051 startup code to project and addfile to project v nu chon YES ch lm cho
file lp trnh ca bn thm nng.

to mt file code cc bn ch filenew hoc n ctrl+N. nh sau:

Ca s text1 hin ra. Tip theo bn chn File save As hoc Ctrl+S, lu File mc d
cha c g nh sau:

c ca s sau:

Cc bn nhp tn vo text box file name.ch tn g cng c nhng khng c thiu


ui m rng .C, v nhn SAVE.

Trong bn tri mn hnh, ca s PROJECT WORKSPACE, cc bn m rng ci target 1


ra nh sau:

Nhp chut phi nn SOURCE GROUP, chn Add file to Group Source Group 1 hp
thoi hin ra chn file .C m cc bn va SAVE ri nhn Add 1ln ri nhn Close. nu bn
nhn Add 2 ln n s thong bo l file add bn ch vic OK ri nhn Close. c nh sau:

By gi trong hnh nhn thy trong Source Group 1 c file VIDU.C. cc bn nhp chut phi
vo vng son tho file VIDU.C thm file th vin. Chon Insert #include<REGX51.H>.

Phn cui cng ca cng vic khi to l cc bn vit li gii thch cho d n ca mnh.
phn ny rt cn thit v n ngi khc hiu mnh lm g trong project ny v khi mnh
cn s dng li code c li cn bit n l ci g.

2.2. Son tho chng trnh.

Cc bn vit th 1 chng trnh lm v d. khi vit xong mi dng lnh nn gii thch dng
lnh lm g. V d:

2.3. Bin dch mt chng trnh.

Sau khi son tho xong nhn Ctrl+S nh. Nh xong cc bn bin dch chng trnh bng
cch n phm F7 hoc chn Build target l biu tng ngay trn ca s Workspace, nh trn
hnh:

bin dch chng trnh thnh file HEX cc bn chn: Projectoption for target 1 nh
hnh v:

Trong hp thoi hin ra, hy check vo Creat HEX File nh ch dn:

chn th tp target nhp li tn s thch anh l 12Mhz.

m phng cc bn chon DebugStart/stop debug session hoc n Ctrl+F5, hoc nhn


vo Icon ch D mu trong ci knh lp trn thanh cng c.

hin thi cc cng, cc thanh ghi cc bn chon trong peripherals.

Cc bn thy 1 ca s nh Parallel Port xut hin l ci m phng cho 1 cng ca


AT89C51. du tick tng ng chn mc cao (5V), khng tick chn mc thp 0V.trong
menu peripherals cn c cc ngoi vi khc nh timer, interrupt, serial.

chy chng trnh cc bn n chut phi vo mn hnh son tho, ri n F11.mi ln n


s chy 1 lnh.khi debug nu cc bn ch hm delay lu qu 1000 ln lp cc bn nhn
ctrl+F11 b qua hm.
hoc n F10 chy tng dng lnh

Bi 2: iu khin Led n, Led 7 thanh v nt nhn


I. Hin th Led n

Bi ton:Ghp ni LED dn vi chn P1.0 ca vi iu khin, vit chng trnh iu


khin LED nhp nhy vi thi gian tr l 1s.

+ Lu thut ton ca bi LED nhy:


START
Khi to h thng
Sng Led
Tr 1S
Tt Led
Tr 1S

+ Chng trnh iu khin:


*/==================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
/*================= Khai bao hm==================*/
/*------------------------------ham tre -------------------------------------*/
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
delay(25000); //tre 1s
}
}
II. Phi hp Led v nt nhn
1. Phi hp Led n v nt nhn

Bi ton: Mt n Led c ni vi chn P1.0 ca vi iu khin. Mt cng tc


START ni vi chn P3.0 v cng tc STOP ni vi chn P3.1 ca vi iu khin. hy
vit chng trnh iu khin khi bt cng tc START th Led sang, khi bt cng tc
STOP th Led tt.

+ Lu thut gii ca bi ton:


Start

Led = tat

Start =
0

Led = bat

Stop =
0

Led = tat

+ Chng trnh iu khin:


*/==================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;
}
if((START==1)&&(STOP==0)){
Led = tat;
}
}
}

2. Phi hp Led 7 thanh v nt nhn

Cc s
hin
th
0
1
2
3
4
5
6
7
8
9

P1.0
g
1
1
0
0
0
0
0
1
0
0

P1.1
f
0
1
1
1
0
0
0
1
0
0

P1.2
e
0
1
0
1
1
1
0
1
0
1

P1.3
d
0
1
0
0
1
0
0
1
0
0

P1.4
c
0
0
1
0
0
0
0
0
0
0

P1.5
b
0
0
0
0
0
1
1
0
0
0

P1.6
a
0
1
0
0
1
0
0
0
0
0

dp
1
1
1
1
1
1
1
1
1
1

s np hex
mov P1,#
81
cf
92
86
cc
a4
a0
8f
80
84

Bi ton:
Mt Nt bm c ni vi chn P3.4, hy lp trnh iu khin m s ln n
phm t 0 n 9 v hin th trn Led 7 thanh.

+ Lu thut gii:

START
Dem=0;

ctac==0?
dem++;

dem<=10?

dem=0;

hin thi ra Led 7 thanh

+ Chng trnh iu khin:


/*==================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();
}
}

Bi 3 Hin th LCD, Giao tip bn phm Hex, Hin th ma trn Led


I. LCD

1. Ghp ni vi iu khin vi LCD 16x2.


- Bng m t s chn ca LCD 16x2:
Chn
1
2
3
4

K hiu
Vss
Vcc
VEE
RS

I/O
I

M t
Mass
Dng ngun 5v
Cp ngun iu khin tng phn
RS=0 chon thanh ghi lnh
RS=1 chon thanh ghi d liu
5
R/W
I
R/W=1 c d liu, R/W=1 ghi
6
E
I/O
Cho php
7
DB0
I/O
Bit d liu
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
Chn 15 v 16 l A v K. N c ni vi 2 chn ca 1 con Led dng sng
LCD trong bng ti chng ta khng s dng.
- S ghp ni LCD vi vi iu khin:

2. Nguyn l hot ng ca LCD.


- Chn VCC, Vss, v VEE: cc chn VCC v VSS cp dng ngun 5v v mass tng
ng. Chn VEE c dng iu khin tng phn.
- Chn chn thanh ghi RS(Register Select): c 2 thanh ghi trong LCD chn RS c
dng chn thanh ghi. nu RS=0 th thanh ghi m lnh c chn cho php ngi
dng gi 1 lnh ln chng hn nh xo mn hnh, a con tr v u dng Nu RS=1
th thanh ghi d liu c chn cho php ngi dng gi d liu cn hin th ln LCD.
- Chn c/ghi (R/W): u vo c/ghi cho php ngi dng c thng tin t LCD
khi R/W=1 hoc ghi thng tin ln LCD.
- Chn cho php E(Enable): chn cho php c s dng bi LCD cht d liu
ca n. Khi d liu c cp n chn d liu th 1 xung mc cao xung thp phi c
p n chn ny LCD cht d liu trn cc chn d liu. Xung ny c rng ti
thiu 450ns.
- Chn DB0-DB7: y l ng d liu 8 bt, c dng gi thng tin ln LCD
hoc c ni dung cc thanh ghi trong LCD. hin th cc ch ci v cc con s,
chng ta gi m ASCII ca cc ch ci t A n Z , a n z v cc ch s t 0 n 9 n
cc chn ny khi bt RS=1.
- Bng m lnh ca LCD:

M (HEX)
01
02
04
06
05
07
08
0a
0c
0e
0f
10
14
18
1c
80
0c0
38

Lnh n thanh ghi ca LCD


Xo mn hnh hin th
Tr v u dng
Gim con tr(dch con tr sang tri )
Tng con tr(dch con tr sang phi)
Dch hin th sang phi
Dch hin th sang tri
Tt con tr, tt hin th
Tt hin th, bt con tr
Bt hin thi, tt con tr
Bt hin th, nhp nhy con tr
Tt con tr, nhp nhy con tr
Dch v tr con tr sang tri
Dch v tr con tr sang phi
Dch ton b hin th sang tri
Dch ton b hin th sang phi
p con tr v u dng th nht
p con tr v u dng th 2
Hai dng v ma tn 5x7.

3. Phn luyn tp:


Hy vit chng trnh hin th trn LCD:
Dng 1 ch VIETNAM bng cch hin th tng k t
Dng 2 ch "VI DIEU KHIEN" bng cch hin th c ch. Vi s mch
cho d y.

Chng trnh:
/*=========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 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);
for(count=0;count<lens;count++){
LCDwrite(*(s+count));
}
}
/*=====================chuong trinh tre================*/
void delay(long time)
{
while(time--);
}
/*========================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);
LCDwrites("VI DIEU KHIEN");
while(1); //vong lap vo han
}
II. Giao tip bn phm Hex (ma trn phm 4x4)
1. Thut ton c bn phm
Begin

Cti = 0 (i=1-4)

Sai
Hngi = 0
(i =1-4)
ng
Tr li kt qu phm
nhn
2. Chng trnh

Hy vit chng trnh c ma trn phm v hin thi s th t phm trn LCD.

Chng trnh:
/*=========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
sbit RW = P3^1; // doc/ghi
sbit EN = P3^2; //cho phep chot du lieu
#include"LCD.h"// Thu vien LCD tu xay dung
/*-------- 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. Hin th ma trn Led


1. Thut ton
2. Xy dng chng trnh
Bi ton: Vit chng trnh hin th ma trn LED bng phng php qut ct hin th
dong ch "LAP TRINH VI DIEU KHIEN BANG NGON NGU C", vi dong ch chy t tri
sang phi.

+ Chng trnh:
// 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();
}
// Khoi ham hien thi chu nhap nhay tai cho
void Cambyte(unsigned char chiso)
{
CLOCK=1;
DATA=0;
CLOCK=0;
Pxanh=Mdata2[chiso];
Pdo=Pxanh;
delay(12);
Pdo=0;
Pxanh=0;
}
void Dobyte(unsigned char chiso)
{
CLOCK=1;
DATA=0;
CLOCK=0;
Pdo=Mdata2[chiso];
delay(12);
Pdo=0;
}
void Xanhbyte(unsigned char chiso)
{
CLOCK=1;
DATA=0;

CLOCK=0;
Pxanh=Mdata2[chiso];
delay(12);
Pxanh=0;
}
void Nhapnhaydo(void)
{
while(Tocdolap--){
DATA=1;
for(k=0;k<32;k++)Dobyte(k);
}
}
void Nhapnhayxanh(void)
{
while(Tocdolap--){
DATA=1;
for(k=0;k<32;k++)Xanhbyte(k);
}
}
void Nhapnhaycam(void)
{
while(Tocdolap--){
DATA=1;
for(k=0;k<32;k++)Cambyte(k);
}
}
void Taomangnhapnhay(void)
{
for(i=0;i<32;i++)
Mdata2[i]=0;

Dk4=End-Start;
Dk5=(32-Dk4)/2;
Dk4=32-Dk5;
for(i=Dk5;i<Dk4;i++)
Mdata2[i]=Mcode[Start+i-Dk5];
}
void Nhapnhay(void)
{
unsigned char demnhay;
demnhay=10;
Taomangnhapnhay();
while(demnhay--)
{
Tocdolap=Nhanh;
if(Mau==Mxanh)Nhapnhayxanh();
else if(Mau==Mdo)Nhapnhaydo();
else Nhapnhaycam();
CLEAR=0;
delay(1250);
CLEAR=1;
}
}
// Khoi ham hien thi chu di tu duoi len
unsigned char Mu2(unsigned char somu)
{
if(!somu) return 1;
else return 2*Mu2(somu-1);
}
void Taomanglen(void)
{
for(i=0;i<32;i++)

Mdata2[i]=0;
Dk4=End-Start;
Dk5=(32-Dk4)/2;
Dk4=32-Dk5;
for(i=Dk5;i<Dk4;i++)
Mdata1[i]=Mcode[Start+i-Dk5];
i=8;
}
void Lcam(void)
{
unsigned char data dem;
Tocdolap=Trungbinh;
while(Tocdolap--)
{
DATA=1;
for(dem=0;dem<32;dem++)
{
CLOCK=1;
DATA=0;
CLOCK=0;
Pxanh=Mdata2[dem];
Pdo=Pxanh;
delay(12);
Pxanh=0;
Pdo=0;
}
}
}
void Ldo(void)
{
unsigned char data dem;
Tocdolap=Trungbinh;

while(Tocdolap--)
{
DATA=1;
for(dem=0;dem<32;dem++)
{
CLOCK=1;
DATA=0;
CLOCK=0;
Pdo=Mdata2[dem];
delay(12);
Pdo=0;
}
}
}
void Lxanh(void)
{
unsigned char data dem;
Tocdolap=Trungbinh;
while(Tocdolap--)
{
DATA=1;
for(dem=0;dem<32;dem++)
{
CLOCK=1;
DATA=0;
CLOCK=0;
Pxanh=Mdata2[dem];
delay(12);
Pxanh=0;
}
}
}

void Len(void)
{
Taomanglen();
while(i--)
{
for(j=Dk5;j<Dk4;j++)
Mdata2[j]= Mdata1[j]/Mu2(i);
if(Mau==Mxanh)Lxanh();
else if(Mau==Mdo)Ldo();
else Lcam();
}
for(i=0;i<7;i++)
{
for(j=Dk5;j<Dk4;j++)
Mdata2[j]= Mdata2[j]*2;
if(Mau==Mxanh)Lxanh();
else if(Mau==Mdo)Ldo();
else Lcam();
}
}
/*Ham chinh*/
void main(void)
{
TMOD=0x01;
Pxanh=0;
Pdo=0;
P3=16;
while(1)
{
Start=0;End=194;Mau=3;

Chaychu();
Start=0;End=17;Mau=1;
Len();
Start=19;End=48;Mau=1;
Len();
Start=50;End=61;Mau=1;
Len();
Start=63;End=87;Mau=1;
Len();
Start=89;End=118;Mau=1;
Len();
Start=120;End=143;Mau=1;
Len();
Start=145;End=168;Mau=1;
Len();
Start=170;End=187;Mau=1;
Len();
Start=189;End=194;Mau=1;
Len();
Start=0;End=17;Mau=2;
Nhapnhay();
Start=19;End=48;Mau=2;
Nhapnhay();
Start=50;End=61;Mau=2;
Nhapnhay();
Start=63;End=87;Mau=2;
Nhapnhay();
Start=89;End=118;Mau=2;
Nhapnhay();
Start=120;End=143;Mau=2;
Nhapnhay();

Start=145;End=168;Mau=2;
Nhapnhay();
Start=170;End=187;Mau=2;
Nhapnhay();
Start=189;End=194;Mau=2;
Nhapnhay();
}
}

Bi 5: Giao tip ADC - X l ngt


I. Giao tip ADC

+Chng trnh:
#include<regx51.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 = 0xb0; // chon thanh ghi
sbit RW = 0xb1; // doc/ghi
sbit EN = 0xb2; //cho phep chot du lieu
#include"Lcd.h"// Thu vien LCD tu xay dung
#define RD P3_3
#define WR P3_4
#define INTR P3_5
/*-------- Ham tre ---------------*/
void delay(long time)

{
while(time--);
}
/*-------- ham doc phim nhan tu ma tran phim 4x4---------------*/
void view(unsigned char val)
{
unsigned char var;
if(val<10){
LCDwrite(val+48);
}else if(val<100){
LCDwrite(val/10+48);
LCDwrite(val%10+48);
}else{
var=val/10;
LCDwrite(var/10+48);
LCDwrite(var%10+48);
LCDwrite(val%10+48);
}
}
void main(void)
{
unsigned char ADCval=0;
RD=0;
LCDinit();
LCDcontrol(0x83);
LCDwrites("ADC0804");
while(1){
WR=1;
WR=0;
while(!INTR);
ADCval=P1;
LCDcontrol(0x01);

LCDcontrol(0x83);
LCDwrites("ADC0804");
LCDcontrol(0xC0);
view(ADCval);
delay(5000);
}
}
II. Lp trnh x l ngt

1. Ngt timer/counter.
1.1. c ch to tr ca timer v cch tnh ton gi tr np vo timer.
a. ch 1:
- ch 1 l b nh thi 16 bit, do cc gi tr trong khong t 0000 n
FFFF c th s dng np cho TH v TL ca b nh thi.
- Sau khi TH, TL c np gi tr ban u 16 bit th b nh thi phi c khi
ng vi lnh TR0 = 1 vi timer0 v TR1 = 1 vi timer1, khi ny b nh thi bt u
m tng theo xung clock t gi tr ban u cho ti gi tr nh l FFFF. Khi b nh
thi s quay vong t FFFF v 0000 v bt c bo trn TF0 vi timer0 v TF1 vi
timer1(ban du TFx=0) khi cn phi c thao tc xo c ln sau cn bit c
khi no b m trn.
- khi b m trn th TH v Tl ca b nh thi s mang gi tr 0 do phi c
thao tc np li gi tr ban u cho chng v xo c TF b m c lp li.
- Nh vy khong thi gian m b nh thi to tr chnh l khoangre thi gian
n m tng t gi tr ban u c np cho ti gi tr nh FFFF.
- tnh ton gi tr np vo thanh ghi cha ca b nh thi t thi gian mun to
tr(t): gi N = 65536 t/chu ki my. Sau khi chuyn sang m HEX c 1 s c 4 ch
s c dng: x1x2y1y2. khi gi tr np cho thanh ghi cha nh sau: TH = x1x2, TL =
y1y2.
V d: mun to tr 500us th:
Gi s chu k my l 1us: c N = 65536 500/1 = 65036. chuyn sang m HEX l
FE0C, t : TH = 0xFE, TL = 0x0C.
- cc bc lp trnh cho b nh thi to tr ch 1:
+B1: chn ch 1 cho b nh thi cn dung, t xc nh gi tr np
cho thanh ghi TMOD.
+ B2: tnh ton gi tr ban u cn np cho TH v TL t thi gian tr mong
mun.
+ B3: khi ng b nh thi.
+ B4: kim tra trng thi bt ca c TF.
+ B5:dung b nh thi.
+ B6: xo c TF cho vng lp k tip.

+ B7: quay tr v B2 np li gi tr cho TH v TL.


b. Ch 2:
- ch ny b nh thi l 8 bit, do vy ch cho php cc gi tr t 00 n FF
c np vo thanh ghi TH ca b nh thi. sau khi np gi tr 8 bit th vi iu khin s
sao ni dung ca TH sang TL v b nh thi c khi ng bng lnh TRx=1.
- Sau khi c khi ng th b nh thi bt u m tng trong thanh ghi TL t
gi tr ban u n gi tr nh FF. v khi quay vng t FF v 00 th c TFx c bt ln
1, khi ny thanh ghi TL mang gi tr 0 nhng TL s ngay lp tc c t ng np li
vi gi tr ban u c lu trong thanh ghi TH.
- nh vy trong ch ny mi khi b m trn th thanh ghi cha s c vi
iu khin np li gi tr ban u, do ch ny c gi l ch t ng np li.
- tnh gi tr np vo thanh ghi cha ca b nh thi t thi gian tr (t):
Gi N = 256 t/chu k my. Sau khi chuyn sang m HEX c 1 s, ta np s
ny vo thanh ghi TH v c TL(np vo TL gi tr m ln 1 v np vo TH cho nhng
ln sau khi b m trn th phn cng ca vi iu khin s t ng sao TH sang TL).
V d: to tr 50usth l:
Gi s chu k my l 1us: c N = 256 50/1 = 205, chuyn sang m HEX : 0CE
T : TH = 0xCE v TL = 0xCE.
- cc bc lp trnh cho b nh thi to tr ch 2.
+ B1: np gi tr cho thanh ghi thit lp ch TMOD vi timer mun s
dng.
+ B2: np vo TH gi tr m ban u.
+B3: khi ng b nh thi.
+ B4: kim tra c bo trn TFx.
+ B5: xo c trn TFx, quay v B4.
* lu : 2 ch khc ca b nh thi l ch 0(ch b nh thi 13 bit, b
nh thi/b m 8 bit, nh t l trc 5 bit ) v ch 3(ch b nh thi chia tch)
ay khng gii thiu.
1.2. Ngt ca b nh thi.
- nguyn tc s dng b nh thi ch ngt:
+ khai bo ngt ca b nh thi mun s dng
+ ngun gy ngt.
+ chng trnh chnh v chng trnh phc v ngt.
- vi ngt nh thi vic khai bo ngun ngt bao gm vic khai bo ngt ton cc l
EA = 1 v khai bo ngt cho tng b nh thi mun dng ET0 = 1(timer0) v ET1 =
1(timer1)
- Ngun bo ngt nh thi(vi c 2 ch ) u l khi b m trn(khi c TFx = 1),
khi c TFx = 1 th vi iu khin kt thc cng vic hin ti chng trnh chnh v
chuyn vo chng trnh phc v ngt cn c theo a ch ca chng trnh phc v
ngt.khi thc hin xong chng trnh phc v ngt vi iu khin quay tr v chng
trnh ti ni b gin on khi trc.

- Tm li ngt nh thi l vic ta s dng b nh thi to tr mt khong thi gian


c tnh ton trc, sau khong thi gian ny 1 cng vic ta mong mun s c thc
hin chng trnh phc v ngt. cng vic c th coi l c lp vi cng vic
chng trnh chnh
- cc cng vic lp trnh s dung ngt nh thi :
+ tnh ton thi gian tr mong mun v cng vic mun thc hin sau khong
thi gian .
+ khai bo ngt nh thi trong chng trnh chnh (EA=1, ETX=1).
+ la chon b nh thi v ch ca n trong thanh ghi TMOD
+ khi ng b nh thi.
+ Xy dng chng trnh chnh v cc chng trnh con cn thit.
+ xy dng chng trnh phc v ngt thc hin 1 cng vic mong mun (xc
nh r a ch ngt theo th t ngt trong bng vector ngt)
- Ch : trong chng trnh phc v ngt cc bn phi xo c bo trn TFx v np
li gi tr cho b nh thi vi ch 1 cn ch 2 th khng cn.
1.3. bi ton:
Bi ton 1: s dng b nh thi vi ngt ca n to mt xung vung vi tn s
1kHZ i xng (50% mc 1 v 50% mc 0 ) trn chn P1.0.
Bi gii:
- ta c : f = 1kHZ T = 1/1000s = 1000us TON = TOFF = T/2 = 500us. Nh vy chu
k xung l i xng nn hai phn ny b m m ging nhau(to tr khong thi gian
bng nhau). na chu k u b m to tr 500us cho mc 0, sau khi b m m n
gi tr nh ca thanh ghi cha l FFFF th c bo TFx = 1 gy ngt, vi iu khin phi
chuyn vo chng trnh phc v ngt v s lt trng thi xung ra. Trong na chu k cn
li cng nh vy v c nh th.
- Do thi gian tr l 500us do ta chn ch 16 bit, s dng kt qu t v d trn
np gi tr ban u cho TH v TL.
- Chng trnh iu khin:
/*================khai bao thu vien===============*/
#include<AT89x51.h>
/*=============khai bao bien=====================*/
sbit xung = P1^0;
/*==============khai bao ham ==================*/
/*--------------------------chuong trinh phuc vu ngat timer0 tao xung--------------------*/
void timer0_int(void) interrupt 1
{
TF0=0; // xoa co bao tran timer0
xung = !xung; // tao muc 1 ra chan P1.0
TH0 = 0xfe; // (65536-500)hex =0fe0c (thach anh 12MHz)
TL0 = 0x0c;

}
/*=============chuong trinh chinh=============*/
void main(void)
{
EA = 1; // cho phep ngat toan cuc
ET0 = 1; // cho phep ngat T0
TMOD = 0x01; // timer0 che do 1
xung = 0; //gia tri ban dau cua xung muon tao
TH0 = 0xfe; // (65536-500)hex =0fe0c (thach anh 12MHz)
TL0 = 0x0c;
TR0 = 1; // khoi dong timer
while(1) PCON|=1; //khong lam gi ca de doi ngat.
}
Bi ton 2: s dng b nh thi vi ngt ca to ng h s hin th ln LCD.

+ Chng trnh:
/*================khai bao thu vien===============*/
#include<regx51.h>
#include<string.h>
#define LCDdata P2
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
sbit BF=LCDdata^7;

#include"lcd.h"
/*=============khai bao bien=====================*/
unsigned char data Time[8];
unsigned char data i;
/*==============khai bao ham ==================*/
void T10ms(void) interrupt 1 using 0
{
TR0=0;
TH0=0xD8;
TL0=0xEF;
TR0=1;
if(Time[0]==9){
Time[0]=0;
if(Time[1]==9){
Time[1]=0;
if(Time[2]==9){
Time[2]=0;
if(Time[3]==5){
Time[3]=0;
if(Time[4]==9){
Time[4]=0;
if(Time[5]==5){
Time[5]=0;
if(Time[6]==9&&Time[7]<2){
Time[6]=0;
Time[7]++;
}else if(Time[6]==3&&Time[7]==2){
Time[6]=0;
Time[7]=0;
}else Time[6]++;
}else Time[5]++;
}else Time[4]++;
}else Time[3]++;
}else Time[2]++;
}else Time[1]++;
}else Time[0]++;
LCDwrite(Time[7]+48);LCDwrite(Time[6]+48);LCDwrite(':');
LCDwrite(Time[5]+48);LCDwrite(Time[4]+48);LCDwrite(':');
LCDwrite(Time[3]+48);LCDwrite(Time[2]+48);LCDwrite(':');
LCDwrite(Time[1]+48);LCDwrite(Time[0]+48);

LCDcontrol(0xC0);
}
/*==============Chuong trinh chinh ==================*/
void main()
{
TMOD|=1;
EA=1;
ET0=1;
TH0=0xD8;
TL0=0xEF;
for(i=0;i<8;i++)Time[i]=0;
LCDinit();
LCDwrites("Dong ho so");
LCDcontrol(0xC0);
TR0=1;
while(1)PCON|=1;
}
2. Lp trnh vi cc ngt ngoi ca vi iu khin.
2.1. Khi nim:
- b vi iu khin 8051c hai ngt ngoi l INT0 v INT1 vi 2 chn tc ng u
vo tng ng l P3.2 v P3.3.
- Ngt ngoi l ngt ca vi iu khin m tc ng ngt y chnh l cc tc ng
bn ngoi ca vi iu khin tc ng vo vi iu khin thong qua cc chn ngt i
dng mt tn hiu in p dng xung.
- tc ng ngt ngoi c hai dng l tc ng theo dng mc v dng sn.
+ kch hot theo mc: ch ny cc chn INT0 v INT1 bnh thng mc
cao ging nh cc chn khc ca vi iu khin, khi c tn hiu mc thp cp ti th tn
hiu ny kch hot ngt. lu l trc khi thc hin lnh cui cng ca chng trnh
phc v ngt th mc thp ti cc chn ngt phi c chuyn ln mc cao, nu khng
s li gy ra mt ngt ngay lp tc.
+ Kch hot theo sn: bnh thng cc chn ngt ca vi iu khin mc cao,
khi c tn hiu tc ng vo chng c dng sn xung th s tc ng ngt.
- s dng ch ngt ny th phi tc ng vo thanh ghi TCON c th l
TCON.1=1 hoc IT0=1 th cho php ngt ngoi 0 kch hot sn, cn TCON.2=1 hoc
IT1=1 th cho php ngt ngoi 1 kch hot sn.
2.2. cch lp trnh:
- lp trnh cho ngt ca vi iu khin ta phi thc s hiu bn cht ca ngt v
qu trnh thc hin ngt ca vi iu khin din ra.
- mu vit hm ngt nh sau:
Void name(void)interrupt x(x l s th t ngt ngoi x = 0 hoc 2)

{
//chng trnh phc v ngt
}
- Trong chng trnh chnh ta phi c thao tc thit lp vic cho php cc ngt c
s dng.
2.3. bi ton:
s dng ngt ngoi ca vi iu khin vi nhim v l: bnh thng vi iu khin
bt mt Led n ti chn P1.0 v khi c ngt ngoi th tt Led P1.0 v bt Led chn
P1.1 sau 1s th bt li Led P1.0 v tt Led P1.1.

Bi gii:
/*==================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 Led1 = P1^0; // Khai bao bi?n Led ki?u bit chan P1.0
sbit Led2 = P1^1; // Khai bao bi?n Led ki?u bit chan P1.0
/*================= Khai bao hm==================*/
/*------------------------------ham tre -------------------------------------*/
void delay(long time)

{
while(time--);
}
void INT_0(void) interrupt 0 // chuong trinh phuc vu ngat
{
Led1=tat;
Led2=bat;
delay(25000);
Led1=bat;
Led2=tat;
}
/*--------------------------------ham chinh--------------------------------*/
void main(void)
{
EA=1; // cho phep ngat toan cuc
EX0=1; // cho phep ngat ngoai 0
IT0=1; //ngat kich phat suon
Led1=bat;
Led2=tat;
while(1);
}

Bi 6: iu khin ng c DC, ng c Servo, ng c bc


1. ng c DC
2. ng c Servo
3. ng c bc (Step motor)
iu khin ng c bc vi tc tng dn t 5 n 100 v/p, mi ln chuyn tc
tng 5v/p thi gian chuyn 1s, hin th tc trn LCD.

+ Chng trnh:
#include<regx51.h>
#include<string.h>
#define LCDdata P2
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
sbit BF=LCDdata^7;
#include"lcd.h"
unsigned char data Bytecao1,Bytethap1;
unsigned char data Buoc,Nbuoc;
unsigned char data Mbuoc[4]={144,192,96,48};

void viewspeed(unsigned char speed);


void Xuly(unsigned char Nspeed);

void Dkdongco(void) interrupt 1 using 0


{
TR0=0;
TH0=Bytecao1;
TL0=Bytethap1;
TR0=1;
P1=Mbuoc[Buoc];
Buoc++;
if(Buoc==4)Buoc=0;
}
void Xuly(unsigned char speed)
{
unsigned int data Chuki1,Chuki2;
unsigned int data tam1,tam2;
TR0=0;
viewspeed(speed);
Nbuoc=200;
tam2=10000/Nbuoc;
tam1=6000/speed;
Chuki1=tam1*tam2;
Chuki2=65535-Chuki1;
Bytecao1=Chuki2/256;
Bytethap1=Chuki2%256;
TR0=1;
}
void delay(unsigned long time)

{
while(time--);
}
void viewspeed(unsigned char speed)
{
unsigned char data a1,a2;
LCDcontrol(0xc0);
a1=speed%10;
speed=speed/10;
a2=speed%10;
speed=speed/10;
LCDwrite(speed+48);
LCDwrite(a2+48);
LCDwrite(a1+48);
LCDwrites("(vong/phut)");
}
void main()
{
unsigned char data i;
TMOD=17;
EA=1;
LCDinit();
ET0=1;
LCDcontrol(0x80);
LCDwrites("CT DK DC buoc" );
LCDcontrol(0xc0);
LCDwrites("V:5-100(v/p)");
delay(100000);
while(1){
Buoc=2;
for(i=5;i<101;i=i+5){
LCDcontrol(0x01);

LCDcontrol(0x80);
LCDwrites("CT DK DC buoc" );
Xuly(i);
delay(500000);
}
}
}

Bi 7: Giao tip Vi iu khin vi My tnh


I. Cng truyn thng ni tip
1. Thanh ghi SCON SBUF
II. Xy dng chng trnh
1. Chng trnh VB
+ Giao din

+ Thut ton
+ Chng trnh:
Option Explicit
Dim Mau As Byte
Private Sub cbcolor_Click()
If (cbcolor.Text = "Mau do") Then
Mau = 1
txtchu.ForeColor = &HFF&
lbHienthi.ForeColor = &HFF&
ElseIf (cbcolor.Text = "Mau xanh") Then
Mau = 2
txtchu.ForeColor = vbGreen
lbHienthi.ForeColor = &HFF00&
ElseIf (cbcolor.Text = "Mau cam") Then
Mau = 3

txtchu.ForeColor = &H80FF&
lbHienthi.ForeColor = &H80FF&
End If
End Sub
Private Sub cbcolor_GotFocus()
SendKeys "%{DOWN}"
End Sub
Private Sub cmdCode_Click()
MsgBox Code(txtchu)
End Sub
Private Sub cmdExit_Click()
If MSComm1.PortOpen Then
MSComm1.PortOpen = False
End If
End
End Sub
Function Code(s As String) As String
Dim i As Integer
s = Replace(s, " ", "")
For i = 1 To Len(s)
Code = Code & " " & Asc(Mid(s, i, 1))
Next
End Function
Private Sub OpenPort()
Dim s As String
MSComm1.Settings = "57600,N,8,1"
MSComm1.CommPort = 1
MSComm1.PortOpen = True

MSComm1.InputLen = 0
s = MSComm1.Input
MsgBox "Port did open"
End Sub
Private Sub cmdOpenport_Click()
If MSComm1.PortOpen Then
MSComm1.PortOpen = False
End If
OpenPort
End Sub
Private Sub cmdSend_Click()
Dim s As String
If MSComm1.PortOpen = False Then
MsgBox "Port did not open"
OpenPort
End If
If MSComm1.PortOpen Then
txtchu.Text = UCase(txtchu.Text)
s = Chr(Mau) & Chr(Len(txtchu.Text)) & txtchu.Text & Chr(255)
Do While (MSComm1.OutBufferCount > 0)
Loop
MSComm1.Output = s
End If
End Sub
Private Sub cmdStop_Click()
MSComm1.Output = Chr(250)

MsgBox "Port Stoped"


End Sub
Private Sub Form_Load()
txtchu.ForeColor = vbRed
txtchu.Text = "DO AN GHEP NOI"
Mau = 1
End Sub
Private Sub Form_Resize()
If (Me.WindowState = 1) Then
Me.Height = 4000
Me.Width = 7230
End If
End Sub
Private Sub txtchu_GotFocus()
txtchu.SelStart = 0
txtchu.SelLength = Len(txtchu)
End Sub
2. Chng trnh vi iu khin
+ Thut ton
+ Chng trnh:
/************Khai bao tien xy ly***************/
#include<regx51.h>
/*********Dinh nghia hang so mau**********/
#define Mdo 1
#define Mxanh 2
#define Mcam 3
/*****Khai bao mang ki tu gom chu so va chu cai****/

unsigned char code Mchar[36][7]={


48,0,126,129,129,129,126,/*0*/
49,0,0,33,65,255,1,/*1*/
50,0,99,135,137,145,97,/* 2 */
51,0,66,129,145,145,110,/* 3 */
52,0,24,40,72,255,8,/* 4 */
53,0,226,145,145,145,142,/* 5 */
54,0,118,137,137,137,70,/* 6 */
55,0,128,135,136,144,224,/* 7 */
56,0,110,145,145,145,110,/* 8 */
57,0,102,145,145,145,110,/* 9 */
65,0,63,72,136,72,63,/* A */
66,0,255,145,145,145,110,/* B */
67,0,126,129,129,129,70,/* C */
68,0,255,129,129,129,126,/* D */
69,0,255,145,145,145,129,/* E */
70,0,255,144,144,144,128,/* F */
71,0,126,129,129,137,78,/* G */
72,0,255,16,16,16,255,/* H */
73,0,129,129,255,129,129,/* I */
74,0,2,129,130,252,128,/* J */
75,0,255,24,36,66,129,/* K */
76,0,255,1,1,1,1,/* L */
77,0,255,64,32,64,255,/* M */
78,0,255,96,24,6,255,/* N */
79,0,126,129,129,129,126,/* O */
80,0,255,144,144,144,96,/* P */
81,0,126,129,133,130,125,/* Q */
82,0,255,144,144,144,111,/* R */
83,0,98,144,144,144,78,/* S */
84,0,128,128,255,128,128,/* T */
85,0,254,1,1,1,254,/* U */
86,0,252,2,3,2,252,/* V */

87,0,255,12,3,12,255,/* W */
88,0,199,40,16,40,199,/* X */
89,0,224,16,15,16,224,/* Y */
90,0,131,133,153,161,193/* Z */
};
/*******Dinh nghia cac chan va cac cong dieu khien*****/
sfr Pxanh=0x90;
sfr Pdo=0xA0;
sbit Clear=P3^4;
sbit Data=P3^3;
sbit Clock=P3^2;
/**************Khai bao bien toan cuc*************/
unsigned char data Ktnhan,nhanmau,j,i,Maxc,Count,nLap;
unsigned char data Mau,Chay,tam,dem;
unsigned char data MC[76],MQ[32];
/**********Khoi ham chuong trinh**********/
// Ham ngat noi tiep
void Ngatnoitiep(void) interrupt 4 using 0
{
if(RI){
RI=0;
tam=SBUF;
if(tam==250){
Chay=1;i=j=77;dem=8;
Count=0;
Clear=0;
}else{
if(nhanmau){
Mau=tam;
Chay=1;i=j=77;dem=8;
Count=nhanmau=0;
P1=P2=0;

Clear=0;
}else if(tam==255){
Clear=1;
Chay=0;
Ktnhan=nhanmau=1;
}else{
if(Ktnhan){
Maxc=tam;
Ktnhan=0;
}else if(Count<76&&Count<Maxc){
MC[Count]=tam;
Count++;
}
}
}
}
}
void Khoitao(void)
{
PCON|=128;
EA=1;
ES=1;
SM0=0;
SM1=1;
Ktnhan=nhanmau=1;
Chay=1;
P0=P1=P2=0;
P3_0=1;
nLap=1;
}
// Ham tao tre
void delay(void)
{

unsigned char data i;


i=10;
while(i--);
}
// Ham hien thi mau cam
void Cam(void)
{
while(nLap--)
{
Data=1;
for(j=0;j<32;j++){
Clock=1;
Data=0;
Clock=0;
Pdo=Pxanh=MQ[j];
delay();
Pxanh=Pdo=0;
}
}
}
// Ham hien thi mau xanh
void Xanh(void)
{
while(nLap--)
{
Data=1;
for(j=0;j<32;j++){
Clock=1;
Data=0;
Clock=0;
Pxanh=MQ[j];
delay();

Pxanh=0;
}
}
}
// Ham hien thi mau do
void Do(void)
{
while(nLap--)
{
Data=1;
for(j=0;j<32;j++){
Clock=1;
Data=0;
Clock=0;
Pdo=MQ[j];
delay();
Pdo=0;
}
}
}
// Ham thay doi mang hien thi
void change(void)
{
MQ[0]=MQ[1];MQ[1]=MQ[2];MQ[2]=MQ[3];MQ[3]=MQ[4];
MQ[4]=MQ[5];MQ[5]=MQ[6];MQ[6]=MQ[7];MQ[7]=MQ[8];
MQ[8]=MQ[9];MQ[9]=MQ[10];MQ[10]=MQ[11];MQ[11]=MQ[12];
MQ[12]=MQ[13];MQ[13]=MQ[14];MQ[14]=MQ[15];MQ[15]=MQ[16];
MQ[16]=MQ[17];MQ[17]=MQ[18];MQ[18]=MQ[19];MQ[19]=MQ[20];
MQ[20]=MQ[21];MQ[21]=MQ[22];MQ[22]=MQ[23];MQ[23]=MQ[24];
MQ[24]=MQ[25];MQ[25]=MQ[26];MQ[26]=MQ[27];MQ[27]=MQ[28];
MQ[28]=MQ[29];MQ[29]=MQ[30];MQ[30]=MQ[31];
}

// Ham tim vitri ki tu hien thi trong bang chu cai va chu so
unsigned char Chiso(unsigned char chr)
{
unsigned char data End,Start,Mid,Mctam;
if(chr==Mchar[0][0]){
return 0;
}else if(chr==Mchar[35][0]){
return 35;
}else{
End=35;
Start=0;
while(1){
Mid=(End+Start)/2;
Mctam=Mchar[Mid][0];
if(chr==Mctam){
return Mid;
}else if(chr<Mctam){
End=Mid;
}else{
Start=Mid;
}
}
}
}
void Chaychu(void)
{
unsigned char vitri;
for(j=0;j<32;j++){
MQ[j]=0;
}
for(i=0;i<Count;i++)
{

if(MC[i]==32){
change();
MQ[31]=0;
if(Mau==Mxanh)Xanh();
else if(Mau==Mdo)Do();
else Cam();
change();
MQ[31]=0;
if(Mau==Mxanh)Xanh();
else if(Mau==Mdo)Do();
else Cam();
}else{
vitri=Chiso(MC[i]);
for(dem=1;dem<7;dem++){
change();
MQ[31]=Mchar[vitri][dem];
if(Mau==Mxanh)Xanh();
else if(Mau==Mdo)Do();
else Cam();
}
}
}
if(!Chay){
for(i=0;i<32;i++){
change();
MQ[31]=0;
if(Mau==Mxanh)Xanh();
else if(Mau==Mdo)Do();
else Cam();
}
}
}
// Chuong trinh chinh

void main()
{
Khoitao();
REN=1;
while(1){
while(Chay);
Chaychu();
}
}

You might also like