mình thì không rành về delphi và cũng chưa lập trình về delphi bao giờ, nhưng lập trình giao tiếp mạng bằng C#.net thì mình có cái ví dụ gửi nhận UDP có thể dùng để bạn tham khảo lập trình giao tiếp mạng.
Thông báo
Collapse
No announcement yet.
Ngâm cứu ENC28J60 để giao tiếp với mạng Internet
Collapse
X
-
chào tất cả các bạn. mình đọc qua luồng này thấy đề tài này rất hay. mình chưa tìm hiểu sâu về con ENC28J60. mình thấy trên sơ đồ thì VDK+ENC28J60. theo các bạn mình hiểu là VDK có nhiệm vụ là giao tiếp với các ngoại vi + nhận yêu cầu từ ENC28J60 và trả lời những yêu cầu đó cho ENC28J60. còn ENC28J60 có nhiệm giao tiếp với modem. tuy nhiên mình vẫn chưa rõ ở chỗ là cài đặt cấu hình cho con ENC28J60 như thế nào. dùng phần mềm gì.vì mình đang muốn dùng Psoc để giao tiếp với ENC28J60.thanks!
Comment
-
Bạn Hvlongffffff ui! Mình muốn làm đồ án về điều khiển thiết bị từ xa qua Internet, ko biết làm theo cách mà bạn hướng dẫn có được ko? bạn nói "có thể sử dụng làm web sever trên Internet" là sao mình ko hiểu?! Có thể cho mình email và phone ko, mình liên hệ trực tiếp cho nhanh nà.Nguyên văn bởi hvlongffffff Xem bài viếtcái này mình đang làm , thấy nó chạy tốt. gửi nhận bằng udp và tcp(webserver) có thể sử dụng làm webserver trên internet.
đây là sơ đồ nguyên lý.

