Hiển thị các bài đăng có nhãn PIC Project. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn PIC Project. Hiển thị tất cả bài đăng

Thứ Tư, 22 tháng 8, 2018

Published tháng 8 22, 2018 by Nặc danh with 0 comment

Tài liệu về DS1307 + Pic16f877a , 8051

      edit
Published tháng 8 22, 2018 by Nặc danh with 0 comment

Share mạch RF điều khiển 4 Role bằng Pic 16F54 + PT 2272

      edit

Thứ Bảy, 16 tháng 6, 2018

Published tháng 6 16, 2018 by Nặc danh with 0 comment

[PIC 16F877A]Quét led 7 đoạn 4 số kết hợp IC ghi dịch 74HC595


IC 74HC595 giúp mở rộng Port cho các loiạ vi điều khiển , mục đích sử dụng lớn cho các Project đòi hỏi số lượng I/O nhiều.
Nhiệm vụ của IC 74HC595 là lấy 3 chân của VĐK ( chân dịch dữ liệu DS, chân phát hiện xung dữ liệu SH_CP, và chân tạo xung chốt dữ liệu ST_CP). Các IO từ Q0 đến Q7 có chức năng cũng giống như 1 port của VĐK VCC nối lên 5V , GND nối mass, MR nối chung với VCC tạo reset, OE giúp cấu hình ngõ ra nối chung GND.
Để thấy rõ sự hoạt động của IC này ta sẽ tham khảo đoạn code sau cho vđk 16f877a :

#define data_pin PIN_B0
#define clock_pin PIN_B1
#define latch_pin PIN_B2
#include <16f877a .h="">
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 8000000)
#use fast_io(B) // dinh che do io thu cong
#use fast_io(D)
/*khai bao ham con*/
void cauhinhport();
unsigned int seg(unsigned int num);
void kiemtranutnhan();
void write_data(unsigned int number);
void quetled7doan();
/*khai bao bien toan cuc*/
short s;
unsigned int j,nghin,tram,chuc,donvi ;
unsigned long i = 0;
/*ham con chau hinh port*/
void cauhinhport()
{
port_b_pullups(TRUE); // bat dien tro keo port B
output_b(0); // PORTB khoi tao cong
set_tris_b(0x18); // Cau hinh RB3 & RB4 nhu la input
output_d(0); // PORTD khoi tao cong
set_tris_d(0);
}
/*ham con hien thi led 7 doan anode chung*/
unsigned int seg(unsigned int num) {
switch (num) {
case 0 : return 0xc0;
case 1 : return 0xf9;
case 2 : return 0xa4;
case 3 : return 0xb0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;
}
}
/*ham con dich bit data*/
void write_data(unsigned int number){
for(j = 0x80; j > 0; j = j >> 1)
{
if(number & j){
output_high(data_pin); // xung cao
}
else
{
output_low(data_pin); //xung thap
}
/*tao xung clock day data*/
output_high(clock_pin);
output_low(clock_pin);
}
/*tao xung ket thuc day data*/
output_high(latch_pin);
output_low(latch_pin);
}
/*ham con kiem tra nut nhan*/
void kiemtranutnhan()
{
if(input(PIN_B3) && input(PIN_B4))
s = 1;
if(s == 1) {
if(input(PIN_B3) == 0) {
s = 0;
i++;
if(i > 9999)
i = 0;
}
if(input(PIN_B4) == 0) {
s = 0;
if(i < 1)
i = 1;
i--;
}
}
nghin = seg(i/1000); // hang nghin
tram = seg((i %1000) /100); // hang tram
chuc = seg(((i %1000)%100)/10); // hang chuc
donvi = seg(i% 10); // hang don vi
}
void quetled7doan()
{
/*quet led thu nhat*/
output_high(PIN_D0);
write_data(nghin);
delay_ms(1);
output_low(PIN_D0);
/*quet led thu hai*/
output_high(PIN_D1);
write_data(tram);
delay_ms(1);
output_low(PIN_D1);
/*quet led thu ba*/
output_high(PIN_D2);
write_data(chuc);
delay_ms(1);
output_low(PIN_D2);
/*quet led thu tu*/
output_high(PIN_D3);
write_data(donvi);
delay_ms(1);
output_low(PIN_D3);
}
/*ham chinh xu ly*/
void main(){
cauhinhport(); // Cau hinh port nhu la output
while(TRUE)
{
/* kiem tra phim nhat*/
kiemtranutnhan();
/*tien hanh quet led*/
quetled7doan();
}
}
Read More
      edit

