Professional Documents
Culture Documents
De Cuong Ung Dung Lap Trinh C Cho 8051
De Cuong Ung Dung Lap Trinh C Cho 8051
2. Ngôn ngữ C
AND: &&
OR: ||
NOT: !
Giải thích: nếu dieu_kien đúng thì xư lí các câu lệnh bên trong còn sai thì nhảy qua.
- Cấu trúc: if(dieu_kien)
{
// Đoạn chương trình 1
}
else
{
// Đoạn chương trình 2
}
Giải thích: nếu dieu_kien đúng thì xử lí “Đoạn chương trình 1” bên trong còn sai thì
x ử l ý “Đoạn chương trình 1”
Trong này có 1 loạt các hãng điện tử sản xuất 8051. bạn lập trình cho con nào thì chọn con
đấy, kích chuột vào dấu + để mở rộng các con IC của các hang. ở đây ta lập trình cho
AT89C51 của hang ATMEN nên ta chọn như trên.
Khi chọn chip thì ngay lập tức 1 bảng hiện ra 1 số tính năng của chip các bạn có thể nhìn
thấy: 8051 based fully static 24Mhz …. nhập OK, chọ câu trả lời NO khi được hỏi “copy
standard 8051 startup code to project and addfile to project” vì nếu chon YES chỉ làm cho
file lập trình của bạn thêm nặng.
Để tạo một file code các bạn chọ file→new hoặc ấn ctrl+N. như sau:
Cửa sổ text1 hiện ra. Tiếp theo bạn chọn File → save As hoặc Ctrl+S, để lưu File mặc dù
chưa có gì như sau:
Được cửa sổ sau:
Các bạn nhập tên vào text box file name.chú ý tên gì cũng được nhưng không được thiếu
đuôi mở rộng .C, và nhấn SAVE.
Trong ô bên trái màn hình, cửa sổ PROJECT WORKSPACE, các bạn mở rộng cái target 1
ra như sau:
Nhấp chuột phải nên SOURCE GROUP, chọn Add file to Group “Source Group 1” hộp
thoại hiện ra chọn file .C mà các bạn vừa SAVE rồi nhấn Add 1lấn rồi nhấn Close. nếu bạn
nhấn Add 2 lần nó sẽ thong báo là file đã add bạn chỉ việc OK rồi nhấn Close. Được như
sau:
Bây giờ trong hình nhìn thấy trong Source Group 1 có file VIDU.C. các bạn nhấp chuột
phải vào vùng soạn thảo file VIDU.C để thêm file thư viện. Chon Insert
“#include<REGX51.H>”.
Phần cuối cùng của công việc khởi tạo là các bạn viết lời giải thích cho dự án của mình.
phần này rất cần thiết vì nó để người khác hiểu mình làm gì trong project này và khi mình
cần sử dụng lại code đọc lại còn biết nó là cái gì.
2.2. Soạn thảo chương trình.
Các bạn viết thử 1 chương trình làm ví dụ. khi viết xong mỗi dòng lệnh nên giải thích dòng
lệnh đó làm gì. Ví dụ:
2.3. Biên dịch một chương trình.
Sau khi soạn thảo xong nhấn Ctrl+S để nhớ. Nhớ xong các bạn biên dịch chương trình
bắng cách ấn phím F7 hoặc chọn Build target là biểu tượng ngay trên cửa sổ Workspace,
như trên hình:
Để biên dịch chương trình thành file HEX các bạn chọn: Project→option for ‘target 1’
như hình vẽ:
Trong hộp thoại hiện ra, hãy check vào Creat HEX File như chỉ dẫn:
chọn thẻ táp target nhập lại tần số thạch anh là 12Mhz.
Để mô phỏng các bạn chon Debug→Start/stop debug session hoặc ấn Ctrl+F5, hoặc nhấn
vào Icon chữ D màu đỏ trong cái kính lúp trên thanh công cụ.
Để hiển thi các cổng, các thanh ghi các bạn chon trong peripherals.
Các bạn thấy 1 cửa sổ nhỏ Parallel Port xuất hiện đó là cái để mô phỏng cho 1 cổng của
AT89C51. dấu tick tương đương chân ở mức cao (5V), không tick chân ở mức thấp
0V.trong menu peripherals còn có các ngoại vi khác như timer, interrupt, serial.
Để chạy chương trình các bạn ấn chuột phải vào màn hình soạn thảo, rồi ấn F11.mỗi làn ấn
sẽ chạy 1 lệnh.khi debug nếu các bạn chờ hàm delay lâu quá 1000 lần lặp các bạn nhấn
ctrl+F11 để bỏ qua hàm.
hoặc ấn F10 để chạy từng dòng lệnh
Bài 2: Điều khiển Led đơn, Led 7 thanh và nút nhấn
START
Sáng Led
Trễ 1S
Tắt Led
Trễ 1S
+ 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
Start
Led = tat
Led = tat
Stop =
0
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.
Dem=0;
ctac==0?
dem++;
dem<=10?
dem=0;
Cộti = 0 (i=1-4)
Sai
Hàngi = 0
(i =1-4)
Đúng
Trả lại kết quả phím đã
nhấn
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
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. 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>
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 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();
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();
}
}
Bài 5: Giao tiếp ADC - Xử lý ngắt
I. Giao tiếp ADC
+Chương trình:
#include<regx51.h>
#include<string.h>
+ Chương trình:
/*================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;
Bài giải:
/*==================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 hàm==================*/
/*------------------------------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);
}
Bài 6: Điều khiển động cơ DC, động cơ Servo, động cơ bước
1. Đông cơ DC
2. Động cơ Servo
3. Động cơ bước (Step motor)
Điều khiển động cơ bước với tốc độ tăng dần từ 5 đến 100 v/p, mỗi lần chuyển tốc
độ tăng 5v/p thời gian chuyển 1s, hiển thị tốc độ trên LCD.
+ Chương trình:
#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"
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);
}
}
}
Bài 7: Giao tiếp Vi điều khiển với Máy tính
I. Cổng truyền thông nối tiếp
+ Thuật toán
+ Chương trình:
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
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
Dim s As String
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
txtchu.ForeColor = vbRed
txtchu.Text = "DO AN GHEP NOI"
Mau = 1
End Sub
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();
}
}