Tải bản đầy đủ (.docx) (14 trang)

chương trình sử dụng timer trong vi điều khiển

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (113.31 KB, 14 trang )

NGÔN NGỮ C TRONG 8951 ( dùng con 8951)
Đề bài:
Viết chương trình điều khiển bóng đèn theo qui luật: 300mS sáng, 300mS tắt
(delay sử dụng timer0, mode 16 bit); P1.0 nối bóng đèn

1.

2.

3.

Viết chương trình xuất chuỗi xung 500Hz ra loa (delay sử dụng timer1,
mode 2); P2.5 nối loa.
viết chương trình hiển thị các số tăng dần từ 0 -9, lặp lại vô hạn lần; thời
gian delay 471ms dùng timer 1, mode1, thạch anh 12Mhz

viết chương trình hiển thị 1 led sáng, dịch dần từ D1 đến D8. Lặp lại vô hạn
lần, thời gian delay là 450ms, dùng timer0, mode2.

4.

5.

VCT thực hien hiển thị các led sáng dần từ D8 đến D1. Lặp lại vô hạn lần,
thời gian delay là 451ms, dùng timer0, mode1.

6.

VCT hiển thị led tắt dần từ D1 đến D8, lặp lại quá trình 8 lần. Thời gian
delay là 1450ms, dùng timer0, mode1.


7.

VCT hiển thị l led sáng dịch dần từ D8 đến D1, lặp lại quá trình 276 lần .
Thời gian delay là 1450ms, dùng timer0, mode1.

VCT hiển thị led sáng dần từ ngoài vào trong (D1,D8; D1,D2,D7,D8;
D1,D2,D3,D6,D7,D8; D1-D8) Lặp lại quá trình 7 lần, đồng thời hiển thị số
lần trên led 7 đoạn 4. Thời gian delay là 450ms, dùng timer0, mode1.
9. Viết chương trình truyền 2 byte 41H và 30H từ vi điều khiển 1 sang VĐK 2;
ở VĐK2 sẽ nhận 2 byte và lưu vào các biến data1 và data2 (xem như có sẵn
mạch, XTAL = 11,0592Mhz; tốc độ truyền/ nhận là 2400bps; chế độ truyền
8 bit)
10. Viết chương trình truyền 10 byte dữ liệu trong bảng data a[10] từ vi điều
khiển 1 sang VĐK 2; ở VĐK2 sẽ nhận và kiểm tra lỗi parity, nếu không có
lỗi sẽ lưu vào bảng data b[10] ngược lại sẽ tăng số đếm byte lỗi CntErr lên 1
đơn vị (xem như có sẵn mạch, XTAL = 11,0592Mhz; tốc độ truyền/ nhận là
9600bps(TH1=-3); chế độ truyền 8 bit; tất cả các byte dữ liệu trong bảng
a[10] <= 127:7 bit, bit thứ 8=0)
11. viết chương trình truyền giá trị tăng dần từ 0-200 từ VD9K1 sang VĐK2.
Tại nơi nhận (VĐK2), dữ liệu nhận được sẽ hiển thị ra các Led từ D1 đến
8.


D8 trên P0 (thời truyền mỗi byte là 500ms; chế độ truyền 8bit, tốc độ truyền
2400bps)
12. Viết chương trình truyền 10 byte dữ liệu trong bảng data a[10] từ vi điều
khiển 1 sang VĐK 2; ở VĐK2 sẽ nhận và kiểm tra lỗi parity, nếu không có
lỗi sẽ lưu vào bảng data b[10] ngược lại sẽ tăng số đếm byte lỗi CntErr lên 1
đơn vị (xem như có sẵn mạch, XTAL = 11,0592Mhz; tốc độ truyền/ nhận là
9600bps(TH1=-3); chế độ truyền 9 bit; tất cả các byte dữ liệu trong bảng

a[10] <= 127:7 bit, bit thứ 8=0)

Chương trình
1.
-

#include
<reg51.h> : liên kết thư viện 8951
Khai báo biến: data <kiểu> tên biến

