PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 31-05-2009, 08:37 AM   #1
tienchuan
Đệ tử 4 túi
 
tienchuan's Avatar
 
Tham gia ngày: Oct 2008
Bài gửi: 71
:
cho em tham gia với!
Nhân tiện em xin đưa chương trình "đo nhiệt độ "dùng cảm biến nhiệt LM35DZ hiển thị trên 2 led 7 đoạn anode chung ,dùng pic16f877a (phí quá,nhưng chip này do Thầy em cho).
cai mach in em vẽ thiếu chân nguồn cho 2 con led7,em nhát quá chạy lun cái jumper trước con trở Reset xuống luôn>


// |+++++++++++++++++++++++++++++++++++++++++++++++++ ++|
// | CHUONG TRINH HIENTHI NHIET DO TREN 2 LED 7 DOAN |
// | BAO CAO THUC TAP MACH SO UNG DUNG |
// | NGUYEN TIEN CHUAN-071250520207-07DT2 |
// |+++++++++++++++++++++++++++++++++++++++++++++++++ ++|


// ||||||||||||---------------------- KET NOI PHAN CUNG --------------------||||||||||||||||
//++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++\
//| RB0->6 KET NOI DEN CAC CHAN A,B,C,D,E,F,G CUA 2 LED 7 DOAN ANODE CHUNG. +\
//| CHAN 8(VCC) CUA 2 LED 7 D0AN DUOC DIEU KHIEN BOI 2 BJT THUAN PNP: A1015 +\
//| CHAN C CUA 2 BJT NOI VOI CHAN VCC CUA 2 LED 7 DOAN DE DIEU KHIEN QUET LED +\
//| CHAN E CUA BJT NOI VOI NGUON +\
//| CHAN B (BAM DIEN TRO 10K )CUA BJT HANG CHUC VA DON VI NOI LAN LUOT VOI CHAN RD1,RD0 +\
//|---------------------------------------------------------------------------------------+\
//| SU DUNG TRINH BIEN DICH PCWH COMPLIER VER:4.018 +\
//| SU DUNG TRINH WINPIC800 DE NAP FILE HEX LEN PIC QUA CHUAN GIAO TIEP ICSP +\
//|+++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++\



#include <16F877A.h> // KHAI BAO SU DUNG PIC 16F877A

#include <def_877a.h> // FILE DINH NGHIA CAC THANH GHI VA CAC BIT

#device *=16 adc=10 // KHAI BAO SU DUNG CON TRO 16 BIT VA ADC 10 BIT

// KHAI BAO CAU HINH CHO PIC 16F877A
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT

// KHAI BAO SU DUNG DELAY VOI TAN SO DAO DONG NGOAI
#use delay(clock=12000000)

int8 high,low; // KHAI BAO CAC BIEN SO NGUYEN 1 BYTE

// KHAI BAO BANG MA LED 7 DOAN ANODE CHUNG
int8 const a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };

// CHUONG TRINH CON TACH SO HANG CHUC VA HANG DON VI
void convert_bcd(int8 x)
{
low=x%10; // CHU SO HANG DON VI
high=x/10; // CHU SO HANG CHUC

}
// CHUONG TRINH CON HIEN THI RA 2 LED 7 DOAN
void display()
{
PORTB=a[low];
RD0=0;
delay_us(500);
RD0=1;
PORTB=a[high];
RD1=0;
delay_us(500);
RD1=1;
}

void main()
{
float value;
int16 i;
trisb = 0x00; // THIET LAP CAC CHAN PORTB LA OUTPUT
trisd = 0x00; // THIET LAP CAC CHAN PORT D LA OUTPUT
trise = 0x00; // THIET LAP CAC CHAN PORT E LA OUTPUT
trisa = 0xff; // THIET LAP CAC CHAN PORT A LA INPUT

// KHOI TAO ADC

setup_adc(ADC_CLOCK_INTERNAL); // THIET LAP THOI GIAN LAY MAU BANG XUNG CLOCK
setup_adc_ports(AN0); // THIET LAP CHAN AN0 LA CHAN VAO ADC
set_ADC_channel(0) ;
delay_us(10); // TRE 10US

value=(float)read_adc(); // DOC GIA TRI ADC
value = value/2.048; //
convert_bcd((int8)value); // GOI CHUONG TRINH CON CONVERT_BCD

i=0;
while(1)
{
i++;
value =(float) read_adc();
value = value/2.048;
if (i==500)
{
convert_bcd((int8)value);
i=0;
}
display();
}
}
File Kèm Theo
File Type: rar main.rar (59.3 KB, 53 lần tải)
tienchuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-08-2009, 05:38 PM   #2
sonduy1
Đệ tử 1 túi
 
Tham gia ngày: Jun 2009
Bài gửi: 20
:
bác coi giúp e cái !..!

#include <16f877a.h>
#fuses HS,NOWDT
#use delay(clock=4000000)
#byte trisb=0x86
#byte portb=0x06
#BYTE TRISD=0X88
#BYTE PORTD=0X08