Thứ Sáu, 15 tháng 6, 2018

Published tháng 6 15, 2018 by Nặc danh with 1 comment

[PIC 16F877A] Lập trình hệ điều hành thời gian thực RTOS trên CCS for PIC


RTOS ((Real Time operating System) cho phép chạy nhiều tác vụ đồng thời song song với nhau. Mình đã nói đến phần này ở những bài viết trước các bạn có thể tham khảo bài :
Thực hiện tác vụ song song bằng hàm delay
- Còn với bài hướng dẫn này chúng ta không dùng delay nữa mà dùng hàm RTOS có sẵn được hỗ trợ trên trình biên dịch CCS để điều khiển
- Tôi cũng đưa ra một ví dụ đó là lập trình 5 led có chu kỳ sáng tắt khác nhau và chạy song song với nhau.
Led 1  : 250ms
Led 2 : 500ms
Led 3 : 750ms
Led 4 : 1000ms
Led 5 : 1250ms
Lưu ý một số điểm quan trọng: 
#use rtos(timer=0,minor_cycle=100ms) :
ở đây minor_cycle là thời gian dài nhất cho mỗi task hoạt động, timer là chon timer để dùng có thể  là 0 ,1 ,2 và nhớ mỗi timer có số tràn khác nhau 
#task(rate=200ms,max=100ms) :
Ở đây rate là chu kỳ làm việc trong mỗi task (rate=n*minor_cycle : n là số nguyên), ví dụ led nháy với chu kỳ 200ms , max là thời gian làm việc của task này, lưu ý rate và max làm việc độc lập với nhau, nếu hết thời gian max mà task chạy chưa hết lệnh trong nó thì sẽ dừng lại và chuyển sang làm việc ở task khác. và nó nhớ vị trí task đã dừng và đến lần hoạt động sau thì nó thực hiện tiếp nơi nó bị dừng.
CODE trên CCS With PIC16f887:

#include <16f887 .h="">
#fuses NOMCLR, NOBROWNOUT, NOLVP, INTRC_IO
#use delay(clock = 4MHz)
#use fast_io(B)
#use rtos(timer = 0, minor_cycle = 50ms)

#task(rate = 250ms, max = 50ms) // 1st RTOS task (executed every 250ms)
void led1(){
output_toggle(PIN_B0);
}
#task(rate = 500ms, max = 50ms) // 2nd RTOS task (executed every 500ms)
void led2(){
output_toggle(PIN_B1);
}
#task(rate = 750ms, max = 50ms) // 3rd RTOS task (executed every 750ms)
void led3(){
output_toggle(PIN_B2);
}
#task(rate = 1000ms, max = 50ms) // 4th RTOS task (executed every 1000ms)
void led4(){
output_toggle(PIN_B3);
}
#task(rate = 1250ms, max = 50ms) // 5th RTOS task (executed every 1250ms)
void led5(){
output_toggle(PIN_B4);
}
void main(){
setup_oscillator(OSC_4MHZ); // Set the internal oscillator to 4MHz
output_b(0); // All PORTB register pins are zeros
set_tris_b(0); // Configure PORTB pins as outputs
rtos_run(); // bắt đầu chạy rtos
}
Read More
      edit

Thứ Năm, 14 tháng 6, 2018

Published tháng 6 14, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Ví dụ về PWM kết hợp ADC trên CCS


Bộ vi điều khiển PIC16F877A có hai mô-đun CCP và với các mô-đun này, chúng ta có thể tạo ra hai tín hiệu PWM (Pulse Width Modulation) PWM1 liên quan với CCP1 và PWM2 liên quan với CCP2. Cả hai mô đun PWM đều sử dụng Timer2 để tạo tín hiệu có nghĩa là hai mô-đun sẽ có cùng tần số.
Bài viết này sẽ hướng dẫn cách sử dụng mô-đun PWM PIC16F877A bằng trình biên dịch CCS PIC C. Trước tiên, chúng ta phải cấu hình mô-đun CCP để chạy dưới dạng PWM sử dụng các lệnh CCS sau:
setup_ccp1(CCP_PWM);           // Configure CCP1 as a PWM
setup_ccp2(CCP_PWM);           // Configure CCP2 as a PWM
Sau đó, chúng ta phải sử dụng Timer2 để thiết lập tần số pwm. 
Sử dụng các phương trình sau đây để tính toán tần số PWM:
PWM (period) = [(PR2) + 1] • 4 • Tosc • (TMR2 Prescale Value)
Trường này hợp tần số PWM được định nghĩa là 1/PWM period .
PWM period là chu kỳ băm xung.
PR2 là giá trị tải trước của Timer2, giá trị này dùng để xác định độ dài của một chu kỳ T
Tosc = 1/(tần số nội của MCU)
TMR2 Prescale Value là giá trị bộ chia có thể là  1, 4 hoặc 16.
Cho ví dụ : PR2 = 255 , tần số MCU= 8MHz và Prescale Value= 16 chúng ta sẽ nhận được một tần số PWM là 488Hz.
Cấu hình thông số cho timer2 bằng lệnh sau :
setup_timer_2(mode,  period, postscale)
Trong đó: mode là Giá trị Prescale Value TMR2period là PR2 và postscaler không được sử dụng trong việc xác định tần số PWM (nên giữ nó là 1).
Cho ví dụ : setup_timer_2(T2_DIV_BY_16, 255, 1);
Trên là bước xác định chu kỳ và tần số , sau khi xác định xong thì tiến hành xác định chu kỳ ON và chu kỳ OFF có nghĩ là trong 1 chu kỳ xung sẽ có mức cao và thấp (hay  1 và 0)
Ta sử dụng lệnh : 
set_pwm1_duty(Ton Value); 
set_pwm2_duty(Ton Value);
// trong đó Ton Value là chỉ số của chu kỳ ON nhưng phải luôn bé hơn hoặc bằng Period 
còn chu kỳ OFF thì tự nó tính trừ đi chu kỳ OFF bằng biểu thức Tof
Để cụ thể hơn , chúng ta sẽ đi lập trình một bài toán, điều chỉnh độ sáng của led bằng băm xung thông qua đọc giá trị điện áp vào chân ANALOG của PIC.



#include "main.h"
int16 i,j,n,m,k=0,l=0;
void main()
{
setup_adc(ADC_CLOCK_DIV_32); // chon bo chia ADC
setup_adc_ports(ALL_ANALOG); // mo tat cac cong ANALOG
setup_ccp1(CCP_PWM); // cai dat ccp1
setup_ccp2(CCP_PWM); // cai dat ccp1
delay_ms(100); // cho 100ms de hoan tat
setup_timer_2(T2_DIV_BY_16,255, 1); // cai dat de lay mau dua vao cong thuc
// truong hop co loc trung binh
while(false)
{
set_adc_channel(0); // chon kenh dau tien
delay_ms(1);
i=0; j=0; // tao gia tri mac dinh
for(n=0;n<50 50="" adc="" ap="" bien="" binh="" chia="" chon="" cong="" cua="" cycle="" dau="" de="" delay_ms="" dien="" duty="" for="" gan="" gia="" hop="" i="" j="" k="" kenh="" khong="" l="" lam="" lan="" loc="" m="0;m<50;m++)" n="" pre="" set_adc_channel="" set_pwm1_duty="" set_pwm2_duty="" tam="" tien="" toff="" ton="" tri="" true="" trung="" truong="" va="" vao="" while="">
Read More
      edit

Thứ Ba, 12 tháng 6, 2018

Published tháng 6 12, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Thực hiện tác vụ song song bằng hàm delay


Yêu cầu của một bài toán : Có 3 led đơn , led 1 sáng tắt với chu kỳ 10ms , led 2 sáng tắt với chu kỳ 100ms, led 3 sáng tắt với chu kỳ 350ms . Hướng giải quyết : không thể dùng ngắt timer nếu bài toán với nhiều IO hơn, do đó thực hiện bằng một hàm con tạo delay nếu sau mỗi khoảng thời gian khớp với chu kỳ củ 1 tác vụ thì thực hiện tác vụ yêu cầu đó thông qua lệnh điều kiện if
#include "main.h"
#define led1 PIN_D0
#define led2 PIN_D1
#define led3 PIN_D2
void main()
{
while(1)
{
int16 t1=0,t2=0,t3=0,z;
for(z=0;z<350 delay_ms="" if="" t1="" t2="" t3="" z="">10)
{
output_toggle(led1);
t1=0;
}
if(t2>100)
{
output_toggle(led2);
t2=0;
}
if(t3>=350)
{
output_toggle(led3);
t3=0;
}
}
}
}

Đo dạng sóng của analog :

Màu xanh blue thể hiện chu kỳ 10ms Màu đỏ thể hiện chu kỳ 100ms Màu xanh Green thể hiện chu kỳ 350ms Chúc các bạn học tốt
Read More
      edit

Thứ Ba, 5 tháng 6, 2018

Published tháng 6 05, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Cách bật điện trở kéo lên trên ccs cho PIC


Trong trình biên dịch ccs có một số lệnh hỗ trợ bật điện trở kéo lên cho các  PORT , mục đích dùng cho Pic loại và  16 bit , sử dụng cho setup_counter trên mạch thật.
PORT_B_PULLUPS(VALUE);
PORT_B_PULLUPS(BOOL);
Trong đó value là các thông số để bật PIN nào trong một port B ví dụ như : 0x03
Mục đích đưa về số BIN 00000011 để bật điện trở kéo của PIN B0 và B1
Nếu bật hết các điện trở kéo trong cả PORT thì dùng Bool giá trị của Bool là true hoặc false
Ngoài ra còn các hàm như :
port_x_pullups (upmask);
port_x_pullups (upmask, downmask);
Các hàm này chúng ta có thể tìm hiểu thêm vì nó cũng khá ít dùng.
Chúc các bạn học tốt !

Read More
      edit

Chủ Nhật, 3 tháng 6, 2018

Published tháng 6 03, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Sơ đồ mạch PICKIT2

      edit

Thứ Sáu, 1 tháng 6, 2018

Published tháng 6 01, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Lập trình hiệu ứng sáng dồn 24 led đơn trên PIC16F877A




 Đối với vi điều khiển các bạn thường xuyên làm các hiệu ứng , mà một trong những hiệu ứng đẹp đó là sáng dồn từng led, với cách làm này các bạn sẽ dễ dàng làm được trên các loại vđk khác các bạn chỉ cần thay biến, giá trị là có thể sáng nhiều led hoặc ít led hơn.
Chúc các bạn học tốt
Link tải code và mô phỏng ( lập trình ccs và proteus ) : https://mega.nz/#!XRFR0ZJB!EbvjN7mIjYwKcHnp9JaarGyN7JpGQKbHp-zpfge8u1k
Read More
      edit
Published tháng 6 01, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Giao tiếp vi điều khiển PIC16F877A với máy tính

Các công cụ hỗ trợ : 
+ viết code bằng trình CCS 5 (MPLAB X hoặc PIC-C)
+ Mô phỏng Proteus 8.6
+ Visualstudio 2010 ultimate
+ Phần mềm tạo cổng com ảo : Configure Virtual Serial Port Driver 
Hướng dẫn sử dụng (video) :
Chương trình giao tiếp máy trính với PIC mục tiêu gửi dữ liệu từ máy tính sang vi điều khiển Chúc các bạn học tốt, code mình đã giải thích kỹ
Read More
      edit

Thứ Ba, 8 tháng 5, 2018

Published tháng 5 08, 2018 by Nặc danh with 0 comment

Tài liệu ôn thi lập trình PIC16F877a tham khảo trường đại học GTVT

Bộ tài liệu này chỉ mang tính chất tham khảo , những bài sát với đề thi của UTC2, không thể bao quát hết lượng kiến thức đã học ở PIC
Bao gồm các phần cơ bản như :
- Led đơn
- Led 7 đoạn
- Lập trình LCD
- Giao tiếp ADC
- Các vấn đề quan trọng
Link tải tài liệu :
MEGA
Read More
      edit

Thứ Bảy, 5 tháng 5, 2018

Published tháng 5 05, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Kết hợp LM35 , LCD, Led 7 đoạn cảnh báo nhiệt độ cao


#include <main.h>
#include <lcd4bit.c>
unsigned char Code7Seg[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
int16 kqadc,donvi,chuc;
void hienthiadcva7doan()
{
set_tris_d(0x00);
set_tris_a(0x00);
set_adc_channel(0);
setup_adc(adc_clock_div_2);
setup_adc_ports(AN0);
kqadc=0;
for(int i=0;i<200;i++)
{
 kqadc=kqadc+read_adc();
 delay_ms(1);
}
kqadc=kqadc/2.046;
kqadc=kqadc/200;
chuc =kqadc/10;
donvi=kqadc%10;
output_high(PIN_C0);
output_B(code7seg[chuc]);
delay_ms(1);
output_low(PIN_C0);
output_high(PIN_C1);
output_B(code7seg[donvi]);
delay_ms(1);
output_low(PIN_C1);

}
void canhbaonhietdo()
{
 output_high(PIN_C2);
}
void main()
{
   LCD_Init();
   while(TRUE)
   {
     hienthiadcva7doan();
     if(kqadc>=32)
 {
     canhbaonhietdo();
     LCD_PutCmd(0x80);
     LCD_PutChar("Nhiet do cao !!!");
 }
 else
 {

     output_low(PIN_C2);
     LCD_PutCmd(0x80);
     LCD_PutChar("Nhiet do :       ");
 }
     LCD_PutCmd(0xc0);
     WriteNum(kqadc);
   }

}

Tải Project này về : https://mega.nz/#!uN8GWTqQ!7hPx-wF0Nexw3bOqOWjeJvj5OitBqFWwIZazRJ3_05Q
Read More
      edit

Thứ Tư, 2 tháng 5, 2018

Published tháng 5 02, 2018 by Nặc danh with 0 comment

[PIC 16F877A] Lập trình LCD 4 bit hiện nhiệt độ từ LM35 (thư viện riêng)


#include <main.h>
#include "lcd4bit.c"
#Fuses HS,NOWDT,NOPROTECT,NOLVP
#Use delay(clock=20000000)
int16 kqadc;
void caidatadc()
{
SET_TRIS_D(0X00);
SET_TRIS_A(0X00);
SETUP_ADC(ADC_CLOCK_DIV_2);
SETUP_ADC_PORTS(AN0);
SET_ADC_CHANNEL(0);
kqadc=0;
for(int i=0;i<200;i++)
{
KQADC=kqadc+READ_ADC();
delay_ms(1);
}
kqadc=kqadc/2.046;
kqadc=kqadc/200;
}
Void main() // Chuong trinh chinh
{
   caidatadc();
   Lcd_init();  // Khoi dong che do hoat dong cua LCD
   Delay_ms(20);// Cho de LCD hoat dong on dinh
   While (TRUE)
   { 
      Lcd_putcmd(0x80); // Bat dau hien thi tai vi tri thu 2 dong 1
      Lcd_putchar("Nhiet Do:");
      Lcd_putcmd(0xC0); // Bat dau hien thi tai vi tri thu 1 dong 2
      WriteNum(kqadc);
   }
}
Link project : LM35 và PIC 877a
Read More
      edit

Thứ Bảy, 28 tháng 4, 2018

Published tháng 4 28, 2018 by Nặc danh with 0 comment

[PIC16F877A] Thư viện LCD 4 bit

Đây là bộ thư viện LCD 4 bit dùng cho PIC16f877a mới một số thao tác trên LCD đủ dùng

#include "stddef.h"
#define LCD_RS PIN_D2
#define LCD_EN PIN_D3
#define LCD_D4 PIN_D4
#define LCD_D5 PIN_D5
#define LCD_D6 PIN_D6
#define LCD_D7 PIN_D7
// misc display defines-
#define Line_1 0x80
#define Line_2 0xC0
#define Clear_Scr 0x01
// prototype statements
#separate void LCD_Init(void); //Ham khoi tao LCD
#separate void LCD_SetPosition(unsigned int cX);//Thiet lap vi tri con tro
//Ham viet 1ky tu hoac 1 chuoi len LCD
#separate void LCD_PutChar(unsigned int cX);
#separate void LCD_PutCmd(unsigned int cX) ; //Ham gui lenh len LCD
#separate void LCD_PulseEnable(void); //Xung kich hoat
#separate void LCD_SetData(unsigned int cX); //Dat du lieu len chan Data
#separate void WriteNum(unsigned char num);
#separate void HTsothapphan(Int32 num);
// Dinh nghia Cong
#use standard_io(B)
#use standard_io(A)
//Khoi tao LCD
#separate void LCD_Init (void)
{
LCD_SetData (0x00);
Delay_ms(20); // Cho cho LCD khoi tao >> 15ms
output_low(LCD_RS); // Che do gui lenh
LCD_SetData(0x03); // Khoi tao che do 4 bit
LCD_PulseEnable();
LCD_SetData(0x02); // Tao giao dien 4 bit
LCD_PulseEnable(); // send dual nibbles hereafter, MSN first
LCD_PutCmd(0x2C); // function set (all lines, 5x7 characters)
LCD_PutCmd(0x0C); // display ON, cursor off, no blink
LCD_PutCmd(0x06); // entry mode set, increment & scroll left
LCD_PutCmd(0x01); // clear display
}
#separate void LCD_SetPosition(unsigned int cX)
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData(swap(cX)|0x08);
LCD_PulseEnable();
LCD_SetData(swap(cX));
LCD_PulseEnable();
}
#separate void LCD_PutChar(unsigned int cX)
{
/* this subroutine works specifically for 4-bit Port A */
output_high(LCD_RS);
LCD_PutCmd(cX);
output_low(LCD_RS);
}
#separate void LCD_PutCmd(unsigned int cX)
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData(swap(cX)); /* send high nibble */
LCD_PulseEnable();
LCD_SetData(swap(cX)); /* send low nibble */
LCD_PulseEnable();
}
#separate void LCD_PulseEnable(void)
{
output_high(LCD_EN);
delay_us(5);
output_low(LCD_EN);
delay_ms(5);
}
#separate void LCD_SetData(unsigned int cX)
{
output_bit(LCD_D4, cX & 0x01);
output_bit(LCD_D5, cX & 0x02);
output_bit(LCD_D6, cX & 0x04);
output_bit(LCD_D7, cX & 0x08);
}
#separate void WriteNum(unsigned char num)
{
unsigned char digit;
digit = num/100;
LCD_PutChar(digit + '0'); //write tram+ma ASCII cua '0'
digit = num/10;
digit = digit % 10;
LCD_PutChar(digit + '0'); //write chuc
digit = num % 100;
digit = digit % 10;
LCD_PutChar(digit + '0'); //write dvi
}
#separate void HTsothapphan(Int32 num)
{
Int8 Integer, First, Second, Third;
Integer = num/1000 + 0x30; // Tach phan nguyen
num= num%1000;
First = num/100 + 0x30; // Tach phan le thu 1
num = num%100;
Second = num/10 + 0x30; // Tach phan le thu 2
Third = num%10 + 0x30; // Tach phan le thu 3
Lcd_putcmd(0xCA);
Lcd_putchar(Integer);
Lcd_putchar(".");
Lcd_putchar(First);
Lcd_putchar(Second);
Lcd_putchar(Third);

}
Read More
      edit

Thứ Sáu, 30 tháng 3, 2018

Published tháng 3 30, 2018 by Nặc danh with 0 comment

[PIC16F877A] Bài tập đọc giá trị điện áp thông qua phím nhấn


Đề bài : Hãy sử dụng ADC để đọc giá trị điện áp thông qua phím nhấn sử dụng chân AN0 và thực hiện các hiệu ứng led đơn với :
Nút 1 : Sáng dần 8 led của Port D
Nút 2:  Nháy 8 led port D với chu kỳ 0.5s
Nút 3:  Sáng tắt 8 led port D
Nút 4:  Dịch 8 led port D
Hướng dẫn vẽ sơ đồ :

Hướn Dẫn Code


<8 i="" move="move">#include <main.h>
UNSIGNED INT16 KQADC,SOV=5,SON=1023;
// SANG DAN 8 LED
void SANG_DAN(VOID)
{
unsigned int8 init=0x7F, temp, reset =0xff, move;
output_D(reset);
delay_MS(1000);
move=init;
output_D(move);
delay_MS(1000);
for(int8 i=0;i<8;i++)
{
move=move>>1;
temp=move;
output_D(temp);
delay_MS(1000);
}
}
// NHAY 8 LED CHU KY 0.5 ( TAT 0.25 VA MO 0.25)
VOID NHAY05GIAY(VOID)
{
OUTPUT_D(0X00);
DELAY_MS(250);
OUTPUT_D(0XFF);
DELAY_MS(250);
}
// SANG TAT 8 LED PORTD
VOID SANG_TAT()
{
OUTPUT_D(0X00);
DELAY_MS(500);
OUTPUT_D(0XFF);
DELAY_MS(500);
}
// DICH 8 LED
VOID DICH8LED(VOID)
{
output_D(0b01111111);
delay_MS(1000);
output_D(0b10111111);
delay_MS(1000);
output_D(0b11011111);
delay_MS(1000);
output_D(0b11101111);
delay_MS(1000);
output_D(0b11110111);
delay_MS(1000);
output_D(0b11111011);
delay_MS(1000);
output_D(0b11111101);
delay_MS(1000);
output_D(0b11111110);
delay_MS(1000);
output_D(0b11111111);
delay_MS(1000);

}
VOID HIENTHI()
{
KQADC=SOV*READ_ADC()/SON;

//NUT NHAN 1
IF(KQADC==4)
{
// SANG TAT 8 LED PORTD
SANG_TAT();
}

// NUT NHAN 2

ELSE IF(KQADC==3)
{
// SANG DAN 8 LED PORTd
SANG_DAN();
}

//NUT NHAN 3
ELSE IF(KQADC==2)
{
// DICH 8 LED PORTd
DICH8LED();
}

// NUT NHAN 4

ELSE IF(KQADC==1)
{
// NHAY 8 LED PORTd CHU KY 0.5S
NHAY05GIAY();
}
ELSE
OUTPUT_D(0XFF);


}
void main()
{
SET_TRIS_D(0X00);
SET_TRIS_A(0X00);
SETUP_ADC(ADC_CLOCK_DIV_2);
SETUP_ADC_PORTS(AN0);
SET_ADC_CHANNEL(0);


while(TRUE)
{
HIENTHI();
}

}

Chúc các bạn thành công !!!!
Read More
      edit

Thứ Năm, 29 tháng 3, 2018

Published tháng 3 29, 2018 by Nặc danh with 0 comment

[PIC16F877A] Ngắt PortB

Đầu tiên ta khai báo trong hàm main.h như trên 
 Đấu nối theo sơ đồ sau để kiểm tra code

Viết code như trên hình và chạy thử chương trình
Hoặc có thể copy full code ở đây

#include
#byte congatRB = 6
#INT_RB
void ngatRB()
{
// quet nut nhan
if(NUTNHAN_1==0)
{
while(NUTNHAN_1==0)
{

int8 clear;
output_toggle(LED1);
delay_ms(500);
clear= congatRB;
}
}
if(NUTNHAN_4==0)
{
while(NUTNHAN_4==0)
{

int8 clear;
output_toggle(LED4);
delay_ms(500);
clear= congatRB;
}
}
if(NUTNHAN_2==0)
{
while(NUTNHAN_2==0)
{

int8 clear;
output_toggle(LED2);
delay_ms(500);
clear= congatRB;
}
}
if(NUTNHAN_3==0)
{
while(NUTNHAN_3==0)
{

int8 clear;
output_toggle(LED3);
delay_ms(500);
clear= congatRB;
}
}
}
void main()
{
//xoa ngat RB
clear_interrupt(INT_RB);
// Bat ngat RB
enable_interrupts(INT_RB);
// Cho phep ngat toan cuc
enable_interrupts(GLOBAL);
// tat tac ca cac LED
output_bit(LED1,0);
output_bit(LED2,0);
output_bit(LED3,0);
output_bit(LED4,0);

while(TRUE)
{

}

}

Read More
      edit

Thứ Ba, 20 tháng 3, 2018

Published tháng 3 20, 2018 by Nặc danh with 0 comment

[Pic16F877A] Hiển thị chuỗi ký tự lên LCD 16x2 đơn giản


LCD (Liquid Crystal Display) màn hình tinh thể lỏng ứng dụng nhiều trong học tập về điện tử, như trong vi điều khiển, mạch ứng dụng Arduino ,.. và có rất nhiều loại . Hôm nay mình sẽ lập trình hiện chữ đơn giản trên LCD bằng vi điều khiển PIC 16F877A .
Đầu tiên ta tìm hiểu về các chân của LCD :
Sau khi đọc xong chúng ta bắt đầu vẽ phần cứng trên Proteus


Đây là cách nối kiểu lập trình 4 bit trên LCD.
Sau đó bắt đầu cấu hình chân như sau :
#include <main.h> // trong main.h chứa thư viện 16f877a.h và file khai báo cần thiết
#include <lcd.c>  // đây là file thư viện của LCD file này có sẵn trong CCS
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

để kết nối với port D thì khai báo như trên để định nghĩa chân
Tiếp theo là hàm chính
void main()
{

   lcd_init();
   while(TRUE)
   {
     lcd_gotoxy(1,1);
     lcd_putc("Nguyen Minh Chau ");
   }

}


Hàm chính có lệnh
lcd_init(); để khởi tạo lcd trongg ccs
lcd_gotoxy(1,1); chọn vị trí của chuỗi bắt đầu là chữ cái đầu tiên trong chuỗi ,ở đây là hàng 1 và cột 1
lcd_putc("chuỗi ở đây"); để viết chuỗi hiển thị

Như vậy sau khi chạy ta có kết quả như sau
Chúc các bạn thành công .
Read More
      edit
Published tháng 3 20, 2018 by Nặc danh with 1 comment

[PIC16F877A] Bật tắt led với chu kỳ 200ms dùng ngắt timer 1





Ở bài trước mình đã giải thích kỹ các thành phần và đoạn code

ở bài này khác nhau ở chu kỳ 200ms
để xây dụng cũng tương tự vậy nhưng set_timer(3036); mục đích là chạy 62500 thì tràn có nghĩa là lúc tràn có 62500*1.6=100000us = 100ms vậy chu kỳ tắt mở led là 200ms

code đầy đủ ở đây:

#include 

unsigned int x=0x00;
void main()
{
set_tris_D(0x00);
setup_timer_1(t1_internal|t1_div_by_8);
set_timer1(3036); // 65536-3036 =62500 , 62500*1.6= 100000 =100ms
while(TRUE)
{
if(tmr1if==1)
{
x=~x;
output_D(x);
set_timer1(3036);
tmr1if=0;
}
}

}
Read More
      edit
Published tháng 3 20, 2018 by Nặc danh with 1 comment

[PIC16F877A] Sử dụng Timer 1 tạo ngắt để tắt mở led chu kỳ 210ms


Ở bài này mình sẽ hưởng dẫn các bạn tạo hàm delay có thời gian là 210ms bằng cách ngắt Timer1.
Bài toán giải quyết như sau :
+ Khởi tạo 1 timer1 với thạch anh nội là 40M , sử dụng bộ chia 8, và xuất ra Port D
+ Vì timer 1 có 16bit nên giá trị tràn là 65536
+ Thạch anh nội 40M và dùng bộ chia 8 ( đầu tiên ta lấy 20/4 sau đó lấy (20/4)/8= 0.625 M)
 0.625M  lấy T=1/f = 1/625 = 1.6us . Như vậy mỗi chu kỳ máy ta được 1.6us do đó
khi tràn ta được 65536*1.6 = 104857.6 us xấp xỉ 105ms.
+ Cờ tràn nằm ở bit thứ 0 trong thanh ghi PIR1(00001100) do đó ta định nghĩa #bit tmr1if=0x0C.0 nếu
xảy ra tràn thì tmr1if=1 , để xóa cờ tràn thì gán tmr1if=0
Lưu ý mở file <16f877a.h> ra và thêm vào #bit tmr1if 0x0c.0 hoặc thêm trực tiếp vào code phía dưới nhé
Code C đây : 


/* dieu khien cac led don sang tat dung timer 1 voi chu ky delay la 210ms */
/*
thuat toan nhu sau T=210ms vay Ton=Toff=105ms
dung he so chia 8 va port D xuat va bat dau dem timer

*/

#include

unsigned int8 X=0x00;
void main()
{
SET_TRIS_D(0x00);
setup_timer_1(T1_internal| T1_div_by_8);
set_timer1(0); // dem bat dau tu 0

while (true)
{
if (tmr1if==1)
{
X=~X;
output_D(x);
tmr1if=0;

}
}
}


Read More
      edit