1. THÔNG BÁO TUYỂN ADMIN DIỄN ĐÀN 2013
    Tìm kiếm nhà trọ - Ở ghép
    THÔNG BÁO BÁN ÁO SPKT.NET CHO THÀNH VIÊN DIỄN ĐÀN


    HÃY TÌM KIẾM Ở ĐÂY TRƯỚC KHI ĐẶT CÂU HỎI
    {xen:phrase loading}

Mô phỏng 8051 trên proteus - 8051 giao tiếp ADC và cảm biến nhiệt

Thảo luận trong 'Vi điều khiển - Mạch Số' bắt đầu bởi admin, 11 Tháng mười một 2010.

  1. admin Administrator

    Số bài viết: 683
    Đã được thích: 64
    Điểm thành tích: 28
    Trước khi bắt đầu bài viết mình xin lưu ý 1 số điểm:
    + Tất cả những bài viết về 8051 của mình đều thực hiện trên proteus vì vậy nó chỉ mang tính chất mô phỏng, mạch thật sẽ có những điểm khác nhất định, và khác như thế nào thì do các bạn tìm hiểu, mày mò tìm kiếm thêm!
    + Có 1 số code mình kiếm trên mạng và chỉnh sửa chút ít theo ý của mình, và tất nhiên kô phải code nào mình cũng hiểu tường tận, do đó các bạn tiếp tục tìm hiểu, thay đổi, sang tạo cho phù hợp với mục đích sử dụng của mỗi người.
    + Bắt đầu từ bài này mình dùng proteus 7.3, nếu bạn nào chưa có thì có thể dow theo link sau:
    http://www.mediafire.com/file/ntnjytqzcyz/Proteus 7.4 Sp3 Full.rar
    Hi! Thế là xong phần chú ý, cũng lâu quá mới viết được entry mới này, mình xin đi luôn vào vấn đề. Việc ứng dụng đo nhiệt độ được sử dụng rất nhiều trong cuộc sống, và để tiếp nối các entry về mô phỏng 8051 dung proteus mình sẽ làm demo 1 bài dùng cảm biến nhiệt LM35 + ADC0804 + AT89C51 + LCD. Vẫn như thường lệ mình chỉ nêu khái quát, các bạn tự tìm hiểu thêm nhé:
    Đầu tiên là sơ đồ mạch trên proteus:

    [IMG]

    Tại sao mình lại ghép nối như hình trên các bạn đọc tài liệu dưới sẽ rõ:
    http://www.mediafire.com/file/mz3im0wmgzz/6969707-12lcd-adc-cam-bien.pdf

    Ở đây khi mình tăng giá trị của LM35 theo thứ tự : 1,2,3,4… thì ở trên LCD cũng sẽ tăng tương ứng như vậy và để được như vậy thì theo như tớ làm sẽ nối chân VREF/2 ( chân số 9 trên ADC0804) với nguồn là 1.28 V lúc này kích thước độ phân dải của ADC là 10mV tương ứng với đầu ra 10mV/F cuả LM35

    [IMG]

    [IMG]


    Tiếp theo sẽ là code chương trình:
    Mã:
    #include <AT89X51.H>
    #include <stdio.h>
    #include<string.h>
    
    #define RS P3_5
    #define RW P3_6//RW=0 => ghi
    #define EN P3_7//RW=1 => doc
    //RS=0 => code
    //RS=1 => data
    #define LCD_PORT P1
    
    #define INTR P3_0
    #define RD P3_1
    #define WR P3_2
    
    
    //===========================
    void delay_ms(int n)
    {
    	int k,j;
    	for(k=0;k<n;k++)
    	{
    		for(j=0;j<500;j++);
    	}
    
    }
    //==========================
    void delay_5ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<4;j++){}
    }
    //===========================
    void delay_15ms(){
    int i,j;
    for(i=0;i<250;i++)
    for(j=0;j<100;j++){}
    }
    //============================
    void LCDWriteCmd(unsigned char c) //CT con ghi du lieu len LCD
    {
     RS=0;
     RW=0;
     LCD_PORT=c;
     EN=1;
     EN=0;
     delay_5ms();
    }
    //==============================
    void LCDWriteData(unsigned char c) //CT con doc du lieu tu LCD
    {
     RS=1;
     RW=0;
     LCD_PORT=c;
     EN=1;
     EN=0;
     delay_5ms();
    }
    //=============================
    void LCDcursorxy(int x, int y)
    {
    	if((x<1||x>2)&&(y<1||y>16))
    	{
    		x=1;
    		y=1;
    	}
    	if(x == 1)
    		LCDWriteCmd(0x7F+y);
    	else
    		LCDWriteCmd(0xBF+y);
    }
    //===============================
    void LCD_init()  // Khoi tao LCD
    {
     delay_15ms();
    
     LCDWriteCmd(0x38);
     LCDWriteCmd(0x0C);
    // LCDWriteCmd(0x06);
     LCDWriteCmd(0x01);  // Xoa man hinh LCD
    }
    //================================
    void LCD_clear()
    {
     LCDWriteCmd(0x01);
    }
    //===============================
    void LCD_home()
    {
     LCDWriteCmd(0x80);
    }
    //=============================
    void LCD_putstr(unsigned char *s)
    {
     while (*s)
     {
      LCDWriteData(*s);
      s++;
     }
    }	    
    //============================
    void HienThi_ADC(unsigned char t)
    {
     unsigned char v;
     
      
    if(t<10)
      {	 LCDWriteData(t+48);
      }else if(t<100){
         LCDWriteData(t/10+48);
    	 LCDWriteData(t%10+48);
      }else{
         v=t/10;
    	 LCDWriteData(v/10+48);
    	 LCDWriteData(v%10+48);
    	 LCDWriteData(t%10+48);
      }
    }
    
    //==========================================
    
    
    void main (void)
    {
    unsigned char gt=0;	   //gt la bie^n' cho gia tri 8bit ADC
    LCD_init();
    LCDWriteCmd(0x83);
    LCD_putstr("8051 & ADC");
    while(1)	  
    {	
    	
    	WR=0;				 //	   Bat dau chuyen doi gia tri tu ADC
    	delay_ms(5);		 // Tao tre de cap nhat du lieu tu ADC
    	WR=1;				 //
    	while(!INTR);
     	  RD=0;				 // Nhan du lieu da duoc chuyen doi
    	  gt=P2;
    	  LCDWriteCmd(0x01);
    	  LCDWriteCmd(0x83);
    	  LCD_putstr("8051 & ADC");
    	  LCDWriteCmd(0xC0);
    	  LCD_putstr("Nhiet do:");
          HienThi_ADC(gt);
    	  delay_ms(100);
    	 
    }
    }
    Và đây là link dow Proteus + code C + hex:
    http://www.mediafire.com/file/zwltjvyenmv/8051_ADC_LCD.rar

    xuanlienbk thích bài này.
  2. vanchang1987 New Member

    Số bài viết: 3
    Đã được thích: 0
    Điểm thành tích: 0
    thật sự là tui rất mừng khi đọc xong bài của bác!
    tui không biết nói gì hơn là cảm ơn bác nhiều!
    nếu bác ở đà lạt tui mời bác uống cafe liền.....hjk
  3. ngoc phuc New Member

    Số bài viết: 3
    Đã được thích: 0
    Điểm thành tích: 0
  4. huynhson155 New Member

    Số bài viết: 5
    Đã được thích: 0
    Điểm thành tích: 0
  5. benquaz New Member

    Số bài viết: 1
    Đã được thích: 0
    Điểm thành tích: 0

Chia sẻ trang này