Thông báo
Collapse
No announcement yet.
code cho PIC 16f887 chức năng giống PT 2262 -2272
Collapse
X
-
bác queduong cho e hỏi cái, phần code thu, chỗNguyên văn bởi queduong Xem bài viếtNhớ ngày xưa cách đây chác vài năm cũng viết cho em nào đó ở Quảng Ninh , Hải Phòng ... cái đề tài tương tự ... mò trong máy tính được cái này :
Điều khiển 8 led nút bấm ( PIC16F877A) --- CCS nhé.
( cách thức hoạt động : Gạt switch ... bấm nút send ... bên thu sẽ sáng led tương ứng --- Có mã nguồn C ở bên dưới ... pố
tùy ý sửa code theo ý muốn nha !
)
Thu :
Code:#include <16F877A.h> #device adc=8 #FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, WRT_50% #use delay(clock=4000000) #define RX_ID 0x30 // Receiver ID #define RX PIN_C7 // Chan nhan xung ma hoa #define Led PIN_D1 // power led unsigned char RX_packet[3],x; int1 rx_bit; // rx_bit range value : 0 or 1 unsigned int checksum; int1 Receiver(unsigned char *buff); void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_comparator(NC_NC_NC_NC); set_tris_b(0x00); // Port b all out put output_b(0x00); // port b all low set_tris_c(0xFF); // port C all input ( RC7 input) set_tris_d(0xFD); output_high(Led); while(TRUE) { checksum=0; while(Receiver(RX_packet)); for(x=0;x<2;x++) checksum+= RX_packet[x]; checksum&= 0x0FF; if(checksum==RX_packet[2]) // Kiem tra tong cua goi du lieu (packet) { if(RX_packet[0]==RX_ID) // Kiem tra ID { output_b(RX_packet[1]); // Xuat ra port b } } } // End while(1) } //////////////////////////// Functions //////////////////////////// int1 Receiver(unsigned char *buff) { unsigned char i,j,T0,count; i=32; count=0; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); // setup timer 0 div 2 while(--i) // wait preamble { #asm NOP; NOP; NOP; #endasm while(input(RX)); set_timer0(0); // reset timer0 = 0 #asm NOP; NOP; NOP; #endasm while(!input(RX)); T0=get_timer0(); // doc timer 0 if (T0==0xFF) {return 1;} // error if ((T0>=198) && (T0<=218)) // check pulse 396us --> 436us (OK ) { count++; if ((count>=1)|| (i==0)) break; } } if ((count==0)&&(i==0)) {return 1;} // error setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); // setup time0 div 16 T0=0; while (!((T0>=94) && (T0<=114))) // 1504 - 1824 uS it OK. syn bit for 4Te or 1664 uS { #asm NOP; NOP; NOP; #endasm while(input(RX)); // wait syn set_timer0(0); // reset timer0 = 0 #asm NOP; NOP; NOP; #endasm while(!input(RX)); T0=get_timer0(); // doc timer 0 } while(input(RX)); //wait start bit go low delay_us(624); // delay before sampling (1.5Te) for (j=0;j<3;j++) // build packet bytes ( 3 bytes) { i=8; // build paket bit (8 bits ) buff[j]=0; while(i--) { buff[j]=buff[j]<<1; rx_bit=input(RX); // check logic (0,1) chan RX buff[j]=buff[j] | rx_bit; if (rx_bit==0) while(!input(RX)); else while(input(RX)); delay_us(624); // delay for 1,5Te } } if (rx_bit==0) if (!input(RX)) return 1; // error (no stop bit found) else if (!input(RX)) return 1; // error (no stop bit found) return 0; }
--- Thôi ... hết rồi . Đi ngủ cho khỏe !
#asm
NOP;
NOP;
NOP;
#endasm
- sao có phần code asm chi vậy bác, thay bằng delay ko được àh ?.
- với phần timer nếu dùng chia tỉ lệ là 1 thì trong 1 chu kì máy ở đây là 1us, thì timer0 nó đếm được 256 giá trị tương ứng trong khoảng thời gian 256us, nếu chọn tỉ lệ chia 2 thì 256 giá trị tương ứng khoảng thời gian 512us phải ko ?? . hơi mất căn bản timer bác thông cảm
if ((count>=1)|| (i==0)) code này thì hiểu như thế nào vậy ạh ? ,
- em thấy có dùng biến *buff trong đoạn sub int1 Receiver(unsigned char *buff) , vậy biến này là gị vậy ạ, hình như là biến đệm hay gì đó vì giống từ buffer
Last edited by minhtri0405; 05-12-2013, 00:43.CK6C -HUI
Comment
-
Tùy sở thích thôi bạn. Thay bằng delay cũng được.Nguyên văn bởi minhtri0405 Xem bài viếtbác queduong cho e hỏi cái, phần code thu, chỗ
#asm
NOP;
NOP;
NOP;
#endasm
- sao có phần code asm chi vậy bác, thay bằng delay ko được àh ?.
Chính xác !- với phần timer nếu dùng chia tỉ lệ là 1 thì trong 1 chu kì máy ở đây là 1us, thì timer0 nó đếm được 256 giá trị tương ứng trong khoảng thời gian 256us, nếu chọn tỉ lệ chia 2 thì 256 giá trị tương ứng khoảng thời gian 512us phải ko ?? . hơi mất căn bản timer bác thông cảm
Nếu (count lớn hơn hoặc bằng 1) hoặc (i=0).if ((count>=1)|| (i==0)) code này thì hiểu như thế nào vậy ạh ? ,
Nó là biến đệm để truyền giá trị vào 1 hàm. Ví dụ delay_ms(100) thì buff là để truyền giá trị 100 vào hàm delay.- em thấy có dùng biến *buff trong đoạn sub int1 Receiver(unsigned char *buff) , vậy biến này là gị vậy ạ, hình như là biến đệm hay gì đó vì giống từ buffer
Comment
-
em cũng hiểu là như vậy nhưng nếu vậy thì điều kiện đó luôn đúng mà, giả sử 1 xung đủ điều kiện là >396us và < 436us thì count lên 1 rồi => câu if ((count>=1)|| (i==0)) đúng , lệnh break thực hiện rồi còn đâu ?? mà đếm nữaNguyên văn bởi duong_act Xem bài viết
Nếu (count lớn hơn hoặc bằng 1) hoặc (i=0).CK6C -HUI
Comment
-
Thì nó đủ điều kiện rồi mới không cần đếm nữa ( biết là thằng phát đang phát ... đồng bộ được rồi thì ngồi chờ xung Sync và START, thì còn đếm làm gì nữa ).Nguyên văn bởi minhtri0405 Xem bài viếtem cũng hiểu là như vậy nhưng nếu vậy thì điều kiện đó luôn đúng mà, giả sử 1 xung đủ điều kiện là >396us và < 436us thì count lên 1 rồi => câu if ((count>=1)|| (i==0)) đúng , lệnh break thực hiện rồi còn đâu ?? mà đếm nữa
Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
module hàng chợ , tốc độ thần kim quy thì khó khăn đấy , chịu khó xem lại bố trí phân bổ thời gian để lập trình ... hoặc kiểu RTOS hoặc dùng các module chuyên dụng có khả năng hơn . RC0 thì chỉ có ngắt timer1 bên ngoài thôi ... chẳng giải quyết được gì.Nguyên văn bởi minhtri0405 Xem bài viếtcó thể dùng ngắt trong mạch thu Rx được ko các bác, e dùng thời gian thực nữa mà vòng lặp nó làm cho thời gian thực chạy ko được, nếu ngắt được thì port C có ngắt được ko , cụ thể là PIN C0, chứ e in mạch rồi lười vẽ lại quáModule RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
anh ơi cho em hỏi .giờ e muốn điều khiển 1 led bằng mắt thu hồng ngoại .sau đó cho nó qua triac khuyếch đại công suất lên điều khiển bóng 220v .thì code này viết lại hay xóa phần nào anh ! tks anh nhiều ....e đang làm đồ án .mong mấy a giúp đỡ
Comment
-
anh ơi cho em hỏi .giờ e muốn điều khiển 1 led bằng mắt thu hồng ngoại .sau đó cho nó qua triac khuyếch đại công suất lên điều khiển bóng 220v .thì code này viết lại hay xóa phần nào anh ! tks anh nhiều ....e đang làm đồ án .mong mấy a giúp đỡNguyên văn bởi queduong Xem bài viếtNhớ ngày xưa cách đây chác vài năm cũng viết cho em nào đó ở Quảng Ninh , Hải Phòng ... cái đề tài tương tự ... mò trong máy tính được cái này :
Điều khiển 8 led nút bấm ( PIC16F877A) --- CCS nhé.
( cách thức hoạt động : Gạt switch ... bấm nút send ... bên thu sẽ sáng led tương ứng --- Có mã nguồn C ở bên dưới ... pố
tùy ý sửa code theo ý muốn nha !
)
[ATTACH=CONFIG]77578[/ATTACH]
Phát :
Code:#include <16F877A.h> #device adc=8 #FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, WRT_50% #use delay(clock=4000000) #define TX_ID 0x30 // Transmitter ID #define TX PIN_C6 // Chan phat xung ma hoa #define Button PIN_D0 // nut bam #define Led PIN_D1 // Power led unsigned char TX_packet[3]; unsigned char i,j; unsigned int checksum; void Transmitter(); void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_comparator(NC_NC_NC_NC); set_tris_c(0b10111111); output_c(0x00); set_tris_a(0x00); output_a(0x00); set_tris_d(0xFD); // rd1 output output_high(Led); while(TRUE) { if(!input(Button)) { do { // Dong goi du lieu // ( data packet ) checksum=0; TX_packet[0]=TX_ID; // Transmitter ID checksum+= TX_packet[0]; TX_packet[1]=input_b(); // doc trang thai port b checksum+= TX_packet[1]; TX_packet[2]=checksum; // goi du lieu ( Tong ( Sum ) ) // gui du lieu qua chan TX Transmitter(); } while(!input(Button)); delay_ms(200); // Chong rung phim } } } ///////////////// functions //////////////////////// void Transmitter() { for (i=0;i<32;i++) // send preamble { output_high(TX); delay_us(416); // Delay 416 uS output_low(TX); delay_us(416); // } delay_us(1248); // delay 1248 uS or 3Te for syn bit //----------------- output_high(TX); // start bit delay_us(416); output_low(TX); delay_us(416); //----------------- for (j=0;j<3;j++) // 3 bytes packet transmitter { for(i=0;i<8;i++) { if ((TX_packet[j] & 0x80) == 0x80) { output_high(TX); delay_us(416); output_low(TX); delay_us(416); } else { output_low(TX); delay_us(416); output_high(TX); delay_us(416); } TX_packet[j]=TX_packet[j]<<1; } } //------ send stop bit ------- output_high(TX); delay_us(416); output_low(TX); delay_us(416); delay_ms(20); // delay gaurd } //////////////////////////////
Thu :
Code:#include <16F877A.h> #device adc=8 #FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, WRT_50% #use delay(clock=4000000) #define RX_ID 0x30 // Receiver ID #define RX PIN_C7 // Chan nhan xung ma hoa #define Led PIN_D1 // power led unsigned char RX_packet[3],x; int1 rx_bit; // rx_bit range value : 0 or 1 unsigned int checksum; int1 Receiver(unsigned char *buff); void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_comparator(NC_NC_NC_NC); set_tris_b(0x00); // Port b all out put output_b(0x00); // port b all low set_tris_c(0xFF); // port C all input ( RC7 input) set_tris_d(0xFD); output_high(Led); while(TRUE) { checksum=0; while(Receiver(RX_packet)); for(x=0;x<2;x++) checksum+= RX_packet[x]; checksum&= 0x0FF; if(checksum==RX_packet[2]) // Kiem tra tong cua goi du lieu (packet) { if(RX_packet[0]==RX_ID) // Kiem tra ID { output_b(RX_packet[1]); // Xuat ra port b } } } // End while(1) } //////////////////////////// Functions //////////////////////////// int1 Receiver(unsigned char *buff) { unsigned char i,j,T0,count; i=32; count=0; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); // setup timer 0 div 2 while(--i) // wait preamble { #asm NOP; NOP; NOP; #endasm while(input(RX)); set_timer0(0); // reset timer0 = 0 #asm NOP; NOP; NOP; #endasm while(!input(RX)); T0=get_timer0(); // doc timer 0 if (T0==0xFF) {return 1;} // error if ((T0>=198) && (T0<=218)) // check pulse 396us --> 436us (OK ) { count++; if ((count>=1)|| (i==0)) break; } } if ((count==0)&&(i==0)) {return 1;} // error setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); // setup time0 div 16 T0=0; while (!((T0>=94) && (T0<=114))) // 1504 - 1824 uS it OK. syn bit for 4Te or 1664 uS { #asm NOP; NOP; NOP; #endasm while(input(RX)); // wait syn set_timer0(0); // reset timer0 = 0 #asm NOP; NOP; NOP; #endasm while(!input(RX)); T0=get_timer0(); // doc timer 0 } while(input(RX)); //wait start bit go low delay_us(624); // delay before sampling (1.5Te) for (j=0;j<3;j++) // build packet bytes ( 3 bytes) { i=8; // build paket bit (8 bits ) buff[j]=0; while(i--) { buff[j]=buff[j]<<1; rx_bit=input(RX); // check logic (0,1) chan RX buff[j]=buff[j] | rx_bit; if (rx_bit==0) while(!input(RX)); else while(input(RX)); delay_us(624); // delay for 1,5Te } } if (rx_bit==0) if (!input(RX)) return 1; // error (no stop bit found) else if (!input(RX)) return 1; // error (no stop bit found) return 0; }
--- Thôi ... hết rồi . Đi ngủ cho khỏe !
Comment
-
Bạn cài bộ dao động sóng mang 38Khz bên ngoài vào là chẳng phải chỉnh sửa về code. Còn không thì viết mới hoàn toàn . Tìm trong diễn đàn có nhiều bài đã viết về điều khiển hồng ngoại . Cứ Hỏi không tìm ... chẳng ai buồn giúp.Nguyên văn bởi gse7en Xem bài viếtanh ơi cho em hỏi .giờ e muốn điều khiển 1 led bằng mắt thu hồng ngoại .sau đó cho nó qua triac khuyếch đại công suất lên điều khiển bóng 220v .thì code này viết lại hay xóa phần nào anh ! tks anh nhiều ....e đang làm đồ án .mong mấy a giúp đỡModule RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
Click vào hình nhỏ sẽ được TONguyên văn bởi 09069 Xem bài viếtảnh nhỏ quá bác quế dương ơi chả thấy gì cả
Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
-
Click vào nó sẽ hiện 1 nhỏ , 1 to :
- Đây là cái hình nhỏ : http://www.dientuvietnam.net/forums/...2-led_send.jpg
- Đây là cái hình to :
http://www.dientuvietnam.net/forums/...2-led_send.jpgModule RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi bqvietBqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
-
Channel: Thiết bị điện tử cá nhân
06-12-2025, 17:17 -
-
Trả lời cho Xin hỏi về mạch thu FM/AM trong catsettebởi nguyendinhvanTheo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
-
Channel: Điện thanh
05-12-2025, 19:59 -
-
Trả lời cho Đấu tắt điện cho máy tính bảngbởi afrendlyCó vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
-
Channel: Thiết bị điện tử cá nhân
04-12-2025, 01:27 -
-
Trả lời cho Máy điện châm ?bởi nick22Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
-
Channel: Điện tử y sinh
01-12-2025, 13:23 -


Comment