
L p trình C b ng Keil Cậ ằ
I. C u trúc ch ng trình C cho 8051 ấ ươ
Đ có th hi u đ c nh ng v n đ tôi vi t thì yêu c u b n ph i có ki n th cể ể ể ượ ữ ấ ề ế ầ ạ ả ế ứ
căn b n v C nh hàm con, s d ng con tr , các ki u d li u(int, float,ả ề ư ử ụ ỏ ể ữ ệ
double,char, unsigned char,..)
Tôi xin đi vào bài th nh t. Nói v c u trúc cho ch ng trình C:ứ ấ ề ấ ươ
1/Ph n đ u tiên là li t kê các header file mà các b n dùng b ng t khóa ầ ầ ệ ạ ằ ừ
#include"tên header file"
ho c ặ
#include< tên header file>
Khi b n vi t theo cách th nh t thì trình biên d ch s tìm ki m file .h ho c .c nàyạ ế ứ ấ ị ẽ ế ặ
trong th m c hi n t i ch a d án c a b n, n u không có thì s tìm ki m trongư ụ ệ ạ ứ ự ủ ạ ế ẽ ế
th m c Inc trong th m c cài đ t KeilC.ư ụ ư ụ ặ
Vi t theo cách th hai thì trình biên d ch s tìm luôn trong th m c /INC luôn.ế ứ ị ẽ ư ụ
Đ có th s d ng đúng các file .h cho các vi đi u khi n c a mình thì b n nênể ể ử ụ ề ể ủ ạ
m th m c /inc trong th m c này có các th m c con nh tên c a hãng s nở ư ụ ư ụ ư ụ ư ủ ả
xu t. Ví d nh c a Atmel thì b n tìm trong th m c /Atmel thì s th y đ cấ ụ ư ủ ạ ư ụ ẽ ấ ượ
file reg51.h ,.. B n m t ng file nên mà khám phá s có nhi u đi u hay đ y.ạ ở ừ ẽ ề ề ấ
2/Đ nh nghĩa các macro cho ch ng trình sáng s a. Vi c đ nh nghĩa này đ cị ươ ủ ệ ị ượ
dùng b ng t khóa #defineằ ừ
Ví d : b n đ nh nghĩa led1 là P1_0 t c là led1 đ c n i v i chân 0 c a Port 1.ụ ạ ị ứ ượ ố ớ ủ
#define led1 P1_0
3/ Các hàm ng t nh ng t timer0, timer1, ng t n i ti p, ng t ngoài. Tôi s nói chiắ ư ắ ắ ố ế ắ ẽ
ti t cái này sau. Còn bây gi tôi ch gi i thi u s s thôi.ế ờ ỉ ớ ệ ơ ơ
Ví d b n dùng ng t n i ti p là ng t 4 trong b ng vector ng t thì hàm s có d ngụ ạ ắ ố ế ắ ả ắ ẽ ạ
nh sau:ư
void inter_4(void) interrupt 4 using 2
{
// làm gì thì làm đâyở
}
Cú pháp các ng t khác cũng t ng t ch thay s 4 b ng s th t c a ng t trongắ ươ ự ỉ ố ằ ố ứ ự ủ ắ
b ng vector ng t.ả ắ

4/ Các hàm con nh Delay, kh i t o,.. nh :ư ở ạ ư
void delay( unsigned char time)
{
//code vi t đâyế ở
}
5/ Ch ng trình chính:ươ
void main(void)
{
// vi t mã đâyế ở
}
Đ i t ng c a ch ng trình là vi đi u khi n nên hàm main không có giá tr trố ượ ủ ươ ề ể ị ả
v và không có tham s đ a vào. Và th c ch t cũng ch ng c n bi n toàn c c vìề ố ư ự ấ ẳ ầ ế ụ
ta ch c n vi t 1 file thôi. Nên tôi không đ a bi n toàn c c vào đây. ỉ ầ ế ư ế ụ
K t lu n, ch ng trình c a chúng ta s có d ng nh sau:ế ậ ươ ủ ẽ ạ ư
// li t kê header fileệ
#inlucde"tên header file"
....................
// các marco
#define led1 P1_0
...........
// các hàm ng tắ
void inter_1 interrupt 1 using 3{
}
..........
// các hàm bình th ngườ
void delay( unsigned char time){
///
}
..............

// ch ng trình chínhươ
void main(void)
{
//lenh
}
Trên đây tôi đã phân tích c u trúc c a ch ng trình vi t cho 8051 r i. Chi ti tấ ủ ươ ế ồ ế
t ng v n đ tôi s đ a sau.ừ ấ ề ẽ ư
Có l ng i dùng Keil C l n đ u tiên g p tr ng i khi dùng #include đó là khôngẽ ườ ầ ầ ặ ở ạ
bi t li t kê các header file nào c n thi t cho ng d ng c a mình.ế ệ ầ ế ứ ụ ủ
Đ có th bi t đ c header file nào dùng cho vi đi u khi n c a mình thì các b nể ể ế ượ ề ể ủ ạ
m th m c cài Keil C ra, tìm đ n th m c C51/INC b n s th y m t lo t cácở ư ụ ế ư ụ ạ ẽ ấ ộ ạ
th m c c a các hãng nh Atmel,Dalas,.. Tôi xin l y ví d m t file regx51.hư ụ ủ ư ấ ụ ộ
trong th m c /Atmel. B n m file đó lên s th y đ u đ c a nó nh sau:ư ụ ạ ở ẽ ấ ầ ề ủ ư
/
*--------------------------------------------------------------------------
AT89X51.H
Header file for the low voltage Flash Atmel AT89C51 and AT89LV51.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
Ch ng t file này dùng cho con AT89C51 và AT89LV51 r i. Khi đó b n s thêmứ ỏ ồ ạ ẽ
header file này vào ch ng trình c a mình.ươ ủ
Còn làm th nào đ mình làm vi c v i các thành ghi, các port nh trong ASM bâyế ể ệ ớ ư
gi . Câu tr l i trong file này:ờ ả ờ ở
#ifndef __AT89X51_H__
#define __AT89X51_H__
/*------------------------------------------------
Byte Registers ; Đ nh nghĩa các thành ghi các đ a ch trong RAMị ở ị ỉ
------------------------------------------------*/
sfr P0 = 0x80;
sfr SP = 0x81;

sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr P1 = 0x90;
sfr SCON = 0x98;
sfr SBUF = 0x99;
sfr P2 = 0xA0;
sfr IE = 0xA8;
sfr P3 = 0xB0;
sfr IP = 0xB8;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
/*------------------------------------------------
P0 Bit Registers ; Đ nh nghĩa các c ng c a Port 0 vì port này là thanh ghi 8 bítị ổ ủ
đ nh đ c đ a ch tr c ti pị ượ ị ỉ ự ế
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;
/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_ 0x01
#define STOP_ 0x02
#define PD_ 0x02 /* Alternate definition */
#define GF0_ 0x04
#define GF1_ 0x08

#define SMOD_ 0x80
/*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0 = 0x88;
sbit IE0 = 0x89;
sbit IT1 = 0x8A;
sbit IE1 = 0x8B;
sbit TR0 = 0x8C;
sbit TF0 = 0x8D;
sbit TR1 = 0x8E;
sbit TF1 = 0x8F;
/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_ 0x01
#define T0_M1_ 0x02
#define T0_CT_ 0x04
#define T0_GATE_ 0x08
#define T1_M0_ 0x10
#define T1_M1_ 0x20
#define T1_CT_ 0x40
#define T1_GATE_ 0x80
#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F
/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;
/*------------------------------------------------