C: VI ĐIỀU KHIỂN PIC
6. Giới thiệu một vài linh kiện được lựa chọn
6.6: Ngoài ra còn 1 số loại linh kiện khác
Nút nhấn button :
Nút bấm được chọn làm nút Reset và nút bấm dán dùng làm ma trận phím 4x4.
Là công tắc thường mở, khi nhấn sẽ ở trạng thái đóng (nối) mạch.
Nút bấm và nút bấm dán
SW-DIP
Dùng để bắt dây điện. Có thể dùng để lấy nguồn từ biến áp.
Thạch anh
Header 40 pins:
CHƯƠNG 3: MỘT SỐ BÀI THỰC HÀNH
Để điều khiển hoạt động của thiết bị ta cần viết chương trình cho vi điều khiển hoặc điều khiển trực tiếp bằng máy vi tính thông qua cổng COM. Atmega 32 có thể được lập trình bằng ngôn ngữ Assembly hoặc cũng có thể được lập trình bằng ngôn ngữ C. Do tính tiện dụng, trình bày khoa học và dễ dàng cho việc debug, chúng em quyết định lựa chọn ngôn ngữ C được viết bằng CodevisionAVR. Là trình biên dịch ngôn ngữ lập trình C cho vi điều khiển AVR của Atmel, CodeVisionAVR được phát triển bởi HP InfoTech, tích hợp đầy đủ trình biên dịch, môi trường soạn thảo tích hợp Development Environment (IDE) trên nền hệ điều hành Windows.
Các tập bài thực hành mẫu :
Bài 1. Chương trình hiển thị led đơn
Mục đích: Giúp sinh viên làm quen với việc điều khiển tín hiệu ra của vi điều khiển và hiển thị trực quan lên LED đơn.
#include <mega32.h> void delay (unsigned int ms) { unsigned char i; while(ms--) { for(i=0;i<150;i++) {}; } } void main(void) { while (1) { PORTB = 0xff; delay(1000); PORTB = 0xfe; delay(1000); PORTB = 0xfc; delay(1000); PORTB = 0xf8; delay(1000); PORTB = 0xf0; delay(1000);
delay(1000); } }
Bài 2. Chương trình hiển thị led 7 thanh
Mục đích: Giúp sinh viên làm quen với việc hiển thị số lên LED 7 thanh
#include <mega32.h> #include <delay.h>
void daydulieu(unsigned char x) //ham dua du lieu ra port { switch(x)
{ //logic 1 tat led, logic 0 bat led case 0: {PORTB=0xC0; break;} //so 0 case 1: {PORTB=0xF9; break;} //so 1 case 2: {PORTB=0xA4; break;} //so 2 case 3: {PORTB=0xB0; break;} //so 3 case 4: {PORTB=0x99; break;} //so 4 case 5: {PORTB=0x92; break;} //so 5 case 6: {PORTB=0x82; break;} //so 6 case 7: {PORTB=0xF8; break;} //so 7 case 8: {PORTB=0x80; break;} //so 8 case 9: {PORTB=0x90; break;} //so 9 } }
void hienthi(int n) { int a,b,c,d;
a=n/1000; //lay hang nghin b=(n-a*1000)/100; // lay hang tram c=(n-a*1000-b*100)/10; // lay hang chuc d=(n-a*1000-b*100-c*10); // lay hang don vi // quet led
PORTA=0x08; // led dau tien daydulieu(d); // day ra hang don vi delay_ms(10); //tre
PORTB=0xFF; // tat toan bo led PORTA=0x04; // led thu hai daydulieu(c); // dua ra hang chuc delay_ms(10); // tre
PORTB=0xFF; PORTA=0x02;
daydulieu(b); delay_ms(10); PORTB=0x0FF; PORTA=0x01; daydulieu(a); delay_ms(10); PORTB=0x0FF; } void main(void) { while (1) { hienthi(2014); } }
Bài 3. Chương trình hiển thị led ma trận
Mục đích: Giúp sinh viên làm quen với màn hình hiển thị LED ma trận.
#include <mega32.h> int i,j,k;
void delay(int t) // Ham tao tre t(ms) { int a,b;
for(a=0;a<t;a++)
{ for(b=0;b<125;b++) {} } }
unsigned char cot[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01},
hang[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x83,0xF7,0xEF,0xF7,0x83,0xFF,0x8F,0xE7, }; void main(void)
{ while (1)
{ for(i=0;i<24;i++) // Quet tung ma trong mang 'hang' (so luong chu)
{ for(j=0;j<30;j++) // Muc dich tao tre cho hien thi
{ for(k=0;k<8;k++) // Quet tu cot 1 toi cot 8
{ PORTA=cot[k]; // ma cot
PORTB=hang[k+i]; // ma hang cho led delay(5); // tao tre cho hien thi
PORTA=0x00; // Xoa led } } } }
#include <mega324.h> #include <delay.h> #include <alcd.h> void main(void) {lcd_init(8); while (1)
{ lcd_gotoxy(0,0); // dua con tro ve goc dong 0 cot 0 lcd_putsf("KIT THUC HANH"); // hien thi dong chu lcd_gotoxy(0,1); // dua con tro ve dong 1 cot 0
lcd_putsf("8051-AVR-PIC"); // hien thi dong chu delay_ms(3000); // tre 3s } }
Bài 5. Chương trình đọc thời gian từ DS1307 hiển thị LCD
Mục đích: Giúp sinh viên làm quen với các ứng dụng trong thực tế.
#include <mega32.h> #include <delay.h> #asm
.equ __i2c_port=0x15 ;PORTC .equ __sda_bit=1 .equ __scl_bit=0 #endasm #include <i2c.h> #include <ds1307.h> #include <alcd.h> unsigned char h,m,s;
unsigned char date,month,year; void lcd_putnum(unsigned char x) { unsigned char chuc,donvi ; chuc=x/10 ; donvi=(x - chuc*10); lcd_putchar(chuc+48); lcd_putchar(donvi+48); } void main(void) { while (1)
{ rtc_get_time(&h ,&m, &s);
rtc_get_date(&date ,&month, &year); // doc ngay tu ds1307 lcd_gotoxy(0,0); lcd_putsf("Time: "); lcd_putnum(h); lcd_putsf(":"); lcd_putnum(m); lcd_putsf(":"); lcd_putnum(s); lcd_gotoxy(0,1); lcd_putsf("Date: "); lcd_putnum(date); lcd_putsf("-"); lcd_putnum(month); lcd_putsf("-20"); lcd_putnum(year); delay_ms(100); } }
Bài 6 Chương trình dùng phím bấm điều khiển Led đơn
Mục đích: Giúp sinh viên làm quen với việc điều khiển đầu ra dựa vào dữ liệu nhận được từ đầu vào. #define F_CPU 8000000 #include <util/delay.h> #include <avr/io.h> int main() { DDRD=0x00; PORTD=0xff; DDRB=0xff; while(1) { while(!(PIND&1)) {PORTB=0xfe;} PORTB=0xff; while(!(PIND&2)) {PORTB=0xfd;} PORTB=0xff;
{PORTB=0xfb;} PORTB=0xff; while(!(PIND&8)) {PORTB=0xf7;}
CHƯƠNG 4: KẾT LUẬN