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 Minhdai95Em chào mọi người, e đang sửa mạch tạo sóng siêu âm cho máy rửa mà chưa có tài liệu để tham khảo sửa, mọi người cho e xin tài liệu ạ...
-
Channel: Điện tử công suất
hôm nay, 11:37 -
-
bởi pia2k1Cùng câu hỏi và cần được giải đáp thêm ạ...
-
Channel: Hướng dẫn sử dụng diễn đàn
hôm nay, 11:28 -
-
bởi trun9Chào các bạn,
Tôi vừa làm 1 video Youtube đăng lên vào tối hôm qua, hiện tại có 4 lượt xem đều là của tôi vào xem có ai xem không
https://www.youtube.com/watch?v=_oFIBAcvoSY
Vào xem và chửi tôi để tôi bớt làm lại đi.-
Channel: Quảng cáo
hôm nay, 08:55 -
-
Trả lời cho Công thức điện tửbởi mèomướpDạ thời thế giờ thay đổi theo hướng tích cực hơn rồi chú trung sĩ ạ. Kiến thức được chia sẻ ngày càng nhìu nên làm ăn gian dối ko còn dễ dàng như trước đâu ạ. Những thợ nhỏ rồi sẽ thành công nhân sản xuất đồ mới hết thay vì sửa chữa lặt vặt...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 21:21 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi mèomướpDạ cùng chuẩn tín hiệu thì chắc chắn là nhận ạ. Vì bản chất oled hay lcd thì đều phải có mạch chuyển đổi trên thanh gỗ rồi chuyển sang những chip xử lý hàng nghìn chân gắn trên những tab mỏng dính rồi mới ra các điểm ảnh theo hàng...
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 20:31 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11Ok , thanks bác đã chỉ...
-
Channel: Thiết bị điện tử cá nhân
Hôm qua, 15:06 -
-
bởi nguyendinhvanSau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !
Chập thì thay. Cháy thì tháo
Làm thì láo. Báo thì hay
May thì khoe. Rủi thì bỏ
Thành tích nhỏ. Báo thành to
Làm cho có. Báo chi li
Sai cả li. Báo...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 00:35 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi yname11có chắc ko b, màn lcd phải có cao áp mới sáng, màn led thì ko có, ko có cáp chuyển đổi thì lắp thế nào đc ??...
-
Channel: Thiết bị điện tử cá nhân
25-11-2024, 22:31 -
-
Trả lời cho Xin hỏi về màn hình laptopbởi mèomướpDạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
-
Channel: Thiết bị điện tử cá nhân
25-11-2024, 22:14 -
-
Trả lời cho Tự làm máy đo Cuộn cảmbởi bacthoHay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
-
Channel: Điện tử dành cho người mới bắt đầu
25-11-2024, 21:48 -
Comment