Professional Documents
Culture Documents
Nội Dung : Giải thích 10 bài lập trình vi điều khiển, với những đoạn code lập lại
sẽ không được giải thích lại mà chỉ được giải thích một lần.
1. Bài 1: Điều khiển công tắc đơn và led đơn.
#include <delay.h>
char ledtam2;
int n,m;
void main(void)
{
// Input/Output Ports initialization
// Port A initialization
// Port C initialization
};
led=0x80; // Gán led =1000 0000 (đèn 8 sáng còn lại tắt)
};
};
led=0x01; // Gán led = 0000 0001 (đèn 1 sáng còn lại tắt)
while(led)
delay_ms(200);
while(led)
delay_ms(200);
};
};
while(sw3) // Khi sw3 được nhấn vòng lặp sẽ thực hiện liên tục
led=0x81; // Gán led = 1000 0001 (đèn 8 và 1 sáng còn lại tắt)
delay_ms(200);
while(led)
delay_ms(200);
while(led)
led=ledtam1|ledtam2; // hoặc bít giữa ledtam1 và //ledtam2 rồi gán cho led
delay_ms(200);
};
};
while(sw4)
delay_ms(200);
delay_ms(200);
};
led=ledtam2;
delay_ms(500);
m--; // giảm m đi 1
n=m-1;
};
};
while(sw5)
delay_ms(200);
delay_ms(200);
};
while(sw6)
delay_ms(200);
delay_ms(200);
};
while(sw7)
delay_ms(200);
delay_ms(200);
};
while(sw8)
delay_ms(200);
ledtam1=ledtam2=led;
while(led)
ledtam1=(ledtam1>>1);
ledtam2=(ledtam2<<1);
delay_ms(200);
};
while(led)
delay_ms(200);
};
};
};
}
2. Bài 2: Điều khiển hiển thị trên LED 7 đoạn.
#include <delay.h>
#define nut1 PINC.4 // Định nghĩa lại tên các chân của port C và port D
void main(void)
{
// Port C initialization
PORTC=0xF0; // 4 chân bít cao port C có điện trở kéo lên vào 4 chân bít thâp có giá trị 0
DDRC=0x0F; // set port C ở trạng thái 4 chân bít cao là ngõ vào và 4 chân bít thấp là ngõ ra
// Port D initialization
DDRD=0x0F;
led1=0;
led2=0;
led3=0;
led4=0;
while (1)
xuatled=0x00;
{ // và a=1
bien=bien+1;
a=1;
};
a=0;
// nghĩa của các câu lệnh trên là khi nhấn và giữ nguyên nút nhấn thì giá trị bien sẽ chỉ tăng lên 1 lần,
tương tự với các câu lệnh dưới đây.
if(b==0&&nut2)
bien=bien+10;
b=1;
};
if(!nut2)
b=0;
if(c==0&&nut3)
bien=bien+100;
c=1;
};
if(!nut3)
c=0;
if(d==0&&nut4)
bien=bien+1000;
d=1;
};
if(!nut4)
d=0;
bien=0;
switch(n)
case 2: led1=led2=led3=led4=0;
break;
case 3: led1=led2=led3=led4=0;
break;
case 4: led1=led2=led3=led4=0;
break;
};
delay_ms(50);
}; // nội dung của đoạn code trong switch là quét led và xuất giá trị từng led
3. Bài 3: Điều khiển bàn phím ma trận hiển thị lên LED 07 đoạn.
#include <delay.h>
#include <math.h>
#define a1 PORTA.0 // định nghĩa tên cho các chân của port A và C
#define a2 PORTA.1
#define a3 PORTA.2
#define a4 PORTA.3
unsigned char
x,a[]={0x00,0x04,0x08,0x0c,0x01,0x05,0x09,0x0d,0x02,0x06,0x0a,0x0e,0x03,0x07,0x0b,0x0f};
void main(void)
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
PORTA=0xF0; // set 4 chân bít cao có điện trở kéo lên, 4 chân bít thấp ngõ ra bằng 0
DDRA=0x0F; // set 4 chân bít cao là ngõ vào, 4 chân bít thấp là ngõ ra
// Port C initialization
xuatled=0x00; // xuatled bằng 0 (vì trong mạch có dùng con giải mã 7447 nên
while (1)
switch(n)
case 0: a1=0;
a2=a3=a4=1;
break;
case 1: a2=0;
a1=a3=a4=1;
break;
case 2: a3=0;
a1=a2=a4=1;
break;
case 3: a4=0;
a1=a2=a3=1;
if(x!=0)
i=log(x)/log(2); // lấy giá trị mũ gán cho i tức là i sẽ tương ứng với
xuatled=a[4*n+i]; // xuatled được gán giá trị nội dung của mảng chỉ đến
};
n++;
if(n==4)
n=0;
};
}
4. Bài 4: Điều khiển hiển thị chữ chạy trên LCD.
#include <mega16.h>
#include <delay.h>
int i;
int j;
unsigned char a[13]; // 13 là độ dài chuỗi “DoVanTienDat” công thêm 1 ký tự kết thúc chuỗi
.equ __lcd_port=0x15 ;PORTC // khái báo port nối với lcd là port C
#endasm
#include <lcd.h>
void main(void)
// LCD module initialization
n=15;
while (1)
if(i<7){
*(b+i)=*(lop+i); // lưu nội dung ký tự thứ i của chuỗi lớp vào phần tử
*(b+i+1)='\0'; // đưa ký tự kết thúc chuỗi vào phần tử tiếp theo của
// mảng b
if(i<12){
*(a+i)=*(ten+i); // lưu nội dung ký tự thứ i của chuỗi lớp vào phần tử
*(a+i+1)='\0'; // đưa ký tự kết thúc chuỗi vào phần tử tiếp theo của
// mảng a
// dòng lệnh này có tác dụng không cho nội dung của
// hàng trên của lcd tràn xuống hàng dưới
lcd_gotoxy(n,0); // đến vị trí xuất ra màn hình lcd cột n hàng thứ nhất
lcd_gotoxy(n,1); // đến vị trí xuất ra màn hình lcd cột n hàng thứ hai
n--; // giảm n đi 1
delay_ms(50);
};
};
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
int n=0;
float i;
.equ __lcd_port=0x15 ;PORTC // khai báo sử dung port C làm port xuất lcd
#endasm
#include <lcd.h>
unsigned char read_adc(unsigned char adc_input) // hàm đọc chân vào adc
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
ADCSRA|=0x10;
return ADCH;
lcd_putchar(c);
void main(void)
// Port A initialization
// ADC initialization
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;
while (1)
while(n<=7) // lập 8 lần để đọc lần lược cái chân vào của adc
if(ADCH<255) // nếu giá trị đọc được nhỏ hơn mức thứ 256
} else
n++;
{ // adc có thể đo
delay_ms(50); // n=0;
lcd_clear(); // lcd_gotoxy(0,0);
delay_ms(50);
lcd_clear();
};
};
6. Bài 6: Đo và hiển thị nhiệt độ hiển thị trên LED 7 đoạn.
#include <mega16.h> // Khai báo các thư viện nhập xuất, trễ và tính toán
#include <delay.h>
#include <math.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
#endasm
#include <lcd.h>
lcd_putchar(c);
float time,t,v,C=0.001;
}
// Analog Comparator interrupt service routine
void main(void)
// Port A initialization
// Timer/Counter 0 initialization
TCCR0=0x0B;
TCNT0=0x00;
// Analog Comparator: On
ACSR=0x0F;
SFIOR=0x00;
lcd_init(16);
delay_ms(50);
while (1)
PORTA.0=0; // nạp tụ
i=0;
x=1;
x=0;
};
lcd_clear();
lcd_gotoxy(0,0);
printf("%f",t);
time=0;
PORTA.0=1;
delay_ms(100);
};
#include <mega16.h>
#include<math.h>
#include<delay.h>
#define pi 3.141592654
int i,j,count;
ADMUX=adc_input|ADC_VREF_TYPE;
ADCSRA|=0x40;
ADCSRA|=0x10;
return ADCH;
void main(void)
{
for(i=0;i<128;i++)
table[i]=(int)((sin(2*pi*i/128)+1)*63)*2; // tạo hàm sóng sin lưu giá trị vào mảng table
// Port C initialization
// Port D initialization
// Timer/Counter 0 initialization
TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x86;
while (1)
switch(PINB) //đọc giá trị của ngõ vào B (xem bên mạch nguyên lý)
{ // thực hiện
PORTC=0; // áp bằng 0
delay_ms(ADCH); // độ trễ phụ thuộc vào tần số (xem mạch nguyên lý)
read_adc(0);
delay_ms(ADCH);
count++;
break;
{ // thực hiện
PORTD=0; // mở relays
count=0;
read_adc(0);
delay_ms(ADCH);
count++;
read_adc(0);
delay_ms(ADCH);
count++;
break;
{ // thực hiện
PORTD=0;
count=0;
read_adc(0);
delay_ms(ADCH);
count++;
break;
}
};
#include <mega16.h>
#include <delay.h>
#include <math.h>
#define a1 PORTA.0
#define a2 PORTA.1
#define a3 PORTA.2
#define a4 PORTA.3
char x,data,xuat=0;
unsigned char
a[]={0x61,0x65,0x69,0x73,0x62,0x66,0x70,0x74,0x63,0x67,0x71,0x75,0x64,0x68,0x72,0x76};
int i,n=0,key;
#include <lcd.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
#endif
bit rx_buffer_overflow;
char status,data;
status=UCSRA;
data=UDR;
rx_buffer[rx_wr_index]=data;
if (++rx_counter == RX_BUFFER_SIZE)
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
#asm("cli")
--rx_counter;
#asm("sei")
return data;
#pragma used-
#endif
#define TX_BUFFER_SIZE 8
char tx_buffer[TX_BUFFER_SIZE];
#if TX_BUFFER_SIZE<256
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
if (tx_counter)
--tx_counter;
UDR=tx_buffer[tx_rd_index];
};
#ifndef _DEBUG_TERMINAL_IO_
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar_com(char c)
#asm("cli")
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
else
UDR=c;
#asm("sei")
#pragma used-
#endif
// Các câu lệnh trên xuất hiện khi set chế độ ngắt ở đầu thu và đầu phát của USART
void putchar(char c)
switch(key)
break;
break;
#include <stdio.h>
// Timer 0 output compare interrupt service routine
switch(n) //************************
case 0: a1=0;
a2=a3=a4=1;
break;
case 1: a2=0;
break;
case 2: a3=0;
a1=a2=a4=1;
break;
case 3: a4=0;
a1=a2=a3=1;
}; // *************************
};
n++;
if(n==4)
n=0;
void main(void)
// Port A initialization
PORTA=0xF0;
DDRA=0x0F;
// Timer/Counter 0 initialization
TCCR0=0x0D;
TCNT0=0x00;
OCR0=0x10; // 1,574 ms
// USART Receiver: On
// USART Transmitter: On
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47; // ******
while (1)
};
lcd_gotoxy(15,0);
delay_ms(50);
lcd_clear();
};
9. Bài 9: Thực hiện đồ hồ điện tử trên KIT vi điều khiển.
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#asm
#endasm
#include <lcd.h>
int i=0,a=0,b=1,gio=0,phut=0,giay=0,x=0,y=0,z=0;
void putchar(char c)
lcd_putchar(c);
} //*********************************************
void xuat(int vitri,int noidung) //Hàm hiển thị đồng hồ trên lcd với 2 đối số
if(noidung<10)
lcd_gotoxy(vitri,0);
printf("%d",noidung);
lcd_gotoxy(vitri-1,0);
printf("0");
else
lcd_gotoxy(vitri-1,0);
printf("%d",noidung);
lcd_gotoxy(13,0);
printf(":");
lcd_gotoxy(10,0);
printf(":");
void main(void)
{
// Timer/Counter 0 initialization
TCCR0=0x0D;
TCNT0=0x00;
OCR0=0x47; //10ms
TIMSK=0x02;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
#asm("sei")
while (1)
{
a=1;x=1;
};
if(PINA.0==0) // đảm bảo nếu nhấn giữ nguyên nút chỉnh đồng hồ
if(a)
while(a)
if(b)
b++;y=1;
if(b==4)
b=1;
};
switch(b)
{
xuat(12,phut);
xuat(9,gio);
if(PINA.2&&z==0)
giay++;z=1;
if(giay==60)
giay=0;
};
break;
xuat(12,phut);
xuat(9,gio);
if(PINA.2&&z==0)
phut++;z=1;
if(phut==60)
phut=0;
};
break;
case 3: xuat(15,giay); // chỉnh giờ
xuat(12,phut);
xuat(9,gio);
if(PINA.2&&z==0)
gio++;z=1;
if(gio==24)
gio=0;
};
};
};
if(PINA.0==0)
x=0;
if(PINA.0&&x==0)
a=0;
x=1;
};
};
TIMSK=0x02;
if(i==100)
giay++;
i=0;
};
if(giay==60)
giay=0;
phut++;
};
if(phut==60)
phut=0;
gio++;
};
if(gio==24)
gio=0;
xuat(15,giay);
xuat(12,phut);
xuat(9,gio);
};
};
}
10. Bài 10: Thực hiện giao tiếp với tải AC. (vd đèn giao thông)
include <mega16.h>
#include<delay.h>
int i=0,j=0,a=1;
char buffer=0,n=10,m=0;
i++;j++;
if(j==6)
switch(a)
case 1:
a++;
break;
case 2:
buffer=buffer<<4;
PORTA=buffer;
a=1;
}; j=0;
};
void main(void)
// Port A initialization
// Port B initialization
// Port C initialization
// Timer/Counter 0 initialization
TCCR0=0x0D;
TCNT0=0x00;
OCR0=0x47; //10ms
TIMSK=0x02;
#asm("sei")
PORTC=0x21; // đèn đỏ trên và đèn xanh dưới sáng
while (1)
m=7;
i=0;
n--;m--;
};
m=2;
};
m=10;
};
};
{
if(m==10) // m=10 thì gán n=7
n=7;
i=0;
m--;n--;
};
n=2;
};
n=10;
};
};
};