PIC Vietnam

Go Back   PIC Vietnam > Robotics > Thực hành

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

Thực hành Bắt đầu làm một robot như thế nào? Mẹo vặt? Kỹ thuật? Công nghệ?... Hãy bắt tay vào việc...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 11-03-2010, 12:11 AM   #1
dacthuong
Nhập môn đệ tử
 
Tham gia ngày: May 2009
Bài gửi: 2
:
Smile lập trình cho pic bằng ngôn ngữ C

Chào tất cả các bạn.
Mình đang học lập trình pic, mình đang tập viết một chương trình cho led 7 đoạn nhưng chưa chạy được. Mong các bạn giúp đỡ mình nhé.
Cảm ơn các bạn nhiều!
Đây là chương trình xuất led 7 đoạn ra portb, Các bạn xem có sai chỗ nào sửa dùm mình nhé.


#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)


const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi; // khai bao kieu du lieu
int16 mdonvi;

void main()
{set_tris_B(0x00);
//xuat port b
while(1)
{for(donvi=0;donvi<10;donvi++);
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}

}
dacthuong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-03-2010, 09:18 AM   #2
trai_xq
Đệ tử 1 túi
 
Tham gia ngày: Feb 2010
Bài gửi: 15
:
Trích:
Nguyên văn bởi dacthuong View Post
Chào tất cả các bạn.
Mình đang học lập trình pic, mình đang tập viết một chương trình cho led 7 đoạn nhưng chưa chạy được. Mong các bạn giúp đỡ mình nhé.
Cảm ơn các bạn nhiều!
Đây là chương trình xuất led 7 đoạn ra portb, Các bạn xem có sai chỗ nào sửa dùm mình nhé.


#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)


const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi; // khai bao kieu du lieu
int16 mdonvi;

void main()
{set_tris_B(0x00);
//xuat port b
while(1)
{for(donvi=0;donvi<10;donvi++);
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}

}
Cách lập trình của bạn rất đơn giản. Bạn sai ở chổ
while(1)
{for(donvi=0;donvi<10;donvi++);
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}
trong vòng for nếu bạn đặt dấu ; nghĩa là đoạn chương trình dưới sẽ không thực hiện theo vòng for đó. Cho nên ban bỏ dấu ; đó đi. Ngoài ra chương trình của bạn là dùng led7seg anot chung, catot điều khiển.

#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)


const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi; // khai bao kieu du lieu
int16 mdonvi;

void main()
{set_tris_B(0x00);
//xuat port b
while(1)
{for(donvi=0;donvi<10;donvi++)
{mdonvi=ma7doan[donvi]; // lay ma led
output_B(mdonvi);
delay_ms(100);
}
}

}
trai_xq vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-03-2010, 10:02 AM   #3
dacthuong
Nhập môn đệ tử
 
Tham gia ngày: May 2009
Bài gửi: 2
:
Chào các bạn. Mình gõ lại bài thầy làm nhưng khi cho mô phỏng thì mạch chạy không đúng( bài này dùng quét led). Mong các bạn sửa chỗ sai dùm mình với.
Cảm ơn các bạn nhiều!

#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)

const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi,dem,chuc,i; // khai bao kieu du lieu
unsigned char mdonvi,mchuc;

void div_bcd(int tam)
{chuc=tam/10;
donvi=tam%10;
mchuc=ma7doan[chuc];
}

void hienthi()
{for(i=0;i<250;i++)
{output_b(mdonvi);
output_d(0xfe);
delay_ms(1);

output_b(mchuc);
output_d(0xfd);
delay_ms(1);
}
}

void main()
{set_tris_b(0x00);
set_tris_d(0x00);
while(1)
{for(dem=0;dem<100;dem++)
{div_bcd(dem);
hienthi();
}
}
}
dacthuong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-03-2010, 06:46 PM   #4
trai_xq
Đệ tử 1 túi
 
Tham gia ngày: Feb 2010
Bài gửi: 15
:
Trích:
Nguyên văn bởi dacthuong View Post
Chào các bạn. Mình gõ lại bài thầy làm nhưng khi cho mô phỏng thì mạch chạy không đúng( bài này dùng quét led). Mong các bạn sửa chỗ sai dùm mình với.
Cảm ơn các bạn nhiều!

#include<16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(d)

const unsigned char ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
int8 donvi,dem,chuc,i; // khai bao kieu du lieu
unsigned char mdonvi,mchuc;

