gia thiet bi ve sinh chinh hang, doc truyen truyện tranh cười Việt Nam doc truyen ma kinh di truyen tinh yeu lãng mạn, tin tuc onlinethiet bi nha ve sinh Việt Nam - Voi hoa sen

kiem tien online
Hiển thị các bài đăng có nhãn Do nhiet do. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Do nhiet do. Hiển thị tất cả bài đăng

Giao tiếp 1 wire DS18b20, đo nhiệt độ hiển thị led

Được đăng bởi NetVN Chủ Nhật, 20 tháng 5, 2012 0 nhận xét
Giao tiếp 1 wire DS18b20, đo nhiệt độ hiển thị led 7

I Đặc điểm:
Các đặc điểm kỹ thuật của cảm biến DS18B20 có thể kể ra một cách tóm tắt như sau:
• Sử dụng giao diện một dây nên chỉ cần có một chân ra để truyền thông.
• Có thể đo nhiệt độ trong khoảng -55 -> +125 oC.Với khoảng nhiệt độ là -10°C to +85°C thì độ chính xác ±0.5°C.Có chức năng cảnh báo nhiệt độ vược qua giá trị cho trước.
• Điện áp sử dụng : 3 – 5.5 V,có thể cấu hình mã hóa nhiệu độ từ 9 – 12 bit
số bit càng lớn thì độ chính xác cao hơn.Thời gian chuyển đổi nhiệt độ tối đa là 750ms cho mã hóa 12 bit
• Dòng tiêu thụ tại chế độ nghỉ cực nhỏ.
• Mỗi cảm biến có một mã định danh duy nhất 64 bit chứa trong bộ nhớ ROM trên chip (on chip), giá trị nhị phân được khắc bằng tia laze.
• Nếu cấu hình cho DS18B20 theo 9,10,11,12 bit thì ta có độ chính xác tương ứng là : 0.5°C , 0.25°C ,0.125°C, 0.0625°C.Theo mặc định của nhà sản xuất nếu chúng ta không cấu hình chế độ chuyển đổi thì nó sẽ tự cấu hình là 12 bit.
Khi bắt đầu chuyển đổi nhiệt độ thì chân DQ sẽ được kéo xuống mức thấp và khi chuyển đổi xong thì ở mức cao.Như vậy ta sẽ căn cứ vào hiện tượng này để xác định khi nào chuyển đổi xong nhiệt độ.

II.Các tập lệnh của ds18b20