còn đây là code:
còn đây là link hướng dẫn làm.
mình đang làm đồ án nên bận quá không đủ thời gian hướng dẫn cụ thể.
còn đây là trình biên dịch mã nguồn chạy trên window:WINAVR V20070525
còn đây là phần mềm kiểm tra các gói tin gửi đi trên mạng lan. (cách sử dụng phần mềm)
đây là những gì mình đang làm và đang chạy rất tốt. chúc các bạn thành công.
Với lại các cao thủ ra tay giúp với, mình đã làm mạch điều khiển xài con pic 18F452, chỉ kết nối với vài con led và động cơ bước thôi, vì mình tính gắn webcam lên rồi điều khiển góc quay của nó để theo dõi từ xa vậy mà. và mua cái board giao tiếp ethernet của công ty Thiên Minh rùi. Bước tiếp theo là làm thế nào?
Gấp gấp các sư huynh ơi, tới hạn nộp đồ án rùi!!!
Mail của mình: phutgiaomua@yahoo.com
Cứu với cứu với!
Comment
-
Mình cũng đang làm đồ án về điều khiển thiết bị từ xa qua Internet (ATmega32+Enc28j60).Mình sử dụng Router VT-AD02 Adsl 2/2+ (khuyến mãi của Viettel), Router này gồm có một port Ethernet + 1 port USB. PC kết nối với port USB, board giao tiếp Ethernet(ENC28j60) kết nối với port Ethernet. Vấn đề đặt ra là với cách kết nối như vậy, PC có kết nối với board giao tiếp ethernet để điều khiển được thiêt bị (qua web-sever) được không, vì mình thử test bằng lệnh ping như không nhận được. Mình cũng đã cố gắng tìm hiểu, nhưng tới giờ này vẫn chưa giải quyết được. Mong các bạn dành một ít thời gian giúp đỡ mình tìm ra hướng đi.
Nếu cách kết nối như trên là không khả thi, thì mình phải làm như thế nào.
Cảm ơn và mong sự giúp đỡ của các bạn.
Comment
-
bạn nối thẳng vào PC coi ping đc hok đãNguyên văn bởi minh tuong Xem bài viếtMình cũng đang làm đồ án về điều khiển thiết bị từ xa qua Internet (ATmega32+Enc28j60).Mình sử dụng Router VT-AD02 Adsl 2/2+ (khuyến mãi của Viettel), Router này gồm có một port Ethernet + 1 port USB. PC kết nối với port USB, board giao tiếp Ethernet(ENC28j60) kết nối với port Ethernet. Vấn đề đặt ra là với cách kết nối như vậy, PC có kết nối với board giao tiếp ethernet để điều khiển được thiêt bị (qua web-sever) được không, vì mình thử test bằng lệnh ping như không nhận được. Mình cũng đã cố gắng tìm hiểu, nhưng tới giờ này vẫn chưa giải quyết được. Mong các bạn dành một ít thời gian giúp đỡ mình tìm ra hướng đi.
Nếu cách kết nối như trên là không khả thi, thì mình phải làm như thế nào.
Cảm ơn và mong sự giúp đỡ của các bạn.
hình như Ethernet cũng có vụ cable thẳng/chéo (hok rành chỉ nghe nói thui ^^)Kit thí nghiệm 8051 + mạch nạp + cable + LCD16x2 + CD hướng dẫn, giá chỉ
Comment
-
Cảm ơn bạn team.hatlife đã tư vấn cho mình. Bạn có thể nói rõ hơn được không ạ. Nối thẳng vào PC bằng cách nào vì Board giao tiếp Ethernet (enc28j60) chỉ có một cổng RJ45 để cắm vào Router thôi.Nguyên văn bởi team.hatlife Xem bài viếtbạn nối thẳng vào PC coi ping đc hok đã
hình như Ethernet cũng có vụ cable thẳng/chéo (hok rành chỉ nghe nói thui ^^)
Cảm ơn và rất mong sự giúp đỡ của team.hatlife và các bạn!
Comment
-
mình thì cũng làm qua rồi, có lẽ mọi người cần hỏi gì thì mình có thời gian sẽ trả lời thì tốt hơn, vì bản chất các bạn phải hiểu rõ được quá trình truyền nhận dữ liệu dữ liệu của các giao thức trên mạng khi làm về vấn đề này.
về mặt mạch thì không có gì đặc biệt, 1 avr32 hoạt động điện áp 5v và 3v3, 1 enc28j60, 1 jack rj45.
bạn minh tường muốn kiểm tra được mạch hoạt động hay chưa thì phải kiểm tra từng bước: kiểm tra jack rj45, kiểm tra enc28, kiểm tra gửi một gói dữ liệu bất kỳ lên mạng bằng mạch enc xem đèn tín hiệu trên jack rj45 có sáng không. khi mạch ethernet đã chắc chắn hoạt động tốt, thì cắm mạch ethernet vào model của bạn rồi dùng máy tính ping đến thử, nhưng bạn phải chắc rằng bạn đã viết hàm cho mạch ethernet để trả lời khi có tín hiệu ping từ mạng. và bạn nên cẩn thận khi thực hiện với model, vì khi cắm mạch ethernet vào model, thì trước khi bạn gửi tín hiệu ping tới mạch ethernet thì có vô số gói tin trên mạng gửi đến mạch ethernet của bạn, và nếu không lập trình để chuẩn bị tình huống này thì mạch ethernet của bạn sẽ không hoạt động được trước khi nhận được tín hiệu gửi tới từ máy tính của bạn.
- tốt hơn hết để kiểm tra bạn có thể mượn một cái switch, và chỉ nối máy tính của bạn và mạch ethernet, để kiểm tra. và một điều nữa bạn cần biết điều gì đang diễn ra trên mạng, bạn cần cài đặt phần mềm wireshark để kiểm tra các tín hiệu trên mạng.
Comment
-
giao tiếp ethernet
anh hvlong cho em hỏi là con RJ45 đó có gì đặc biệt không?hay nó chỉ như 1 connectort thông thường.Em thấy trên mạch nguyên lý anh vẽ nó còn 2 transformer thì phải,tác dụng của nó và mạch ngoài[capacitor+Resistor] làm gì vậy anh.Nguyên văn bởi hvlongffffff Xem bài viếtmình thì cũng làm qua rồi, có lẽ mọi người cần hỏi gì thì mình có thời gian sẽ trả lời thì tốt hơn, vì bản chất các bạn phải hiểu rõ được quá trình truyền nhận dữ liệu dữ liệu của các giao thức trên mạng khi làm về vấn đề này.
về mặt mạch thì không có gì đặc biệt, 1 avr32 hoạt động điện áp 5v và 3v3, 1 enc28j60, 1 jack rj45.
bạn minh tường muốn kiểm tra được mạch hoạt động hay chưa thì phải kiểm tra từng bước: kiểm tra jack rj45, kiểm tra enc28, kiểm tra gửi một gói dữ liệu bất kỳ lên mạng bằng mạch enc xem đèn tín hiệu trên jack rj45 có sáng không. khi mạch ethernet đã chắc chắn hoạt động tốt, thì cắm mạch ethernet vào model của bạn rồi dùng máy tính ping đến thử, nhưng bạn phải chắc rằng bạn đã viết hàm cho mạch ethernet để trả lời khi có tín hiệu ping từ mạng. và bạn nên cẩn thận khi thực hiện với model, vì khi cắm mạch ethernet vào model, thì trước khi bạn gửi tín hiệu ping tới mạch ethernet thì có vô số gói tin trên mạng gửi đến mạch ethernet của bạn, và nếu không lập trình để chuẩn bị tình huống này thì mạch ethernet của bạn sẽ không hoạt động được trước khi nhận được tín hiệu gửi tới từ máy tính của bạn.
- tốt hơn hết để kiểm tra bạn có thể mượn một cái switch, và chỉ nối máy tính của bạn và mạch ethernet, để kiểm tra. và một điều nữa bạn cần biết điều gì đang diễn ra trên mạng, bạn cần cài đặt phần mềm wireshark để kiểm tra các tín hiệu trên mạng.