void div_bcd(int tam)
{chuc=tam/10;
donvi=tam%10;
mchuc=ma7doan[chuc];
}

void hienthi()
{for(i=0;i<250;i++)
{output_b(mdonvi);
output_d(0xfe);
delay_ms(1);

output_b(mchuc);
output_d(0xfd);
delay_ms(1);
}
}

void main()
{set_tris_b(0x00);
set_tris_d(0x00);
while(1)
{for(dem=0;dem<100;dem++)
{div_bcd(dem);
hienthi();
}
}
}
Bài lập trình của bạn sai ở hàm hiển thị. Tuy nhiên lập trình như vậy còn lủng cũng quá. Tôi sửa bài của bạn lại như thế này:

#include <16f877A.h>
#fuses NOWDT,PUT,HS,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(d)
byte const ma7doan[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
void hienthi(int so)
{
int hc,hdv;
hc=so/10;
hdv=so%10;
//hien thi so hang chuc
output_low(pin_a4);//cho chan a4 xuong muc thap--->>>qua transitor(PNP)--->>>>tich cuc led hang chuc
output_high(pin_a5);//cho chan a4 len muc cao--->>>qua transitor(PNP)--->>>>khoa led hang don vi
output_b(ma7doan[hc]);//hien thi so hangf chuc da chuyen doi BCD
delay_ms(100);//thay doi tuy theo ban chon thach anh
//hien thi so hang don vi
output_high(pin_a4);
output_low(pin_a5);
output_b(ma7doan[hdv]);
delay_ms(100);
}

void main()
{
int8 count=0;
int8 i;
set_tris_b(0x00);
//set_tris_a(0x00);
while(1)
{
for(i=0;i<2;i++)//vong for de lap hien thi, de tao thoi` gian tre
{
hienthi(count);
count++;
if(count==10) count=0; //reset lai
}
}
}

chú ý: bài này led hàng chuc được nối với RA4, led hàng đơn vị nối với RA5 qua transitor loại pnp(tíc cực múc 0). port b nói với led7seg
trai_xq vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-11-2010, 09:05 AM   #5
ichitea606
Đệ tử 2 túi
 
Tham gia ngày: Nov 2010
Bài gửi: 26
:
bạn TRAI_XQ ơi cho mình hỏi cái này nha
mình đang viết đo hiển thị nhiệt độ trên LCD nhưng cần thêm 2 nút nhấn tăng giảm đễ hiển thị nhiệt độ trên LCD vỉ đó là nhiệt độ cài đặt để báo cháy. nhưng không biết làm sao để nhấn nút tăng giảm dc mong bạn chỉ giúp
ichitea606 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-11-2010, 10:06 AM   #6
ichitea606
Đệ tử 2 túi
 
Tham gia ngày: Nov 2010
Bài gửi: 26
:
pic

và đây là code chỉnh nút tăng vì toàn bộ truong trình thì dài quá. Nếu xong ai quan tâm mình post toàn bộ
#include <16F877A.h>
#include <DEF_16F877A.h>
#device *=16 adc=8
#fuses NOWDT,NOPROTECT,NOLVP,HS,NOPUT,NODEBUG, NOBROWNOUT,NOCPD, NOWRT
#use delay(clock=20000000)
#define RS RB0
#define RW RB1
#define E RB2
#define LED RB3

#define LCD PORTC
#define TANG rd0

unsigned char CD[]="N_DO BAO:";
unsigned char so[]="0123456789";
int8 I,CHUC,DV,BIEN;

void CONTROL(void)
{
RS = 0;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}

void WRITE(void)
{
RS = 1;
RW = 0;
E = 1;
E = 0;
delay_ms(1);
}

// KHOI TAO LCD

void main(void)
{
set_tris_B(0);
set_tris_C(0);
set_tris_D(0xff);

delay_ms(100);

LCD = 0x38;
CONTROL();
LCD = 0x0C;
CONTROL();

WHILE(TRUE)

{
bien=0;
delay_ms(10);

if(tang==0)
{
delay_ms(50);

while(tang==0)
{
CONTINUE ;
};
bien++;
}
CHUC=BIEN/10;
DV =BIEN%10;

LCD = 0xC0;
CONTROL();

i=0;
while (i<=8)
{
LCD = CD[i];
WRITE();
i++;
}
LCD = 0xCA;
CONTROL();
LCD = so[chuc];
WRITE();
LCD = so[dv];
WRITE();
}

}
ichitea606 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à 09:30 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