Thứ Sáu, 24 tháng 2, 2012

Code mẫu cho PIC - Kết hợp: ADC đo nhiệt độ, điện áp, hiển thị LCD và giao tiếp với máy tính

Chương trình thực hiện đo nhiệt độ, điện áp, hiển thị kết quả lên màn hình LCD 16x2, và truyền giá trị lên máy tính.
Mô phỏng trên Proteus:


mô phỏng trên Proteus


Sơ đồ nguyên lý:


Sơ đồ nguyên lý


Mã nguồn:


#include "16f877a.h"
#include "def_877a.h"
#device *=16 ADC=10
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include "lcd_lib_4bit.c"
//=======================================================================
void send(int8 a);
void HIENTHI_LCD(int8 t);
void HIENTHI_LCD_float(int8 t);
int8 count=0;
int8 i,value,vl[10];
//=======================================================================
#INT_RDA //ngat khi nhan du lieu.
Receive_isr()
{
   char c;
   c=getc();
   switch(c)
   {
      case '0':   //xoa man hinh LCD
      {
               LCD_putcmd(0x01);
      }
      break;
          //o day co the su dung ma thap phan! (ngoai tru cac ky tu dieu khien)
      case '-':   //lui con tro hien thi LCD 1 don vi.
      {
               LCD_putcmd(0x10);
      }
      break;
      case '1':   //truyen len may tinh: gia tri do duoc.
      {
         Set_ADC_channel(0);  //kenh 0 chan so2
         delay_us(10);
         for(i=0;i<10;i++)
         {
               vl[i]=read_adc();
               delay_us(10);
         }
         value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/20.48;
         send(value);
      }
      break;
      case '2':   //truyen len may tinh: gia tri do duoc.
      {
         Set_ADC_channel(1);  //kenh 1 chan so3
         delay_us(10);
         if(read_adc()==0)
         {
               for(i=0;i<10;i++)
               {
                     vl[i]=read_adc();
                     delay_us(10);
               }
               value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
         }
         else
         {
               value=read_adc()+6;
               for(i=0;i<10;i++)
               {
                     vl[i]=read_adc()+6;
                     delay_us(10);
               }
               value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
         }
         send(value);
      }
      break;
      case '9':   //thoat khoi ham ngat, cho ADC làm viec.
      {
            count=0;   //ket thuc viec truyen ky tu len LCD
            LCD_putcmd(0x01);
      }
      break;
      default : //truyen ky tu xuong LCD ^^.
      {
               count++;
               if(count==1) LCD_putcmd(0x01);
               if(count==16) LCD_putcmd(0xC0);
               if(count==32)
               {
                  LCD_putcmd(0x01);
                  count=0;
               }
               LCD_putchar(c);
      }    
    }
}
//=======================================================================
void main()
{
   //trisD=0x0C; //D0,D1 LA CONG VAO, D2-D7 LA CONG RA.
 
   enable_interrupts(int_rda); //cho phep ngat noi tiep nhan.
   enable_interrupts(GLOBAL);

 
   LCD_init(); //Khoi tao LCD.
   LCD_putcmd(0xC0);
   Printf(LCD_putchar,"Khoi tao...");
   delay_ms(250);

   setup_adc_ports(AN0_AN1_AN3);   //Khoi tao che do cho bo ADC.
   setup_adc(ADC_CLOCK_INTERNAL);
   delay_us(10);

   while(1)
   {
      //do nhiet do
      {
         Set_ADC_channel(0);  //kenh 0 chan so2
         delay_us(10);
         value=read_adc();
         value=value/2.048;
       
         LCD_putcmd(0x80);
         LCD_putchar("Nhiet do: ");
         LCD_putcmd(0x89);
         HIENTHI_LCD(value);
         LCD_putcmd(0x8C);
         LCD_putchar("oC");
         delay_ms(0.1);
      }
      //do diep ap
      {
         Set_ADC_channel(1);  //kenh 1 chan so3
         delay_us(10);
         if(read_adc()==0)
         {
               for(i=0;i<10;i++)
               {
                     vl[i]=read_adc();
                     delay_us(10);
               }
               value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
         }
         else
         {
               value=read_adc()+6;
               for(i=0;i<10;i++)
               {
                     vl[i]=read_adc()+6;
                     delay_us(10);
               }
               value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/10;
         }

         LCD_PutCmd(0xC0);
         LCD_putchar("DIEN AP : ");
         LCD_putcmd(0xC9);
         //HIENTHI_LCD(value);
         HIENTHI_LCD_float(value);
         LCD_putcmd(0xCD);
         LCD_putchar("V ");
      }
   }
}
//=======================================================================
void HIENTHI_LCD(int8 t)
{
     unsigned char v;
     if(t<10)
          LCD_putchar(t+48);
     else
     if(t<100)
     {
          LCD_putchar(t/10+48);
          LCD_putchar(t%10+48);
     }
     else
     {
         v=t/10;
         LCD_putchar(v/10+48);
         LCD_putchar(v%10+48);
         LCD_putchar(t%10+48);
     }
}
void send(int8 a)
{
    if(a<10)
     {
         putc(a+48);      
     }
     if(a>9&&a<100)
     {
          unsigned char c=a/10;
          unsigned char d=a%10;
          putc(c+48);
          putc(d+48);    
     }
     if(a>99)
     {
          unsigned char t=a/100;
          unsigned char c=a/10-10*t;
          unsigned char d=a%10;
          putc(t+48);
          putc(c+48);
          putc(d+48);
     }
}
void HIENTHI_LCD_float(int8 t)
{
     int8 v;
     if(t<10)
     {
          LCD_putchar(48);
          LCD_putchar(46);
          LCD_putchar(t+48);
          LCD_putchar(32);
     }
     else
     if(t<100)
     {
          LCD_putchar(t/10+48);
          LCD_putchar(46);
          LCD_putchar(t%10+48);
          LCD_putchar(32);
     }
     else
     {
         v=t/10;
         LCD_putchar(v/10+48);
         LCD_putchar(v%10+48);
         LCD_putchar(46);
         LCD_putchar(t%10+48);
     }
}
/*
void send_float(float a)
{
    if(a<10)
     {
         putc(a+48);      
     }
     if(a>9&&a<100)
     {
          unsigned char c=a/10;
          unsigned char d=a%10;
          putc(c+48);
          putc(d+48);    
     }
     if(a>99)
     {
          unsigned char t=a/100;
          unsigned char c=a/10-10*t;
          unsigned char d=a%10;
          putc(t+48);
          putc(c+48);
          putc(d+48);
     }
}*/
//=======================================================================


