bạn có thể sử dụng thông qua hai hoặc 3 lần biến đếm là được, chứ với giá trị lớn như vậy không thể sử dụng 1 biến đếm được.
Thông báo
Collapse
No announcement yet.
HƯỚNG DẪN LẬP TRÌNH KEIL C CHO 8051-[Chỉ dành post bài hướng dẫn]
Collapse
X
-
có bạn nhắc đến i2c, lục trong thư mục code cũ của mình thấy có nên chia sẻ cho bạn nào cầnNguyên văn bởi PSman Xem bài viếtBác NgoHaiBac viết tut về giao tiếp I2C cho EEPROM 24Cxx dùng 8951 bằng Keil-C nhé. Em có tham khảo trên diễn đàn rồi, một số đoạn code chưa hiểu nhưng vẫn copy nguyên vào biên dịch và thử nghiệm (code của bác QueDuong), test bằng Proteus cũng như mạch thật thì chạy k như mong muốn.
i2c.h:
lcd4bit.h:Code:sbit SCL = P1^0; sbit SDA = P1^1; /************************************************************************************************************/ void delay(){ unsigned char i; for (i = 0; i < 20; i++){}; } /************************************************************************************************************/ /* I2C clock high */ /************************************************************************************************************/ void SCL_high(){ SCL = 1; delay(); } /************************************************************************************************************/ /* I2C clock low */ /************************************************************************************************************/ void SCL_low(){ SCL = 0; delay(); } /************************************************************************************************************/ /* Start condition */ /************************************************************************************************************/ void I2C_Start(){ SDA = 1; SCL = 1; SDA = 0; delay(); SCL = 0; SDA = 1; } /************************************************************************************************************/ /* Stop Condition */ /************************************************************************************************************/ void I2C_Stop(){ SDA = 0; SCL_high(); SDA = 1; } /************************************************************************************************************/ /* I2C_Write function */ /* Put a byte to bus, bit MSB must be send first. */ /* Input: byte to write */ /* Output: return 0 if write complete */ /* return 1 if write not complete */ /************************************************************************************************************/ bit I2C_Write(unsigned char dat){ unsigned char i; bit outbit; for (i = 0; i < 8; i++){ outbit = dat & 0x80; SDA = outbit; dat = dat << 1; SCL_high(); SCL_low(); } SDA = 1; // set SDA to receive Acknowledge SCL_high(); outbit = SDA; // check busy or not SCL_low(); return(outbit); // if outbit=1 ,A=1: error // if outbit=0 ,A=0: ok } /************************************************************************************************************/ /* I2C_Read function */ /* Read a byte from bus */ /* after complete, set SDA = 0 (ACK) to Read next byte in sequential read mode */ /* Input: none */ /* Output: Byte to read */ /************************************************************************************************************/ unsigned char I2C_Read(){ unsigned char i, dat; bit inbit; dat = 0; for(i = 0; i < 8; i++) { SCL_high(); inbit = SDA; dat = dat << 1; dat = dat | inbit; SCL_low(); } SDA = 0; // set SDA = 0 (ACK) SCL_high(); SCL = 0; SDA = 1; // Set SDA = 1 for next read delay(); return(dat); } /************************************************************************************************************/ /* I2C_LastRead function */ /* Read a last byte from bus */ /* after complete, set SDA = 1 (not ACK) to Stop read */ /* Input: none */ /* Output: Byte to read */ /************************************************************************************************************/ unsigned char I2C_LastRead(){ unsigned char i,dat; bit inbit; dat = 0; for(i = 0; i < 8; i++){ SCL_high(); inbit = SDA; dat = dat << 1; dat = dat | inbit; SCL_low(); } SDA = 1; // Set SDA = 1 to stop Read (not ACK) SCL_high(); SCL_low(); return(dat); } /***************************************** END OF FILE *****************************************************/
main.c:Code:/***************************************************************************** define Hardware address *****************************************************************************/ #define LCD_PORT P2 sbit LCD_RS = LCD_PORT^0; sbit LCD_RW = LCD_PORT^1; sbit LCD_EN = LCD_PORT^2; #define ReadCommand {LCD_RS = 0; LCD_RW = 1;} #define WriteCommand {LCD_RS = 0; LCD_RW = 0;} #define WriteData {LCD_RS = 1; LCD_RW = 0;} #define LatchData {LCD_EN = 1; LCD_EN = 0;} /**************************************************************************** define LCD command *****************************************************************************/ #define LCD_CLEAR 0x01 // Clear display #define LCD_HOME 0x02 // return cursor and LCD to home position #define LCD_OFF 0x08 // turn off display and cursor #define LCD_DISPLAY_ON 0x0C // turn on display and turn off cursor #define LCD_CURSOR_ON 0x0A // turn on cursor and turn off display #define LCD_BLINK_CURSOR 0x0E // turn on display and blink cursor #define LCD_FONT_8BIT 0x38 // set interace length: 8bits, 2 lines, font 5x8 #define LCD_FONT_4BIT 0x28 // set interace length: 4bits, 2 lines, font 5x8 #define LCD_MOVE_CURSOR 0x06 // Entry mode set: set increments mode, not shift (cursor) #define LCD_MDRIGHT 0x1C // Move display to the right #define LCD_MDLEFT 0x18 // Move display to the left /*============================================================================= unsigned char LCD_Read(){ unsigned char r_data; LCD_PORT |= 0xF0; // Be sure to release datalines (set outputlatches to '1') LCD_EN = 1; r_data = LCD_PORT; // Read first part of the return value (high nibble) LCD_EN = 0; r_data &= 0xF0; // Only high nibble is usable LCD_EN = 1; r_data |= (LCD_PORT >> 4); // Read second part of the return value (low nibble) LCD_EN = 0; return (r_data); } */ //================================================================= void WaitReady() { bit lcd_busy = 1; ReadCommand; LCD_PORT |= 0xF0; // set outputlatches to '1' while(lcd_busy){ LCD_EN = 1; // read high nibble lcd_busy = 1; lcd_busy = LCD_PORT & 0x80; // return bit 7 LCD_EN = 0; LCD_EN = 1; // read low nibble LCD_EN = 0; } } //============================================================================== void write_char(unsigned char c) { unsigned char temp; temp = c & 0xF0; // Don't affect bits 0-3 LCD_PORT &= 0x0F; // Bits 4..7 <- 0 LCD_PORT |= temp; // High nibble to display LatchData; temp = (c << 4) & 0xF0; // Prepare to send low nibble LCD_PORT &= 0x0F; // Bits 4..7 <- 0 LCD_PORT |= temp; // Low nibble to display LatchData; } /*****************************************************************************/ void LCD_Init_Write(unsigned char cmd) { WaitReady(); WriteCommand; LCD_PORT = cmd; LatchData; } /**************************************************************************** LCD_PutCmd function Write a control byte to LCD Input : control byte *****************************************************************************/ void LCD_PutCmd(unsigned char cmd) { WaitReady(); // Wait for LCD ready WriteCommand; // set LCD to send mode write_char(cmd); // send command } /**************************************************************************** LCD_PutChar function Write a ASCII symbol to LCD Input: ASCII symbol *****************************************************************************/ void LCD_PutChar(unsigned char ch) { WaitReady(); WriteData; write_char(ch); } /***************************************************************************** LCD_PrString function Write a string to LCD Input: string ******************************************************************************/ void LCD_PrString(char *str) { while(*str!='\0'){ LCD_PutChar(*str); ++str; } } /***************************************************************************** LCD_Position function Set the position of cursor on LCD Input: row, column ******************************************************************************/ void LCD_Position(unsigned char row, unsigned char col) { LCD_PutCmd( (1<<7)|(row<<6)|col ); } /***************************************************************************** LCD_Clear function Clear LCD ******************************************************************************/ void LCD_Clear() { LCD_PutCmd(LCD_CLEAR); } /***************************************************************************** LCD_Init function Prepare for display content. Must be called at first ******************************************************************************/ void LCD_Init() { // LCD_Init_Write(0x30); // Data length setting, 8 bits // LCD_Init_Write(0x30); // Data length setting, 8 bits // LCD_Init_Write(0x30); // Data length setting, 8bits LCD_Init_Write(LCD_FONT_4BIT); // set a 5x8 dot character font LCD_PutCmd(LCD_FONT_4BIT); // and 4 bits data bus LCD_PutCmd(LCD_DISPLAY_ON); // 0x0C, Display on and cursor off LCD_PutCmd(LCD_MOVE_CURSOR); // 0x06 // LCD_PutCmd(LCD_BLINK_CURSOR); // Blink cursor } /**************************************************************************** LCD_PrInteger function Display a integer decimal number to LCD Input: a integer number *****************************************************************************/ void LCD_PrInteger(int num) { int temp; unsigned char i = 0, c[5]; temp = num; if (temp != 0) { if (temp < 0){ LCD_PutChar('-'); temp = - temp; } while(temp){ c[i++] = temp%10; temp /= 10; } while(i) LCD_PutChar(c[--i] + '0'); } else LCD_PutChar('0'); } /************************* END OF FILE *******************************/
Code:#include <REGX51.H> #include "i2c.h" #include "lcd4bit.h" //================================================================== void main() { unsigned char i; unsigned char id; LCD_Init(); // =============================// Write to 24c04 I2C_Start(); I2C_Write(0xA0); // Write Device Select with WR = 0; // Block 0 I2C_Write(0x00); // write Rom address to prepare write I2C_Write(1); // write day I2C_Write(12); // write month I2C_Write(83); // write year I2C_Stop(); // stop write; //==============================// Read from 24C04 I2C_Start(); I2C_Write(0xA0); I2C_Write(0x00); // rom address to read I2C_Start(); I2C_Write(0xA1); // set read mode // WR = 1; LCD_PrString("Encoder: "); LCD_Position(1, 0); for (i=0; i< 3; i++){ // Read day, month, year (integer type) id = I2C_read(); // Display on LCD LCD_PrInteger(id); if(i < 2) LCD_PutChar('-'); } I2C_LastRead(); // Read nothing I2C_Stop(); while(1){} }Attached FilesLast edited by encoder; 28-08-2007, 00:49.CUNG CẤP PSOC, MẠCH NẠP
CHUYỂN ĐỔI USB <-> RS485 AutoBaud
RS232 <-> RS485 MultiBaud
MẠCH NẠP USBPPI S7-200
Mobile: 0906076116
Email:
Comment
-
Mấy chương trình trên diễn đàn này thường đôi khi copy xuống mà không chạy được. Mong các Bác post lên các bài chạy được. Đôi khi người mới học có thể xem không hiểu nhưng họ có thể chạy chương trình rồi mới hiểu được chứ, và các bác post thêm các sơ đồ nếu là mạch phức tạp cho anh em xài với.
+ Tôi là người mới học AT89 với Keil C nên cũng mong các Bác giúp đỡ như bạn Ngô Hoài Bắc thì tốt cũng như cho các bạn khác nữa
Comment
-
nhiều việc quá. chết mất!!! tìm đâu đc luận chứng chọn thiết bị hệ thống đo lường, cáp dãn, đường dẫn xung, chuyển đổi, bộ điều chỉnh, cơ cấu chấp hành, van điều chỉnh....thiết kế phòng đièu khiển trung tâm (bàn điều khiển, tủ điều khiển, nguồn nuôi, môi trường làm việc và bảo quản thiết bị..) pác nào jups em với!!! làm xong em xin hậu tạ nhìu nhìu
Comment
-
Các anh ơi em tìm mãi phần mềm keil C mà không được.Anh nao có gưỉ cho em với .mail của em là ngvansu@gmail.com .Mấy link mà anh Ngô Hải Bắc cho trong luồng này die mất rồi.
Comment
-
Các link vẫn tốt mà, bạn có thể vào link dưới để dow.Nguyên văn bởi nguyensu Xem bài viếtCác anh ơi em tìm mãi phần mềm keil C mà không được.Anh nao có gưỉ cho em với .mail của em là ngvansu@gmail.com .Mấy link mà anh Ngô Hải Bắc cho trong luồng này die mất rồi.
http://www.esnips.com/doc/34e0113f-6...d3/Keil-C-8.05
chúc thành công!
email:mahaco@fpt.vn
Comment
-
Keil C 8.05 18.8MB mail mãi cho bạn mà không được! bạn vào link tôi cho mà lấy vậy.Nguyên văn bởi nguyensu Xem bài viếtCác anh ơi em tìm mãi phần mềm keil C mà không được.Anh nao có gưỉ cho em với .mail của em là ngvansu@gmail.com .Mấy link mà anh Ngô Hải Bắc cho trong luồng này die mất rồi.
email:mahaco@fpt.vn
Comment
-
Bạn kiểm tra lại đi vì trước khi post bài mình đã dow thử rồi.Nguyên văn bởi nguyensu Xem bài viếtchắc bác để file đó >8MB (13MB ) nên không gửi được qua mail cho em rùi.link bác cho em có phần mềm này nhưng cũng không down được . Không biết có phải cái máy tính khỉ dó của em nó dở chứng không,hay là tại cai IE cũng ko biết nữa.
email:mahaco@fpt.vn
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Máy đo khuôn mẫubởi vi van phamQuá dễ, Mua cái máy xq quét tòan thân, lấy bàn và khung di chuyển. Tháo đầu xquang ra bán ve chai, mua cái máy siêu âm gắn vào vị trí đầu đèn. Setup máy là chạy chính xác, còn file Setup thì chưa nghĩ ra....
-
Channel: Đo lường và điều khiển dùng máy tính
07-06-2026, 08:49 -
-
Trả lời cho Máy Phun sương tạo ầm Trung Quốc.bởi nguyendinhvanMạch tạo sương là tự dao động.
Mach 555 là đóng mở chu kỳ tần số thấp.
IC 555 giá rẻ, chỉ chạy lên tần số vài trăm ki lô hẹc thôi. Thăng cao hơn là méo dạng rồi tịt.
Mach sương thì dao động tần số tầm 2 mê ga hẹc cơ !...-
Channel: Tâm tình dân kỹ thuật
07-06-2026, 00:09 -
-
bởi nguyendinhvan
Cái máy đo này mắc tiền quá !
Anh em dtvn có giải pháp nào tự chế được không ?...-
Channel: Đo lường và điều khiển dùng máy tính
07-06-2026, 00:00 -
-
bởi nguyendinhvanOi giời.
Thơi buổi PLC rồi, cậu còn hỏi mấy thứ cổ lỗ sĩ này nữa.-
Channel: Tâm tình dân kỹ thuật
06-06-2026, 22:59 -
-
bởi nguyendinhvanChuyện này cũ rồi.
Họ trả lương cho CN, sau đó lại bán hàng thu tiền về. Họ còn cấp các dịch vụ như chỗ ăn ở, quán cafe , giải trí, phương tiện giao thông. Mục đích là thu tối đa số tiền đã chi trả.
Hàng hóa sx ra, chuyển...-
Channel: Tìm mua
06-06-2026, 22:56 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phambao nhiêu năm quên bẳng đi, là mình còn có 1 chút xíu nghệ thuật bài bản, đã dạy cho con cháu chơi đàn, dù bố mẹ và chúng không xem là quan trọng. Hôm qua ngày bế mạc lớp lá, bỗng dưng thằng cháu ngoại thấy con bé được sơ giới thiệu...
-
Channel: Tâm tình dân kỹ thuật
06-06-2026, 21:58 -
-
bởi ittcChào các anh em, tình hình là mình lo làm ăn không để ý sức khỏe, giờ có chút vấn đề rồi? không biết trên này có anh em nào độ tuổi U35 -> 40 đang có dùng các loại thuốc, thuốc bổ hay thực phẩm chức năng giúp bổ thận tráng dương,...
-
Channel: Tâm tình dân kỹ thuật
05-06-2026, 12:28 -
-
bởi theidiotcatTrong thế giới phần cứng năm 2026, AMD Ryzen 5 7500X3D không chỉ là một cái tên mới, nó là một tuyên ngôn về hiệu suất. Dựa trên các thử nghiệm khắt khe trong môi trường chơi game chuyên nghiệp, con chip này đã chứng minh rằng: bạn không cần...
-
Channel: Đánh giá sản phẩm DTVN
05-06-2026, 10:05 -
-
bởi VinhPham92Chào các bác,
Em vừa dự một cái Odoo Business Show 2026 tuần rồi, ngồi nghe mấy session về tự động hóa sản xuất mà em thấy có vài điểm thấy đáng chia sẻ với mấy anh em làm kỹ thuật ở đây.
Câu hỏi của các doanh nghiệp.
Hôm đấy đi thì các doanh...-
Channel: Lập trình PLC và ứng dụng
05-06-2026, 09:18 -
-
bởi quang4789Mình có cái tay chuyển số chơi game của PXN, hiệu là PXN shifter A7, nó bị lỗi 1 con biến trở chỗ gạt lên xuống dùng để xác định là đang đẩy lên, ở giữa, hay gạt về. Con biến trở này giá trị là 10kOhm, sau khi bị hư thì mình đo chỉ...
-
Channel: Hướng dẫn tìm thông tin linh kiện
03-06-2026, 12:04 -

Comment