Thông báo

Collapse
No announcement yet.

dùng eprom ngoài cho 8051

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • dùng eprom ngoài cho 8051

    mấy bác ơi,giúp cho em với. Em muốn tăng rom cho con 8051 nhưng không biết dùng loại rom nào, cách nạp cho rom ngoài đó ra sao? Em đã thiết kế thử như trong cuốn Vi Xử Lý của Tong Van On, nhưng test trên Proteus thì không thấy động tĩnh gì cả ??? Rất mong các bác giúp đỡ cho!

  • #2
    bạn có thể dùng con ROM 64k để gắn thêm vào 8051(maximum rồi đó,thêm nữa nó ko chạy),nhớ nối lại cái chân quy định 8051 truy xuất loại rom nội/ngoại nữa nghen(tui quên mất chân gì rồi,bạn tra lại vậy).khi gắn rom ngoại thì con rom nội ko tính vào dung lượng tổng của bộ nhớ rom

    2 thanh ghi chủ đạo trong việc truyền data theo kiểu nối tiếp là SBUF và SCON

    đợi sau này có bạn nào pót 1 ví dụ đơn giản lên trên này,bạn sẽ thấy rõ hơn

    Comment


    • #3
      em vẫn chưa biết cách nạp cho rom ngoài như thế nào? làm sao cho con 8051 lấy dữ liệu từ rom? Mong mấy bác chỉ dẫn cụ thể giùm em cái. Mấy bác làm ơn chỉ giùm em nhanh nhanh tí. Em đang cần gấp lắm ạ! cám ơn nhiều!

      Comment


      • #4
        Nguyên văn bởi themumy
        em vẫn chưa biết cách nạp cho rom ngoài như thế nào? làm sao cho con 8051 lấy dữ liệu từ rom? Mong mấy bác chỉ dẫn cụ thể giùm em cái. Mấy bác làm ơn chỉ giùm em nhanh nhanh tí. Em đang cần gấp lắm ạ! cám ơn nhiều!
        giao tiếp EEPROM 24c04 theo chuẩn I2C ok nhế

        Code:
        #include <AT89X52.H>
        #include <intrins.h> // Dinh nghia cho _NOP_
        
        #define NOP _nop_
        #define delay20 {NOP NOP NOP NOP};0
        
        sbit scl = P3^6;// CUA DS1307
        sbit sda = P3^7;
        sbit errled = P3^1;
        
        #define data_led7 P0
        #define led1  P1_0
        #define led2  P1_1
        #define led3  P1_2
        #define led4  P1_3
        
        unsigned char byte1,byte2,byte3;
        
        //------------------------
        void delay(int t)
        {
        	int i;
        	for(i=0;i<t;i++){};
        }
        void ipdelay(){
        	delay(20);
        }
        
        void ipchigh(){	//I2C clock high
        	scl=1;
        	ipdelay();
        }
        void ipclow(){	//I2C clock low
        	scl=0;
        	ipdelay();
        }
        void i2c_start(){	//	start condition
        	sda=1;
        	scl=1;
        	sda=0;
        	ipdelay();
        	scl=0;
        	sda=1;
        } 
        void i2c_stop(){		//stop condition
        	sda=0;
        	scl=1;
        	ipdelay();
        	scl=1;
        }
        bit i2c_write(unsigned char dat){	//write 1byte 
        	unsigned char i;			//return 0 if ok
        	bit outbit;					//return 1 if error
        	for(i=1;i<=8;i++){
        		outbit=dat&0x80;
        		sda=outbit;
         	    dat=dat<<1;
        		ipchigh();
        		ipclow();
        	}
        	sda=1;				// set sda to receive Acknowledge
        	ipchigh();
        	outbit=sda;			// check busy or not	
        	ipclow();
        	return(outbit);		//if outbit=1 ,A=1: error
        						//if outbit=0 ,A=0: ok
        
        }
        unsigned char i2c_read(){		//Read 1 byte (ACK)
        	unsigned char i, dat;
            bit inbit;
            dat=0;
            for(i=1;i<=8;i++)   {
        		ipchigh();
        		inbit=sda;
        		dat=dat<<1;
        		dat=dat|inbit;
        		ipclow();
        	}
        	sda=0;
        	ipchigh();
        	ipclow();
        	return(dat);
        }
        unsigned char i2c_readlastbyte(){		// Read last byte (not Ack)
        	unsigned char i,dat;
        	bit inbit;
        	dat=0;
        	for(i=1;i<=8;i++){
        		ipchigh();
        		inbit=sda;
        		dat=dat<<1;
        		dat=dat|inbit;
        		ipclow();
        	}
        	sda=1;
        	ipchigh();
        	ipclow();
        	return(dat);
        
        }
        void display()
        {
        unsigned char code maled7[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,
        				  			   0xC6,0x86,0x8E,0x82,0x89,0x7F,0xFF};
        
        	data_led7 = maled7[byte1]; 	led1 = 0; delay(250); led1 = 1;
        	data_led7 = maled7[byte2]; 	led2 = 0; delay(250); led2 = 1;
        	data_led7 = maled7[byte3]; 	led3 = 0; delay(250); led3 = 1;
        
        }
        
        void main() 
        {
        int i;
        bit err;
        
        P1 = 0xFF;
        // Ghi du lieu vao 24C04
        i2c_start(); // send start sequence
        err = i2c_write(0xA0); // Gui dia chi cua 24C04 voi bit RW = 0
        if(err) {errled = 0;}
        else errled = 1;
        i2c_write(0x00); // Dia chi vi tri ROM can ghi du lieu
        for (i=0;i<16;i++)
        	i2c_write(i); 	// Cac byte tiep theo, thanh ghi xac dinh dia chi se tu tang len 1
        P3_0 = 0;
        i2c_stop();
        // Doc du lieu tu 24C04
        i2c_start();
        i2c_write(0xA0);
        i2c_write(0x01);
        i2c_start(); // send a restart sequence
        i2c_write(0xA1); // set bit R/W - Read from 24C04
        byte1 = i2c_read();
        byte2 = i2c_read(); 
        byte2 = i2c_read(); 
        byte2 = i2c_read(); 
        byte3 = i2c_read(); 
        i2c_stop(); // send stop sequence 
        
        while (1) 
        {
        display();
        }
        }
        //--------------------------------------------------------
        SHARE KHO PHIM LỚN

        Comment


        • #5
          Bạn nên dùng EEPROM, như 28C64, giao tiếp dễ dàng!
          /OE của EEPROM = (/RD AND /PSEN) của 8051 làm cho EEPROM có khả năng vừa làm bộ nhớ dữ liệu vừa làm bộ nhớ chương trình, bạn có thể ghi vào nó bằng lệnh kiểu như sau
          MOV DPTR, #EEPROM_ADDR
          MOV A, OPCODE ; OPCODE là mã máy của 8051 đã được trình biên dịch dịch ra, nằm trong file hex í!
          MOVX @DPTR, A
          Quá trình nạp bạn có thể nạp từ máy tính bằng giao tiếp RS232, vd gửi xuống 1 byte, ghi vào @DPTR, tăng DPTR lên, ghi tiếp byte tiếp theo, cho đến khi hết file hex thì thôi!
          Bạn nên tham khảo thêm cuốn Cấu trúc và lập trình họ vi điều khiển 8051 của NGUYỄN TĂNG CƯỜNG!
          Chúc thành công!
          Attached Files

          Comment


          • #6
            Nguyên văn bởi giaosucan
            giao tiếp EEPROM 24c04 theo chuẩn I2C ok nhế

            Code:
            #include <AT89X52.H>
            #include <intrins.h> // Dinh nghia cho _NOP_
            
            #define NOP _nop_
            #define delay20 {NOP NOP NOP NOP};0
            
            sbit scl = P3^6;// CUA DS1307
            sbit sda = P3^7;
            sbit errled = P3^1;
            
            #define data_led7 P0
            #define led1  P1_0
            #define led2  P1_1
            #define led3  P1_2
            #define led4  P1_3
            
            unsigned char byte1,byte2,byte3;
            
            //------------------------
            void delay(int t)
            {
            	int i;
            	for(i=0;i<t;i++){};
            }
            void ipdelay(){
            	delay(20);
            }
            
            void ipchigh(){	//I2C clock high
            	scl=1;
            	ipdelay();
            }
            void ipclow(){	//I2C clock low
            	scl=0;
            	ipdelay();
            }
            void i2c_start(){	//	start condition
            	sda=1;
            	scl=1;
            	sda=0;
            	ipdelay();
            	scl=0;
            	sda=1;
            } 
            void i2c_stop(){		//stop condition
            	sda=0;
            	scl=1;
            	ipdelay();
            	scl=1;
            }
            bit i2c_write(unsigned char dat){	//write 1byte 
            	unsigned char i;			//return 0 if ok
            	bit outbit;					//return 1 if error
            	for(i=1;i<=8;i++){
            		outbit=dat&0x80;
            		sda=outbit;
             	    dat=dat<<1;
            		ipchigh();
            		ipclow();
            	}
            	sda=1;				// set sda to receive Acknowledge
            	ipchigh();
            	outbit=sda;			// check busy or not	
            	ipclow();
            	return(outbit);		//if outbit=1 ,A=1: error
            						//if outbit=0 ,A=0: ok
            
            }
            unsigned char i2c_read(){		//Read 1 byte (ACK)
            	unsigned char i, dat;
                bit inbit;
                dat=0;
                for(i=1;i<=8;i++)   {
            		ipchigh();
            		inbit=sda;
            		dat=dat<<1;
            		dat=dat|inbit;
            		ipclow();
            	}
            	sda=0;
            	ipchigh();
            	ipclow();
            	return(dat);
            }
            unsigned char i2c_readlastbyte(){		// Read last byte (not Ack)
            	unsigned char i,dat;
            	bit inbit;
            	dat=0;
            	for(i=1;i<=8;i++){
            		ipchigh();
            		inbit=sda;
            		dat=dat<<1;
            		dat=dat|inbit;
            		ipclow();
            	}
            	sda=1;
            	ipchigh();
            	ipclow();
            	return(dat);
            
            }
            void display()
            {
            unsigned char code maled7[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,
            				  			   0xC6,0x86,0x8E,0x82,0x89,0x7F,0xFF};
            
            	data_led7 = maled7[byte1]; 	led1 = 0; delay(250); led1 = 1;
            	data_led7 = maled7[byte2]; 	led2 = 0; delay(250); led2 = 1;
            	data_led7 = maled7[byte3]; 	led3 = 0; delay(250); led3 = 1;
            
            }
            
            void main() 
            {
            int i;
            bit err;
            
            P1 = 0xFF;
            // Ghi du lieu vao 24C04
            i2c_start(); // send start sequence
            err = i2c_write(0xA0); // Gui dia chi cua 24C04 voi bit RW = 0
            if(err) {errled = 0;}
            else errled = 1;
            i2c_write(0x00); // Dia chi vi tri ROM can ghi du lieu
            for (i=0;i<16;i++)
            	i2c_write(i); 	// Cac byte tiep theo, thanh ghi xac dinh dia chi se tu tang len 1
            P3_0 = 0;
            i2c_stop();
            // Doc du lieu tu 24C04
            i2c_start();
            i2c_write(0xA0);
            i2c_write(0x01);
            i2c_start(); // send a restart sequence
            i2c_write(0xA1); // set bit R/W - Read from 24C04
            byte1 = i2c_read();
            byte2 = i2c_read(); 
            byte2 = i2c_read(); 
            byte2 = i2c_read(); 
            byte3 = i2c_read(); 
            i2c_stop(); // send stop sequence 
            
            while (1) 
            {
            display();
            }
            }
            //--------------------------------------------------------
            Sao bác không cho luôn cái sơ đồ, nói thế này sao "em nó" thấy được! hehe!

            Comment


            • #7
              hic,giáo sư cận thị giúp tớ viết bằng ASM đi,mù tịt C rồi!

              Comment


              • #8
                oái sơ đồ giao tiếp 24c04 có đầy trên mạng đơn giản có gì đâu
                SHARE KHO PHIM LỚN

                Comment


                • #9
                  24C04 làm bộ nhớ dữ liệu thì được, có dùng làm bộ nhớ chương trình được không nhỉ, hay mỗi lần muốn dùng phải load lên RAM, 28C theo mình biết là được!

                  Comment


                  • #10
                    24C04 làm bộ nhớ dữ liệu thì được, có dùng làm bộ nhớ chương trình được không nhỉ, hay mỗi lần muốn dùng phải load lên RAM, 28C theo mình biết là được!
                    Nếu muốn dùng bộ nhớ chương trình ngoài cho 8051 thì phải dùng bộ nhớ dạng song song, không dùng loại nối tiếp được.
                    Thân mến,
                    blackmoon.

                    Comment


                    • #11
                      Nguyên văn bởi blackmoon
                      Nếu muốn dùng bộ nhớ chương trình ngoài cho 8051 thì phải dùng bộ nhớ dạng song song, không dùng loại nối tiếp được.
                      Thân mến,
                      blackmoon.
                      Bác có thể nói rõ hơn một chút chỗ này không ạ ?Thanks !

                      Comment


                      • #12
                        Nguyên văn bởi vulh_bk
                        Bác có thể nói rõ hơn một chút chỗ này không ạ ?Thanks !
                        8051 có khả năng giao tiếp để mở rộng bộ nhớ ngoài bằng 2 port PORT0 và PORT2, PORT0 vừa làm bus địa chỉ vừa làm bus dữ liệu!
                        Như hình bên trên mình đã post là một ví dụ về mở rộng bộ nhớ bằng giao tiếp song song! Bạn xem lại đi nha!
                        Bộ nhớ nối tiếp người ta chỉ dùng để lưu dữ liệu vì giao tiếp của nó với 8051 đơn giản, chỉ cần 2 chân, phần cứng gọn nhẹ!

                        Comment


                        • #13
                          viet bang C de hieu hon the ma con che gi nua
                          giao su can co the cho em bit 1 it ve EEPROM nhe

                          Comment


                          • #14
                            các anh chị ơi giúp em với .
                            về vấn đề rom ngoài , nạp file HEX vao rom ngoài thì dùng thiết bị nào để nạp , cac anh chị chỉ gùm ,em cảm on nhiều

                            Comment


                            • #15
                              @lamtonlamton : chắc làm 1 cái mạch nạp gồm 1 con 89 là được


                              Các bác cho hỏi : con 24c04 chứa được 512 byte , em dùng I2C thì nó chỉ có 8 bít địa chỉ , thì làm thế nào sử dụng được những byte từ 256 trở lên ???
                              Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X