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 2D8 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 3data 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 6P2 = 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 8sẵ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 9như 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 10while(!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 12Q1=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 13At 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=…}