Thư Viện: lcd_lib_4bit.c
Sơ Đồ Nguyên Lý: NguyenLy.pdf

25 nhận xét:

  1. Những code này mình đã chạy tốt cả.
    Nếu bạn gặp lỗi gì hãy mô tả cụ thể cho mình biết.
    Thân!

    Trả lờiXóa
  2. khi mình chạy thì có rất nhìu lỗi thông báo là Expecting a declaration
    và khi down lcd_lib_4bit.c trên mạng thì mỗi thư viện lcd_lib_4bit.c lại ra thông báo lỗi ở 1 số chõ khác nhau..bạn có thể gửi cho mình file lcd_lib_4bit.c bạn dùng không

    Trả lờiXóa
  3. Sao mình dùng thư viện lcd_lib_4bit đều bị lỗi. bạn xem lại đi ạ. bạn có thể gửi cho mình cái thư viện bạn đang dùng cho mình được chứ. mail: toancs@gmail.com
    thanks so much!

    Trả lờiXóa
  4. Thư viện lcd_lib_4bit.c đây bạn: http://www.mediafire.com/?c3adajpns1bb4bz

    Trả lờiXóa
  5. @Đinh Văn Hiếu: Bạn kiểm tra lại:
    + Các thư viện đã có đủ trong cùng thư mục project chưa? nếu báo thiếu thư viện nào thì bạn coppy đầy đủ thư viện vào.
    + Bạn sửa lại các cặp dấu <> thành "" trong các dòng #include. VD: #include"16f877a.h"
    + Phần khai báo ở đầu CCS theo đúng thứ tự như trên chưa? Đôi khi bạn khai báo sai thứ tự cũng gây ra lỗi.
    + Chú ý các chân trong thư viện LCD_4BIT.C bạn phải khai báo lại theo đúng các chân trong mạch nguyên lý của bạn.
    Thân!

    Trả lờiXóa
  6. bạn mới sửa code à? mới hôm trước mình vào còn khác mà

    Trả lờiXóa
  7. Mình sửa lại các dòng #include"..." cho đỡ gặp lỗi:)
    Thân!

    Trả lờiXóa
  8. Bạn cho mình xin cái file sơ đồ nguyên lý đi, hình trên mờ qua mình ko nhìn rõ dc.
    Mail của mình : minhsang08ddt1@gmail.com
    Thanks bạn nhiều

    Trả lờiXóa
  9. hì... bác ơi cho em xin cái sơ đồ nguyên lí đi.. ảnh mờ quá.... mail của em là.... joneyquest1711@gmail.com... thanks bác

    Trả lờiXóa
  10. Ok mình up thêm File sơ đồ nguyên lý ở trên rồi đó.
    Thân!

    Trả lờiXóa
  11. thanks bạn nhiều. Nhưng mà cái file đó mình ko đọc được, bạn có thể gửi file orcad hay chép sang word để dễ đọc hơn ko?

    Trả lờiXóa
  12. Mình chuyển qua file PDF ở trên rồi đó!
    Thân!

    Trả lờiXóa
  13. code nay hien thi dc chu ko nhi

    Trả lờiXóa
  14. sao minh copy ve ma lai bao loi o doan (unsigned char d=a%10;)

    Trả lờiXóa
  15. Bạn xem trình biên dịch báo lỗi gì ở dòng đó?

    Trả lờiXóa
  16. bạn ơi sao mình copy code rồi chạy thử tren proteus và vb6 mà nó ko kết để truyền dữ liệu đc.hic

    Trả lờiXóa
  17. bạn ơi bổ xung thư viện thế nào nhỉ?

    Trả lờiXóa
  18. Nhận xét này đã bị tác giả xóa.

    Trả lờiXóa
  19. T bị lỗi này trong thư viện lcd_lib_4bit:
    A #DEVIDE required before this line
    t viết bằng CCS, c sửa hộ t nha, thank c ^^

    Trả lờiXóa
  20. bạn ơi gui minh file vb va protues duoc ko ban
    mail:hiepcuibapspkt@gmail.com

    Trả lờiXóa
  21. e cũng làm về đề tài này ,nhưng không biết bắt đâu như thế nào.
    ac giúp e mới.
    đầu tiên cần phải có những cài gì vây?

    Trả lờiXóa
  22. có bạn nào làm mạch thành công chưa vậy

    Trả lờiXóa
  23. đã bluild code nhưng còn 1 lỗi khng6 biết sửa ở đâu !! lổi : Unknown device type ''pic16f877a'' . nhờ mod xem qua!

    Trả lờiXóa
  24. cho mình xin file nguyen lí và file mo phỏng đi bạn ơi, minh ko tải đc
    cám ơn bạn nhiều
    email:buivanhieu2105@gmail.com

    Trả lờiXóa