- READ ROM (33h) 
Cho phép đọc ra 8 byte mã đã khắc bằng laser trên ROM, bao gồm: 8 bit mã định tên linh kiện (10h), 48 bit số xuất xưởng, 8 bit kiểm tra CRC. Lệnh này chỉ dùng khi trên bus có 1 cảm biến DS1820, nếu không sẽ xảy ra xung đột trên bus do tất cả các thiết bị tớ cùng đáp ứng.
- MATCH ROM (55h) 
Lệnh này được gửi đi cùng với 64 bit ROM tiếp theo, cho phép bộ điều khiển bus chọn ra chỉ một cảm biến DS1820 cụ thể khi trên bus có nhiều cảm biến DS1820 cùng nối vào. Chỉ có DS1820 nào có 64 bit trên ROM trung khớp với chuỗi 64 bit vừa được gửi tới mới đáp ứng lại các lệnh về bộ nhớ tiếp theo. Còn các cảm biến DS1820 có 64 bit ROM không trùng khớp sẽ tiếp tục chờ một xung reset. Lệnh này được sử dụng cả trong trường hợp có một cảm biến một dây, cả trong trường hợp có nhiều cảm biến một dây.
- SKIP ROM (CCh) 
Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ nhớ của DS1820 mà không cần gửi chuỗi mã 64 bit ROM. Như vậy sẽ tiết kiệm được thời gian chờ đợi nhưng chỉ mang hiệu quả khi trên bú chỉ có một cảm biến.
- SEARCH ROM (F0h) 
Lệnh này cho phép bộ điều khiển bus có thể dò tìm được số lượng thành viên tớ đang được đấu vào bus và các giá trị cụ thể trong 64 bit ROM của chúng bằng một chu trình dò tìm.
- ALARM SEARCH (ECh) 
Tiến trình của lệnh này giống hệt như lệnh Search ROM, nhưng cảm biến DS1820 chỉ đáp ứng lệnh này khi xuất hiện điều kiện cảnh báo trong phép đo nhiệt độ cuối cùng. Điều kiện cảnh báo ở đây được định nghĩa là giá trị nhiệt độ đo được lớn hơn giá trị TH và nhỏ hơn giá trị TL là hai giá trị nhiệt độ cao nhất và nhiệt độ thấp nhất đã được đặt trên thanh ghi trong bộ nhớ của cảm biến.
Sau khi thiết bị chủ (thường là một vi điều khiển) sử dụng các lệnh ROM để định địa chỉ cho các cảm biến một dây đang được đấu vào bus, thiết bị chủ sẽ đưa ra các lệnh chức năng DS1820. Bằng các lệnh chức năng thiết bị chủ có thể đọc ra và ghi vào bộ nhớ nháp (scratchpath) của cảm biến DS1820. khởi tạo quá trình chuyển đổi giá trị nhiệt độ đo được và xác định chế độ cung cấp điện áp nguồn. Các lệnh chức năng có thể được mô tả ngắn gọn như sau:
- WRITE SCRATCHPAD (4Eh) 
Lệnh này cho phép ghi 2 byte dữ liệu vào bộ nhớ nháp của DS1820. Byte đầu tiên được ghi vào thanh ghi TH (byte 2 của bộ nhớ nháp) còn byte thứ hai được ghi vào thanh ghi TL (byte 3 của bộ nhớ nháp). Dữ liệu truyền theo trình tự đầu tiên là bit có ý nghĩa nhất và kế tiếp là những bit có ý nghĩa giảm dần. Cả hai byte này phải được ghi trước khi thiết bị chủ xuất ra một xung reset hoặc khi có dữ liệu khác xuất hiện.
- READ SCRATCHPAD (BEh)
Lệnh này cho phép thiết bị chủ đọc nội dung bộ nhớ nháp. Quá trình đọc bắt đầu từ bit có ý nghĩa nhấy của byte 0 và tiếp tục cho đến byte rhứ 9 (byte 8 – CRC). Thiết bị chủ có thể xuất ra một xung reset để làm dừng quá trình đọc bất kỳ lúc nào nếu như chỉ có một phần của dữ liệu trên bộ nhớ nháp cần được đọc.
- COPYSCRATCHPAD (48h) 
Lệnh này copy nội dung của hai thanh ghi TH và TL (byte 2 và byte 3) vào bộ nhớ EEPROM. Nếu cảm biến được sử dụng trong chế dộ cấp nguồn l bắt đầu việc đo.
- CONVERT T (44h) 
Lệnh này khởi động một quá trình đo và chuyển đổi giá trị nhiệt độ thành số (nhị phân). Sau khi chuyển đổi giá trị kết quả đo nhiệt độ được lưu trữ trên thanh ghi nhiệt độ 2 byte trong bộ nhớ nháp Thời gian chuyển đổi không quá 200 ms, trong thời gian đang chuyển đổi nếu thực hiện lệnh đọc thì các giá trị đọc ra đều bằng 0.
- READ POWER SUPPLY (B4h) 
Một lệnh đọc tiếp sau lệnh này sẽ cho biết DS1820 đang sử dụng chế độ cấp nguồn như thế nào, giá trị đọc được bằng 0 nếu cấp nguồn bằng chính đường dẫn dữ liệu và bằng 1 nếu cấp nguồn qua một đường dẫn riêng.
III.Ứng dụng đo nhiệt độ  hiển thị led 7.

