Bộ nguồn xung
Sơ đồ:
Bài 1: Điều khiển LED
- Một bài ứng dụng đầu tiên đơn giản nhất để hiểu cách điều khiển IO của một MCU (PIC)
Code:
//========================================================
// Ten chuong trinh : dieu khien IO vdk
// Nguoi thuc hien : Le son trong Le
// Ngay thuc hien : 03/04/2012
// Phien ban : 1.0
//Trinh bien dich: CCS
// Mo ta phan cung : Dung PIC16F887 - thach anh 7.3728MHz
// ket noi LED (tich cuc [0])
//----------------------------------------------------------------
// Ngay hoan thanh :
// Ngay kiem tra :
// Nguoi kiem tra :
//----------------------------------------------------------------
//========================================================
#include <16f887.h> //khai bao chip cho trinh dich biet
#device *= 16 ADC = 10 //khai bao con tro chuong trinh la 16bit
#fuses HS, NOWDT, NOPROTECT,NOPUT, NOBROWNOUT, NODEBUG //config
#use delay (clock = 7.3728MHz) //khai bao nguon cap dao dong thach anh 7.3728MHz
#define LED PIN_D0 //dinh nghia Macro (ten thay the) cho pin RD0
void main (void)
{
while (true) //vong lap
{
output_low(LED); //xuat muc [0] ra pin RD0 (led off)
delay_ms(500); //lam tre 500ms
output_high(LED); //xuat muc [1] ra pin RD0 (led on)
delay_ms(500); //
}
}
Link download bai 1
Bài 2: Sử dụng ngắt timer
- Bài này nhằm mục đích mô tả hoạt động của bộ đếm timer, sử dụng bộ định thời timer để điều khiển chu kỳ on/off của led_yelow. Từ ví dụ ta thấy hoạt động on/off của led_yelow hoàn toàn độc lập với led_red (led_red mô tả trạng thái hoạt động của chương trình chính)
Code:
//========================================================
// Ten chuong trinh : HD Su dung timer
// Nguoi thuc hien : Le son trong Le
// Ngay thuc hien : 08/04/2012
// Phien ban : 1.0
//Trinh bien dich: CCS
// Mo ta phan cung : Dung PIC16F887 - thach anh 7.3728MHz
// ket noi LED_red (tich cuc [0]) bao trang thai hoat dong cua chuong trinh chinh
// ket noi LED_yelow (tich cuc [0]) bao trang thai hoat dong ham ngat timer
//----------------------------------------------------------------
// Ngay hoan thanh :
// Ngay kiem tra :
// Nguoi kiem tra :
//----------------------------------------------------------------
//========================================================
/*
mo ta hoat dong cua ngat timer: Chuong trinh chinh (main) van miet mai thuc hien cong viec cua minh theo trinh tu song song voi do thi bo dem timer cung dang hoat dong.. nhung toi khi bo dem timer tran thi yeu cau ngat xay ra tuc thi chuong trinh chinh dung lai va nhay vao ham (void interrup_timer1 (void)) thuc hien sau khi phuc vu xong tro lai ctrinh chinh tiep tuc cong viec.
*/
#include <16f887.h> //khai bao chip cho trinh dich biet
#device *= 16 ADC = 10 //khai bao con tro chuong trinh la 16bit
#fuses HS, NOWDT, NOPROTECT,NOPUT, NOBROWNOUT, NODEBUG //config
#use delay (clock = 7.3728MHz) //khai bao nguon cap dao dong thach anh 7.3728MHz (Tosc =0.5425us)
#define LED_red PIN_D0 //dinh nghia Macro (ten thay the) cho pin RD0
#define LED_yelow PIN_D1 //dinh nghia Macro (ten thay the) cho pin RD1
#INT_TIMER1
void interrup_timer1 (void)
{
int1 x; //bien x gia tri 1bit
/*
timer1 co bo dem 16bit = 65535
lenh set_timer1(value); dat gia tri bat dau cho timer dem len den gia tri tran FFFF -> ngat timer xay ra tinh thoi gian ngat xay ra Tosc*(65535-535)
*/
set_timer1(535); // 0.5425us*(65535-535)=~35.26ms
x=!x; //thuc hien dao (NOT) bit x va gan nguoc lai vao bien x
output_bit(LED_yelow,x); //xuat muc [x] ra pin RD1
}
void main (void)
{
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
enable_interrupts(int_timer1);
enable_interrupts(global);
set_timer1(535);
while (true) //vong lap
{
output_low(LED_red); //xuat muc [0] ra pin RD0 (led on)
delay_ms(1500); //lam tre 1500ms
output_high(LED_red); //xuat muc [1] ra pin RD0 (led off)
delay_ms(1500); //
}
}