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
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 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.
    Góp vui với mọi người!!! heheehe

    Comment


    • huynh HaiBac lam on up lai sach lap trinh C gium de duoc khong. de dơn hoai khong duoc.

      Comment


      • Nguyên văn bởi PSman Xem bài viết
        Bá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.
        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ần

        i2c.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 *****************************************************/
        lcd4bit.h:

        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 *******************************/
        main.c:

        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 Files
        Last 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


        • Cho em hỏi trong Keil-C khi debug muốn biết chính xác một đoạn code nào mất thời gian thực của VXL là bao lâu thì làm thế nào ?

          Bác NgoHaiBac nói debug đoạn code Delay bác viết mất ~8.28us (TA 11.0592) là debug ở chỗ nào thế ?

          Comment


          • Chao ban N_H_B, sao minh vo link cua ban ko thay file pdf nao vay? Mong ban kiem tra lai gium.
            Homepage:

            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


              • Chạy được thì mới post. Nếu không mọi người cười chết.
                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


                • em đang chật vật với 8051, đang phải dùng nó lập trình cho bộ điều chỉnh PID(bài tập dài của em đấy) mới vào nghề nên còn bỡ ngỡ. Pác nào có biết thì chỉ cho em với, hoạc tài liệu cũng đc. thanks các pác nhìu

                  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


                      • Nguyên văn bởi nguyensu Xem bài viết
                        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.
                        Các link vẫn tốt mà, bạn có thể vào link dưới để dow.
                        http://www.esnips.com/doc/34e0113f-6...d3/Keil-C-8.05
                        chúc thành công!

                        email:mahaco@fpt.vn

                        Comment


                        • Nguyên văn bởi nguyensu Xem bài viết
                          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.
                          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.

                          email:mahaco@fpt.vn

                          Comment


                          • chắ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.

                            Comment


                            • Nguyên văn bởi nguyensu Xem bài viết
                              chắ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.
                              Bạn kiểm tra lại đi vì trước khi post bài mình đã dow thử rồi.

                              email:mahaco@fpt.vn

                              Comment


                              • Sách lập trình C nhá

                                Mình đã gom thành Pdf file, ai có khó khăn cứ hỏi.

                                Về C thì đây: Link

                                Comment

                                Về tác giả

                                Collapse

                                kien_tran Tìm hiểu thêm về kien_tran

                                Bài viết mới nhất

                                Collapse

                                • mèomướp
                                  Trả lời cho Sửa bộ nguồn DC 60V 45A
                                  bởi mèomướp
                                  Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                                  Hôm qua, 13:11
                                • tuyennhan
                                  Trả lời cho Sửa bộ nguồn DC 60V 45A
                                  bởi tuyennhan
                                  Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                                  Hôm qua, 09:25
                                • tuyennhan
                                  Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                  bởi tuyennhan
                                  Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                                  Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                                  Hôm qua, 09:10
                                • Ng.Phuong.5
                                  Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                  bởi Ng.Phuong.5
                                  Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                  Mấy con...
                                  09-01-2025, 19:44
                                • viettinh
                                  Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                  bởi viettinh
                                  Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                                  Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                                  09-01-2025, 18:12
                                • nguyendinhvan
                                  Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                  bởi nguyendinhvan
                                  Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                                  Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                                  Cách đơn giản...
                                  09-01-2025, 00:04
                                • mèomướp
                                  Trả lời cho Sửa bộ nguồn DC 60V 45A
                                  bởi mèomướp
                                  Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                                  08-01-2025, 19:02
                                • tuyennhan
                                  Trả lời cho Sửa bộ nguồn DC 60V 45A
                                  bởi tuyennhan
                                  Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                                  08-01-2025, 15:43
                                • tuyennhan
                                  Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                  bởi tuyennhan
                                  Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                                  08-01-2025, 15:28
                                • mèomướp
                                  Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                  bởi mèomướp
                                  Dạ loa tép bé xíu như ngón chân cái thôi ạ. Thiếu gì chỗ để đâu. Quan trọng là gắn thêm nó loa nghe ok hay ko thôi ạ...
                                  08-01-2025, 11:44
                                Đang tải...
                                X