Data: biến được khai báo nằm trong vùng nhớ RAM 128 byte
Xdata: biến được khai báo nằm trong vùng nhớ RAM từ 128 – 255
(8952/8955): truy xuất chậm hơn vùng data
Ví dụ:
data unsigned char CODE[12] =
{0xc0,0xf9,0xa4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0Xff,0Xbf};
data unsigned char LED1, LED2, LED3, LED4;
-

at
at
at
at
at
at
at

Định nghĩa chân 8951: port 0 (P0), địa chỉ từ 0x80 đến 0x87 (P0.0-P0.7);
port 1 (P1), địa chỉ từ 0x90 đến 0x97 (P1.0 – P1.7); port 2 (P2), địa chỉ từ
0xa0 đến 0xa7 (P2.0-P2.7); port 3 (P3), địa chỉ từ 0xb0 đến 0xb7 (P3.0 –

P3.7). Đinh nghĩa chân trong C:

0xb2
0xb3
0xb4
0xb5

0x90 sbit
0x91 sbit
0x92 sbit
sbit
sbit
sbit
sbit

SW1;
SW2;
SW3;
Q1;//P3.2
Q2;//P3.3
Q3;//P3.4
Q4;//P3.5

YÊU CẦU: Viết chương trình điều khiển bóng đèn theo qui luật: 300mS sáng,
300mS tắt (delay sử dụng timer0, mode 16 bit); P1.0 nối bóng đèn.


#include<reg51.h>
data unsigned char a[5] = {0xff,0x7e,0x3c,0x18,0x00};
data unsigned char CODE[10] =

