bac nao da lap trinh C cho khien roi thi co the huong dan qua cau truc lap trinh C cho vi khien duoc khong cam on nhieu . :?:
Thông báo
Collapse
No announcement yet.
lap trinh c cho vi khien
Collapse
X
-
Re: Lập trình C cho vi điều khiển
Nguyên văn bởi ATYLABạn lập trình C thế nào thì dùng cho vi điều khiển cũng như thế, tham khảo bài điều chế độ rộng xung, so sánh 2 cách viết bằng asm và C thì hiểu ngay."ta la mot hat bui tren xa mac bao la"
Comment
-
Ví dụ minh họa
Bạn xem kĩ nhé :
Nếu viết asm một lệnh chuyển dữ liệu ra cổng thực hiện như sau:
mov p1,#01h
Bây giờ viết bằng C thì đơn giản là :
P1=0x01;
Hoặc cấu hình cho thanh ghi TMOD :
mov TMOD,#01
-->C :
TMOD=0x01;
Còn các cấu trúc vòng lặp dùng như khi bạn viết bằng C thông thường
Bạn phải xem vd và làm thử thì mới hiểu, chứ không thể chỉ từng tí cho bạn được.
Bạn xem lại VD phần điều chế độ rộng xung để hiểu thêm.Càng biết nhiều càng thấy mình biết ít.
Comment
-
Tóm lại là muốn lập trình C cho VĐK thì cần đọc kỹ về C đã . Việc chuyển đổi từ assembler sang C thì rất đơn giản , bác chỉ cần xem vài VD là hiểu thôi . Tui thấy quyển lập trình C của tác giả Quách Tuấn Ngọc viết khá là đầy đủ về C , bác có thể tìm đọc . Còn về trình biên dịch C cho 8051 thì tìm bộ Keil , bộ này khá thịnh hành trong dân chúng !
Comment
-
cho bác một đoạn code 8051 để nghiên cứu
đây là một đoạn lập trình robo của một đội trường tôi đấy
#include <AT89X51.H>
bit pwm;
sbit trai3 = P0^0;
sbit trai2 = P0^1;
sbit trai1 = P0^2;
sbit trai0 = P0^3;
sbit phai0 = P0^4;
sbit phai1 = P0^5;
sbit phai2 = P0^6;
sbit phai3 = P0^7;
sbit ML0=P1^0;
sbit ML1=P1^1;
sbit MR0=P1^2;
sbit MR1=P1^3;
sbit start= P2^6;
sbit tren = P2^5;
sbit duoi = P2^4;
sbit N1 = P1^4;
sbit N2 = P1^5;
unsigned char vach;
long j;
void init(){
TMOD=0x02;
TH0=84;
IE=0x82;
pwm=1;
vach=0;
P1=0x00;
TR0=1;
}
void t0isr()interrupt 1{
TR0=0;
TH0=255-TH0;
pwm=~pwm;
TR0=1;
}
void dinhanh(){
P1=0x05;
while(!(trai0&phai0&trai1&phai1)){
if (trai1|trai2|trai3)P1=0x07;
else if (phai1|phai2|phai3)P1=0x0d;
else
if (trai0) {ML0=1;ML1=pwm;
MR0=1;MR1=0;}
else
if (phai0){ ML0=1;ML1=0;
MR0=1;MR1=pwm;}
else P1=0x05;}
P1=0x05;
j=999;
while(j--);
while(trai0&phai0&trai1&phai1);
j=999;
while(j--);
vach++;
}
void dicham(){
P1=0x05;
while(!(trai0&phai0&trai1&phai1))
if (trai0|trai1|trai2|trai3) {ML0=1; ML1=1;
MR0=1; MR1=pwm;}
else if (phai0|phai1|phai2|phai3){ ML0=1;ML1=pwm;
MR0=1;MR1=1;}
else { ML0=1;ML1=pwm;
MR0=1;MR1=pwm;}
//passvach
j=999;
while(j--){ ML0=1;ML1=pwm;
MR0=1;MR1=pwm;}
while(trai0&phai0&trai1&phai1){ ML0=1;ML1=pwm;
MR0=1;MR1=pwm;}
j=999;
while(j--){ ML0=1;ML1=pwm;
MR0=1;MR1=pwm;};
vach++;
}
void quaytrai(){
P1=0x0f;
j=999;
while(j--);
while(trai3) { ML0=pwm;ML1=1;
MR0=1;MR1=0;}
while(!(trai3)) { ML0=pwm;ML1=1;
MR0=1;MR1=0;}
vach=0;
}
void quayphai(){
P1=0x0f;
j=999;
while(j--);
while(phai3) { ML0=1;ML1=0;
MR0=pwm;MR1=1;}
while(!(phai3)) { ML0=1;ML1=0;
MR0=pwm;MR1=1;}
vach=0;
}
void thabong(){
P1=0x0f;
j=2000;while(j--);
while(tren) {N1=1;N2=0;}
N1=0;N2=0;
j=100000;while(j--);
P1=0x0a;
j=9999; while(j--)
P1=0x0f;
}
void reset(){
P1=0x00;
while(1){
while(!(start)){N1=0;N2=1;}
N2=0;
}
}
void batvach(){
while(!(phai0)){ML0=1;ML1=pwm;
MR0=1;MR1=0;}
while(phai0){ML0=1;ML1=pwm;
MR0=1;MR1=0;}
while(!(phai0)){ML0=1;ML1=pwm;
MR0=1;MR1=0;}
P1=0x05;
j=2999;
while(j--);
while(phai3) { ML0=1;ML1=0;
MR0=pwm;MR1=1;}
while(!(phai3)) { ML0=1;ML1=0;
MR0=pwm;MR1=1;}
while(phai3) { ML0=1;ML1=0;
MR0=pwm;MR1=1;}
vach=0;
}
void main(){
init();
while(start)P3=P2;
if (!(P2_0)){batvach();
dicham();quaytrai();
while(vach<2)dinhanh();
dicham();quayphai();
while(vach<14)dinhanh();
dicham();quayphai();
dinhanh();
dicham();quayphai();
dinhanh();
dicham();
thabong();
}
if (!(P2_1)){batvach();
dicham();quaytrai();
while(vach<3)dinhanh();
dicham();quayphai();
while(vach<13)dinhanh();
dicham();quayphai();
while(vach<5)dinhanh();
dicham();quayphai();
dinhanh();dicham();thabong();
}
if (!(P2_2)){batvach();
dicham();quaytrai();
while(vach<3)dinhanh();
dicham();quayphai();
while(vach<13)dinhanh();
dicham();quayphai();
while(vach<5)dinhanh();
dicham();quaytrai();
while(vach<4)dinhanh();dicham();
thabong();
}
if (!(P2_3)){P1=0x05;
while(!(phai0));
while(phai0);
quayphai();
dicham();dicham();
quayphai();
while(vach<2)dinhanh();
dicham();quayphai();
dinhanh();dicham();
quaytrai();
while(vach<6)dinhanh();
dicham();quaytrai();
while(vach<15)dinhanh();
dicham();quaytrai();
dinhanh();dicham();
quaytrai();
dinhanh();dicham();
thabong();
}
reset();
}SHARE KHO PHIM LỚN
Comment
-
lập trình c
cảm ơn bác giaoucan vi` bác đã up vi du rat hay cho anh em xem.
neu bac con nhieu vi du nua mong bác up nôt' lên để em có thể hoc hỏi thêm.
à ma` cho em hỏi bác một tí, khi điều khiển LCD có cách nào xuất một phát ra màn hình cả chuỗi không.mong bác hay huynh de nào đã từng làm rồi thì chi dẫn cho em với.
rất mong được các bác giúp đỡ.!thứ gì không mua được bằng tiền sẽ mua được bằng rất nhiều tiền!!
Comment
-
Re: lập trình c
Nguyên văn bởi rang_lanh_nhonà ma` cho em hỏi bác một tí, khi điều khiển LCD có cách nào xuất một phát ra màn hình cả chuỗi không.mong bác hay huynh de nào đã từng làm rồi thì chi dẫn cho em với.
rất mong được các bác giúp đỡ.!
Bạn hỏi thế cũng khó, nên ra ngoài post 1 luồng và cả phần cứng lên, mọi người sẽ giúp sức.
Comment
-
cảm ơn bác giaoucan vi` bác đã up vi du rat hay cho anh em xem.
neu bac con nhieu vi du nua mong bác up nôt' lên để em có thể hoc hỏi thêm.
à ma` cho em hỏi bác một tí, khi điều khiển LCD có cách nào xuất một phát ra màn hình cả chuỗi không.mong bác hay huynh de nào đã từng làm rồi thì chi dẫn cho em với.
rất mong được các bác giúp đỡ.!
sfr LCDdata = 0x80;
sbit BF = 0x87;
sbit RS = P2^2;
sbit RW = P2^1;
sbit EN = P2^0;
void wait(void)
{
long n = 0;
EN=1;
RS=0;
RW=1;
LCDdata=0xFF;
while(BF){n++; if(n>100) break;}
EN=0;
RW=0;
}
void LCDcontrol(unsigned char x)
{
G_LCD=0;
EN=1;
RS=0;
RW=0;
LCDdata=x;
EN=0;
wait();
G_LCD=1;
}
void LCDinit(void)
{
LCDcontrol(0x30);
LCDcontrol(0x30);
LCDcontrol(0x30);
LCDcontrol(0x38);
LCDcontrol(0x0C);
LCDcontrol(0x06);
LCDcontrol(0x01);
}
void LCDwrite(unsigned char c)
{
G_LCD=0;
EN=1;
RS=1;
RW=0;
LCDdata=c;
EN=0;
wait();
G_LCD=1;
}
void LCDputs(unsigned char *s,unsigned char row)
{
unsigned char len;
if(row==1) LCDcontrol(0x80);
else LCDcontrol(0xC0);
len=strlen(s);
while(len!=0)
{
LCDwrite(*s);
s++;
len--;
}
}
void LCDwrites(unsigned char d)
{
unsigned char i,j;
i=d%10;
d=d/10;
j=d%10;
d=d/10;
LCDwrite(48+d);
LCDwrite(48+j);
LCDwrite(48+i);
}
void LCDwritei(int d)
{
unsigned char i,j,k,l;
i=d%10;
d=d/10;
j=d%10;
d=d/10;
k=d%10;
l=d/10;
LCDwrite(48+l);
LCDwrite(48+k);
LCDwrite(48+j);
LCDwrite(48+i);
}
nen bac co the yen tam vi tinh chinh xac cua no ,vi ban than toi cung da thu nghiem nhieu roaiSHARE KHO PHIM LỚN
Comment
-
oh thank bac giaosucan nhiều vì bác đã tận tình giúp đỡ,
em cũng đã viết thử kiểu đó nhưng phai viết kiểu thủ công,
em sẽ thử xem chuong trình này để áp dụng vào mạch cu thể,
ma` cho em hỏi bác đã từng tham gia robocon thì phải , bác đã viết điều khiển PID cho robo chưa, hay cho khống chế nhiệt độ chẳng hạn nếu bác có chương trình nào rồi mong bác up lên cho em học hỏi (ca phần cứng nưa thì tốt )
vì em mới bắt đầu viết ĐK PID ma` lên chưa có kinh nghiệm sử lí tốt, toàn viết kiểu thủ công thuần túy thôi không có thuật toán nào giúp cho tối ưu chương trình cả,
rất mong bác cũng như các bạn đã có kinh nghiệm giúp đỡ thằng em.
Cảm ơn các bác nhiều!thứ gì không mua được bằng tiền sẽ mua được bằng rất nhiều tiền!!
Comment
-
gửi bác giaosucan cho em hỏi G_LCD la` gì và khai báo ra sao vậy nó có tác dụng gì, sao bác không post cả chương trình lên cho anh em xem,
để mấy người ít kinh nghiệm như bon em đỡ phải đoán già đoán non xem các biến được khai báo như thế nào.. mong sớm có được sự giúp đỡ của bácthứ gì không mua được bằng tiền sẽ mua được bằng rất nhiều tiền!!
Comment
-
file lcdheader.c
sfr LCDdata = 0x80;
sbit BF = 0x87;
sbit RS = P2^2;
sbit RW = P2^1;
sbit EN = P2^0;
void wait(void)
{
long n = 0;
EN=1;
RS=0;
RW=1;
LCDdata=0xFF;
while(BF){n++; if(n>100) break;}
EN=0;
RW=0;
}
void LCDcontrol(unsigned char x)
{
G_LCD=0;
EN=1;
RS=0;
RW=0;
LCDdata=x;
EN=0;
wait();
G_LCD=1;
}
void LCDinit(void)
{
LCDcontrol(0x30);
LCDcontrol(0x30);
LCDcontrol(0x30);
LCDcontrol(0x38);
LCDcontrol(0x0C);
LCDcontrol(0x06);
LCDcontrol(0x01);
}
void LCDwrite(unsigned char c)
{
G_LCD=0;
EN=1;
RS=1;
RW=0;
LCDdata=c;
EN=0;
wait();
G_LCD=1;
}
void LCDputs(unsigned char *s,unsigned char row)
{
unsigned char len;
if(row==1) LCDcontrol(0x80);
else LCDcontrol(0xC0);
len=strlen(s);
while(len!=0)
{
LCDwrite(*s);
s++;
len--;
}
}
void LCDwrites(unsigned char d)
{
unsigned char i,j;
i=d%10;
d=d/10;
j=d%10;
d=d/10;
LCDwrite(48+d);
LCDwrite(48+j);
LCDwrite(48+i);
}
void LCDwritei(int d)
{
unsigned char i,j,k,l;
i=d%10;
d=d/10;
j=d%10;
d=d/10;
k=d%10;
l=d/10;
LCDwrite(48+l);
LCDwrite(48+k);
LCDwrite(48+j);
LCDwrite(48+i);
}SHARE KHO PHIM LỚN
Comment
-
motor.c
unsigned char Motorphu;
void motorleft(unsigned char d,flag)
{
if(flag) {
P0=d|0x7F;// 0111 1111
LE0=1;
LE0=1;
LE0=1;
LE0=0;
LE0=0;
delay10ms();
}
P0=d;
LE0=1;
LE0=1;
LE0=1;
LE0=0;
LE0=0;
}//motorleft(Off,0);
void motorright(unsigned char d,flag)
{
if(flag) {
P0=d|0x7F;
LE1=1;
LE1=1;
LE1=1;
LE1=0;
LE1=0;
delay10ms();
}
P0=d;
LE1=1;
LE1=1;
LE1=1;
LE1=0;
LE1=0;
}
void bothmotor(unsigned char d,flag)
{
if(flag) {
P0=d|0x7F;// 0111 1111
P2|=0xC0;
P2&=0x3F;
delay10ms();
}
P0=d;
P2|=0xC0;
P2|=0xC0;
P2|=0xC0;
P2&=0x3F;
P2&=0x3F;
}//motorleft(Off,0);
void motor1(unsigned char d,flag)//can kiem tra lai cai stop fet khi chuyen relay
{
if(flag){ Motorphu|=0x02;//tat fet
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
delay10ms();
}
if(d==Subforward){
Motorphu|=0x3;
Motorphu&=0xFD;//clear bit 1 cua chot
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Subreverse){
Motorphu|=0x3;
Motorphu&=0xFC;//batrelay
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Run){ Motorphu&=0xFD;
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Stop){
Motorphu|=0x2;
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
}//end of motor1 subroutine
//Motor 2 Subroutine
// 7 6 5 4 3 2 1 0
//Motorphu Forward
// 0 0 n n n n 0 1
// 0 0 n n n n 0 0
// 0 0 // x x OF3 RF3 OF2 RF2 OF1 RF1
// 1 1 1 1 0 1 1 1
void motor2(unsigned char d,flag)//can kiem tra lai cai stop fet khi chuyen relay
{
if(flag){ Motorphu|=0x08;//tat fet
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
delay10ms();
}
if(d==Subforward){
Motorphu|=0x0C; // 1 1
Motorphu&=0xF7;//clear bit cua chot
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Subreverse){
Motorphu|=0x0C;
Motorphu&=0xF3;//batrelay
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Run){ Motorphu&=0xF7;
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Stop){
Motorphu|=0x08;
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
}
//motor 3 subroutine
// 7 6 5 4 3 2 1 0
//Motorphu Forward
// 0 0 n n n n 0 1
// 0 0 n n n n 0 0
// 0 0 // x x OF3 RF3 OF2 RF2 OF1 RF1
// 1
void motor3(unsigned char d,flag)//can kiem tra lai cai stop fet khi chuyen relay
{
if(flag){ Motorphu|=0x20;//tat fet
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
delay10ms();
}
if(d==Subforward){
Motorphu|=0x30; // 1 1
Motorphu&=0xDF;//clear bit cua chot
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Subreverse){
Motorphu|=0x30;
Motorphu&=0xCF;//batrelay
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Run){ Motorphu&=0x30;
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
if(d==Stop){
Motorphu|=0x20;
P0=Motorphu;
LE2=1;
LE2=1;
LE2=1;
LE2=0;
LE2=0;
}
}SHARE KHO PHIM LỚN
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi mèomướpDạ thấy chú dinh... có vẻ mặn nồng với đèn sự cố nên cháu rình lúc chị hàng xóm đi vắng bắc thang trèo lên chụp mấy cái đèn nhà chị ấy ạ. Tầm vài trăm cái dùng tuýp led 220v bình thường ấy ạ. Dùng chiếu sáng thay bóng tuýp luôn Hơn...
-
Channel: Điện tử công suất
Hôm qua, 22:38 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi bqvietTheo sơ đồ bạn đã vẽ thì đây chỉ là mạch nguồn flyback không cách ly, phản hồi cả dòng lẫn áp thôi mà. Một dạng nguồn CC-CV thông dụng. Kiếm con chip tốt làm là được, nếu chịu chạy dãy LED có cách ly thì càng tốt.
Vấn đề...-
Channel: Điện tử công suất
Hôm qua, 21:56 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi dinhthuong80Phật có dạy là CHÁNH NIỆM (hay CHÍNH gì ấy, ĐT bị... rối loạn ngôn ngữ và trí nhớ, mong lượng thứ!) - CHÁNH NGỮ - CHÁNH HÀNH ĐỘNG, đó là đường hướng tới CHÁNH ĐẠO.
ĐT ngu muội nên cứ áp dụng vào điện tử: phải cố...-
Channel: Điện tử công suất
06-02-2025, 06:16 -
-
Trả lời cho [HELP] mạch cầu H inverter 100vdc to 100v ?bởi ngoctn93Em cũng có nguồn 250 đến 280vdc muốn chuyển sang 100vac bằng mạch cầu H dùng esg002. Có bác nào làm rồi chỉ em hoặc bán em với ạ. Em xin cảm ơn ạ
-
Channel: Điện tử công suất
05-02-2025, 23:00 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi mèomướpCháu thấy chú nhat... viết toàn cái gì gì ấy ạ khó hiểu ghê, chắc mai cháu phải đi hỏi mấy anh chị lớp lớn hơn xem sao ạ. Những việc lớn tầm cỡ thì hông phải ai cũng có đủ kiến thức, thời gian, sức khỏe, tiền bạc, đam mê, kiên...
-
Channel: Điện tử công suất
05-02-2025, 22:11 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Bác bảo ai lớn tờ iếng tiếng?
Hùng là không nhé. Chỉ bảo tận tình chứ không tận diệt.
Yêu kỹ thuật nên vẫn tham gia cho vui thôi. Mấy của nợ này dùng con PIC hai chục ngàn còn ngon luôn....-
Channel: Điện tử công suất
05-02-2025, 21:38 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi vi van phamThôi mà, anh em giúp đỡ nhau, có gì mà lớn tiếng?
Ai không chịu giúp đỡ nhau thì vào đây nhậu với tui. Bà xã hôm nay ngũ sớm tui được tự do, solo buồn quá, Nhathung,Dinhthuong ,Đinh Vặn gì đó tui cân tuốt.-
Channel: Điện tử công suất
05-02-2025, 21:16 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Thằng I Lôn Mút nó sắp đưa người lên sao Hỏa rồi.
Mấy anh em vẫn bàn cái "Một Phát Phải Thôi" thì nẫu quá.
Ngâm cứu cái gì cho đáng đi. Còn tôi nói gì hơi quá thì xin lỗi nhé.-
Channel: Điện tử công suất
05-02-2025, 19:45 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Và tôi thấy cái này như con bò sữa thôi mà. Nếu xét nguyên lý.
Bóp bóp bóp... đến hết thì thôi. Cái mạch thì nguồn sơ đẳng. Con để bóp thì vu nó lại cáo cào cao.
Ắc qui hay pin thì vưỡn giá nào xào nấy. Inverter thì...-
Channel: Điện tử công suất
05-02-2025, 19:33 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Chip hay trở? Chip tôi có vài bịch để từ trước tết, mai giặt.
Trở thì tồn vài cân. Toàn hàng đặt, sai số 1%.
Nhưng ở đây ko buôn bán, chỉ tặng....-
Channel: Điện tử công suất
05-02-2025, 19:14 -
Comment