1. Trang chủ
  2. » Thể loại khác

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

14 2,1K 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 24,2 KB

Nội dung

Trang 1

NGÔN NGỮ C TRONG 8951 ( dùng con 8951)

Đề bài:

1. 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

2. 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

3. 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

4. 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

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

8. 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

Trang 2

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;

- Đị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:

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

Trang 3

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++;}

Trang 4

} 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>

// 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

Trang 5

#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 ( ; ; )

Trang 6

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;<k++)

{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

Trang 7

} 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ó

Trang 8

sẵn mạch, XTAL = 11,0592Mhz; tốc độ truyền/ nhận là 2400bps; chế độ truyền 8

bit)

#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) }

#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

Trang 9

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)

#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) }

#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++)

{

Trang 10

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

Trang 11

//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;

Trang 12

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;

Trang 13

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;

Trang 14

{

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=…}

Ngày đăng: 16/12/2015, 09:54

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w