Chân 11 là chân xung clock. Khi có 1xung từ thấp lên cao thì nhận 1 bit dữ liệu
vào chân Data.
Chân 14 là chân data cho từng bit dữ liệu khi có xung vào chân 11. Các bit dữ liệu
này dịch từ chân QA tới chân QH, nếu các bit đầy QA đến QH thì dữ liệu tràn
xuống chân 9 là chân SDO (chân tràn)
Chân 12 là chân chốt dữ liệu (STR). dữ liệu sau khi được đưa vào chân data, khi
có xung từ 0 lên 1 vào chân STR thì dữ liệu sẽ được xuất ra khỏi IC74hc595.
72 trang |
Chia sẻ: lylyngoc | Lượt xem: 3314 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Thực tập môn vi xử lý : Led Cube 8x8x8, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ed4=tat;
tre(1000);
Nhóm 1– Đ3dtvt
led3=bat;
tre(1000);
led3=tat;
tre(1000);
led2=bat;
tre(1000);
led2=tat;
tre(1000);
led1=bat;
tre(1000);
led1=tat;
tre(1000);
}
}
Sau khi chạy chương trình,kiểm tra lỗi va mô phỏng trên protus ta sẽ có mạch sau:
Tuy nhiên,với cách điều khiển từng chân của vi điều khiển như ở trên thì rất tốn
công,thay cách điều khiển từng chân như thông thường ta có thể xuất giá trị ra cả cổng.
Nguyên tắc thực hiện của cách này như sau: 1 cổng có 8 bit tổ hợp của 8 bit có
28=256 trạng thái.Khi đưa ra cổng 1 giá trị a thập phân (0-255) thì số a sẽ được đổi sang
hệ nhị phân rồi đưa ra các bit(chân) của cổng. Ví dụ : nếu có lệnh P1=1;vì 1(10)=0000
0001(2)nên chân P1_0(bit 0) sẽ bằng 1(5V) các chân còn lại đều bằng 0V. Chúng ta có thể
đưa ra cổng 1 giá trị hexa từ 0 tới ff tương ứng với 0 tới 255. Ví dụ P1=1 tương đương
Nhóm 1– Đ3dtvt
với P1=0x01; P1=10 tương đương với P1=0x0A.Như vậy chương trình xuất ra cả cổng
tương đương với chương trình điều khiển 8 LED từng chân như sau:
#include
/************************************/
void tre(int time)
{
int n;// khai bao bien cuc bo
for(n=0;n<time;n++); //lap time lan
}
/*******************************************/
void main()
{
while(1)
{
P2=0xFF;tre(5000);
P2=0xFE;tre(5000);
P2=0xFD;tre(5000);
P2=0xFB;tre(5000);
P2=0xF7;tre(5000);
P2=0xEF;tre(5000);
P2=0xDF;tre(5000);
P2=0xBF;tre(5000);
P2=0x7F;tre(5000);
P2=0x7f;tre(10000);
P2=0xBF;tre(10000);
P2=0xDF;tre(10000);
P2=0xEF;tre(10000);
P2=0xF7;tre(10000);
P2=0xFB;tre(10000);
P2=0xFD;tre(10000);
P2=0xFE;tre(10000);
P2=0x7e;tre(5000);
P2=0xBD;tre(5000);
P2=0xDB;tre(5000);
P2=0xE7;tre(5000);
P2=0xE7;tre(5000);
P2=0xDB;tre(5000);
P2=0xBD;tre(5000);
P2=0x7e;tre(5000);
}
Nhóm 1– Đ3dtvt
BÀI 2 : ĐIỀU KHIỂN LED 7 THANH DÙNG ANOT CHUNG
1. Led 7 đoạn
Led 7 đoạn có 2 loại la anot chung và katot chung,nó được cấu tạo chỉ là 8 con led đấu
chung 1 đầu anot hoặc katot.Led 7 đoạn có tất cả 10 chân được ký hiệu như hình vẽ
Mạch led sử dụng led anot chung như sau:
2. Nguyên lý hoạt động
Nhóm 1– Đ3dtvt
Khi cắm nguồn vào mạch tất cả các chân của các cổng IO của vi điều khiển 5V(nếu
cổng 0 không lắp điện trở treo thì sẽ là 0V). Nhìn sơ đồ mạch không có sự chênh lệch điện
áp nên không có đèn nào sáng. Ta muốn led nào sáng ta chỉ việc đưa ra điện áp 0V ở chân vi
điều khiển nối với thanh đó.
Thanh hiện Thanh tắt Giá trị(P2)
Để hiển thị số 1: B,C các thanh còn lại 1111 1001
Để hiển thị số 2: A,B,D,E,G các thanh còn lại 1010 0100
….
Để hiển thị số 8: Tât cả các thanh không thanh nào 1000 0000
Ngoài led 7 thanh còn có thể hiển thị 1 chữ số.ví dụ :
Hiển thị chữ A: thanh hiện A,B,C,E,F,G;thanh tắt D;giá trị của P2 :1000 1000
3. Lập trình
- Cách 1 : giống như bài thứ nhất, lập trình dễ hiểu không cần tính toán nhưng phải
viết copy,past và chỉnh sửa nhiều
- Cách 2 : cũng giống như ở bài trên chúng ta điều khiển từng cổng không theo từng
chân như ở cách 1,tuy nhiên phải tính toán nhiều.
Ở đây chúng ta sẽ làm theo cách 2,ta có code sau:
#include // dinh nghia
//khai bao bien toan cuc
unsigned char i;
unsigned char so_dem[] =
{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
//so 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
unsigned char so_dem2[] = {0x00
,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
//so 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
//chuong trinh con
void taotre(long time )
{
int n;
for(n=0;n<time;n++);
}
//chuong trinh chinh
void main(void)
{
unsigned char j=0; //khai bao bien
P1 = 0x00;
while(1) //tao vong lap 99
{
for(i=0;i<10;i++) //chay dem
{
P1 = (so_dem2[i]|so_dem[j]); //khai bao hang don vi
taotre(7000); //tao tre
if(i==9)
{
Nhóm 1– Đ3dtvt
j++;
P1=(so_dem[j]|so_dem2[i]); //khai bao hang chuc
if(j==10) //cho hang
chuc den 9 roi ve 0
j=0;
}
}
}
}
Sau khi chạy chương trình và kiểm tra lỗi thì kết quả hiển thị trên protus như sau :
Nhóm 1– Đ3dtvt
BÀI 3 : ĐỌC BÀN PHÍM
(Đọc ma trận phím)
1. Nhiệm vụ : quyét bàn phím 16 phím (4x4),xem phím nào được bấm,các phím được đánh
số từ 0 đến 15 rồi hiển thị ra led 7 thanh.
2. Sơ đồ bàn phím :
3. Nguyên lý quét :
- Vì sao mạch phím đấu theo ma trận? vì nếu để đọc 16 nút bấm thông thường thì cần
phải đấu với 16 chân vi điều khiển. Còn nếu đấu theo ma trận thì ta chỉ cần 8 chân vi
điều khiển cũng có thể điều khiển được 16 phím bấm
- Có hai cách quét phím theo cột và theo hàng. Ở đây, chúng ta chọn cách quét phím
theo hàng.
- Bước 1: Ta đưa chân P3.0 nối hàng 1 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 1 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 2 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 3 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 4 được bấm thì cột 4_P3.7 sẽ có
giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Bước 2: Ta đưa chân P3.1 nối hàng 2 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 5 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 6 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 7 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 8 được bấm thì cột 4_P3.7 sẽ có
giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
Nhóm 1– Đ3dtvt
- Bước 3: Ta đưa chân P3.2 nối hàng 3 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 8 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 9 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 10 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 11 được bấm thì cột 4_P3.7 sẽ
có giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Bước 4: Ta đưa chân P3.3 nối hàng 4 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 12 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 13 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 14 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 15 được bấm thì cột 4_P3.7 sẽ
có giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Ta sẽ dung câu lệnh IF để kiểm tra.
4. Lập trình
CODE :
#include
unsigned char Ma[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x8
2};
unsigned char stt=0,a;
sbit H_1 =P3^4;
sbit H_2 =P3^5;
sbit H_3 =P3^6;
sbit H_4 =P3^7;
sbit C_1 =P3^3;
sbit C_2 =P3^2;
sbit C_3 =P3^1;
sbit C_4 =P3^0;
void scan(void);
void delay( unsigned long time )
{
long i;
for(i=0;i<time;i++)
{;}
}
void scan()
{
H_1=1;
H_2=1;
H_3=1;
H_4=1;
C_1=0;
C_2=0;
C_3=0;
C_4=0;
if((!H_1)|(!H_2)|(!H_3)| (!H_4))
{
delay(100);
Nhóm 1– Đ3dtvt
if (!H_1)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_1 = 0;
if(!C_1) stt = 1;
else if (!C_2) stt = 2;
else if (!C_3) stt = 3;
else if (!C_4) stt = 4;
}
if (!H_2)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_2 = 0;
if(!C_1) stt = 5;
else if (!C_2) stt = 6;
else if (!C_3) stt = 7;
else if (!C_4) stt = 8;
}
if(!H_3)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_3 = 0;
if(!C_1) stt = 9;
else if (!C_2) stt = 10;
else if (!C_3) stt = 11;
else if (!C_4) stt = 12;
}
if(!H_4)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_4 = 0;
if(!C_1) stt = 13;
else if (!C_2) stt = 14;
Nhóm 1– Đ3dtvt
else if (!C_3) stt = 15;
else if (!C_4) stt = 16;
}
}
}
void main()
{
while(1)
{
scan();
P2=Ma[stt];
a=stt/10;
P0=Ma[a];
}
}
Sau khi chạy và kiểm tra lỗi ta có mạch chạy mô phỏng sau :
Nhóm 1– Đ3dtvt
BÀI 4 : ĐIỀU KHIỂN LCD 16X2
1. Nhiệm vụ : Điều khiển hiển thị LCD 16x2 dòng chữ : “Nhom 18-d3dtvt” và hiển thị thời
gian
2. Giới thiệu về LCD:
LCD 16x2 hiển thị được hai hàng mỗi hàng hiển thị được 16 ký tự.(LCD có 14 chân
được hiển thị như hình vẽ :
Thông số của LCD :
+Kích thước hiển thị : 16 ký tự x 2 dòng
+Màu hiển thị: đen/trắng
+Chế độ giao tiếp : 8 bít và 4 bít
+Cỡ chữ hiển thị : 5x7 hoặc 5x10
Cấu trúc của LCD :
LCD có tổng số 14 chân chia làm 3 nhóm:
Nhóm 1: (3 chân) Cấp nguồn VDD, VSS : cấp 5V, 0V
VEE: thay đổi điện áp để thay đổi độ tương phản
Nhãm 2: (8 chân) Vào ra thông tin với VĐK : Từ chân D0-D7
Nhãm 3 : (3 chân) Điều khiển việc vào ra thông tin : E,RS,R/W
E :(bật /tắt ) (cho phép/ không cho phép trao đổi thông tin với VĐK )
RS :(loại thông tin trao đổi)Thông tin trao đổi là lệnh điều khiển hay là
dữ liệu để hiển thị
R/W : (hướng truyền của thông tin) đọc trạng thái từ LCD hay thông tin cho VĐK để
Nhóm 1– Đ3dtvt
LCD hiển thị.
Cụ thể tên gọi và bảng chức năng của các chân được viết trong bảng sau :
Interface Pin Connections
Chân
số
Ký
hiệu Tên Mô tả chức năng
1 VSS Cấp nguồn 0V (GND)
2 VDD Cấp nguồn Nối với dương nguồn (+4.5V~+5.5V)
3 VEE Contrast
Điều chỉnh điện áp chân này sẽ tăng giảm độ tương
phản của LCD. cho nên nó thường được nối với biến
trở.
4 RS Chọn thanh ghi Nếu RS=0 : LCD nhận lệnh từ VĐK Nếu RS=1: LCD nhận dữ liệu từ VĐK để hiển thị
5 RW Read/Write Chọn chức năng ghi/ đọc
RS=1 : chọn chức năng đọc dữ liệu từ LCD vào VĐK
RS=0 : chọn chức năng ghi dữ liệu từ VĐKvào LCD để hiển thị
6 E Read Write enable
Cho phép/ ko cho phép LCD trao đổi thông tin với
VĐK.
Chờ khi E chuyển từ 10 thì tín hiệu ở các chân D0-
D7 mới được đưa vào LCD.
7 D0
Data bus 0-7
8 chân này được nối với
VĐK để vào/ra thông tin
8 D1
9 D2
10 D3
11 D4
12 D5
13 D6
14 D7
Nhóm 1– Đ3dtvt
Từ những đặc điểm và chức năng đã được đề cập ở trên ta có sơ đồ VDK sau :
3. Nguyên tắc hoạt động
Các chân Vcc Vee Vss : cấp dương nguồn -5V và đất tương ứng thì VEE dùng để điều
khiển chế độ tương phản của LCD.
Chân chọn thanh ghi RS(regiter select):Có hai thanh ghi trong LCD,chân RS được
dùng để chọn thanh ghi,như sau : nếu RS=0 thi thanh ghi mà lệnh được chọn để cho phép
người dùng gửi 1 lệnh chẳng hạn như xóa màn hình,đưa con trỏ về đầu dòng…nếu RS=1
thì thanh ghi dữ liệu được chọn cho phép người dùng gửi dữ liệu cần hiển thị trên LCD.
Chân đọc/ghi (R/W):Đầu vào đọc/ghi cho phép người dùng ghi thông tin trên LCD
khi RW=0 hoặc đọc thông tin từ nó khi RW=1.
Chân cho phép E(Enable):chân cho phép E được sử dụng bởi LCD để chốt dữ liệu
của nó.Khi dữ liệu được cấp đến chân dữ liệu thì một xung mức cao xuống thấp phải được
áp đến chân này để LCD chốt dữ liệu trên các chân dữ liệu.Xung này phải rộng tối thiểu
450ns.
Chân D0-D7: đây là 8 chân dữ liệu 8bit được dùng để gửi nội dung lên LCD hoặc
đọc nội dung của các thanh ghi trong LCD.Để hiển thị các chữ cái và các con số chúng ta
Nhóm 1– Đ3dtvt
sử dụng mã ASCII của các chữ cái từ A-Z,a-f và các con số từ 0-9 đến các chân này khi
RS=1.
Cũng có các mã lệnh được gửi đến LCD để xóa màn hình hoặc đưa con trỏ về đầu
dòng hoặc nhấp nháy con trỏ.
*Chú ý: Chúng ta có thể sử dụng RS=0 để kiểm tra bit bận để xem LCD có sẵn sàng
nhận thông tin.Cờ bận là bít D7 và có thể được đọc thi R/W=1 và RS=0 như sau:
Nếu R/W=1, RS=0, D7=1(cờ bận) thì LCD bận thì LCD bận bởi các công việc bên
trong và sẽ không nhận bất kỳ thông tin mới nào.Khi D7=0 thì LCD sẵn sàng nhận thông
tin mới.Lưu ý chúng ta nên kiểm tra cờ bận trước khi ghi bất kỳ dữ liệu nào lên LCD.
Sau đây là bảng mã lệnh của LCD:
Mã(Hex) Lệnh đến thanh ghi của LCD
1 Xóa màn hình hiển thị
2 Trở về đầu dòng
3 Giảm con trỏ (dịch con trỏ sang bên trái)
4 Tăng con trỏ (dịch con trỏ sang bên phải)
5 Dịch hiển thị sang phải
6 Dịch hiển thị sang trái
7 Tắt con trỏ,tắt hiển thị
8 Tắt hiển thị,bật con trỏ
A Bật hiển thị,tắt con trỏ
C Bật hiển thị,nhấp nháy con trỏ
E Tắt con trỏ,nhấp nháy con trỏ
F Dịch vị trí con trỏ sang trái
10 Dịch vi trí con trỏ sang phải
14
18 Dịch toàn bộ hiển thị sang trái
1C Dịch toàn bộ hiển thị sang phải
80 Ép con trỏ về đầu dòng thứ nhất
C0 Ép con trỏ về đầu dòng thứ 2
38 Hai dòng và ma trận 5x7
Điều khiển LCD qua các bước sau:
- Bước 0: chẩn bị phần cứng.dùng tuốc vít xoay biến trở 5k điều chỉnh độ tương phản của
LCD.Xoay cho đến khi các ô vuông (các điểm ảnh)của LCD hiện lên thì xoay ngược biến trở lại
1 chút.
-Bước 1: Khởi tạo cho LCD.
-Bước 2: Gán giá trị cho các bit điều khiển các chân RS,R/W,EN cho phù hợp với các chế
độ.Hiển thị ký tự lên LCD hay thực hiện 1 lệnh của LCD.
-Bước 3: Xuất byte dữ liệu ra cổng điều khiển 8 bit dữ liệu của LCD.
-Bước 4: Kiểm tra cờ bận xem LCD sẵn sàng nhận dữ liệu mới chưa
-Bước 5: Quay vòng lại bước 1.
4. Lập trình
Nhóm 1– Đ3dtvt
Code :
#include
#include
//------------Khoi tao bien va cac gia tri gan-------------//
sbit RS_LCD = P2^5;
sbit RW_LCD = P2^6;
sbit E_LCD = P2^7;
//---------------Sau day la cac chuong trinh con------------//
unsigned char min,sec,hour,x0,x1;
//ngat do bo dinh thoi 0
void timer0_isr() interrupt 1
{
x0++;
if (x0==100)
{
x0 = 0;
x1++ ;
if (x1 == 100)
{
x1 = 0;
sec ++;
if (sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
}
//--------------Ham tre khoang thoi gian rat ngan phuc vu viec kiem tr co ban---------------//
void delay()
{
unsigned int i;
for(i=0;i<125;i++);
Nhóm 1– Đ3dtvt
}
//--------------Ham kiem tra co ban (busy_flag)--------------??
void kt_ban()
{
unsigned char x;
P0 = 0xff;
RS_LCD = 0;
RW_LCD = 1;
do
{
E_LCD = 1;
delay();
E_LCD = 0;
x=P0;
x=x&0x80;
}
while(x!=0x80);
}
//---------------Ham ghi lenh giao tiep voi LCD---------------//
void ghi_lenh(unsigned char lenh)
{
kt_ban();
P0 = lenh;
RS_LCD = 0; // Chon thanh ghi lenh
RW_LCD = 0; // Chon che do ghi du lieu tu 8051 vao LCD
E_LCD = 1;
delay();
E_LCD = 0;
}//------------*******-----------------//
//-----------Ham ghi ky tu ra LCD------------//
void ghi_kytu(unsigned char kytu)
{
kt_ban();
P0 = kytu;
RS_LCD = 1; // Chon thanh ghi du lieu
RW_LCD = 0; //che do ghi
E_LCD =1;
delay(); //xung cho phep chot du lieu >450ns
E_LCD = 0;
}
//-----------Ham ghi chuoi ky tu ra LCD------------//
void ghi_chuoi(char *str)
{
while(*str)
{
Nhóm 1– Đ3dtvt
// delay(50);
ghi_kytu(*str);
str++;
}
}
//-----------Ham khoi tao LCD------------//
void setting_LCD()
{
ghi_lenh(0x38);
ghi_lenh(0x01); // Xoa man hinh
ghi_lenh(0x0f); // Co dich hien thi
}
/*CHUONG TRINH CHINH */
void main()
{
TMOD = 0x02; //Bit chon che do thu nhat cho timer0
TH0 = 155; //155-255 100 lan dem thi ngat
IE = 0x82; //cho phep ngat tu ben ngoai (ngat ngoai 0)
TR0 = 1; //Cho phep timer0 chay
setting_LCD();
while(1)
{
ghi_lenh(0x80);
ghi_lenh(0x0c);
ghi_chuoi ("Nhom 18-d3dtvt");
ghi_lenh(0xc0);
ghi_lenh(0x0c);
ghi_kytu(hour/10+0x30); // chuyen sag bang ASCII
ghi_kytu(hour%10+0x30);
ghi_kytu(':') ;
ghi_kytu(min/10+0x30);
ghi_kytu(min%10+0x30);
ghi_kytu(':') ;
ghi_kytu(sec/10+0x30);
ghi_kytu(sec%10+0x30);
}
}
Nhóm 1– Đ3dtvt
Hiển thị mô phỏng :
Nhóm 1– Đ3dtvt
BÀI 5 : LED MA TRẬN
1. Nhiệm vụ : Điều khiển LED ma trận 8x8 dòng chữ chạy “NHOM-18”
LED ma trận:
2. Cơ sở lý thuyết
Dựa trên nguyên tắc như quét màng hình,ta có thể thực hiện việc hiển thị ma trận đèn bằng
cách quét theo hàng và quét theo cột.Mỗi led trên ma trận có thễ coi là một điểm ảnh.Địa chỉ của
mỗi điểm ảnh được xác định đồng thời với bộ giải mã hàng và giải mã cột.Điểm ảnh này dược
xác định trạng thái nhờ vi điều khiển 8051.
Như vậy tại mỗi thời điểm chỉ có trạng thái của một điểm ảnh được xác định.Tuy nhiên
khi xác định địa chỉ và trạng thái của điểm ảnh tiếp theo thì các điểm ảnh còn lại sẽ chuyển về
trạng thái tắt(nếu LED đang sáng thì sẽ tắt dần).Vì thế đẻ hiển thị được toàn bộ hình ảnh của ma
trận đèn.Ta có thể quét ma trận nhiều lần với tốc độ quét rất lớn,lớn hơn nhiều lần thời gian tắt
của đèn.Mắt người chỉ nhận biết được tối đa 24hình/s do đó nếu tốc độ quet rất lớn thì sẽ không
nhận ra được sự thay đổi nhỏ của đèn mà sẽ thấy được toàn bộ hình ảnh cần hiển thị.
Nhóm 1– Đ3dtvt
3. Nguyên lý hoạt
động
Muốn cho led sáng ta cấp dương 5V vào hàng,0V vào cột dòng 10mA đến 15mA.
Ví dụ : muốn led ở vị trí 5x4 sáng, ta đưa điện áp cột 4(P0_3) xuống 0V đến hàng
5(P2_5) lên 5V.
Hiển thị chữ : thống kê các điểm sáng thành chữ rồi cho các hàng cột điện áp tương
ứng.Giống như quyét bàn phím đưa điện áp 0V ra từng cột nối với cổng 0. Như vậy sẽ có
8 giá trị: 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F phải đưa vào 1 mảng 8
phần tử,rồi sau đó đưa vào 1 vòng for tăng dần 1 biến để tăng dần phần tử mảng cot[8].
Với mỗi lần 1 chân cổng 0 xuống 0V ta dùng cổng 2 đưa ra 1 giá trị 8 bít để điều khiển
trong 1 cột những đèn nào sáng. Ví dụ muốn hàng 1và hàng 3 sáng thì hàng 1và 3 có giá
trị 5V còn các hàng khác 0V, ta được giá trị 8 bít sau: 0x05 (1010 000). Tại mỗi thời
điểm chỉ có một số đèn trên 1cột sáng,nhưng do ta quét 8 cột với tần sô nhanh, vì mắt có
hiện tượng lưu ảnh nên ta thấy trong 1 thời điểm ta thấy toàn bộ kí tự.Với 8 cột lần lượt
bằng 0V ta phải đưa ra tương ứng 8 giá trị 8 bit ra cổng 2, do đó ta phải lưu 8 giá trị đó
vào 1 mảng 8 kí tự kytu1[8], ta sẽ viết các ký tự trên 7 cột. Để mỗi kí tự sẽ cách nhau
1cột không sáng.Ta khai báo mảng kytu1[9] có 9 phần tử và phần tử đầu tiên có giá trị
đấy ra cổng 2 là 0x00 để tắt toàn bộ cột đó.
Quá trình điều khiển hiển thị như sau:
Cột 1, hàng 1, cột 2 hàng 2, …, cột 8 , hàng 8.
Để làm chữ chạy:
Thêm 1 biến vào để điều khiển thứ tự hiển thị hàng.
Hiện 1 chữ trên led như trên đã đưa ra:
Nhóm 1– Đ3dtvt
Cột 1, hàng 1, cột 2 hàng 2, …, cột 8 , hàng 8.
Muốn chữ đó dịch chuyển sang trái ta hiển thị như sau:
Cột 1, hàng 2, cột 2 hàng 3, …, cột 7, hàng 8,cột 8 , hàng 1 ký tự sau.
Cột 1, hàng 3, cột 2 hàng 4, …, cột 7 hàng 1 ký tự sau,cột 8 , hàng 2 ký tự sau.
4. Lập trình :
Code :
#include
unsigned int m,n,k,p,x,y;
unsigned char hang[8]={0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01};
unsigned char cot[75]={0XFF,0XFF,0XFF,0XFF,
0X00,0X00,0X9F,0XCF,0XE7,0xF3,0X00,0X00, //chu N
0XFF,0X00,0X00,0XE7,0XE7,0X00,0X00,//chu H
0XFF,0XFF,0X81,0X00,0X3C,0X00,0X81, // chu o
0XFF,0X00,0X00,0X9F,0XCF,0XCF,0X9F,0X00,0X00, //chu M
0XFF,0XFF,0XF7,0XF7,0XF7,0XF7, // dau -
0XFF,0XFF,0XFF,0XFF,0XCC,0X00,0X00,0XFC,// so 1
0XFF,0XFF,0X00,0X00,0X24,0X24,0X00,0X00, // so 8
0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,
0XFF,0XFF,0XFF};
void delay(unsigned int t)
{
unsigned int i;
Nhóm 1– Đ3dtvt
for(i=0;i<=t;i++);
}
void scan(void)
{
P3=hang[n];
if(p<=75) P2=cot[p];
if(p>8) P1=cot[p-8];
if(p>16) P0=cot[p-16];
}
void main(void)
{
m=0;
while(1)
{
for(n=0;n<=7;n++)
{
p=n+m;
scan();
delay(100);
}
delay(3000);
Nhóm 1– Đ3dtvt
m++;
if(m==75) m=0;
}
}
Hiển thị trên protus :
Nhóm 1– Đ3dtvt
BÀI 6 : NGẮT NGOÀI – ĐẾM XUNG
1. Ngắt ngoài
a. Xử lý ngắt
Có 5 nguyên nhân tạo ra ngắt (gọi tắt là nguyên nhân ngắt) đối với 8051: hai ngắt do bên
ngoài, hai ngắt do bộ định thời và một ngắt do port nối tiếp. Song cũng có nhiều tài liệu kỹ thuật
nói rằng có 6 ngắt, nguyên nhân là do họ tính cả lệnh RESET, khi ta thiết lập trạng thái ban đầu
cho hệ thống (gọi tắt là reset hệ thống), tất cả các ngắt đều bị vô hiệu hóa (cấm) và sau đó chúng
được cho phép riêng rẽ bằng phần mềm.
Khi xảy ra hai hay nhiều ngắt đồng thời hoặc xảy ra một ngắt trong khi một ngắt khác đang
được phục vụ, ta có 2 sơ đồ xử lý các ngắt: sơ đồ chỗi vòng và sơ đồ hai mức ưu tiên. Sơ đồ
chuổi vòng là sơ đồ cố định, còn sơ đồ ưu tiên ngắt được lập trình bởi người sử dụng.
Khi Reset thì tất cả mọi ngắt đều bị cấm (bị che), có nghĩa là không có ngắt nào được bộ vi
điều khiển đáp ứng nếu chúng được kích hoạt. Các ngắt phải được cho phép bằng phần mềm để
bộ vi điều khiển có thể đáp ứng được. Có một thanh ghi được gọi là cho phép ngắt (Interrupt
Enable) chịu trách nhiệm về việc cho phép (không che) và cấm (che) các ngắt.
IE Register (Interrupt Enable)
EA – bit enable hoặc disable tất cả các interrupt.
EA=0 thì không ngắt nào được nhận.
EA=1 thì từng nguồn ngắt sẽ được mở hoặc cấm bằng cách bật hoặc xóa bit cho phép
tương ứng.
ES – bit enable hoặc disable ngắt cổng nối tiếp.
ES=0 thì không cho phép ngắt nối tiếp.
ES=1 cho phép ngắt nối tiếp.
ET1 – bit enable hoặc disable ngắt tràn của của Timer1.
Nhóm 1– Đ3dtvt
ET1=0 Timer1 không ảnh hưởng đến ngắt.
ET1=1 Timer1 kích hoạt ngắt.
EXT1 – cho phép hoặc cấm ngắt ngoài của Timer1.
EXT1=0 thì sự thay đổi trạng thái của cổng INT0 không ảnh hưởng đến việc ngắt.
EXT1=1 enable ngắt ngoại ngay tại thời điểm INT0 thay đổi trạng thái.
ET0 – bit enable hoặc disable ngắt tràn của Timer0.
ET0=0 Timer0 không ảnh hưởng đến ngắt.
ET0=1 Timer0 kích hoạt ngắt.
EX0 – bit enable hoặc disable ngắt ngòai của Timer0.
EX0=0 thì sự thay đổi trạng thái của INT1 không ảnh hưởng đến việc ngắt.
EX0=1 enable ngắt ngoại ngay tại thời điểm INT1 thay đổi trạng thái.
b. Ngắt ngoài
Ngắt ngoài xả ra khi có mức thấp hoặc có cạnh âm trên chân INT0 hoặc INT1 của 8051.
Đây là các chân đa hợp với 2 chân P3.2 và P3.3 của port .
Thực tế nhờ các cờ tạo ra các ngắt này là các bit IE0 và IE1 của thanh ghi TCON. Khi một
ngắt ngoài được tạo ra, cờ tạo ra ngắt được xóa bỏi phần cứng khi CPU trỏ đến trình phục vụ
ngắt chỉ nếu ngắt thuộc loại tác động cạnh. Nếu ngắt thuộc loại tác động mức, nguyên nhân ngắt
ngoài sẽ điều khiển mức của cờ thay vì là phần cứng trên chip.
Việc chọn các ngắt loại tác động cạnh hay các ngắt loại tác động mức được lập trình thông
qua các bit IT0 và IT1 của thanh ghi TCON. Lấy ví dụ nếu IT1=0, ngắt ngoài 1 được kích khởi
cạnh, ở chế độ này nếu các mẫu liên tiếp ở chân INT1 cho thấy chân này ở mức cao trong một
chu kỳ và ở mức thấp trong chu kỳ kế, cờ ngắt IE1 trong thanh ghi TCON được set bằng 1; kế
đến IE1 yêu cầu một ngắt.
Vì các chân ngắt ngoài được lấy mẫu một lần ở mỗi một chu kỳ máy, các ngõ vào này phải
được duy trì tối thiểu 12 chu kỳ dao động để bảo đảm việc lấy mẫu là đúng. Nếu ngắt ngoài
thuộc loại tác động cạnh, nguyên nhân ngắt ngoài phải được duy trì tại chân yêu cầu ở mức cao
tối thiểu một chu kỳ và sau đó ở mức thấp tối thiệt một chu kỳ nữa để đảm bảo rằng sự chuyển
trạng thái được phát hiện. IE0 và IE1 tự động được xóa khi CPU trỏ tới trình phục vụ ngắt tương
ứng.
Nhóm 1– Đ3dtvt
Nếu ngắt ngoài thuộc loại tác động mức, nguyên nhân ngắt ngoài phải được duy trì trạng thái
tích cực cho đến khi ngắt theo yêu cầu thực sự được tạo ra. Sau đó nguyên nhân ngắt phải ở trạng
thái thụ động trước khi trình phục vụ ngắt được thực thi xong hoặc trước khi có một ngắt khác
được tạo ra.
Thông thường, một công việc được thực thi bên trong trình phục vụ ngắt làm cho nguyên nhân
ngắt trả tín hiệu yêu cầu ngắt trở về trạng thái không tích cực.
2. Lập trình
Code :
#include
#include
//khai bao va dinh nghia
unsigned const t = 100;
unsigned char giay = 0,gio=3,phut=45;
unsigned char date=29,month=9;
//unsigned char count=0;
//dinh nghia LCD
sbit BF = P2^7;
sfr databus=0xA0;
///
sbit rs = P3^0;
sbit rw = P3^1;
sbit e = P3^3;
//chuong trinh tao tre
Nhóm 1– Đ3dtvt
void taotre(long time )
{
long i;
for(i=0;i<time;i++);
}
////
// CAC CHUONG TRINH CUA LCD
//chuong trinh kiem tra co bao ban cua LCD
void ready(void)
{
BF = 1; // de ban dau la 1
rs = 0; //chon thanh ghi lenh
rw = 1; //chon che do doc
while(1)
{
e = 0;// dua noi dung tu thanh ghi lenh ra bus du lieu de xac dinh trang thai co bao
ban
e = 1;
if(BF == 0)
break;
}
}
// chuong trinh ghi lenh dieu khien
void control(unsigned char c) // c phai o dang hexa
Nhóm 1– Đ3dtvt
{
ready();
databus = c;
rs = 0;//chon thanh ghi lenh
rw = 0;//chon che do ghi
e = 1;//dua chan chot tu 1 xuong 0 de day du lieu tren bus vao LCD
e = 0;
}
//khoi tao LCD
void lcd_init(void)
{
control(0x01);// xoa man hinh hien thi truoc do
control(0x38);//0x38:giao tiep 8 bit,hien thi 2 dong va che do 5x8 diem anh
//0x37:giao tiep 8 bit,hien thi 1 dong,kieu ky tu 5x10 diem anh
control(0x0c);//0x0f: bat hien thi,nhap nhay con tro
//0x0c:tat con tro
control(0x06);//dich con tro sang phai 1 vi tri khi co thao tac doc/ghi du lieu tren
DDRAM,nhung
// khong dich toan bo noi dung hien thi.neu muon dich toan
bo thi nap vao 0x05
}
//chuong trinh ghi du lieu
void putchar(unsigned char c)
{
Nhóm 1– Đ3dtvt
ready();
databus = c;
rs = 1;// chon thanh ghi du lieu
rw = 0; // chon che do ghi
e = 1;
e = 0;
}
// chuong trin in sau ki tu
void lcd_putsf(unsigned char *s)//,unsigned char row)
{
unsigned char do_dai;
/*if(row == 1)
control(0x80); //ep con tro ve dau dong thu nhat
else if(row == 2)
control(0xc0);//ep con tro ve dau dong thu hai
*/
do_dai = strlen(s); //lay do dai bien duoc tro boi con tro,strlen(s) la ham lay do dai bien
duoc tro
// boi con tro s
while(do_dai != 0)
{
putchar(*s); //ghi ra LCD du lieu duoc tro boi bien con tro s
s++; //tang gia tri cua bien con tro
Nhóm 1– Đ3dtvt
do_dai--;//tru do_dai di mot don vi,co den khi bang 0 di thoat khoi while
}
}
//hien thi so nguyen
void integer(unsigned int d )
{
unsigned char nghin,tram,chuc,don_vi;
if(d>999)
{
don_vi = d%10; //duoc chuc so hang don vi
d = d/10; //duoc so da bo di hang don vi ->lam viec voi so d moi
//sau moi lan chia cho 10 va lay phan nguyen thi lai duoc 1 so moi
mat di mot hang ben phai
chuc = d%10; //duoc chu so hang chuc
d = d/10;
tram = d%10; // duoc chu so hang tram
nghin = d/10;//duoc hang nghin
putchar(48+nghin);//hien thi hang nghin
putchar(48+tram); //hien thi hang tram
putchar(48+chuc); //hien thi hang chuc
putchar(48+don_vi); //hien thi hang don vi
}
else if((d99))
Nhóm 1– Đ3dtvt
{
don_vi = d%10; //duoc chuc so hang don vi
d = d/10; //duoc so da bo di hang don vi ->lam viec voi so d moi
//sau moi lan chia cho 10 va lay phan nguyen thi lai duoc 1 so moi
mat di mot hang ben phai
chuc = d%10; //duoc chu so hang chuc
d = d/10;
tram = d%10; // duoc chu so hang tram
putchar(48+tram); //hien thi hang tram
putchar(48+chuc); //hien thi hang chuc
putchar(48+don_vi); //hien thi hang don vi
}
else
{
don_vi = d%10; //duoc chuc so hang don vi
chuc = d%10; //duoc chu so hang chuc
putchar(48+chuc); //hien thi hang chuc
putchar(48+don_vi); //hien thi hang don vi
}
/*hien thi so trong bang ma ASSCII thi so 0 co ma la 48,so 1 la 49,cu tiep tuc nhu vay */
putchar(48+nghin);//hien thi hang nghin
putchar(48+tram); //hien thi hang tram
putchar(48+chuc); //hien thi hang chuc
putchar(48+don_vi); //hien thi hang don vi
Nhóm 1– Đ3dtvt
}
//dua con tro toi vi tri bat ky
void lcd_gotoxy(unsigned char x,y) //y la cot y = 0->15, x la hang x = 1,2
{
unsigned char i;
if(x == 1 )
control(0x80); //ep con tro ve dau dong thu nhat
else
control(0xc0); //ep com tro ve dau dong thu 2
if(y<16)
{
for(i=0;i<y;i++)
control(0x14);
}
}
///NGAT NGOAI///////////////////////////////
//khoi tao ngat ngoai 0
void ex_init(void)
{
//EA = 0;//cam cac ngat toan cuc
IT0 = 1;//kich boi suon xuong
EX0 = 1; // cho phep ngat ngoai 0
EA = 1; // cho phep ngat toan cuc
Nhóm 1– Đ3dtvt
}
// ISR cho ngat ngoai 0
void ngatngoai_isr(void) interrupt 0
{
//count++;
//TH0 = 0xf7;
//EX0 = 0;
giay++;
if(giay == 60)
{
giay = 0;
phut++;
if(phut == 60)
{
phut = 0;
gio++;
if(gio == 24)
{
gio = 0;
date++;
if(date == 30)
{
date = 1;
Nhóm 1– Đ3dtvt
month++;
if(month == 12 )
month = 1;
}
}
}
}
// EX0 = 1;
}
/////////////////////////////////
//chuong trinh hien thi so
void hienthi_so(unsigned char q)
{
unsigned char dv,ch;
ch = q/10;
dv = q%10;
putchar(48+ch); //hien thi hang chuc
putchar(48+dv); //hien thi hang don vi
}
//chuong trinh hien thi thoi gian
void hienthi_time(unsigned char h,m,s)
{
Nhóm 1– Đ3dtvt
//hien thi gio
if(h>=13)
{
h = h-12;
lcd_gotoxy(1,4);
hienthi_so(h);
lcd_gotoxy(1,1);
lcd_putsf("pm");
//hien thi dau ':'
lcd_gotoxy(1,6);
lcd_putsf(":");
//hien thi phut
lcd_gotoxy(1,7);
hienthi_so(m);
//hien thi dau ':'
lcd_gotoxy(1,9);
lcd_putsf(":");
//hien thi giay
lcd_gotoxy(1,10);
hienthi_so(s);
}
else if(h == 12)
Nhóm 1– Đ3dtvt
{
lcd_gotoxy(1,4);
hienthi_so(h);
lcd_gotoxy(1,1);
lcd_putsf("pm");
//hien thi dau ':'
lcd_gotoxy(1,6);
lcd_putsf(":");
//hien thi phut
lcd_gotoxy(1,7);
hienthi_so(m);
//hien thi dau ':'
lcd_gotoxy(1,9);
lcd_putsf(":");
//hien thi giay
lcd_gotoxy(1,10);
hienthi_so(s);
}
else
{
lcd_gotoxy(1,4);
hienthi_so(h);
Nhóm 1– Đ3dtvt
lcd_gotoxy(1,1);
lcd_putsf("am");
//hien thi dau ':'
lcd_gotoxy(1,6);
lcd_putsf(":");
//hien thi phut
lcd_gotoxy(1,7);
hienthi_so(m);
//hien thi dau ':'
lcd_gotoxy(1,9);
lcd_putsf(":");
//hien thi giay
lcd_gotoxy(1,10);
hienthi_so(s);
}
}
//hien thi lich
void hienthi_lich(unsigned char dt,mt)
{
//hien thi ngay
lcd_gotoxy(2,6);
hienthi_so(dt);
//hien thi dau '/'
Nhóm 1– Đ3dtvt
lcd_gotoxy(2,8);
lcd_putsf("/");
//hien thi thang
lcd_gotoxy(2,9);
hienthi_so(mt);
//hien thi dau '/'
lcd_gotoxy(2,11);
lcd_putsf("/");
//hien thi nam
lcd_gotoxy(2,12);
integer(2011);
}
//chuong trinh chinh
void main(void)
{
//unsigned char a;
lcd_init();
ex_init();
while(1)
{
//control(0x01);
Nhóm 1– Đ3dtvt
//for(a=0;a<24;a++)
//{
hienthi_time(gio,phut,giay);
hienthi_lich(date,month);
taotre(5000);
// control(0x18);
// }
}
}
Mô phỏng :
Nhóm 1– Đ3dtvt
BÀI 7 : MẠCH ĐO TẦN SỐ
Code :
#include
#include
#include
#define RS P3_5
#define RW P3_6//RW=0 => ghi
#define EN P3_7//RW=1 => doc
//RS=0 => code
//RS=1 => data
#define lcd_PORT P1
#define INTR P3_0
#define RD P3_1
#define WR P3_2
Nhóm 1– Đ3dtvt
//===========================
void delay_ms(int n)
{
int k,j;
for(k=0;k<n;k++)
{
for(j=0;j<500;j++);
}
}
//==========================
void delay_5ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<4;j++){}
}
//===========================
void delay_15ms(){
int i,j;
for(i=0;i<250;i++)
for(j=0;j<100;j++){}
}
Nhóm 1– Đ3dtvt
//============================
void lcd_command(unsigned char c) //CT con ghi du lieu len LCD
{
RS=0;
RW=0;
lcd_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//==============================
void lcd_data(unsigned char c) //CT con doc du lieu tu LCD
{
RS=1;
RW=0;
lcd_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//=============================
void lcd_gotoxy(int x, int y)
{
Nhóm 1– Đ3dtvt
if((x2)&&(y16))
{
x=1;
y=1;
}
if(x == 1)
lcd_command(0x7F+y);
else
lcd_command(0xBF+y);
}
//===============================
void lcd_init() // Khoi tao LCD
{
delay_15ms();
lcd_command(0x38);
lcd_command(0x0C);
// lcd_command(0x06);
lcd_command(0x01); // Xoa man hinh LCD
}
//================================
void lcd_clear()
Nhóm 1– Đ3dtvt
{
lcd_command(0x01);
}
//===============================
void lcd_home()
{
lcd_command(0x80);
}
//=============================
void lcd_putsf(unsigned char *s)
{
while (*s)
{
lcd_data(*s);
s++;
}
}
//============================
void HienThi_ADC(unsigned char t)
{
unsigned char v;
if(t<10)
lcd_data(t+48);
Nhóm 1– Đ3dtvt
else if(t<100)
{
lcd_data(t/10+48);
lcd_data(t%10+48);
}
else
{
v=t/10;
lcd_data(v/10+48);
lcd_data(v%10+48);
lcd_data(t%10+48);
}
}
void main (void)
{
unsigned char gt=0; //gt la bie^n' cho gia tri 8bit ADC
lcd_init();
lcd_command(0x83);
lcd_putsf("8051 & ADC");
while(1)
{
Nhóm 1– Đ3dtvt
WR=0; // Bat dau chuyen doi gia tri tu ADC
delay_ms(5); // Tao tre de cap nhat du lieu tu ADC
WR=1; //
while(!INTR);
RD=0; // Nhan du lieu da duoc chuyen doi
gt=P2;
lcd_command(0x01);
lcd_command(0x83);
lcd_putsf("8051 & ADC");
lcd_command(0xC0);
lcd_putsf("Nhiet do:");
HienThi_ADC(gt);
delay_ms(150);
}
}
Mô phỏng :
Nhóm 1– Đ3dtvt
Nhóm 1– Đ3dtvt
BÁO CÁO THỰC TẬP VI XỬ LÝ
Đề tài : LED CUBE 8X8X8
1. Tìm hiểu chung
1.1 Atmega32
Atmega16 có cấu trúc RISC với:
+131 lệnh,hầu hết được thực thi trong 1 chu kì xung nhịp.
+32x8 thanh ghi đa dụng
+Full static operation
+Tốc độ làm việc 16MPIS,với thạch anh 16MHz
- Bộ nhớ:
+32KB ISP Flash với khả năng 10.000lần ghi/xóa
+1024 Byte EEROM
+2KB SRAM ngọai
* Giao tiếp JTAG
+Khả năng quét toàn diện theo chuẩn JTAG
+Hỗ trợ khả năng go roi
+Hỗ trợ lập trình Flash,EEROM,fuse…
+Lock bit qua giao tiếp JTAG
* Ngọai vi:
+2 timer/counter 8 bit với các mode :so sánh và chia tần số
+1 timer/counter 16 bit với các mode:so sánh,chia tần số,capture,PWM
+1 timer thời gian thực(Real time clock) với bộ dao động riêng biệt
+4 kênh PWM(họăc nhiều hơn trong các VĐK khác thuộc họ này)
Nhóm 1– Đ3dtvt
+8 kênh biến đổi ADC 10bit
+Hỗ trợ giao tiếp I2C
+Bộ giao giao tiếp nối tiếp lập trình được USART
+Giao tiếp SPI
+Watch_dog timer với bộ dao động on-chip riêng biệt
* Những thuộc tính đặc biệt:
+Power On reset và Brown-out detection
+chế độ hiệu chỉnh bộ sai số cho bộ dao động RC On-chip
+Các chế độ ngắt ngòai và trong đa dạng
+6 mode sleep:Idle,ADC noise reduction,tiết kiệm năng lượng,power-down,
standby,extended standby
* I/O port:
+32 chân I/O(Atmega16) và 21 chân I/O (Atmega8) lập trình được
+vỏ 40 chaân (Atmega16) ,28 chân(Atmega8),64 chân(AT90can128);
* Nguồn cấp:
2,7->5.5 V với ATmega32L
4.5->5.5V với ATmega32H
* Tiêu hao năng lượng:
+Khi họat động tiêu thụ dòng 1,1mA
+Ở mode Idle tiêu thụ dòng 0.35mA
+Ở chế độ Power_down tiêu thụ dòng nhỏ hơn 1uA
* Đây là những chức năng cơ bản thường thấy trong các Vi điều khiển
AVR,ngòai ra trong các vi điều khiển khác thuộc dòng vi điều khiển này thì
thường được hỗ trợ thêm những chức năng đặc biệt.Ví dụ AT90can128 hỗ trợ
thêm bộ giao tiếp mạng Can bus on-chip
Nhóm 1– Đ3dtvt
* Các phần mềm lập trình cho AVR:
+ AVRStuido (free), Code Vision. Các phần mềm này có hỗ trợ phần nạp và
debug on chip
1.2 ULN2803
Nguyên lý hoạt động của ULN2803:
ULN2803 dùng để đệm dòng (khuếch đại dòng). Nó biến đổi chân đầu vào 1 thành
0, nếu đầu vào là 0 đầu ra không xác định.
Nhóm 1– Đ3dtvt
1.3 IC 74HC595
Chân 11 là chân xung clock. Khi có 1xung từ thấp lên cao thì nhận 1 bit dữ liệu
vào chân Data.
Chân 14 là chân data cho từng bit dữ liệu khi có xung vào chân 11. Các bit dữ liệu
này dịch từ chân QA tới chân QH, nếu các bit đầy QA đến QH thì dữ liệu tràn
xuống chân 9 là chân SDO (chân tràn)
Chân 12 là chân chốt dữ liệu (STR). dữ liệu sau khi được đưa vào chân data, khi
có xung từ 0 lên 1 vào chân STR thì dữ liệu sẽ được xuất ra khỏi IC74hc595.
Nhóm 1– Đ3dtvt
2.Mach nguyên lý điều khiển led cube 8x8x8
Ta sử dụng chân PC0 làm chân xuất data từ vi điều khiển vào chân data của
IC74hc5995. Chân PC1 chân chốt dữ liệu cho 74hc595. Chân PC2 làm chân xuất
xung clock cho chân CLK của 74hc595.
Nhóm 1– Đ3dtvt
Ta dùng PORTA để xuất dữ liệu cho ULN2803 điều khiển các tầng của led cube.
Mỗi tầng tương ứng với 1bit của PORTA.
ta sử dụng các chân CLK, STR, DATA để đưa dữ liệu từ vi điều khiển tới 64 cột
thông qua 8 con 74hc595
Nhóm 1– Đ3dtvt
4.Lập trình hiển thị led cube 8x8x8
Mạch led cube gồm 8 tầng mắc cathode chung, mỗi tầng được điều khiển 1bit của
PORTA thông qua con ULN2803. Vì đặc điểm của ULN2803 biến 1 thành 0, nên
ta sẽ xuất các tín hiệu 1 từ bit của PORTA của vi điều khiển điều khiển cho led
sáng khi chân anode của led có tín hiệu 1.
64 cột của led cube tương ứng với 8temp mỗi temp 8bit để điều khiển led sáng
tương ứng.
Code lập trình một số hiệu ứng đơn giản
#include
#include
#define DATA PORTC.0
#define chot PORTC.1
#define xung PORTC.2
#define mat PORTA
#define L1 PORTA.0
#define L2 PORTA.1
#define L3 PORTA.2
#define L4 PORTA.3
#define L5 PORTA.4
#define L6 PORTA.5
#define L7 PORTA.6
#define L8 PORTA.7
unsigned char temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,;
unsigned char i,j;//k,c;
Nhóm 1– Đ3dtvt
void hienthi(unsigned char x)
{
unsigned char i,temp;
for(i=0;i<8;i++)
{
temp=x;
temp=temp&0x80;
if(temp==0x80)
DATA=1;
else
DATA=0;
x*=2;
xung=0;
xung=1;
}
}
void xuat()
{
hienthi(temp1);
hienthi(temp2);
hienthi(temp3);
hienthi(temp4);
Nhóm 1– Đ3dtvt
hienthi(temp5);
hienthi(temp6);
hienthi(temp7);
hienthi(temp8);
chot=0;
chot=1;
}
void tat()
{
hienthi(0x00);
hienthi(0x00);
hienthi(0x00);
hienthi(0x00);
hienthi(0x00);
hienthi(0x00);
hienthi(0x00);
hienthi(0x00);
chot=0;
chot=1;
}
void dtvt(unsigned char m)
{
for(i=0;i<=m;i++)
{
Nhóm 1– Đ3dtvt
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x07;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x07;temp4=0x00;temp5=0x00;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x07;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x07;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x07;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x07;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x07;temp4=0x00;temp5=0x00;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x07;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L1=1;delay_ms(1);L1=0;
}
for(i=0;i<=m;i++)
{
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x1c;temp6=0x1c;temp7=0x00;temp
8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x1c;temp4=0x00;temp5=0x00;temp6=0x1c;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x1c;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x1c;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x1c;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x1c;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
Nhóm 1– Đ3dtvt
temp1=0x00;temp2=0x1c;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x1c;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x1c;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x1c;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x1c;temp4=0x00;temp5=0x00;temp6=0x1c;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x1c;temp6=0x1c;temp7=0x00;temp
8=0x00;xuat();L1=1;delay_ms(1);L1=0;
}
for(i=0;i<=m;i++) //d
{
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x70;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x70;temp4=0x00;temp5=0x00;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x70;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x70;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x70;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x70;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x70;temp4=0x00;temp5=0x00;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x70;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L1=1;delay_ms(1);L1=0;
}
Nhóm 1– Đ3dtvt
for(i=0;i<=m;i++) //t
{
temp1=0x00;temp2=0x07;temp3=0x07;temp4=0x07;temp5=0x07;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //t
{
temp1=0x00;temp2=0x1c;temp3=0x1c;temp4=0x1c;temp5=0x1c;temp6=0x07;temp7=0x00;temp
8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
Nhóm 1– Đ3dtvt
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //t
{
temp1=0x00;temp2=0x70;temp3=0x70;temp4=0x70;temp5=0x70;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //v
{
//temp1=0x00;temp2=0x80;temp3=0x80;temp4=0x80;temp5=0x80;temp6=0x80;temp7=0x00;te
mp8=0x00;xuat();L8=1;delay_ms(1);L8=0;
Nhóm 1– Đ3dtvt
temp1=0x;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;temp8
=0x07;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x07;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x07;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x07;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x07;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x07;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x07;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x07;temp4=0x00;temp5=0x00;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x07;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //v
{
//temp1=0x00;temp2=0x80;temp3=0x80;temp4=0x80;temp5=0x80;temp6=0x80;temp7=0x00;te
mp8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x1c;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x1c;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x1c;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x1c;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x1c;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x1c;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x1c;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x1c;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x1c;temp4=0x00;temp5=0x00;temp6=0x1c;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
Nhóm 1– Đ3dtvt
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x1c;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //v
{
//temp1=0x00;temp2=0x80;temp3=0x80;temp4=0x80;temp5=0x80;temp6=0x80;temp7=0x00;te
mp8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x70;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x70;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x70;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x70;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x70;temp2=0x00;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x70;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x70;temp3=0x00;temp4=0x00;temp5=0x00;temp6=0x00;temp7=0x70;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x70;temp4=0x00;temp5=0x00;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x70;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //t
{
temp1=0x00;temp2=0x07;temp3=0x07;temp4=0x07;temp5=0x07;temp6=0x07;temp7=0x00;tem
p8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
Nhóm 1– Đ3dtvt
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x07;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //t
{
temp1=0x00;temp2=0x1c;temp3=0x1c;temp4=0x1c;temp5=0x1c;temp6=0x07;temp7=0x00;temp
8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x1c;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
for(i=0;i<=m;i++) //t
{
Nhóm 1– Đ3dtvt
temp1=0x00;temp2=0x70;temp3=0x70;temp4=0x70;temp5=0x70;temp6=0x70;temp7=0x00;tem
p8=0x00;xuat();L8=1;delay_ms(1);L8=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L7=1;delay_ms(1);L7=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L6=1;delay_ms(1);L6=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L5=1;delay_ms(1);L5=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L4=1;delay_ms(1);L4=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L3=1;delay_ms(1);L3=0;
temp1=0x00;temp2=0x00;temp3=0x00;temp4=0x70;temp5=0x00;temp6=0x00;temp7=0x00;tem
p8=0x00;xuat();L2=1;delay_ms(1);L2=0;
}
}
void main(void)
{
PORTA=0x00; DDRA=0xFF;
PORTB=0x00; DDRB=0x00;
PORTC=0x00; DDRC=0x07;
PORTD=0x00; DDRD=0x00;
TCCR0=0x00; TCNT0=0x00; OCR0=0x00
TCCR1A=0x00; TCCR1B=0x00;
TCNT1H=0x00; TCNT1L=0x00;
ICR1H=0x00; ICR1L=0x00;
Nhóm 1– Đ3dtvt
OCR1AH=0x00; OCR1AL=0x00;
OCR1BH=0x00; OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00; MCUCSR=0x00
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
while (1)
{ tat();
phaohoa(25);
hinhhopgoc1(30);
hinhhopgoc3(30);
hinhhopgoc2(30);
hinhhopgoc4(30);
//khung1(100,1);
danglen(100,1);
quet1(100,1);
quet2(100,1);
cheo2(20);
// khung1(100,1);
quacau(20);
Nhóm 1– Đ3dtvt
hinhhoptrungtam(10);
traitim2(10,1);
traitimdac(30);
dtvt(25);
};
}
Các file đính kèm theo tài liệu này:
- 69107412_ttvxl_d3dtvt_epu_9992.pdf