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
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi mèomướpDạ chú chủ thớt có thời gian và đam mê thì cứ từ từ ngâm cứu đi ạ đừng nghe chú Chú bq... dọa mà sợ ạ. Cái nguồn nhìn cũng lởm có khi hông bằng cái máy hàn tàu của chị hàng xóm hôm nọ tháo ra sửa với chú thợ thông ống nước suốt đêm mới xong. Chú ý an toàn xíu là được ạ...
-
Channel: Điện tử công suất
hôm nay, 15:40 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi bqvietBộ nguồn xung ở tầm công suất 2700W này, gần 3 ký, không bao giờ đơn giản để mà sửa ngay cả đối với người có kinh nghiệm chứ đừng nói người không chuyên. Đám linh kiện công suất không tự nhiên cháy mà phải xuất phát từ nguyên nhân...
-
Channel: Điện tử công suất
Hôm qua, 22:09 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi mèomướpDạ chú kiểm tra đi ốt đầu vào, ra nữa ạ. Về phần kiểm tra dao động chú hỏi chị google ấy ạ, có nhìu cô chú đã hướng dẫn rồi ạ...
-
Channel: Điện tử công suất
Hôm qua, 16:53 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi Minhdai95mình đã kiểm tra phần công suất thấy hỏng cả 4 con IGBT mà mình muốn kiểm tra phần dao động và hồi tiếp khi chưa cấp điện cho mạch thì có cách nào không b, mình không phải dân trong nghề lên chưa có kinh nghiệm sửa. Cảm ơn b
-
Channel: Điện tử công suất
Hôm qua, 14:27 -
-
Trả lời cho Sửa bộ nguồn DC 60V 45Abởi mèomướpDạ chú nhắm phần công suất dễ kiểm tra và hay hư hỏng nhất trước ạ. Rồi đến phần dao động nguồn, hồi tiếp...
-
Channel: Điện tử công suất
Hôm qua, 11:42 -
-
bởi Minhdai95mọi người đã ai sửa bộ nguồn này chưa ạ, cho e xin ít kinh nghiệm để sửa bộ nguồn. Em cảm ơn...
-
Channel: Điện tử công suất
Hôm qua, 11:22 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi nhathung1101
-
Channel: Điện tử dành cho người mới bắt đầu
31-12-2024, 17:39 -
-
Comment on Thắc mắc về hạ áp cho adapter laptopbởi nguyendinhvan
-
Channel: Điện tử dành cho người mới bắt đầu
29-12-2024, 23:20 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi nguyendinhvanPhải làm đúng quy chình thì mới được
Bươc 1 lấy cái nguồn điều chỉnh, set về đúng 12v, cấp cho đường out 19v như hình. Chú ý là phần đầu vào adaptor không cấp điện.
Bước 2 . Kiểm tra điện áp tại chân số 3 das001 có đúng...-
Channel: Điện tử dành cho người mới bắt đầu
29-12-2024, 23:20 -
-
Trả lời cho Thắc mắc về hạ áp cho adapter laptopbởi LamVoNhấp nháy có thể do chu kỳ hoạt động bị rút ngắn quá dẫn đến không đủ nguồn nuôi ic, bác thử tăng giá trị tụ nguồn phụ nuôi ic và giảm giá trị điện trở hạn dòng cho nó xem có cải thiện không....
-
Channel: Điện tử dành cho người mới bắt đầu
29-12-2024, 08:45 -
Comment