thanks anh
Comment
-
@ hvlongffffff : anh hvlong a' , em muốn hỏi anh là ở HN thì mua con enc28j60 ở đâu, cả lõi ferit nữa, em tìm mà chẳng có, lại còn LM2937_33, LM 3940_33 nữa chứ, và anh đã mô phỏng chưa hay làm mạch thật luôn, anh cho nick yahoo đi anh, em nhờ anh giúp đỡ !!! Cảm ơn anh!
Comment
-
-con enc bạn có thể vào 200 phùng khoang, mua chỗ này mình vẫn mua.
http://www.azelectronics.org/index.p...art&Itemid=108
-lõi ferit trước mình cũng kiếm khắp hà nội không có cuối cùng mua một con cuộn cảm vào thay cũng được, vì nó cùng tính chất làm ổn định dòng.
-LM2937_33, LM 3940_33 : hai con này không cần thiết vì chỉ cần con LM317 được, con này đầu vào điện áp 5v, sử dụng hai con điện trở 390 và 240 là có điện áp ra 3v3 ổn định.
-cái này mình làm mạch thật không mô phỏng
-mình bây giờ đang làm việc, công việc rất bận, mình chỉ thỉnh thoảng qua diễn dàn trả lời cho các bạn thôi, mong bạn thông cảm.
Comment
-
cái jack rj45 chỉ là một connector, nhưng vì mạch enc nhận tín hiệu hơi yếu nên phải chọn cái rj45 loại xịn (45k), phụ trợ việc lọc nhiễu và ổn định tín hiệu thì cần thêm tụ điện và điện trở, cái này nhà sản xuất đã thiết kế hộ rồi mình chỉ việc sử dụng thôiNguyên văn bởi daipv85 Xem bài viếtanh hvlong cho em hỏi là con RJ45 đó có gì đặc biệt không?hay nó chỉ như 1 connectort thông thường.Em thấy trên mạch nguyên lý anh vẽ nó còn 2 transformer thì phải,tác dụng của nó và mạch ngoài[capacitor+Resistor] làm gì vậy anh.
thanks anh
Comment
-
Có bác nào làm giao tiếp enc28j60 với pic 16f877A hoặc với 18f452 mà chạy chưa. Mình mua cái module chỗ chú Minh về xoay hơn nữa tháng với cái ví dụ mẫu của mikroC mà ko thể nào chạy được. Không hiểu vì cái module có vấn đề hay vì code của mikroC mà nó ko chạy. Cắm vào có nhận IP ngon lành nhưng mà khi ping thì không được.
/*
* Project Name:
httpserver_example (Ethernet Library http server demo for ENC28J60 mcu)
* Target Platform:
PIC
* Copyright:
(c) mikroElektronika, 2006.
*
* description :
* this code shows how to use the ENC28J60 mini library :
* the board will reply to ARP & ICMP echo requests
* the board will reply to HTTP requests on port 80, GET method with pathnames :
* / will return the HTML main page
* /s will return board status as text string
* /t0 ... /t7 will toggle RC0 to RC7 bit and return HTML main page
* all other requests return also HTML main page
*
* target devices :
* any PIC with integrated SPI and more than 4 Kb ROM memory
* 32 to 40 MHz clock is recommended to get from 8 to 10 Mhz SPI clock,
* otherwise PIC should be clocked by ENC clock output due to ENC silicon bug in SPI hardware
* if you try lower PIC clock speed, don't be surprised if the board hang or miss some requests !
* tested with PIC16F877A@10Mhz on EasyPIC3 board
*
* EP settings :
* RA2 & RA3 pots jumper : closed
* PORTB : pull-down
* PORTC : pull-down
* BUTTONS : pull-up
*
* RC0 : !RESET to ENC reset input pin
* RC1 : !CS to ENC chip select input pin
* the ENC28J60 SPI bus CLK, SO, SI must be connected to the corresponding SPI pins of the PIC
* the INT and WOL signals from the ENC are not used
*
* Test configuration:
MCU: PIC16F877A
Dev.Board: EasyPIC3
Oscillator: HS, 10.000MHz
Ext. Modules: mE Serial Ethernet board
SW: mikroC v6.2.0.0.
* NOTES:
None.
*/
#define SPI_Ethernet_HALFDUPLEX 0
#define SPI_Ethernet_FULLDUPLEX 1
/************************************************** **********
* ROM constant strings
*/
const unsigned char httpHeader[] = "HTTP/1.1 200 OK\nContent-type: " ; // HTTP header
const unsigned char httpMimeTypeHTML[] = "text/html\n\n" ; // HTML MIME type
const unsigned char httpMimeTypeScript[] = "text/plain\n\n" ; // TEXT MIME type
unsigned char httpMethod[] = "GET /"; // supported http method
/*
* web page, splited into 2 parts :
* when coming short of ROM, fragmented data is handled more efficiently by linker
*
* this HTML page calls the boards to get its status, and builds itself with javascript
*/
const char *indexPage = "<HTML><HEAD></HEAD><BODY>\
<h1>PIC + ENC28J60 Mini Web Server</h1>\
<a href=/>Reload</a>\
<script src=/s></script>\
<table><tr><td valign=top><table border=1 style=\"font-size:20px ;font-family: terminal ;\">\
<tr><th colspan=2>ADC</th></tr>\
<tr><td>AN2</td><td><script>document.write(AN2)</script></td></tr>\
<tr><td>AN3</td><td><script>document.write(AN3)</script></td></tr>\
</table></td><td><table border=1 style=\"font-size:20px ;font-family: terminal ;\">\
<tr><th colspan=2>PORTB</th></tr>\
<script>\
var str,i;\
str=\"\";\
for(i=0;i<8;i++)\
{str+=\"<tr><td bgcolor=pink>BUTTON #\"+i+\"</td>\";\
if(PORTB&(1<<i)){str+=\"<td bgcolor=red>ON\";}\
else {str+=\"<td bgcolor=#cccccc>OFF\";}\
str+=\"</td></tr>\";}\
document.write(str) ;\
</script>\
" ;
const char *indexPage2 = "</table></td><td>\
<table border=1 style=\"font-size:20px ;font-family: terminal ;\">\
<tr><th colspan=3>PORTD</th></tr>\
<script>\
var str,i;\
str=\"\";\
for(i=0;i<8;i++)\
{str+=\"<tr><td bgcolor=yellow>LED #\"+i+\"</td>\";\
if(PORTD&(1<<i)){str+=\"<td bgcolor=red>ON\";}\
else {str+=\"<td bgcolor=#cccccc>OFF\";}\
str+=\"</td><td><a href=/t\"+i+\">Toggle</a></td></tr>\";}\
document.write(str) ;\
</script>\
</table></td></tr></table>\
This is HTTP request #<script>document.write(REQ)</script></BODY></HTML>\
" ;
/***********************************
* RAM variables
*/
unsigned char myMacAddr[6] = {0x00, 0x14, 0xA5, 0x76, 0x19, 0x3f} ; // my MAC address
unsigned char myIpAddr[4] = {192,168,1,60} ; // my IP address
unsigned char getRequest[15] ; // HTTP request buffer
unsigned char dyna[31] ; // buffer for dynamic response
unsigned long httpCounter = 0 ; // counter of HTTP requests
/*******************************************
* functions
*/
/*
* put the constant string pointed to by s to the ENC transmit buffer
*/
unsigned int putConstString(const char *s)
{
unsigned int ctr = 0 ;
while(*s)
{
SPI_Ethernet_putByte(*s++) ;
ctr++ ;
}
return(ctr) ;
}
/*
* put the string pointed to by s to the ENC transmit buffer
*/
unsigned int putString(char *s)
{
unsigned int ctr = 0 ;
while(*s)
{
SPI_Ethernet_putByte(*s++) ;
ctr++ ;
}
return(ctr) ;
}
/*
* this function is called by the library
* the user accesses to the HTTP request by successive calls to SPI_Ethernet_getByte()
* the user puts data in the transmit buffer by successive calls to SPI_Ethernet_putByte()
* the function must return the length in bytes of the HTTP reply, or 0 if nothing to transmit
*
* if you don't need to reply to HTTP requests,
* just define this function with a return(0) as single statement
*
*/
unsigned int SPI_Ethernet_UserTCP(unsigned char *remoteHost, unsigned int remotePort, unsigned int localPort, unsigned int reqLength)
{
unsigned int len = 0 ; // my reply length
unsigned int i ; // general purpose integer
if(localPort != 80) // I listen only to web request on port 80
{
return(0) ;
}
// get 10 first bytes only of the request, the rest does not matter here
for(i = 0 ; i < 10 ; i++)
{
getRequest[i] = SPI_Ethernet_getByte() ;
}
getRequest[i] = 0 ;
if(memcmp(getRequest, httpMethod, 5)) // only GET method is supported here
{
return(0) ;
}
httpCounter++ ; // one more request done
if(getRequest[5] == 's') // if request path name starts with s, store dynamic data in transmit buffer
{
// the text string replied by this request can be interpreted as javascript statements
// by browsers
len = putConstString(httpHeader) ; // HTTP header
len += putConstString(httpMimeTypeScript) ; // with text MIME type
// add AN2 value to reply
intToStr(ADC_Read(2), dyna) ; // convert read adc channel 2 value into string
len += putConstString("var AN2=") ;
len += putString(dyna) ;
len += putConstString(";") ;
// add AN3 value to reply
intToStr(ADC_Read(3), dyna) ; // convert read adc channel 2 value into string
len += putConstString("var AN3=") ;
len += putString(dyna) ;
len += putConstString(";") ;
// add PORTB value (buttons) to reply
len += putConstString("var PORTB=") ;
intToStr(PORTB, dyna) ; // convert read portb state into string
len += putString(dyna) ;
len += putConstString(";") ;
// add PORTD value (LEDs) to reply
len += putConstString("var PORTD=") ;
intToStr(PORTD, dyna) ; // convert read latd value (portd led's state) into string
len += putString(dyna) ;
len += putConstString(";") ;
// add HTTP requests counter to reply
intToStr(httpCounter, dyna) ; // convert httpCounter value into string
len += putConstString("var REQ=") ;
len += putString(dyna) ;
len += putConstString(";") ;
}
else if(getRequest[5] == 't') // if request path name starts with t, toggle PORTD (LED) bit number that comes after
{
unsigned char bitMask = 0 ; // for bit mask
if(isdigit(getRequest[6])) // if 0 <= bit number <= 9, bits 8 & 9 does not exist but does not matter
{
bitMask = getRequest[6] - '0' ; // convert ASCII to integer
bitMask = 1 << bitMask ; // create bit mask
PORTD ^= bitMask ; // toggle PORTD with xor operator
}
}
if(len == 0) // what do to by default
{
len = putConstString(httpHeader) ; // HTTP header
len += putConstString(httpMimeTypeHTML) ; // with HTML MIME type
len += putConstString(indexPage) ; // HTML page first part
len += putConstString(indexPage2) ; // HTML page second part
}
return(len) ; // return to the library with the number of bytes to transmit
}
/*
* this function is called by the library
* the user accesses to the UDP request by successive calls to SPI_Ethernet_getByte()
* the user puts data in the transmit buffer by successive calls to SPI_Ethernet_putByte()
* the function must return the length in bytes of the UDP reply, or 0 if nothing to transmit
*
* if you don't need to reply to UDP requests,
* just define this function with a return(0) as single statement
*
*/
unsigned int SPI_Ethernet_UserUDP(unsigned char *remoteHost, unsigned int remotePort, unsigned int destPort, unsigned int reqLength)
{
return 0 ; // back to the library with the length of the UDP reply
}
/*
* main entry
*/
void main()
{
ADCON1 = 0x00 ; // ADC convertors will be used
PORTA = 0 ;
TRISA = 0x00 ; // set PORTA as input for ADC
PORTB = 0 ;
TRISB = 0x00 ; // set PORTB as input for buttons
PORTD = 0 ;
TRISD = 0 ; // set PORTD as output
/*
* initialize ethernet board
* start ENC28J60 with :
* reset bit on RC0
* CS bit on RC1
* my MAC & IP address
* full duplex
*/
SPI_init();
SPI_Ethernet_Init(&PORTC, 0, &PORTC, 1, myMacAddr, myIpAddr,SPI_Ethernet_FULLDUPLEX) ;
while(1) // endless loop
{
SPI_Ethernet_doPacket() ; // process incoming Ethernet packets
/*
* add your stuff here if needed
* SPI_Ethernet_doPacket() must be called as often as possible
* otherwise packets could be lost
*/
}
}
Comment
-
unsigned char myIpAddr[4] = {192,168,1,60} ; // my IP address
Địa chỉ IP mình thay đổi lại là thế này, còn tc mọi thứ còn lại là không thay đổi
mình sử dụng pic dòng LF nên chỉ việc kết nối thẳng vào mạch thôi, vậy mà mấy tuần rồi mà ko chịu chạy, pó tay. Không ai cứu giúp hết ah.
Comment
Bài viết mới nhất
Collapse
-
bởi hayarNăm 2026 việc chọn laptop gaming chủ yếu vẫn là cân bằng vì giá cả và phần cứng thay đổi liên tục, nên tập trung vào GPU ổn, tản nhiệt tốt và hiệu năng thực tế sẽ quan trọng hơn việc chạy theo cấu hình cao nhất, giống như trong nulls brawl, chơi hay hơn khi biết cách tối ưu và chọn chiến...
-
Channel: Đánh giá sản phẩm DTVN
01-07-2026, 21:23 -
-
bởi theidiotcatDưới đây là một số gợi ý để các bạn sinh viên chọn được chiếc laptop phù hợp với nhu cầu, ngân sách và ngành học trong bối cảnh giá linh kiện leo thang kéo theo mức giá laptop liên tục tăng cao.
Bước vào mùa tựu trường năm...-
Channel: Đánh giá sản phẩm DTVN
30-06-2026, 11:26 -
-
bởi theidiotcatAMD Ryzen 9 9950X bước sang năm 2026 vẫn là một trong những bộ vi xử lý desktop mạnh mẽ nhất dành cho người dùng phổ thông cao cấp. Dù đã ra mắt từ thế hệ Zen 5 đầu tiên của dòng Ryzen 9000, con chip 16 nhân 32 luồng này vẫn giữ được sức...
-
Channel: Đánh giá sản phẩm DTVN
29-06-2026, 13:58 -
-
bởi theidiotcatTrong thị trường CPU năm 2026, khi các dòng vi xử lý đời mới liên tục ra mắt với những thông số kỹ thuật hào nhoáng, AMD Ryzen 5 7600X vẫn là một cái tên khiến nhiều game thủ và người dùng phổ thông phải cân nhắc kỹ lưỡng. Sau gần hai...
-
Channel: Đánh giá sản phẩm DTVN
29-06-2026, 13:42 -
-
bởi theidiotcatTrong bối cảnh giá linh kiện tăng cao, hiện tại mức giá laptop đã tăng đáng kể so với thời điểm trước cơn sốt AI. Chính vì vậy để lựa chọn được một chiếc laptop đáp ứng tốt nhu cầu vừa học vừa giải trí các bạn sinh viên cần...
-
Channel: Đánh giá sản phẩm DTVN
29-06-2026, 13:33 -
-
bởi theidiotcatViệc lựa chọn một chiếc laptop gaming phù hợp với nhu cầu, ngân sách chưa bao giờ là dễ dàng. Và điều đó càng khó hơn trong năm 2026 khi mà mức giá liên tục tăng.
Nếu bạn chưa biết nên chọn một chiếc laptop gaming như thế nào...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:29 -
-
bởi theidiotcatVới mức ngân sách 20 - 30 triệu đồng trong năm 2026, các bạn sinh viên và dân văn phòng có thể tìm thấy nhiều lựa chọn cao cấp, mạnh mẽ, pin “trâu”, đặc biệt là các mẫu laptop AI hỗ trợ cho học tập và làm việc.
Trong phân...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:25 -
-
bởi theidiotcatDưới đây là một số mẫu laptop nổi bật trong phân khúc dưới 20 triệu giúp các bạn văn phòng, sinh viên và đặc biệt là tân sinh viên có thể dễ dàng lựa chọn được mẫu laptop phù hợp với nhu cầu và ngân sách của mình.
Thị...-
Channel: Đánh giá sản phẩm DTVN
26-06-2026, 10:07 -
-
bởi theidiotcatViệc chọn mua một bộ máy tính phục vụ cho các nhu cầu làm việc văn phòng và sử dụng cơ bản hàng ngày đang trở nên dễ dàng và tiết kiệm hơn bao giờ hết. Thay vì phải đau đầu trích ngân sách để mua cả vi xử lý lẫn card đồ họa rời...
-
Channel: Đánh giá sản phẩm DTVN
25-06-2026, 11:23 -

...
Comment