chao QUYNH ! minh dang co bai tap lon lien quan den 8051 ,minh dang can rat gap ,ban co the gui cuon sach do den cho minh theo dia chi thucdong2000@yahoo.com ,cam on ban rat nhieu
Thông báo
Collapse
No announcement yet.
Dành cho người mới tìm hiểu 8051
Collapse
X
-
hướng dẫn của các ban rất chi tiết và hay. bạn có tập lệnh của keil c (tiếng việt càng tốt) viết cho 89c51 ko? nếu ban có gửi cho mình với.
thanhhai08@gmail.com
thank!
Comment
-
cac bác cho em hỏi em làm như thế này mà không hiểu sao nó lại bị nhấp nháy, led sang yếu( em đã thử trên mạch thật). các bác chỉ giúp em. em có gửi cả bản mô phỏng bằng Proteus.
cảm ơn!!!!
//chuong trinh thu nghiem quet LED 7 tu mot con so dua vao
#include<AT89x51.h>
#define LED8 P1_0
#define LED7 P1_1
#define LED6 P1_2
#define LED5 P1_3
#define LED4 P1_4
#define LED3 P1_5
#define LED2 P1_6
#define LED1 P1_7
#define Yes 1
#define No 0
//dinh nghia cac bien dung cho su ly tach so
#define donvi 0
#define chuc 1
#define tram 2
#define nghin 3
#define van 4
#define tramnghin 5
#define trieu 6
#define vantrieu 7
/*
#define a P0_0
#define b P0_1
#define c P0_2
#define d P0_3
#define e P0_4
#define f P0_5 ....
*/
unsigned long Buffer[8];
bit fg=No;
//0 , 1 , 2 , 3 ,4 ,5 ,6 ,7 ,8
const char LEDi[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
0x98,0x88,0xC6,0x86,0x8E,0x82,0x89,0x7F,0xFF};
// 9 , A , B , C , D ,E , F , . , TRANG
void delay(unsigned char ms) // tre ms
{
unsigned char i=121;
while(ms--)
{
while(i--);
}
}
void BCD(unsigned long so)
{
//tach cac so ra theo don vi tuong ung
Buffer[donvi]=so%10; //lay so du
Buffer[chuc]=so/10;
Buffer[tram]=so/100;
Buffer[nghin]=so/1000;
Buffer[van]=so/10000;
Buffer[tramnghin]=so/100000;
Buffer[trieu]=so/1000000 ;
Buffer[vantrieu]=so/10000000 ;
// tach rieng tung so mot
// theo dung hang don vi va tram cua chung
if(Buffer[chuc]<=0) Buffer[chuc]=16; //=16 la tat het cac led
else if(Buffer[chuc]>=10) Buffer[chuc]%=10;
if(Buffer[tram]<=0) Buffer[tram]=16; //=16 la tat het cac led
else if(Buffer[tram]>=10) Buffer[tram]%=10;
if(Buffer[nghin]<=0) Buffer[nghin]=16; //=16 la tat het cac led
else if(Buffer[nghin]>=10) Buffer[nghin]%=10;
if(Buffer[van]<=0) Buffer[van]=16; //=16 la tat het cac led
else if(Buffer[van]>=10) Buffer[van]%=10;
if(Buffer[tramnghin]<=0) Buffer[tramnghin]=16; //=16 la tat het cac led
else if(Buffer[tramnghin]>=10) Buffer[tramnghin]%=10;
if(Buffer[trieu]<=0) Buffer[trieu]=16; //=16 la tat het cac led
else if(Buffer[trieu]>=10) Buffer[trieu]%=10;
if(Buffer[vantrieu]<=0) Buffer[vantrieu]=16; //=16 la tat het cac led
else if(Buffer[vantrieu]>=10) Buffer[vantrieu]%=10;
}
void hienthi()
{
{
P0=LEDi[Buffer[donvi]];
LED1=0;
delay(1);
LED1=1;
P0=LEDi[Buffer[chuc]];
LED2=0;
delay(1);
LED2=1;
P0=LEDi[Buffer[tram]];
LED3=0;
delay(10);
LED3=1;
P0=LEDi[Buffer[nghin]];
LED4=0;
delay(1);
LED4=1;
P0=LEDi[Buffer[van]];
LED5=0;
delay(1);
LED5=1;
P0=LEDi[Buffer[tramnghin]];
LED6=0;
delay(1);
LED6=1;
P0=LEDi[Buffer[trieu]];
LED7=0;
delay(1);
LED7=1;
P0=LEDi[Buffer[vantrieu]];
LED8=0;
delay(1);
LED8=1;
}
}
void ngat(void)interrupt 2 using 1 // su dung ngat ngoai
{
if (P3_3==0) fg=Yes;
}
void main(void)
{
unsigned long j=0;
//TMOD=0x02;
EX1=1;
P0=1;
P1=1;
EA=1; //cho phep su dung ngat
//TR1=1;
while(1)
{
if (fg==Yes) j=j+1;
else fg=No;
BCD(j);
hienthi();
//fg=No;
}
}n
ĐT: 0986 492 489
Tham khảo:
Comment
-
Chào các bạn ,từ trước đến giờ tôi chỉ viết cho 8051 bằng asm ,hôm vừ rồi có cóp 1 file của bạn Vũ Hà Linh viết bằng C về dịch thử bằng Keil song báo nhiều lỗi o hiểu tại sao. Keil 709 tôi down từ diễn đàn về. Nhờ bạn Linh giải đáp giúp nhé .Cảm ơn.
Đa
Đây là file List sau khi đã dịch:
C51 COMPILER V7.09 LCDVD 12/03/2006 23:38:21 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE LCDVD
OBJECT MODULE PLACED IN D:\Keil\C51\BIN\lcdvd.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\c51.exe D:\Keil\C51\BIN\lcdvd.c
line level source
1 /************************************************** **************************/
2 /* */
3 /* File: lcd.c */
4 /* Author: Vu Ha Linh, Automatic Control Deparment */
5 /* Ha Noi university of technology */
6 /* */
7 /************************************************** **************************/
8 /* */
9 /* Function: This module is a standard LCD (16x2) functions */
10 /* */
11 /* Input and Output parameters of those subroutines: */
12 /* void LCD_Init(void); */
13 /* void LCD_Position(unsigned char, unsigned char); */
14 /* void LCD_PutCmd(unsigned char); */
15 /* void LCD_PutChar(unsigned char); */
16 /* void LCD_PrString(char*); */
17 /* void LCD_Clear(void); */
18 /* void LCD_PrInteger(int); */
19 /* */
20 /* Note: Must be call LCD_Init() first at the begining of program */
21 /* */
22 /************************************************** **************************/
23 /* */
24 /* History: */
25 /* Version: */
26 /* Date Writer Remark */
27 /* */
28 /* 30-07-2006 Vu Ha Linh Creating the first version */
29 /* */
30 /* */
31 /************************************************** **************************/
32
33 #include <REGX51.H>
*** WARNING C318 IN LINE 33 OF D:\Keil\C51\BIN\lcdvd.c: can't open file 'REGX51.H'
34 #include "lcd.h"
*** WARNING C318 IN LINE 34 OF D:\Keil\C51\BIN\lcdvd.c: can't open file 'lcd.h'
35
36 /************************************************** ***************************
37 define Hardware address
38 it can changed by user
39 ************************************************** ***************************/
40 #define LCD_PORT P1
41
42 sbit LCD_RS = P3^2;
*** ERROR C202 IN LINE 42 OF D:\KEIL\C51\BIN\LCDVD.C: 'P3': undefined identifier
43 sbit LCD_RW = P3^3;
*** ERROR C202 IN LINE 43 OF D:\KEIL\C51\BIN\LCDVD.C: 'P3': undefined identifier
44 sbit LCD_EN = P3^4;
*** ERROR C202 IN LINE 44 OF D:\KEIL\C51\BIN\LCDVD.C: 'P3': undefined identifier
45 sbit LCD_D7 = P1^7;
*** ERROR C202 IN LINE 45 OF D:\KEIL\C51\BIN\LCDVD.C: 'P1': undefined identifier
46
47 #define ReadCommand {LCD_RS = 0; LCD_RW = 1;}
48 #define WriteCommand {LCD_RS = 0; LCD_RW = 0;}
49 #define WriteData {LCD_RS = 1; LCD_RW = 0;}
C51 COMPILER V7.09 LCDVD 12/03/2006 23:38:21 PAGE 2
50 #define LatchData {LCD_EN = 1; LCD_EN = 0;}
51
52 /************************************************** **************************
53 WaitReady function
54 Wait while LCD in execution time
55 ************************************************** ***************************/
56 void WaitReady(void)
57 {
58 1 ReadCommand; // Set Read command mode
*** ERROR C202 IN LINE 58 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_RS': undefined identifier
*** ERROR C202 IN LINE 58 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_RW': undefined identifier
59 1 LCD_D7 = 1;
*** ERROR C202 IN LINE 59 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_D7': undefined identifier
60 1 while(LCD_D7){
*** ERROR C202 IN LINE 60 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_D7': undefined identifier
61 2 LCD_EN = 0;
*** ERROR C202 IN LINE 61 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_EN': undefined identifier
62 2 LCD_EN = 1; // Read bit D7
*** ERROR C202 IN LINE 62 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_EN': undefined identifier
63 2 }
64 1 }
65
66 /************************************************** **************************
67 LCD_PutCmd function
68 Write a control byte to LCD
69 Input : control byte
70 ************************************************** ***************************/
71 void LCD_PutCmd(unsigned char cmd)
72 {
73 1 WaitReady(); // Wait for LCD ready
74 1 WriteCommand; // set LCD to send mode
*** ERROR C202 IN LINE 74 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_RS': undefined identifier
*** ERROR C202 IN LINE 74 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_RW': undefined identifier
75 1 LCD_PORT = cmd; // Prepare to send
*** ERROR C202 IN LINE 75 OF D:\KEIL\C51\BIN\LCDVD.C: 'P1': undefined identifier
76 1 LatchData; // latch data out
*** ERROR C202 IN LINE 76 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_EN': undefined identifier
*** ERROR C202 IN LINE 76 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_EN': undefined identifier
77 1 }
78
79 /************************************************** **************************
80 LCD_PutChar function
81 Write a ASCII symbol to LCD
82 Input: ASCII symbol
83 ************************************************** ***************************/
84 void LCD_PutChar(unsigned char ch)
85 {
86 1 WaitReady();
87 1 WriteData;
*** ERROR C202 IN LINE 87 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_RS': undefined identifier
*** ERROR C202 IN LINE 87 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_RW': undefined identifier
88 1 LCD_PORT = ch;
*** ERROR C202 IN LINE 88 OF D:\KEIL\C51\BIN\LCDVD.C: 'P1': undefined identifier
89 1 LatchData;
*** ERROR C202 IN LINE 89 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_EN': undefined identifier
*** ERROR C202 IN LINE 89 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_EN': undefined identifier
90 1 }
91
92 /************************************************** ***************************
93 LCD_PrString function
94 Write a string to LCD
95 Input: string
C51 COMPILER V7.09 LCDVD 12/03/2006 23:38:21 PAGE 3
96 ************************************************** ****************************/
97 void LCD_PrString(char *str)
98 {
99 1 while(*str!='\0')
100 1 {
101 2 LCD_PutChar(*str);
102 2 ++str;
103 2 }
104 1 }
105
106 /************************************************** ***************************
107 LCD_Position function
108 Set the position of cursor on LCD
109 Input: row, column
110 ************************************************** ****************************/
111 void LCD_Position(unsigned char row, unsigned char col)
112 {
113 1 LCD_PutCmd( (1<<7)|(row<<6)|col );
114 1 }
115
116 /************************************************** ***************************
117 LCD_Clear function
118 Clear LCD
119 ************************************************** ****************************/
120 void LCD_Clear()
121 {
122 1 LCD_PutCmd(LCD_CLEAR);
*** ERROR C202 IN LINE 122 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_CLEAR': undefined identifier
123 1 }
124
125 /************************************************** ***************************
126 LCD_Init function
127 Prepare for display content. Must be called at first
128 ************************************************** ****************************/
129 void LCD_Init()
130 {
131 1 LCD_PutCmd(0x30); // Data length setting, 8 bits
132 1 LCD_PutCmd(0x30); // Data length setting, 8 bits
133 1 LCD_PutCmd(0x30); // Data length setting, 8bits
134 1
135 1 LCD_PutCmd(LCD_FONT); // Function set: 8 bits, 2 lines, font 5x7
*** ERROR C202 IN LINE 135 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_FONT': undefined identifier
136 1 LCD_PutCmd(LCD_OFF); // Display and cursor OFF
*** ERROR C202 IN LINE 136 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_OFF': undefined identifier
137 1 LCD_PutCmd(LCD_CLEAR); // Clear display
*** ERROR C202 IN LINE 137 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_CLEAR': undefined identifier
138 1 LCD_PutCmd(LCD_MOVE_CURSOR); // Entry mode set: Increment mode, not shift
*** ERROR C202 IN LINE 138 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_MOVE_CURSOR': undefined identifier
139 1 LCD_PutCmd(LCD_DISPLAY_ON); // Display ON
*** ERROR C202 IN LINE 139 OF D:\KEIL\C51\BIN\LCDVD.C: 'LCD_DISPLAY_ON': undefined identifier
140 1 // LCD_PutCmd(LCD_BLINK_CURSOR); // Blink cursor
141 1 }
142
143 /************************************************** **************************
144 LCD_PrInteger function
145 Display a integer decimal number on LCD
146 Input: a integer number
147 ************************************************** ***************************/
148 void LCD_PrInteger(int num)
149 {
150 1 int temp;
151 1 unsigned char i, c[5];
C51 COMPILER V7.09 LCDVD 12/03/2006 23:38:21 PAGE 4
152 1
153 1 temp = num;
154 1 if (temp != 0) {
155 2 if (temp < 0) {
156 3 LCD_PutChar('-');
157 3 temp = -temp;
158 3 }
159 2 i = 0;
160 2 while(temp){
161 3 c[i++] = temp%10;
162 3 temp /= 10;
163 3 }
164 2 while(i) LCD_PutChar(c[--i] + '0');
165 2 }
166 1 else LCD_PutChar('0');
167 1 }
168
169 /************************* END OF FILE *******************************/
170
171
172
C51 COMPILATION COMPLETE. 2 WARNING(S), 26 ERROR(S)
Comment
-
Cảm ơn Quỳnh nhiều nha, mình là dân mới tập tành về VDK nên còn lơ mơ lắm và ỏ chổ minh ở cũng chẳng ai dạy dỗ vấn đề này nên phải tự mò, có gi` hay mong chỉ giáo thêm. binhfordlmt@yahoo.com, cho xin email được ko ? or số cầm tay? THANKS rất nhiều.
Comment
-
chào các bạn, mình đang bước đầu học vi điều khiển mình thấy các bạn thảo luận toàn là cách lập trình ,chả thấy master nào nói về cách làm phần cứng giao tiếp với rom (chương trình) ngoài, ram, ic ngoại vi(8255), bây giờ mình cần kết nối 1 con vdk 89c51 với 3con 8255,1ram16k, 1rom 8k,1 con giải mã bàn phím (con gì mình quên mất rồi), 1 con 8253 thì làm thế nào bây giờ?, nếu làm xong phần này thì mới thực sự làm chủ xong phần cứng của 8051.bài giải mã ở trên mình nhờ bạn Quỳnh giúp cho nhé!( bạn hướng dẫn chi tiết dùm mình)
Lại còn vân đề đệm bus địa chỉ , đệm bus dữ liệu,khi giải mã địa chỉ thì lúc chọn trang 2k, lúc chọn trang 8k....(bạn nào nói rõ phần này hộ mình), làm mình đien hết đầu, mình muốn hỏi khi nào cần đệm(bạn nào hiểu rõ hãy cho một ví dụ minh họa càng cụ thể càng tốt)
Nếu làm thành thạo việc giao tiếp với các ic như ở trên thì phần mềm có thể tự nghiên cứu cũng được, chứ phần cứng anh làm sai be sai bét thì viết giỏi cõ nào cũng bó tay.
Mình nghĩ phương pháp tốt nhất là giới thiệu cái tổng quan, và giúp người học thành thạo cái tổng quan đó, rồi còn đi vào chi tiết thì để người tự học, không hiểu chỗ nào thì hỏi, tự ngâm cứu bao giờ cũng thú vị hơn chứ !
mình đọc sách của tống văn on, kể cả sách tiếng anh dày cộp thầy mình đưa cho, thấy vấn đề giao tiếp với ic nhớ, ic ngoại vi không nhiều lắm(hơi qua loa thì phải).
mình không tạo thread mới vì sợ mấy master chê cười rằng phần giải mã địa chỉ là phần cơ bản, e rằng lại trả lời vắn tắt quá hoặc tệ hơn là phán một cầu bạn đọc thêm sách hay học lai đi bồ thì toi(ông cuong quậy đã trả lời như rứa đối với một bạn đăt câu hỏi tương tự trong www.3ihut.com,it ra cũng phải giúp người ta chứ, có ngu thì mới hỏi chứ bồ, bồ có giỏi cỡ mấy cũng không thể qua mặt các chú tây béo được,bằng chứng là bồ vẫn xài chùa phần mềm của họ đây thôi,họ giỏi vì có lẽ học hỗ trợ nhau rất tốt, thầy chủ nhiệm mình có nói: 3 thằng châu á rơi xuống một cái hỗ sâu trong rừng thì 3 thằng đứt cả còn 3 thằng tây thì lại sống nhăn rằng, chắc các bạn hiểu là tại sao;
Trong sách không nói nhiêu, hỏi thầy thì ôi thôi, lại giáo điều .......nên mình mới diễn đàn hỏi chứ bộ!
Bạn quỳnh cho mình xin email để có thể trao đổi thêm.
email của mình là: dieungoclongvn@gmail.com
Comment
-
-
Bac Quynh co the gui cho em may cuon hoc ve VDK o
em moi bat dau hoc nên cam thay kho wa
Dia chi cua em la tranmanhtienat@gmail.com
thanks bac nhieu|
Comment
-
minh moi down dc cuon final word for 8051 ban nao can mail cho toi theo dia chi tranmanhtienat@gmail.com|
Comment
Bài viết mới nhất
Collapse
-
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
Hôm qua, 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
Hôm qua, 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
Hôm qua, 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 -
-
bởi theidiotcatViệc nâng cấp từ một dàn máy tính cũ lên cấu hình mới luôn khiến nhiều người đắn đo về mức chi phí bỏ ra. Nếu bạn đang tìm kiếm một sự lột xác hoàn toàn về hiệu năng mà vẫn cân đối được dòng tiền, combo giữa vi xử lý Ryzen...
-
Channel: Đánh giá sản phẩm DTVN
25-06-2026, 11:06 -
-
Trả lời cho Lực dọc trục làm hỏng ổ bi.bởi nguyendinhvanVí dụ một trang như thế này
...-
Channel: Điện tử công suất
24-06-2026, 19:57 -

...
Comment