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:


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
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);
     }
}*/
//=======================================================================

adc pic, code mẫu pic, giao tiếp máy tính qua rs232, hiển thị lên lcd 16x2, Lập trình pic, Vi Xử Lý PIC, đo nhiệt độ, đo điện áp, Tài Liệu Vi Điều Khiển, Tài liệu Điện Tử, Code Lập Trình, 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

Đăng nhận xét

Đăng nhận xét

Author Name



Tôi là Ngọc Anh. Tôi đến từ Nghệ An. Tôi tốt nghiệp một trường đại học tại Sài Gòn. Hiện tôi đang phát triển công ty riêng. Liên lạc với tôi qua:






Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.