You are on page 1of 6

Sv : Nhữ Văn Trường

Lớp : DLTH1_K52

Mssv :20073096

Đề bài :

Sử dụng MCS51

Input : ngắt nhận dữ liệu nối tiếp

Enqueue : cập nhật dữ liệu vào Circular Buffer

Dequeue : lấy dữ liệu ra

Out put : ngắt truyền dữ liệu nối tiếp

Bộ đệm vòng là một mảng gồm 10 phần tử.Chương trình sử dụng timer0 để
định thời cho hệ thống với thời gian của một đơn vị là 0.1ms.Chương trình
gồm 3 task :

task1: task cấu hình cho cổng nối tiếp gồm tốc độ baud, thiết lập chế độ
truyền...

task2: nhận dữ liệu từ cổng nối tiếp cho vào bộ đệm vòng khi bộ đệm chưa
đầy

task3: lấy dữ liệu từ bộ đệm vòng để cho vào bộ đệm của cổng nối tiếp để
truyền đi khi bộ đệm còn dữ liệu.

sử dụng một biến để nhận biết bộ đệm vòng dầy hay trống.

Phương pháp phân hoạch thời gian là cơ chế xoay vòng hàng đợi.Task1 chạy
trước,khi task1 kết thúc thì task2 chạy.Khi mỗi một đơn vị thời gian được
thực hiện(ngắt của timer0) thì task2 sẽ lưu ngăn xếp cứng của 8051 vào ngăn
xếp do chương trình tạo ra và đẩy vào ngăn xếp cứng dữ liệu lấy từ ngăn
xếp của task3 và ngược lại.Thông qua việc thay đổi ngăn xếp để kích hoạt
các task hoạt động song song.

biểu đồ phân hoạch:

#include <at89x51.h>
volatile unsigned char counter=0,kiemtrabodemvong=0;
volatile unsigned char bodemvong[10];//bo dem vong chi chua duoc 10 du
lieu thi het cho
unsigned char stack1[20],stack2[20],stack3[20];
typedef void (*controham)(void);
typedef volatile struct //cau truc du lieu chua du lieu cua 1 tien trinh
{
volatile unsigned char *pstack; //con tro tro toi dia chi cua mang dung lam
ngan xep
volatile unsigned int stacktop; //bien luu gia tri cua ngan xep (dinh cua ngan
xep)
volatile unsigned char priority; //muc uu tien cua tien trinh
volatile unsigned char status; //trang thai cua tien trinh
controham tenham ;
}hostask;
hostask t1,t2,t3;
void khoitaotask(hostask *ptask,unsigned char priority,controham
tenham,unsigned char *pstack)
{
(*ptask).pstack=pstack;
(*ptask).priority=priority;
(*ptask).tenham=tenham ;
(*ptask).stacktop=pstack[0];
}
void task1(void) ;
void task2(void) ;
void task3(void) ;
void khoitaoxungnhiphethong()
{
TMOD=0x22 ; //bo dinh thoi 0 o che do 8 bit tu nap lai de tao ngat thoi gian
// bo dinh thoi 1 o che do 8 bit tu nap lai de tao toc do baud cho truyen
thong noi tiep
TH0=0x9C;//1 don vi thoi gian cua tien trinh=0.1ms
}
void chopheptaskchay()
{
t1.status=1;
t1.priority=1;//dua muc uu tien cua task 1 len cao nhat
task1();
TR0=1;//cho phep timer0 chay
ET0=1;//cho phep ngat timer 0
EA=1; //cho phep ngat toan cuc
task2(); //ketthuctask1 cho phep task2 chay
}
void truyendulieu(unsigned char a)
{
TI=0;
SBUF=a;
while(!TI)
{
}
}
unsigned char nhandulieu()
{
RI=0;
while(!RI)
{
}
return(SBUF);
}
void timer0(void) interrupt 1
{
if(t1.status)
{
}
if(t2.status)
{
t2.stacktop=SP;// lay du tu ngan xep cung cua 8051 cho vao ngan xep do ta
tao ra
SP=t3.stacktop;// lay du lieu tu ngan xep do ta tao ra dua vao ngan xep cung
de kich hoat task3 chay
}
if(t3.status)
{
t3.stacktop=SP;// lay du tu ngan xep cung cua 8051 cho vao ngan xep do ta
tao ra
SP=t2.stacktop;// lay du lieu tu ngan xep do ta tao ra dua vao ngan xep cung
de kich hoat task3 chay
}
}
void main()
{
khoitaoxungnhiphethong();
khoitaotask(&t1,1,task1,&stack1);
khoitaotask(&t2,0,task2,&stack2);
khoitaotask(&t3,0,task3,&stack3);
chopheptaskchay();
while(1) //chuong trinh khong lam gi ca cho ngat
{
}
}
void task1() //thiet lap cong noi tiep
{
SCON=0x50;//truyen tin noi tiep che do 1
TH1=-3; // khoi tao toc do baud=9600
TR1=1;
t1.priority=0;//dua muc uu tien cua task1 ve 0
t1.status=0;// bao rang task 1 ket thuc.
t3.status=1;
t3.priority=1;
}
void task2()//lay du lieu tu cong noi tiep cho vao bo dem vong
{
while(1)
{
t2.status=1;
//bao cho he thong biet task2 chay
while(t3.status)//neu task3 dang chay thi kiem tra muc uu tien de quyet dinh
xem co chiem quyen dieu khien cua task3 hay khong
{
if(t3.priority)
{
t2.status=0;
while(t3.priority)
{
}
t2.status=1;
}
}
while(counter==10)//bo dem vong da day nen khong nhan them du lieu
{
kiemtrabodemvong=1;
}
bodemvong[counter]=nhandulieu();
counter++;
t2.status=0;
t3.priority=1;
}
task3();
}
void task3()//lay du lieu tu bo dem vong cho vao cong noi tiep
{
while(1)
{
t3.status=1;//bao cho he thong biet task3 chay
while(t2.status)//neu task2 dang chay thi kiem tra muc uu tien de quyet dinh
xem co chiem quyen dieu khien cua task2 hay khong
{
t2.status=1;
if(t2.priority)
{
t3.status=0;
while(t2.priority)
{
}
t3.status=1;
}
}
while(counter==0)//bo dem vong trong nen khong lay du lieu de truyen (tien
trinh bi chan)
{
}
truyendulieu(bodemvong[counter]);
counter--;
t3.status=0;
t2.priority=1;
}
}

You might also like