Professional Documents
Culture Documents
Đề cương ứng dụng lập trình C cho vi điều khiển 8051
Đề cương ứng dụng lập trình C cho vi điều khiển 8051
2. Ngn ng C
2.1 Kiu d liu
2.1.1 Kiu d liu trong C
Kiu
S Byte
Khong gi tr
Char
1
-128 +127
Unsigned char
1
0 255
Int
2
-32768 - +32767
Unsigned int
2
0 - 65535
Long
4
-2147483648 - +2147483647
Unsigned long
4
0 4294697295
Float
4
* 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
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
PDATA
XDATA
* 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;
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
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
Kch thc
3 byte
2 byte
2 byte
1 byte
1 byte
Con tr PDATA
1 byte
ngha
Php cng
Php tr
Php nhn
Php chia ly phn nguyn
V d
X=a+b
X=a-b
X=a*b
X=a/b
(a=9, b=2 X=4)
a%b
(a=9, b=2 X=1)
2.2.4 Php
ton thao
tc Bit
Php
ton
>
ngha
V d
So snh ln 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
>=
Php ton
&
<
|
!
^
<<
>>
~
<=
==
2.2.5 Php
ton
kt
hp
Php ton
+=
-=
*=
/=
%=
!=
V d
a+=5 <=> a=a+5
a-=5 <=> a=a-5
a*=5 <=> a=a*5
a/=5 <=> a=a/5
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
bo ch th tin x l
Khai bo nguyn mu hm
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.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
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.
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.
bin dch chng trnh thnh file HEX cc bn chn: Projectoption for target 1 nh hnh v:
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.
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
START
Khi to h thng
Sng Led
Tr 1S
Tt Led
Tr 1S
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
}
}
Start
Led = tat
Start =
0
Stop =
0
Led = bat
Led = tat
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;
K hiu
Vss
Vcc
VEE
RS
I/O
I
5
6
7
R/W
E
DB0
I
I/O
I/O
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
R/W=1 c d liu, R/W=1 ghi
Cho php
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:
07
08
0a
0c
0e
0f
10
14
18
1c
80
0c0
38
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
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
}
Begin
Cti = 0 (i=1-4)
Sai
2. Chng trnh
Hngi = 0
(i =1-4)
ng
Tr li kt qu phm
nhn
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);
}
}
}
+ 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
}
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();
}
}
+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)
{
- 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);
+ 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);
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);
}
}
}
+ 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
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****/
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();
}
}