char bang_ma[10]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
char n1,n2,n3,n4;
char sec,min,h;
#int_timer1
void ngat_TMR1()
{ int time,count;
set_timer1(15535);
time++;
if(time=1);//dc 1/2s
//<thuc hien cong viec>
{
count++;
if(count==1)
{ portb=bang_ma[N1];
OUTPUT_LOW(PIN_A0);
DELAY_MS(10);
OUTPUT_HIGH(PIN_A0);
}
if(count==2)
{ portb=bang_ma[N2];
OUTPUT_LOW(PIN_A1);
DELAY_MS(10);

}
if(count==3)
{ portD=bang_ma[N3];

OUTPUT_LOW(PIN_A4);DELAY_MS(10);
OUTPUT_HIGH(PIN_A4);
}
if(count==4)
{ portD=bang_ma[N4];
OUTPUT_LOW(PIN_A5);
DELAY_MS(10);
}
count==0;



}
time==0;
}
//SU DUNG HAM NGAT TIMER0 DE HIEN THI
#INT_TIMER0

void ngat_timer0()
{ int dem;

set_timer0(15536); //mac dinh gia tri ban dau cho TMR0

dem++;
if(dem==20) //20*50000=1s
{ dem=0;
sec++;
}
if(sec==60)
{ sec=0;
min++;
}
if(min==60)
{ min=0;
h++;
}
if(h==24)
{ h=0;
}
}





VOID main(void)
{ trisb=0x00;
portb=0xff;
TRISD=0X00;
PORTD=0XFF;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(15536);
enable_interrupts(int_timer0);
enable_interrupts(global);


setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(15535);
enable_interrupts(int_timer1);
enable_interrupts(global);
N1=H/10;
N2=H%10;
N3=SEC/10;
N4=SEC%10;
while(1)
{

NGAT_TIMER0();
N1=H/10;
N2=H%10;
N3=SEC/10;
N4=SEC%10;
ngat_TMR1();

}
}
sonduy1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-08-2009, 09:27 PM   #3
Mr.Bi
Đệ tử 7 túi
 
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
:
Trích:
Nguyên văn bởi sonduy1 View Post
#include <16f877a.h>
#fuses HS,NOWDT
#use delay(clock=4000000)
#byte trisb=0x86
#byte portb=0x06
#BYTE TRISD=0X88
#BYTE PORTD=0X08


char bang_ma[10]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
char n1,n2,n3,n4;
char sec,min,h;
#int_timer1
void ngat_TMR1()
{ int time,count;
set_timer1(15535);
time++;
if(time=1);//dc 1/2s
//<thuc hien cong viec>
{
count++;
if(count==1)
{ portb=bang_ma[N1];
OUTPUT_LOW(PIN_A0);
DELAY_MS(10);
OUTPUT_HIGH(PIN_A0);
}
if(count==2)
{ portb=bang_ma[N2];
OUTPUT_LOW(PIN_A1);
DELAY_MS(10);

}
if(count==3)
{ portD=bang_ma[N3];

OUTPUT_LOW(PIN_A4);DELAY_MS(10);
OUTPUT_HIGH(PIN_A4);
}
if(count==4)
{ portD=bang_ma[N4];
OUTPUT_LOW(PIN_A5);
DELAY_MS(10);
}
count==0;



}
time==0;
}
//SU DUNG HAM NGAT TIMER0 DE HIEN THI
#INT_TIMER0

void ngat_timer0()
{ int dem;

set_timer0(15536); //mac dinh gia tri ban dau cho TMR0

dem++;
if(dem==20) //20*50000=1s
{ dem=0;
sec++;
}
if(sec==60)
{ sec=0;
min++;
}
if(min==60)
{ min=0;
h++;
}
if(h==24)
{ h=0;
}
}





VOID main(void)
{ trisb=0x00;
portb=0xff;
TRISD=0X00;
PORTD=0XFF;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
set_timer0(15536);
enable_interrupts(int_timer0);
enable_interrupts(global);


setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(15535);
enable_interrupts(int_timer1);
enable_interrupts(global);
N1=H/10;
N2=H%10;
N3=SEC/10;
N4=SEC%10;
while(1)
{

NGAT_TIMER0();
N1=H/10;
N2=H%10;
N3=SEC/10;
N4=SEC%10;
ngat_TMR1();

}
}
k biết u mún hỏi j , đọc sơ thì thấy hình như u chưa nắm ngắt timer
- K ai gọi hàm ngat_timer0() , ngat_timer1() cả ,khi khởi tạo ngắt timer , ta đã đặt thời gian ngắt , cứ khi mô timer tràn thì tạo ngắt , trong ct chính , ta k phảii gọi . Í tui nói ở đây là u xem hàm ngắt timer như 1 hàm con bình thường nên gọi . Hỉu sai chỗ í đó
- Đã dùng ngắt timer thì k ai còn gọi thêm delay nữa . Mục đích của ngắt timer là thay thế cho delay
- Trong hàm ngắt timer 1 , cuối ct ngắt có count ==0 để trống trơn t k hỉu u chỗ ni mún j , cóa phải u mún xóa biến count ??? Nếu xóa biến count thì ct k thực hiện đc if (count==2) , ==3 ... biết vì sao k ? Thử nhẩm sẽ thấy , vì count k bao h đếm lên đc tới 2
Mr.Bi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 05:32 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam