Báo cáo thực tập chuyên môn BÁO CÁO THỰC TẬP THIẾT KẾ MẠCH VÀ LẬP TRINH CHO PIC 16F877A Nội dung: - Tìm hiểu về vi xử lý PIC16F877A của Microchip - Thiết kế một PIC KIT gồm 4 module: nút
Trang 1Báo cáo thực tập chuyên môn
BÁO CÁO THỰC TẬP THIẾT KẾ MẠCH VÀ LẬP TRINH CHO PIC 16F877A
Nội dung:
- Tìm hiểu về vi xử lý PIC16F877A của Microchip
- Thiết kế một PIC KIT gồm 4 module: nút nhấn, led đơn, LCD, UART
- Viết chương trình điều khiển hoạt động của 4 module trên
I Tổng quan về PIC 16F877A
1 Sơ đồ chân của PIC 16F877A
PIC16F877A có 5 cổng vào/ra đa chức năng: PORTA, PORTB, PORTC, PORTD, PORTE
Mặc định: PORT A là các đầu vào tương tự Để sử dụng PORT A như các cổng vào/ra số cần thiết lập tham số cho thanh ghi ADCON1 (ADCON1 = 0x06, 0x07)
Trang 2+ Điều khiển chức năng cổng là vào hay ra bằng thanh các thanh ghi TRISA, TRISB, TRISC, TRISD, TRISE
+ Xuất dữ liệu ra cổng, hoặc nhận dữ liệu từ cổng chỉ đơn giản bằng sử dụng phép gán
- Chân OSC1/CLKI(13) : là ngõ vào kết nối với dao động thạch anh hoặc ngõ vào nhận xung clock bên ngoài
+.OSC1 : ngõ vào dao động thạch anh hoặc ngõ vào nguồn xung bên ngoài Ngõ bòa có mạch schmitt trigger nếu sử dụng dao động RC
+ CLKI : ngõ vào nguồ xung bên ngoài
- Chân OSC2/CLKO(14) : là ngõ ra dao động thạch anh hoặc ngõ ra cấp xung clock
+ OSC2 : ngõ ra dao động thạch anh Kết nối đến thạch anh hoặc bộ cộng hưởng
+ CLKO : ở chế độ RC, ngõ ra của OSC2 bằng ¼ tần số của OSC1 và chính
là tốc độ của chu kì lệnh
+ Vpp : khi lập trình cho pic thì đóng vai trò là ngõ vào nhận điện áp lập trình
- Chân RA0 / AN0 (2) : có 2 chức năng
+ RA0 : xuất nhập số
+ AN0 : ngõ vào tương tự của kênh thứ 0
- Chân RA1/ AN1 (3) :
+ RA1 : xuất nhập số
+ AN1 : ngõ vào tương tự của kênh thứ 1
- Chân RA2/ AN2/ VREF-/CVREF (4) :
+ RA2 : xuất nhập số
+ AN2 : ngõ vào tương tự của kênh thứ 2
+ VREF- : ngõ vào điện áp chuẩn (thấp) của bộ A/D
+ CVREF : điện áp tham chiếu VREF ngõ ra bộ so sánh
- Chân RA3/ AN3/ VREF+ (5) :
+ RA3 : xuất nhập số
+ AN3 : ngõ vào tương tự của kênh thứ 3
+ VREF+ : ngõ vào điện áp chuẩn (cao) của bộ A/D
- Chân RA4/ TOCKI/ C1OUT (6) :
+ RA4 : xuất nhập số - mở khi được cấu tạo ngõ ra
+ TOCKI : ngõ vào xung clock bên ngoài cho timer 0
+ C1OUT : ngõ ra bộ so sánh 1
+ RA5 : xuất nhập số
Trang 3Báo cáo thực tập chuyên môn
+ AN4 : ngõ vào tương tự của kênh thứ 4
+ C2OUT : ngõ ra bộ so sánh 2
- Chân RB0 /INT (33) : có 2 chức năng
+ RB0 : xuất nhập số
+ INT : ngõ vào nhận tín hiệu ngắt ngoài
- Chân RB1(34) : xuất nhập số
- Chân RB2(35) : xuất nhập số
- Chân RB3/PGM(36) :
+ RB3 :xuất nhập số
+ Chân cho phép lập trình điện áp thấp ICSP
- Chân RB4(37)và RB5(38) : xuất nhập số
- Chân RB6/ PGC (39) :
+ RB6 : xuất nhập số
+ PGC : mạch gỡ rối và xung clock lập trình ICSP
- Chân RB7/ PGD (40) :
+ RB7 : xuất nhập số
+ PGD : mạch gỡ rối và dữ liệu lập trình ICSP
- Chân RC0/T1OCO/T1CKI (15) :
+ RC0 : xuất nhập số
+ T1OCO : ngõ vào bộ dao động timer 1
+ T1CKI : ngõ vào xung clock bên ngoài timer1
- Chân RC1/T1OSI/CCP2 (16) :
+ RC1 : xuất nhập số
+ T1OSI : ngõ vào bộ dao động timer 1
+ CCP2 : ngõ vào capture2, ngõ ra compare2, ngõ ra PWM2
- Chân RC2/CCP1 (17):
+ RC2 : xuất nhập số
+ CCP1: ngõ vào capture1, ngõ ra compare1, ngõ ra PWM1
- Chân RC3/SCK/SCL (18) :
+ RC3 : xuất nhập số
+ SCK : ngõ vào xung clock nối tiếp đồng bộ, ngõ ra của chế độ SPI
+ SCL : ngõ vào xung clock nối tieepos đồng bộ/ ngõ ra của chế độ I2C
- Chân RC4/ SDI/ SDA (23)
+ RC4 : xuất nhập số
+ SDI : dữ liệu vào SPI
- Chân RC5/ SDO (24)
+ RC5 : xuất nhập số
+ SDO : dữ liệu ra SPI
Trang 4- Chân RC6/ TX/ CK (25)
+ RC6 : xuất nhập số
+ TX : truyền bất đồng bộ USART
+ CK : xung đồng bộ USART
- Chân RC7/RX/ DT (26)
+ RC7 : xuất nhập số
+ RX : nhận bất đồng bộ USART
+ DT : dữ liệu đồng bộ USART
- Chân RD0/ PSP0 (19)
+ RD0 : xuất nhập số
+ PSP0 : dữ liệu port tớ song song
- Chân RD1/ PSP1 (20)
+ RD1 : xuất nhập số
+ PSP1 : dữ liệu port tớ song song
- các chân RD2/PSP2 (21), RD3/PSP3 (22), RD4/PSP4 (27), RD5/PSP5 (28), RD6/PSP6 (29), RD7/PSP7(30) tương tự chân 19, 20
+ RE0 : xuất nhập số
+ AN5 : ngõ vào tương tự 5
+ RE1 : xuất nhập số
+ AN6 : ngõ vào tương tự kênh thứ 6
+ RE2 : xuất nhập số
+AN7 : ngõ vào tương tự kênh thứ 7
- Chân VDD(11,32) và VSS (12, 31) là các chân nguồn của pic
Trang 5Báo cáo thực tập chuyên môn
2 Cấu trúc bên trong của PIC 16f877A
Trang 6Điện tử tin học công nghiệp K48 6
Trang 7Báo cáo thực tập chuyên môn
- Khối ALU:
- Khối bộ nhớ chứa chương trình
- Khối bộ nhớ chứa dữ liệu EEPROM
- Khối bộ nhớ file thanh ghi RAM
- Khối giải mã lệnh và điều khiển - IDC
- Khối thanh ghi đặc biệt
- Khối ngoại vi timer
- Khối giao tiếp nối tiếp USART
- Khối chuyển đổi tín hiệu tương tự sang số
- Khối các Port xuất nhập
3 Một số đặc điểm của PIC 16F877A
Vi xử lý PIC16F877A thuộc họ vi điều khiển PIC do hãng Atmel sản xuất, là bộ xử
lý RISC với cấu trúc kiểu Harvard (đơn vị trung tâm có bộ nhớ chương trình và bộ nhớ
dữ liệu tách biệt) Chip xư lý tốc độ cao, tiêu thụ năng lượng thấp
- Tập lệnh gồm 35 lệnh có độ dài 14bit
- Tốc độ hoạt động tối đa cho phép là 20MHz với một chu kì lệnh là 200ns
8K*14bit bộ nhớ chương trình
- Bộ nhớ dữ liệu 368*8 byte RAM
- Bộ nhớ dữ liệu EEPROM với dung lượng 256*8 byte
- Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit
- Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep.
- Timer2: bộ đếm 8 bit
- Hai bộ Capture/so sánh/ điều chế độ rộng xung
- Hỗ trợ các chuẩn giao tiếp nối tiếp SSP, SPI, I2C
- Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
- 8 kênh chuyển đổi ADC 10 bit
- Bộ nhớ Flash với khả năng ghi xóa được 100000 lần
- Bộ nhớ EEPROM với khả năng ghi xóa 1000000 lần
Thiết bị ngoại vi và tính năng:
- 02 timer/counter 8 bit
- 01 timer/counter 16 bit
- 02 modules PWM độ phân giải 10 bit
Trang 8- Có hỗ trợ giao tiếp SPI và I 2 C
- 01 USART
- 08 kênh ADC 10 bit
- Điện áp hoạt động từ 2V đến 5.5V
4 Tổ chức bộ nhớ
- Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ flash, dung lượng bộ nhớ 8 K word (1 word= 14 bit) và được phân thành nhiều trang (từ trang 0 đến trang 3) Như vậy bộ nhớ chương trình có khả năng chứa được 8*1024 = 8192 lệnh Để mã hóa được địa chỉ của 8 k word bộ nhớ chương trình, bộ đếm chương tình có dung lượng 13 bit Khi vi điều khiển được reset,
bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h
- Bộ nhớ chương trình không bao gồm bộ nhớ stack và không được địa chỉ hóa bởi bộ đếm chương trình
Trang 9Báo cáo thực tập chuyên môn
Lớp: ĐT&THCN - 48
II Thiết kế PIC KIT sử dụng vi xử lý PIC16F877A
1 Mạch nguyên lý
R C 7
D 2
L E D
P 1
C O N N E C T O R D B 9
5
4
7
6
M C L R
R D 6
R 1 6
R
+ 5 V
G N D
R C 6
R A 5
D 1
L E D
C 7
C A P N P
R B 3
R D 7
S W 2
S W P U S H B U T T O N
R 4 R
O S C 1
R E 0
R B 4
+ 5 V
S W 1
C A P N P
O S C 2
R E 1
D 5
L E D
R 6 R
J 2
C O N 3
1 2 3
R B 5
G N D
1
3
6
8
1 0
1 2
1 4
1 6
1 9
2 1
2 3
2 6
2 8
3 0
3 2
3 4
3 6
3 9
M C L R / V p p
R A 0 / A N 0
R A 2 / A N 2 / V r e f - / C V r e f
R A 3 / A N 3 / V r e f +
R A 4 / T O C K 1 / C 1 O U T
R A 5 / A N 4 / S S / C 2 O U T
R E 0 / R D / A N 5
R E 1 / W R / A N 6
R E 2 / C S / A N 7
V d d
O S C 1 / C L K I
O S C 2 / C L K O
R C 0 / T 1 O S O / T 1 C K 1
R C 1 / T 1 O S I / C C P 2
R C 2 / C C P 1
R C 3 / S C K / S C L
R D 0 / P S P 0
R D 2 / P S P 2
R C 4 / S D I / S D AR C 5 / S D O
R C 6 / T X / C K
R C 7 / R X / D TR D 4 / P S P 4
R D 6 / P S P 6
V s s
R B 0 / I N TR B 1
R B 3 / P G MR B 4
R B 6 / P G C
G N D
R E 2
G N D
C 1 2
C A P
D 3
L E D
C 1 0
R 1 2 R
+ 5 V
+ 5 V
T 2 O U T
S W 5
S W P U S H B U T T O N
C 9
C A P
S W 3
S W P U S H B U T T O N
G N D
R 2 I N T
U 2
M A X 2 3 2 _ 1
5
6
7
8
1 3
1 4
1 5
1 6
C 2
V
-T 2 O U -T
R 2 I N
R 1 I N
T 1 O U T
G N D
V C C
R 1 R
R 9 R
M C L R
T 2 O U T
D 6
L E D
R 7 R
R 5 R
R 1 4
R E S I S T O R V A R
C 5
C A P N P
R A 5
R 2 I N T
D 1 0
R 2 R
C 1 1
C A P
R E 0
G N D
R 1 3 R
D 4
L E D
R D 1
R E 1
R 1 5
R E S I S T O R V A R
+ 5 V
R B 0
R 1 0 R
C 1 3
C A P
R D 0
C 1
C A P N P
U 4
L M 7 8 0 5 C / T O
I N O U T
R E 2
+ 5 V
R B 1
R D 2
J 1
C O N 5
1 2 3 4 5
D 7
L E D
R B 7
O S C 2
C 6
C A P N P
L C D 1
1 6 x 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
G V
R E D D D D A K
R B 2
D 9
D I O D E
S W 4
S W P U S H B U T T O N
R D 3
R B 6
O S C 1
Y 1
Z T A
R 3 R
< T i t l e >
B
W e d n e s d a y , J u n e 0 9 , 2 0 1 0
T i t l e
R D 4
C 3
C A P N P
D 8
L E D + 5 V
C 8
C A P
G N D
R 8 R
R D 5
C 2
C A P N P
R 1 1 R
G N D + 5 V
2 Mạch in:
9
Trang 10-III Chương trình điều khiển hoạt động của KIT
1 Nháy led
int i;
int ma[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; int ma1[]={0xff,0x7e,0x3c,0x18,0x00};
int ma2[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; void main()
{
trisD=0;
portD=0;
while(1)
{
for(i=0;i<8;i++)
{
portD=ma[i];
10
Trang 11-Báo cáo thực tập chuyên môn
Lớp: ĐT&THCN - 48
delay_ms(500);
}
for(i=7;i>=0;i )
{
portD=ma[i];
delay_ms(500);
}
for(i=0;i<5;i++)
{
portD=ma1[i];
delay_ms(500);
}
for(i=4;i>=0;i )
{
portD=ma1[i];
delay_ms(500);
}
portD=0x00;
for(i=0;i<8;i++)
{
portD=ma2[i];
delay_ms(500);
}
}
}
2 Hiển thị chữ trên LCD
void main(){
11
Trang 12char text[16] ="Truong DHGTVT";
char text1[16] ="Dien - Dien Tu";
char i=0;
PORTB = 0x00;
TRISB = 0x00;
while(1)
{
Lcd_Init(&PORTB);
Lcd_Cmd(LCD_CLEAR);
Lcd_Cmd(LCD_CURSOR_OFF);
for(i=1;i<13;i++)
{
Lcd_Chr(1,i,text[i-1]);
delay_ms(100);
}
for(i=1;i<15;i++)
{
Lcd_chr(2,i,text1[i-1]) ;
delay_ms(100);
}
{
lcd_cmd(lcd_clear);
lcd_out(1,1," Dien Tu k48 "); delay_ms(1000);
lcd_out(2,1,"wellcome(^_^)!!"); delay_ms(1000);
}
}
}
3 Phím bấm
int ma[]={0x0f,0x1f,0x2f,0x4f,0x8f};
12
Trang 13-Báo cáo thực tập chuyên môn
Lớp: ĐT&THCN - 48
int ma1[]={0x0f,0x1f,0x3f,0x7f,0xff} ; int ma2[]={0x0f,0x3f,0xcf};
int i,j,n;
char text[16] ="Truong DHGTVT"; char text1[15] ="Dien - Dien Tu"; unsigned int so;
void hienthi(unsigned int data)
{
unsigned char a,b,c,d;
a=data/1000;
b=(data%1000)/100;
c=(data%100)/10;
d=data%10;
Lcd_Cmd(LCD_CLEAR);
Lcd_Cmd(LCD_CURSOR_OFF); Lcd_out(1,1,"GIA TRI DOC ===>") ; Lcd_Out(2,1,"ADC :");
Lcd_chr(2,6,a+48);
Lcd_chr(2,7,b+48);
Lcd_chr(2,8,c+48);
Lcd_chr(2,9,d+48);
so=Adc_Read(0);
delay_ms(500);
}
void hienthi1(void)
{
Lcd_Cmd(LCD_CLEAR);
Lcd_Cmd(LCD_CURSOR_OFF); for(i=1;i<14;i++)
{
Lcd_Chr(1,i,text[i-1]);
delay_ms(300);
}
for(i=1;i<15;i++)
{
Lcd_chr(2,i,text1[i-1]) ;
delay_ms(300);
}
{
13
Trang 14lcd_cmd(lcd_clear);
lcd_out(1,1," dien tu k48 ");
delay_ms(1000);
lcd_out(2,1,"wellcome(^_^) !!"); delay_ms(1000);
}
for (i=0;i<=4;i++)
{
Porte= ma[i] ;
portd= ma[i];
delay_ms(300);
}
for (i=4;i>=0;i )
{
porte= ma[i];
portd= ma[i];
delay_ms(300);
}
for (j=0;j<=4;j++)
{
porte= ma1[j];
portd= ma1[j];
delay_ms(300);
}
for (j=4;j>=0;j )
{
porte= ma1[j];
portd= ma1[j];
delay_ms(300);
}
}
void nhayled(void)
{
for (j=0;j<=4;j++)
{
porte= ma1[j];
portd= ma1[j];
delay_ms(300);
14
Trang 15-Báo cáo thực tập chuyên môn
Lớp: ĐT&THCN - 48
}
for (j=4;j>=0;j )
{
porte= ma1[j];
portd= ma1[j];
delay_ms(300);
}
for(n=0;n<=2;n++)
{
porte=ma2[n];
portd=ma2[n];
delay_ms(300);
}
for(n=2;n>=0;n )
{
porte=ma2[n];
portd=ma2[n];
delay_ms(300);
}
portc=0x0f;
portd=0xff;
delay_ms(500);
portc=0xff;
portd=0x0f;
delay_ms(500);
portc=0x0f;
portd=0x0f;
delay_ms(500);
portc=0xff;
portd=0xff;
delay_ms(500);
}
void main()
{
TrisD=0x00;
PortD=0x00;
TrisE=0x0f;
PortE=0x0f;
TRISB = 0x00;
trisA=0xff;
15
Trang 16do {
if (Button(&PORTE, 1, 10, 0))
{
hienthi1();
}
if (button(&portE, 2, 10, 0))
{
nhayled();
}
hienthi(so);
}while(1);
}
4 Đọc ADC tu kênh 0 rồi hiển thị lên LCD
unsigned int so,i;
void hienthi(unsigned int data)
{
unsigned char a,b,c,d;
a=data/1000;
b=(data%1000)/100;
c=(data%100)/10;
d=data%10;
Lcd_Cmd(LCD_CLEAR);
Lcd_out(1,1,"GIA TRI DOC") ;
Lcd_Out(2,1,"ADC :");
Lcd_chr(2,6,a+48);
Lcd_chr(2,7,b+48);
Lcd_chr(2,8,c+48);
Lcd_chr(2,9,d+48);
}
void main()
{
trisA=0xff;
PortA=0xff;
TrisB=0x00;
16
Trang 17-Báo cáo thực tập chuyên môn
Lớp: ĐT&THCN - 48
Lcd_init(&portB) ;
lcd_cmd(lcd_clear);
lcd_cmd(lcd_cursor_off);
while(1)
{
so=Adc_Read(0);
hienthi(so);
delay_ms(500);
}
}
5 Truyền thông UART
unsigned char i;
void main()
{
Usart_Init(9600);
while(1)
{
for(i=0;i<8;i++)
Usart_Write(i+48);
delay_ms(1000);
Usart_Write('\n');
Usart_Write('\r');
}
}
6.Truyền thông UART hiển thị chữ
unsigned char i;
void main()
{
Usart_Init(9600);
while(1)
{
Usart_Write('T');
Usart_Write('H');
Usart_Write('A');
Usart_Write('N');
Usart_Write('H');
Usart_Write('L');
Usart_Write('O');
Usart_Write('A');
Usart_Write('N');
17
Trang 18delay_ms(1000);
Usart_Write('\n');
Usart_Write('\r');
}
}
18