L p trình C b ng Keil C
I. C u trúc ch ng trình C cho 8051 ươ
Đ th hi u đ c nh ng v n đ tôi vi t tyêu c u b n ph i có ki n th c ượ ế ế
căn b n v C nh m con, s d ng con tr , các ki u d li u(int, float, ư
double,char, unsigned char,..)
Tôi xin đio bài th nh t. Nói v c u tc 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 ttrình bn 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 thì s m ki m trongư ế ế
th m c Inc trong th m c cài đ t KeilC.ư ư
Vi t theoch th hai ttrình biên d ch s tìm luôn trong th m c /INC luôn.ế ư
Đ th s d ng đúng các file .h choc vi đi u khi n c a mình thì b n nên
m th m c /inc trong th m c nàyc th m c con nh tên c a hãng s n ư ư ư ư
xu t. Ví d nh c a Atmel tb 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à km phá s 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ĩay đ c ươ ượ
ng b ng t khóa #define
Ví d : b n đ nh nga led1 P1_0 t c là led1 đ c n i v i chân 0 c a Port 1. ượ
#define led1 P1_0
3/ c hàm ng t nh ng t timer0, timer1, ng t n i ti p, ng t ngi. Tôi s nói chi ư ế
ti t cáiy sau. Còn 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 thì làm đây
}
pháp c ng t kc 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 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 vi đi u khi n nênm main không có gtr tr ượ ươ
v và kng tham s đ a vào. Và th c ch t cũng ch ng c n bi n tn c c ư ế
ta ch c n vi t 1 file thôi. Nên 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 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ânch 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. ư
l ng i dùng Keil C l n đ u tiên g p tr ng i khi dùng #include đókhông ườ
bi t li t kê c header file nào c n thi t cho ng d ng c a mình.ế ế
Đ 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, 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 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.ươ
n làm th nào đ nh làm vi c v i các thành ghi,c port nh trong ASMyế ư
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 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;
/*------------------------------------------------