{0xc0,0xf9,0xa4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
// delay 450ms dùng timer0, mode 1
void delay()
{
data unsigned char k;
TR0 = 1; // cấp xung cho bộ đếm
for (k = 0; k < 10; k++)
{
TL0 = -45000;// 45000 xung tràn timer 0
TH0 = -45000>>8;
while(!TF0);// chờ timer tràn
TF0 = 0;
}
TR0 = 0; // ngắt xung
}

void main()
{
unsigned char i,j;
TMOD = 0x01;// timer0, mode2 (8bit, autoreload)
i=0;
j = 0;
P3 = 0x20; // mở nguồn led 4 (P3.5 = 1)
while(j < 7)
{
P2 = CODE[j];
P0 = a[i];
Delay();
// delay 450ms
i++;

if (i == 5) {i = 0; j++;}


}
P2 = CODE[j];
while(1);
}

YÊU CẦU: Viết chương trình xuất chuỗi xung 500Hz ra loa (delay sử dụng
timer1, mode 2); P2.5 nối loa.
#include<reg51.h>
at
0xa5 sbit
loa;
// chương trình con delay 1ms, timer1, mode2
Void delay1()
{
Data unsigned char cnt;
TH1 = -200; // = 56
TL1 = -200; // 200 xung tràn timer1
TR1 = 1; cấp xung cho bộ đếm
cnt = 0;
While (cnt < 5)
{
While(!TF1);// chờ tràn timer 1
TF1 = 0;
cnt++;
}
}
void main()

{
TMOD = 0x20;
While(1)
{
If (!loa) loa = 1;
Else loa = 0;
Delay1(); // 1ms
}
}
Bài tập: viết chương trình hiển thị các số tăng dần từ 0 -9, lặp lại vô hạn lần; thời
gian delay 471ms dùng timer 1, mode1, thạch anh 12Mhz


#include <reg51.h>
data unsigned char CODE[12] =
{0xc0,0xf9,0xa4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0Xff,0Xbf};
at 0xb5 sbit Q4;// p3.5

void delay471()// 471000 xung
{
Data unsigned char i;
TR1 = 1; // cấp xung cho bộ đếm
for (i = 0; i < 10; i++)
{
TL1 = -47100;// byte thấp
TH1 = -47100>> 8; //byte cao
While(!TF1);// chờ timer tràn
TF1 = 0;
}
TR1 = 0; // ngắt xung

}
Void main()
{
Data unsigned char cnt;
Cnt = 0;
P3 = 0;
TMOD = 0x01;//timer0 mode1
For ( ; ; )


{
P2 = CODE[cnt];
Q4 = 1;// mạch test Q4 = 0
Cnt = cnt + 1;
Cnt = cnt % 10;// % chia lấy phần dư
Delay471();
}
}

BT2: viết chương trình hiển thị 1 led sáng, dịch dần từ D1 đến D8. Lặp lại vô hạn
lần, thời gian delay là 450ms, dùng timer0, mode2.
#include<reg51.h>
data unsigned char CODE[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void delay450()
{TR0=1;//cap xung cho bo dem
Data unsigned char k;
For(k=0;k<10;{TL0=-45000;
TH0=-45000>>8;
while (!TF0);//cho timer tran

TF0=0;}
TR0=0;//ngat xung
}
void main()
{
BT1: VCT thực hien hiển thị các led sáng dần từ D8 đến D1. Lặp lại vô hạn lần,
thời gian delay là 451ms, dùng timer0, mode1.
#include<reg51.h>
Data unsigned char CODE[9]={0xff,0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
Void delay450()
{
Data unsigned char k;
TR0=1;//cap xung cho bo dem
for (k=0;k<10;k++)
{TH0=-45000;
TL0=-45000>>8;
While(!TF0);//cho tran timer0


TF0=0;
}
TR0=0;//ngat xung
}
Void main()
{data unsigned char i;
P0=0;
i=0;
TMOD=0x01;//timer0 mode1
For(;;)
{P0=CODE[i];

i++;
i=i%9;
delay451();}
}
BT3: VCT hiển thị led tắt dần từ D1 đến D8, lặp lại quá trình 8 lần. Thời gian
delay là 1450ms, dùng timer0, mode1.
BT4: VCT hiển thị l led sáng dịch dần từ D8 đến D1, lặp lại quá trình 276 lần .
Thời gian delay là 1450ms, dùng timer0, mode1.
BT5: VCT hiển thị led sáng dần từ ngoài vào trong (D1,D8; D1,D2,D7,D8;
D1,D2,D3,D6,D7,D8; D1-D8)
Lặp lại quá trình 7 lần, đồng thời hiển thị số lần trên led 7 đoạn 4. Thời gian delay
là 450ms, dùng timer0, mode1.

Ngày ¼
Ví dụ 01: Viết chương trình truyền 2 byte 41H và 30H từ vi điều khiển 1 sang
VĐK 2; ở VĐK2 sẽ nhận 2 byte và lưu vào các biến data1 và data2 (xem như có


sẵn mạch, XTAL = 11,0592Mhz; tốc độ truyền/ nhận là 2400bps; chế độ truyền 8
bit)
- VĐK 01:
#include <reg51.h>
void main()
{
SCON = 0x50;// chế độ 8 bit
TMOD = 0x20;//timer 1 mode 2
TH1 = -12;//xem kĩ slide
TR1 = 1; // mở timer1 để phát tốc độ
SBUF= 0x41;// truyền byte 41H,ghi vao thanh ghi đệm SBUF
while(!TI); // chờ truyền xong, bit truyền là TI

TI = 0;//truyền xong rồi thì gán lại TI=0
SBUF
= 0x30;// truyền byte 30H
while(!TI); // chờ truyền xong
TI = 0;
while(1);// kết thúc (dừng)
}
VĐK 02:
#include <reg51.h>
data unsigned char data1, data2;
void main()
{
SCON =0x50;
TMOD = 0x20;//timer 1 mode 2
TH1 = -12;
TR1 = 1; // mở timer1 để phát tốc độ
while(!RI);// chờ nhận xong 1 byte
data1 = SBUF;//dat vao data1 byte vua nhận được.
RI = 0;//gán lại sau khi nhận
while(!RI);// chờ nhận xong 1 byte
data2 = SBUF;
RI = 0;
while(1);// kết thúc (dừng)
}
-

Ví dụ 02: Viết chương trình truyền 10 byte dữ liệu trong bảng data a[10] từ vi điều
khiển 1 sang VĐK 2; ở VĐK2 sẽ nhận và kiểm tra lỗi parity, nếu không có lỗi sẽ
lưu vào bảng data b[10] ngược lại sẽ tăng số đếm byte lỗi CntErr lên 1 đơn vị (xem



như có sẵn mạch, XTAL = 11,0592Mhz; tốc độ truyền/ nhận là 9600bps(TH1=-3);
chế độ truyền 8 bit; tất cả các byte dữ liệu trong bảng a[10] <= 127:7 bit, bit thứ
8=0)
- VĐK 01:
#include <reg51.h>
void main()
{
SCON = 0x50;// chế độ 8 bit
TMOD = 0x20;// timer 1 mode 2
TH1 = -3;// xem kĩ slide, 9600bps
TR1 = 1; // mở timer1 để phát tốc độ
Data unsigned char a[10];//1 char là 1 byte
Data unsigned char i;
i=0;
For (i=0;i<10;i++)
{A=a[i];
if(P==1)
A=A+128;//nếu bit P bằng 1 thì gán vào bit đầu của thanh ghi
A.
SBUF = A;// truyền A ghi vao thanh ghi đệm
while(!TI); // chờ truyền xong, bit truyền là TI
TI = 0;//truyền xong rồi thì gán lại TI=0
}
while(1);// kết thúc (dừng)
}
- VĐK 02:
#include <reg51.h>
void main()
{

SCON = 0x50;// chế độ 8 bit
TMOD = 0x20;//timer 1 mode 2
TH1 = -3;//xem kĩ slide, 9600bps
TR1 = 1; // mở timer1 để phát tốc độ
Data unsigned char cnterr;
Data unsigned char i ;
cnterr=0;
i=0;
data unsigned char b[10];//1 char là 1 byte
for (i=0;i<10;i++)
{


while(!RI); // chờ nhận xong, bit nhận là RI
RI = 0;//nhận xong rồi thì gán lại RI=0
A = SBUF;// nhận dữ liệu từ thanh ghi đệm
If(P==0) //truyền đúng
{b[i] = A & 0x7f;}//nhận đúng, xóa bit cao vì and với 01111111
Else
{cnterr++;
i--;// sai thì không ghi vào, ghi cái sau
}
}
while(1);// kết thúc (dừng)
}

VD3: viết chương trình truyền giá trị tăng dần từ 0-200 từ VD9K1 sang
VĐK2. Tại nơi nhận (VĐK2), dữ liệu nhận được sẽ hiển thị ra các Led từ
D1 đến D8 trên P0 (thời truyền mỗi byte là 500ms; chế độ truyền 8bit, tốc
độ truyền 2400bps)

Ví dụ 05: Viết chương trình truyền 10 byte dữ liệu trong bảng data a[10] từ vi điều
khiển 1 sang VĐK 2; ở VĐK2 sẽ nhận và kiểm tra lỗi parity, nếu không có lỗi sẽ
lưu vào bảng data b[10] ngược lại sẽ tăng số đếm byte lỗi CntErr lên 1 đơn vị (xem
như có sẵn mạch, XTAL = 11,0592Mhz; tốc độ truyền/ nhận là 9600bps(TH1=-3);
chế độ truyền 9 bit; tất cả các byte dữ liệu trong bảng a[10] <= 127:7 bit, bit thứ
8=0)
TRUYỀN:
A=data;
TB8=P;
SBUF=A;
NHẬN:
A=SBUF;
If(RB8==P) đúng: b[i]=A;
Else /*tăng lỗi*/ cnterr+=1
Ngày 8/4/10
Cấu trúc tổng quát của chương trình C cho 8951 có sử dụng ngắt
#include<reg51.h>
//khai báo biến toàn cục, nếu có
//chương trình con nếu có
//chương trình ngắt ngoài 0
Void <tên chương trình >(biến nếu có) interrupt 0 using 0/1


//chương trình ngắt timer 0
Void <tên chương trình >(biến nếu có) interrupt 1 using 0/1
//chương trình ngắt ngoài 1
Void <tên chương trình >(biến nếu có) interrupt 2 using 0/1
//chương trình ngắt timer 1
Void <tên chương trình >(biến nếu có) interrupt 3 using 0/1
//chương trình ngắt truyền thông

Void <tên chương trình >(biến nếu có) interrupt 4 using 0/1
Void main(){}
BT:Viết chương trình hiển thị các số tăng dần từ 0 đến 25 trên 2 led 3,4(thời
gian tăng 1 đơn vị là 400ms)
HD:dùng ngắt timer0 để quét led; sử dụng timer1 để viết chương trình delay.
#include<reg51.h>
Data unsigned char CODE[10]={0x…}
Data unsigned char LED1,LED2,LED3,LED4;
Data unsigned char cnt;
At 0xb2 sbit Q1;
At 0xb3 sbit Q2;
At 0xb4 sbit Q3;
At 0xb5 sbit Q4;
//chương trình delay
Void delay()
{data unsigned char k;
For(k=0;k>10;k++)
{TH1=-40000>>8;
TL1=-40000;
TR1=1;//mở xung clock timer1
While(!TF1);
TF1=0;
}
}
void dl()
{data unsigned char i;
For(i=0;i<50;i++)_nop_();//1 nop = 1us
Void QL(void) interrupt 1 using 1
{TH0=-1000>>8;
TL0=-1000;//1ms thì tràn

P2=CODE[LED1];
Q1=1;


dl();
Q1=0;
P2=CODE[LED2];
Q2=1;
dl();
Q2=0;
P2=CODE[LED3];
Q3=1;
dl();
Q3=0;
P2=CODE[LED4];
Q4=1;
dl();
Q4=0;
}//chương trình ngắt timer0, sau mỗi lần ngắt thì TF0 được đưa về 0.
Void main()
{TMOD=0X11;//sử dụng timer1, mode1; timer0 mode1
TH0=-1000>>8;
TL0=-1000;
EA=1;//Có sử dụng ngắt
ET0=1;//sử dụng ngắt timer0
TR0=1;//bắt đầu đưa xung vào bộ đếm
Cnt=0;
LED1=10;
LED2=10;


BT: viết chương trình htực hiện
Nhấn SW1: tăng số hiển thị trên led 3,4 một đv (00 - 99); led 1,2 hiển thị
“In”
Nhấn SW2 giảm hiển thị trên led 3,4 một đv (99 - 00); led 1,2 hiển thị
“dE”
Nhấn SW3: hiển thị chữ “STOP”
(dùng ngắt timer1 để quét led; chu kì quét là 1.2ms)
#include<reg51.h>
Data unsigned char CODE[16]={0x…}
Data unsigned char LED1,LED2,LED3,LED4;
Data unsigned char cnt;
at 0x90
sbit
SW1;
at 0x91
sbit SW2;
at 0x92 sbit SW3;


At 0xb2 sbit Q1;
At 0xb3 sbit Q2;
At 0xb4 sbit Q3;
At 0xb5 sbit Q4;
void dl()
{data unsigned char i;
For(i=0;i<50;i++)_nop_();//1 nop = 1us
Void QL(void) interrupt 1 using 1
{TH0=-1200>>8;
TL0=-1200;//1ms thì tràn
P2=CODE[LED1];

Q1=1;
dl();
Q1=0;
P2=CODE[LED2];
Q2=1;
dl();
Q2=0;
P2=CODE[LED3];
Q3=1;
dl();
Q3=0;
P2=CODE[LED4];
Q4=1;
dl();
Q4=0;
}//chương trình ngắt timer0, sau mỗi lần ngắt thì TF0 được đưa về 0.
Void main()
{TMOD=0X11;//sử dụng timer1, mode1; timer0 mode1
TH0=-1200>>8;
TL0=-1200;
EA=1;//Có sử dụng ngắt
ET0=1;//sử dụng ngắt timer0
TR0=1;//bắt đầu đưa xung vào bộ đếm
Cnt=0;
LED1=10;
LED2=10;
LED3=10;
LED4=10;



While(1)
{
if(!SW1)
{LED1=1;//chữ I
LED2=11;//chữ n
cnt++;cnt=cnt%100;
LED3=cnt/10;//khai báo là nguyên nên đây là chia lấy nguyên
LED4=cnt%10;
}
if(!SW2)
{LED1=12;//chữ d
LED2=13;//chữ E
cnt--;
if(cnt==255) cnt=99;
LED3=cnt/10;
LED4=cnt%10;
Delay();}
if(!SW3)
{LED1=…}



×