Code đọc DS18b20
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;
delay_18B20(8);
DQ = 0;
delay_18B20(80);
DQ = 1;
delay_18B20(14);
x=DQ;
delay_18B20(20);
}
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i–)
{
DQ = 0;
dat>>=1;
DQ = 1;
if(DQ)
dat|=0×80;
delay_18B20(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i–)
{
DQ = 0;
DQ = dat&0×01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
void ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0×44);
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(100);
a=ReadOneChar();
b=ReadOneChar();
nhiet_thuc=b<<4;
nhiet_thuc+=(a&0xf0)>>4;
Tải file chương trình + mô phỏng 

Đồ án đo và khống chế nhiệt độ với PIC16F877

Được đăng bởi NetVN Thứ Năm, 10 tháng 5, 2012 1 nhận xét

Chức năng của đề tài :
+Đo và hiển thị nhiệt độ môi trường trong khoảng – 40 oC đến 100 oC
+Báo động khi nhiệt độ môi trường ở trong một khoảng nào đó mà ta chọn
Download tài liệu :
http://www.mediafire.com/?qxy4bc7j3hu495u

Đo được nhiệt độ từ LM35 hiển thị lên LCD

Được đăng bởi NetVN Thứ Bảy, 28 tháng 4, 2012 0 nhận xét


ADC với LM35
1.Yêu cầu:
Đo được nhiệt độ từ LM35 hiển thị lên LCD.
2.Lý thuyết:
Đối với ATMEGA 16L: 8 chân của PORTA sử dụng làm 8 kênh đầu vào ADC. Để sử dụng tính năng ADC của Atmega 16L chúng ta cần phải thiết kế phần cứng của Vi điều khiển như sau :
* Chân AVCC chân này bình thường khi thiết kế mạch chúng ta đưa lên Vcc(5V) nhưng khi trong mạch có sử dụng các kênh ADC của phần cứng thì chúng ta phải nối chân này lên Vcc qua 1 cuộn cảm nhằm mục đích cấp nguồn ổn định cho các kênh (đầu vào) của bộ biến đổi.
* Chân AREF chân này cần cấp 1 giá trị điện áp ổn định được sử dụng làm điện áp tham chiếu, chính vì vậy điện áp cấp vào chân này cần ổn định vì khi nó thay đổi làm giá trị ADC ở các kênh thu được bị trôi (thay đổi ) không ổn định với 1 giá trị đầu vào chúng ta có công thức tính như sau:
ADCx=(V_INT*1024)/ AREF
chỉ dựa vào công thức chúng ta củng có thể thấy giá trị ADCx tỉ lệ thuận với điện áp vào V_INT. Giá trị ADC thu được từ các kênh được lưu vào 2 thanh ghi ADCH và ADCL khi sử dụng chúng ta phải đọc giá trị từ các thanh ghi này, khi sử dụng ở ché độ 8 bít thì chỉ lưu vào thanh ghi ADCL.
3.Mô tả:
Đầu ra của LM35 và chân 2 biến trở 1K trên Kit được nối vơi 2 jump chờ. Với AMEGA16L có 8 kênh ADC là chức năng thứ 2 của PORTA. Do đó để ADC ta dung dây nối 2 chân đó với 2 bit của PORTA là bit 0 và bit 1..
  
Theo datasheet LM35 thì cứ 10mV tương ứng với 10C, ở 00C điện áp ra là 0V, tương ứng với giá trị ADC là 0. Với Vref=5V, giá trị của ADC từ 0 đến 256, lấy tròn 250 mức. Mỗi giá trị ADC ứng với 5V/250= 20 mV. Vậy 1 giá trị ADC ứng với 20C. Muốn tăng độ phân giải ADC ta giảm Vref.
4.Thực hành: Các bước khởi tạo code như sau:
Trong tab ADC check vào ADC enable:
       Cấu hình ADC.                                              Khởi tạo LCD.

Ta check vào Use 8 bít, để ADC trả về giá trị 8 bít, và ta ADC dùng ngắt check vào Interrupt, về điện áp tham khảo AREF thì lấy điện áp của chân AREF của AVR được nối với 5V. Tần số ADC tùy các bạn thích nhanh hoặc chậm chọn giá trị phù hợp. Trong box Automatically Scan Inputs các bạn check vào Enabled. Vì chúng ta cần ADC 2 kênh, 1 kênh dùng biến trở để test ADC, một kênh từ LM35 đấu với 2 bit 0 và 1 của PORTA do đó chọn First 0, Last 1.
Khởi tạo cho LCD vào PORTB như hình bên cạnh.
Chọn Generate, Save and Exit. Đê hiển thị được một số bất kỳ lên LCD, trong thư viện hàm không có và ta phải tự viết hàm . Đầu vào là một biến unsigned char, ta phải tách lấy hàng trăm, hàng chục, hàng đơn vị và đưa lần lượt lên LCD.
void lcd_putnum(unsigned char so,unsigned char x,unsigned char y)
{
unsigned char a,b,c;
a=so/100;
// lay fan tram
b=(so-100*a)/10;
// lay fan chuc
c=(so-100*a-10*b);
// lay hang don vi
lcd_gotoxy(x,y);
// ve vi tri x,y
lcd_putchar(a+48);
// day ra hang tram, ma ascii
lcd_putchar(b+48);
// day ra hang chuc, ma ascii
lcd_putchar(c+48);
// day ra hang don vi, ma ascii
}
Trong vòng while(1) trong hàm main ta viết như sau:
while (1)
{
// Place your code here
lcd_putnum(2*adc_data[1],0,0);
// dua gia tri ADC tu LM35*2= nhiet do
lcd_putnum(adc_data[0],0,1);
// dua gia tri ADC tu bien tro
delay_ms(3000);
// tre 3 s, cap nhat du lieu mot lan
};Đo nhiệt độ bằng LM35 qua ADC thường có sai số và độ trôi, do đó ta cần hiệu chỉnh nhiệt độ bằng cách so sánh với nhiệt kế.

code mẫu cho 8051 - Đo nhiệt độ, hiển thị LCD, truyền dữ liệu qua RS232

Được đăng bởi NetVN Thứ Bảy, 25 tháng 2, 2012 3 nhận xét
Chương trình thực hiện kết hợp đo nhiệt độ, hiển thị lên LCD, và truyền dữ liệu lên máy tính qua giao tiếp RS232.

Mô phỏng trên ISIS - Proteus:

mô phỏng trên ISIS - Proteus

Mã nguồn C:


#include<at89x51.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
//=========================   #DEFINE LCD
#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 ADC
#define INTR P3_2
#define RD P3_3
#define WR P3_4
//============================================================== DELAY
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++){}
}
//============================================================== LCD
//============================== GUI LENH CHO LCD
void LCD_CODE(unsigned char c)
{
    RS=0;//code
    RW=0;//ghi
    LCD_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
}
//=============================== KHOI TAO LCD
void LCD_INIT()
{
    delay_15ms();    
    LCD_CODE(0x38); //che do 8bit,2 hang,kieu ky tu 5x8 diem anh.
    LCD_CODE(0x0C);   //hien thi man hinh,có con tro, con tro nhâp' nháy.
    LCD_CODE(0x01); // Xoa man hinh LCD
}
//============================== IN KY TU
void LCD_DATA(unsigned char c)
{
   RS=1;//data
   RW=0;//ghi
   LCD_PORT=c;
   EN=1;
   EN=0;
   delay_5ms();
}
//=============================== IN CHUOI KY TU
void LCD_STRING(unsigned char *s)
{
    while(*s) //den NULL thi thoi
    {
        LCD_DATA(*s);
        s++;
    }
}    
//============================================================== KHOI TAO RS232
void SetupSerial()
{
   TMOD=0x20;     /* timer 1 che do 2: 8-Bit tu dong nap lai.          */
   TH1=0xFD;     /* toc do 9600 baud                */
   TL1=0xFD;
   SCON=0x52;      /* Che do 1: 8-bit UART, cho phep truyen   */
   TR1=1;          /* timer 1 run                           */
   TI=0;           /* co ngat nha^n.=0*/
   RI=0;           /* co ngat' truye^n =0*/
   ES=1;          /* cho phep ngat noi tiep */
}
//============================================================== HIEN THI GIA TRI ADC LEN LCD
void HIENTHI_ADC(unsigned char t)
{
     unsigned char v;
     if(t<10)
          LCD_DATA(t+48);
     else
    if(t<100)
     {
          LCD_DATA(t/10+48);
         LCD_DATA(t%10+48);
     }
     else
     {
         v=t/10;
        LCD_DATA(v/10+48);
        LCD_DATA(v%10+48);
        LCD_DATA(t%10+48);
     }
}
//============================================================== HAM GUI SO LIEU LEN VB
void send(unsigned char a)
{
    if(a<10)
     {
         SBUF=a+48;
        while(TI==0){}
         TI=0;        
     }
     if(a>9&&a<100)
     {
          unsigned char c=a/10;
          unsigned char d=a%10;
         SBUF=c+48;
        while(TI==0){}
         TI=0;
         SBUF=d+48;
        while(TI==0){}
         TI=0;      
     }
     if(a>99)
     {
          unsigned char t=a/100;
          unsigned char c=a/10-10*t;
          unsigned char d=a%10;
         SBUF=t+48;
        while(TI==0){}
         TI=0;
         SBUF=c+48;
        while(TI==0){}
         TI=0;
         SBUF=d+48;
        while(TI==0){}
         TI=0;      
     }
}
//============================================================== NGAT NOI TIEP
void RS232(void) interrupt 4  
{
    unsigned char *c,count=0;
    while(RI==0){}
    RI=0;
    *c=SBUF;
    if(count==1&&*c=='1') *c='3';
    if(count==1&&*c=='2') *c='4';
    switch(*c)
    {
       case '0':   //xoa man hinh LCD
      {
            LCD_CODE(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_CODE(0x10);
      }
      break;

      case '1':   //truyen len may tinh: gia tri do duoc.
      {
            send(P2);
      }
      break;

      case '2':   //truyen len may tinh: gia tri do duoc.
      {
            send(P2);
      }
      break;

      case '9':   //thoat khoi ham ngat, cho ADC làm viec.
      {
            TI=0;   //cho phep thoat khoi ham ngat.
            count=0;   //ket thuc viec truyen ky tu len LCD
      }
      break;

      default : //truyen ky tu xuong LCD ^^.
      {
            if(TI==0)
               LCD_CODE(0x01);
            LCD_DATA(*c);
            TI=1;    //de cho chuong trinh ko thoat khoi ham ngat,phuc vu viec truyen ky tu len LCD.
            count=1;   //danh dau bat dau viec truyen ky tu len LCD
      }    
    }
}
//============================================================== MAIN
void main()
{
   SetupSerial();     //Khoi tao cac thong so cho truyen thong noi tiep
   LCD_INIT();
    //LCD_CODE(0x80);//hien thi 2 hang : dia chi hien thi + 80
   EA = 1;           //Cho phep ngat nhung chi? có ngat noi tiep duoc dung trong code nay
   while(1)
   {
      //if(P0_3==1)
      {
         P0_0=P0_1=P0_2=0;
         WR=0;            //Bat dau chuyen doi gia tri tu ADC
         delay_ms(10);      //Tao tre de cap nhat du lieu tu ADC
         WR=1;            //Ket thuc chuyen doi
            RD=0;            //Chot du lieu da duoc chuyen doi: P2
         LCD_CODE(0x01);
         LCD_putstr("Nhiet do:");
         HIENTHI_ADC(P2);
         LCD_STRING(" oC");
         delay_ms(300);
      }
   }
}

code mẫu cho 8051 - Đo nhiệt độ, hiển thị lên LCD 16x2

Được đăng bởi NetVN 1 nhận xét
Chương trình thực hiện đo nhiện độ và hiển thị kết quả lên LCD 16x2, các bước khởi tạo LCD, khởi tạo bộ ADC trong 8051.

Mã nguồn C:


#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_2
#define RD P3_3
#define WR P3_4


//===========================
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;//code
 RW=0;//ghi
 LCD_PORT=c;
 EN=1;
 EN=0;
 delay_5ms();
}
//==============================
void LCDWriteData(unsigned char c) //CT con doc du lieu tu LCD
{
 RS=1;//data
 RW=0;//ghi
 LCD_PORT=c;
 EN=1;
 EN=0;
 delay_5ms();
}
//===============================
void LCD_init()  // Khoi tao LCD
{
 delay_15ms();    
 LCDWriteCmd(0x38); //che do 8bit,2 hang,kieu ky tu 5x8 diem anh.
 LCDWriteCmd(0x0C);   //hien thi man hinh.
 LCDWriteCmd(0x06);   //tu dong tang bo dem dia chi
 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();
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;             //ket thuc chuyen doi.
//   while(!INTR);
    RD=0;             // Nhan du lieu da duoc chuyen doi
     gt=P2;          //cap nhat ADC.
     LCDWriteCmd(0x01);
     LCDWriteCmd(0x83);
     LCD_putstr("8051 & ADC");
     LCDWriteCmd(0xC0);
     LCD_putstr("Nhiet do:");
      HienThi_ADC(gt);
     delay_ms(150);
}
}

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

Được đăng bởi NetVN Thứ Sáu, 24 tháng 2, 2012 0 nhận xét
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


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

Lưu trữ bài viết

Người theo dõi

Thống kê truy cập