tháng 1 2015

10 4.104 8051 9 Acquy adc pic All datasheet ALTIUM Altium Designer AM-FM Arduino ARM ARM là gì Ấn Tượng Bản tin công nghệ Bản tin Thiết Bị Số Barobo bất động sản biến Binary Bit board lpc2378 Bộ chuyển đổi ADC Bộ Đếm Bộ điều khiển cửa cuốn Bộ Định Thời Buy Khóa Số Điện Tử Buy Mạch đếm sản phẩm Buy Mạch giao thông Buy Mạch nạp Buy Matrix Byte C cho AVR các hàm vào ra các loại lõi arm các mạch DAC cơ bản các ngắt trong pic Cách đọc điện trở Cách Đọc Giá Trị Điện Trở Cách đọc giá trị tụ điện Cách hàn linh kiện dán cách làm mạch khóa số cách tạo linh kiện dán cad/cam Cài Đặt cài đặt proteus 8 cảm biến Cấu Kiện Logic Khả Trình cấu tạo cấu trúc arm cấu trúc lệnh CCS Chân chân Transistor Chip Khả Trình chuyển đổi Chuyển đổi số tương tự Chuyển Đổi Tương Tự/Số - ADC Chuyển động số chương trình City Clip Điện Tử Code 8051 - ASM Code 8051 - C Code 8051-C code ASM code ASM mẫu 8086 Code AVR - C code C Code Lập Trình Code led sao băng code maupic code mẫu 8051 Code Mẫu 8086 Code Mẫu cho ARM - LPC1343 code mẫu pic Code PIC - C codemaupic Counter Cổng Vào Ra Cơ Bản Cuộn Cảm Cửa cuốn DA DAC Debug Decimal Delay8051 Dev-C++ Diode DIY Dò đường Do It Yourself doanh nghiệp Download DTMF Mobile đảo chiều động cơ Điện Trở Điện Tử Điện Tử Cơ Bản điều chế độ rộng xung điều chế xung PWM điều khiển bằng điện thoại Điều khiển cửa cuốn Điều khiển cửa cuốn bằng điện thoại điều khiển động cơ đo điện áp đo nhiệt độ đo nhiệt độ hiển thị lên lcd trên 8051 Đo Nhiệt Độ LM35 + LCD Đo Nhiệt Độ LM35 + Led 7 thanh đọc màu điện trở đồ chơi động cơ chân không Động cơ nhiên liệu Động cơ robo đồng hồ thời gian thực Ebook Đại Học ebook điện tử Ebook đồ án Ebook Tin Học Encoder Encoder là gì Full Giải Thuật Giải thuật PID Giáo Dục giao tiếp i2c pic 16f877a giao tiếp i2c pic16f877a với ic ds1307 giao tiếp máy tính qua rs232 Giao Tiếp Máy Tính VB6 giao tiếp rs232 giao tiếp spi giữa 2 pic giao tiếp spi trong pic Giáo Trình Điện Tử Giới thiệu 8051 Giới thiệu cơ bản GPIO Graphic Design hàm Hàn linh kiện dán Hexadecimal Hệ Hexa Hệ Nhị Phân Hệ Thập Lục Phân Hệ Thập Phân hiển thị lên lcd 16x2 Hoạt Động Học Học 8051 qua các ví dụ đơn giản Học ALtium Designer học AVR Học Corel Draw X3 Học Eagle HỌC LẬP TRÌNH 16F877A Học Lập Trình 8051 Học Lập Trình C Học Orcad Học Protues hoc-lam-robot-do-duong-qua-video Hồng ngoại hướng dẫn hướng dẫn Altium Designer hướng dẫn đo đồng hồ VOM hướng dẫn keil - C lập trình 8051 hướng dẫn làm led sao băng hướng dẫn làm led trái tim hướng dẫn lập trình ARM Hướng Dẫn Lập Trình ARM - LPC1343 hướng dẫn lập trình ARM-LPC2378 hướng dẫn lập trình CCS hướng dẫn lập trình PIC Hướng Dẫn Led Trái Tim hướng dẫn module sim548c hướng dẫn sử dụng keil hướng dẫn sử dụng proteus 8 Hyper Terminal hercules 3.2.4 I/O IC 555 IC 7447 IC 74HC151 IC 74HC154 IC 74HC245 IC 74HC595 IC 74LS138 IC DS1307 IC đồng hồ thời gian thực IC LM324 IC LM342 IC LM7805 IC số IC số opamp LM324 IC Thông Dụng IC555 Interrupt Keil 4 Full keil arm Keil C Keil uVision3 kế toán kiểm toán khái niệm Khái Niệm Cơ Bản Kho Vật Liệu khóa điện tử khóa số dùng 8051 khóa số dùng 89s52 Khóa Số Điện Tử khuếch đại kiểm tra Kinh doanh maketing kinh tế quản lí Kỹ Thuật Kỹ Thuật Vi Xử Lý làm mạch điện lý thú Làm quen AVR Lap Trinh Dieu Khien Robot Lập Trình lập trình 8051 Lập Trình AVR Lập Trình C lập trình c++ Lập Trình Led Quảng Cáo Lập Trình Nhúng Lập trình pic Lập trình Robot Lập Trình Vi Điều Khiển Lập Trình Với AVR Studio LCD 16x2 Lcd16x2 Led Clock Led Quay led sao băng led trai tim Led Trái Tim Lịch sử ra đời Linh Kiện Cơ Bản linh kiện điện tử Loa LPC 2378 LSB lý thú Mã AVR - C Mạch 7seg Mạch Amply.Mạch Loa Mạch Autorobo Mạch bảo vệ Mạch Cảm Biến mạch cảm ứng sờ tay Mạch Cầu H Mạch cube Mạch Đếm Sản Phẩm Mạch điện cơ bản Mạch điện hay Mạch Điện Ứng Dụng Mạch Điều khiển động cơ Mạch Động Cơ Mạch đồng hồ Mạch đồng hồ 4 led Mạch giao thông Mạch IC số Mạch in mạch khóa số mạch khuếch đại thuật toán mạch led chúc mừng năm mới mạch led đẹp Mạch Led đơn Mạch Led Quảng Cáo mach led trai tim mạch led trái tim Mạch Led Vumeter mạch lý thú Mạch Ma trận Phím Mạch Matrix Mạch nạp Mạch nguồn Mạch Nút Bấm mạch sóng rf mạch tăng áp Mạch thu phát Mạch tổ hợp MSI Mạch trái tim Mạch Vi điều khiển Microbicho module module GSM/GPS Module Sim548 Module Sim548 giao tiếp với vi điều khiển PIC Module Sim548C Mosfet Motor Mô Phỏng Phần Cứng Mô Tả Phần Cứng MSB mua led sao băng News Ngắt Ngắt Trong LPC23xx ngân hàng Ngôn Ngữ Ngôn Ngữ C Ngôn Ngữ Tự Học Lập Trình C Ngôn Ngữ VHDL Nguyên Lý nguyên lý ic 555 Nguyên Tắc nháy led Nhập môn C Nhỏ Gọn Nibble opamp People Phần Mềm phần mềm altium Designer Phần mềm điện tử Phần Mềm Điện Tử Phần Mềm Điện Tử Hay Phần Mềm Hay Phần Mềm Led Quảng Cáo phần mềm proteus 8 Phần mềm vi tính Phần Mền Phương pháp hàn linh kiện dán PIC pic16f877a Print Design Proteus Proteus 7.8 SP2 FULL PWM quà tặng bạn gái quà tặng độc đáo quản trị doanh nghiệp quản trị kinh doanh quét led 7 đoạn Relay robocon Robot ROBOT DÒ ĐƯỜNG rút gọn mạch logic tổ hợp Sach Dien Tu Sản Phẩm Thú Vị Sản Phẩm Thương Mại Sáng tạo Short Smart Home SMD sơ đồ nguyên lý spi Sports Sử Dụng Sử Dụng Đồng Hồ sử dụng đồng hồ VOM sử dụng ngắt trong pic sự khác nhau Sức mạnh số Tải tài chính tài chính doanh nghiệp tài chính ngân hàng Tài Khoản Chia Sẻ Tài Liệu Tài Liệu 8051 tài liệu avr Tài liệu Điện Tử Tài Liệu Pic Tài liệu robocon tài liệu về ngân hàng Tài Liệu Vi Điều Khiển tailieuvn Tạo cổng Com ảo Tạo cổng nối tiếp ảo tạo dự án trong keil arm Tạo Project trong Vi Xử Lý ARM tạo thư viện altium designer tạo xung vuông Tạp chí Tạp Chí Hay tăng áp Tập lệnh AT Team Support TEAMPLATE PROTEUS Test thị trường tài chính Thiết Bị Thú Vị Thiết kế robot Thiết lập Fuse Bits Thiết Lập Pin Thuật Toán Thuật Toán Điều Khiển PID Thuật Toán Quine MCCluskey Thư viện Protues Thực Hành Thyristor Timer Timer/Counter Tin Học Chia Sẻ Tổ Chức Bộ Nhớ tổng quan về proteus 8 Transistor Tranzito Tranzitor Trao đổi học tập Travel Trình Biên Dịch Trình Dịch Trong Suốt Truyền Thông Nối Tiếp Không Đồng Bộ- UART truyền thông nối tiếp RS232 Tụ điện TUT - 8051 - ASM TUT - 8051 - KeilC tự hành Tự Học C Tự Học Lập Trình C Tý hon UART Update USB Ứng Dụng Led Quảng Cáo ứng dụng mạch khuếch đại thuật toán vẽ mạch in vẽ mạch nguyên lý VHDL Vi Điều Khiển Vi điều khiển - Ứng dụng vi điều khiển PIC Vi mạch số Vi Xử Lý Vi Xử Lý 8051 Vi Xử Lý 8086 Vi Xử Lý ARM Vi Xử Lý PIC Video Video Mach Điện Virtual Serial Port Driver VOM vxl Web Design xác định góc quay động cơ xử lý chuỗi

Bộ chuyển đổi từ tương tự sang số là một khối mạch điện tử quan trọng, có mặt trong rất nhiều thiết kế điện tử. Các bộ ADC thực tế được đóng gói trong những IC chuyên dụng, do nhiều hãng sản xuất. Điểm quan trong cần lưu ý ở các bộ ADC này là độ phân giải và tốc độ lấy mẫu tìn hiệu. Độ phân giải của bộ ADC có thể là 8‐bít, 10‐bít, 12‐bít, 16‐bít, 24‐bít… Tốc độ lấy mẫu của ADC có thể nhanh hay chậm, tùy từng ứng dụng mà ta chọn tốc độ thích hợp.
Vi điều khiển PIC là một trong những dòng Vi điều khiển có phần giao tiếp ngoại vi mạnh và đa dạng. Bên trong PIC đã được tích hợp sẵn một bộ ADC có độ phân giải tối đa là 10‐bít (tùy chon là 8‐bit hay 10‐bit). Với bộ ADC trong PIC ta có thể làm được khá nhiều công việc, dưới đây tôi trình bày một ứng dụng của bộ ADC trong việc thiết kế mạch đo nhiệt độ sử dụng sensor nhiệt LM335.

Dưới đây là phần code mạch đo nhiệt dộ, hiển thị trên LCD.


//=================================================  =======
// Ten chuong trinh  : Mach do nhiet do
// Mo ta phan cung  : Dung PIC16F877A ‐ thach anh 20MHz
//   : LCD giao tiep voi PORTD
//   : Dau ra LM335 dua vao chan AN0
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
// Chu thich : hoac cac chu thich khac
//   : dung che do Power On Reset
//   : chuong trinh viet cho PIC Tutorial
//=================================================  =======
#include "16F877A.h"
#include "def_877a.h"
#device *=16 adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,
NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9)
#include <lcd_lib_4bit.c>  // Thu vien ham cho LCD
int8 low,high,key,mode,min,max,mode1,i;
int1 do_F;
void convert_bcd(int8 x);
void bao_dong();
void test();
//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
void main()
{

 float value;
  on_off =1;
  min    =15;   //nhiet do min default
  max    =35;   //nhiet do max default
  do_F   =0 ;
  i = 50 ;
  mode   =0 ;
  mode1 = 0 ;
   trisa = 0xFF;
   trisb = 0x01;
   trisd = 0x00;
      LCD_init();
      Printf(LCD_putchar,ʺLop DT8 ‐ BKHNʺ);
      LCD_putcmd(0xC0);
      Printf(LCD_putchar,ʺKhoi tao...ʺ);
// Khoi tao cho ngat ngoai
      enable_interrupts (INT_EXT);
      ext_int_edge(H_TO_L);
      enable_interrupts (GLOBAL);
// Khoi tao che do cho bo ADC
      setup_adc_ports(AN0);
      setup_adc(ADC_CLOCK_INTERNAL);
      delay_us(10);
// Lay mau nhiet do lan dau tien
      value=(float)read_adc();
      value = (value ‐ 558.5)/2.048;        // For 5V supply
      //    value = (value ‐ 754.8)/2.048;  // For 3.7V Supply
      //    value = (value ‐ 698.2)/2.048;  // For 4V supply
      convert_bcd((int8)value);  // Tach so tram, chuc, donvi de hien thi len LED 7
      delay_ms(1000);
      LCD_putcmd(0xC0);
      Printf(LCD_putchar,ʺKhoi tao xongʺ);
      while(1)
      {
       if (i==50)
          {
            value = read_adc();

 value=(value‐558.5)/2.048;
            if (do_F==1) value=1.8*value+32;
            convert_bcd((int8)value);
            printf(ʺ\n\rNhiet do phong: %uʺ,value);// Gui gia tri len may tinh
            LCD_putcmd(0xC0);
            printf(LCD_putchar,ʺ  Temp = ʺ);
            LCD_putchar(high); LCD_putchar(low);
            if (do_F==0) printf(LCD_putchar,ʺ Cʺ);
            else printf(LCD_putchar,ʺ Fʺ);
            i=0;
          }
       i++;
       if(((int8)value > 40) || ((int8)value < 15)) on_off=1;
       else
        {
         on_off = 0;
         LCD_Putcmd(0xCF);
         LCD_putchar(ʺ ʺ);
         blink=0;
        }
       if (on_off==1)
       {
       if (blink==0) {
LCD_Putcmd(0xCF);LCD_putchar(ʺ!ʺ);blink=1;delay_ms(250);}
       else          {LCD_Putcmd(0xCF);LCD_putchar(ʺ ʺ);blink=0;delay_ms(250);}
       }
     }
   }//end main‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
#INT_EXT
void test()
{
   if (do_F == 1) do_F=0;
   else          do_F=1;
}
void convert_bcd(int8 x)
  {
   low=x%10;  //chia lay phan du, so hang don vi

 high=x/10;   //tach hang tram va hang chuc
   low = low + 0x30;
   high = high + 0x30;
  }
void bao_dong(){
int8 i;
if (blink == 0) blink = 1;
else            blink=0;
     for(i=0;i<50;i++)
     {
      LCD_Putcmd(0xCF);
      if (blink==0) LCD_putchar(ʺ!ʺ);
      else         LCD_putchar(ʺ ʺ);
     }
}

Dưới đây là một sơ đồ dùng PIC và LM335 để đo nhiệt độ, hiển thị trên LCD. Trong chương trình bạn thấy có hàm chuyển đổi nhiệt độ từ ía trị độ K về độ C. Nguyên nhân có hàm đó là do con LM335 thay đổi 10mV/K, ta cần hiển thị là độ C. Nhận thấy 0oC = 273K, như vậy tại 0oC con LM335 sẽ xuất ra một điện áp là 2.73V và với điện áp này, ADC trong PIC sẽ cho giá trị số là:  (2.73*1023)/5 = 558 . 5585 . Như vậy khi tính toán giá trị nhiệt độ ta cần trừ đi giá trị 558.558 này. Công thức đầy đủ là:
 Do_C= [(adc_value)- 558.558] / 2.048
Giá trị 2.048 có là do ta dùng ADC 10‐bit, điện áp lấy mẫu là 5V, như vậy mỗi mức lượng tử sẽ tương ứng với  5V/1024 = 4.883mV.
LM335 thay dổi 10mV/K do đó ứng với sụ thay đổi 1 độ C sẽ thay đổi 2.048 mức lượng tử (10mV/4.883mV = 2.048). Công thức trên là cho ADC 10‐bit, với các bộ ADC 8‐bit hay 12‐bit việc tính toán chuyển đổi giá trị cũng tương tự.
 Mạch đo nhiệt độ LM335 hiển thị trên LCD 16x2


Việc giao tiếp giữa Vi điều khiển và máy tính là bài lập trình khá quan trọng khi ta làm việc với các dòng Vi điều khiển khác nhau. Với Vi điều khiển PIC cũng vậy, trong mỗi IC PIC đều có tích hợp một khối giao tiếp máy tính USART. Ta sử dụng khối giao tiếp này để truyền dữ liệu lên máy tính và xử lý dữ liệu đó tùy vào mục đích của người lập trình. Để nhận dữ liệu do Vi điều khiển truyền lên máy tính ta có thể sử dụng các phần mềm giao tiếp COM có sẵn hay viết một chương trình mới, sử dụng các ngôn ngữ lập trình như C++, VB hay Delphi… Trong chương trình ví dụ dưới đây tôi sử dụng công cụ sẵn có của CCS là Serial Port Monitor để truyền và nhận dữ liệu từ PIC.
Sơ đồ mạch điện ORCAD. Mạch sử dụng IC MAX232 để kết nối đến cổng COM của
máy tính. Mạch đơn giản chỉ nhằm mục đích giới thiệu khối giao tiếp máy tính của PIC và
cách lập trình cho nó trong CCS.
Trong chương trình ta có sử dụng hàm xử lý ngắt nối tiếp để xử lý ký tự nhân được từ máy
tính. Khi có ngắt xảy ra, ta gọi hàm getc() sẽ trả về ký tự vừa nhận được. Trên màn hình LCD
sẽ hiển thị ký tự mà ta gõ từ bàn phím máy tính.


Code mẫu cho PIC - Truyền thông nối tiếp RS232
 Mạch giao tiếp máy tính, hiển thị LCD
[success title="MÃ NGUỒN CHƯƠNG TRÌNH" icon="check-circle"]

Mã nguồn chương trình: 

#include <16f877a.h> 
#include <def_877a.h> 
#use delay(clock=20000000) 
#FUSES  NOWDT,  HS,  NOPUT,  NOPROTECT,  NODEBUG,  NOBROWNOUT, 
NOLVP, NOCPD, NOWRT 
// Khai báo sử dụng giao tiếp nối tiếp RS232 
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9) 

#include <lcd_lib_4bit.c> 

int8 count=0; 
char string_in[16]; 

#INT_RDA  // Hàm xử lý ngắt nối tiếp 
Receive_isr() { 
char c; 
int8 i; 
count++; 
c = getc(); 
putc(c); 
if (c==ʹcʹ | c==ʹCʹ) 
   { 
      LCD_putcmd(0x01);    //Clear Screen 
      c=ʹcʹ; 
      count=0; 
   } 
if ((count<=16) && (c!=ʹcʹ))  LCD_putchar(c); 
if (count > 16) 
   { 
      count=0; 
      LCD_putcmd(0xC0); 
   } 
void main() 
{
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
lcd_init(); // Khởi tạo cho LCD
lcd_putcmd(0x01);
lcd_putcmd(line_1);
printf(ʺEnter a String.ʺ);
printf(ʺOr anything you want!ʺ);
while (1) {}
} [/success]
Mô tả chương trình: Trên đây là chương trình giao tiếp với máy tính, ta thấy trong CCS để sử dụng giao tiếp nối tiếp ta chỉ cần khai báo #use rs232(). Các hàm giao tiếp với máy tính mà CCS hỗ trợ là:
‐  putc(char ky_tu) : Gửi một ký tự ASCII lên máy tính
‐  getc() : Hàm trả về một ký tự nhận được từ máy tính
‐  printf(string): hàm gửi một chuỗi ký tự lên máy tính

Trong Vi điều khiển PIC có nhiều nguồn ngắt. Để biết cụ thể ta có thể vào mục View >> Valid Interrupts . Khi đó một của sổ sẽ hiện ra liệt kê đầy đủ các nguồn ngắt của từng con PIC.

 Các nguồn ngắt trong PIC


Để viết một hàm phục vụ ngắt ta chỉ việc thêm khai báo #INT_tên_ngắt vào 
trước hàm phục vụ cho ngắt đó. Khi đó trình dich sẽ hiểu đó là địa chỉ hàm cho 
ngắt, khi có ngắt tương ứng xảy ra thì nó sẽ nhảy đến vị trí đó . Lấy ví dụ khi ta muốn xử lý ngắt ngoài, hàm sẽ được viết như sau:

#INT_EXT 
Ext_isr() 
// Nhập mã tại đây 
}




Dưới đây là chương trình nháy led theo nhiều kiểu khác nhau, sử dụng 1 phím bấm nối với chân ngắt ngoài RB0 để chọn kiểu nháy. Có 8 kiểu nháy LED khác nhau, Khi đến kiểu nháy thứ 8, nếu ta nhấn thì sẽ trở về chế độ ban đẩu. Ban đầu biến mode = 0 và tất cả các LED đều tắt Mỗi khi nhấn phím bấm, biến mode sẽ tăng lên 1 đơn vị. Giá trị biến mode tương ứng với chương trình nháy được thực hiện. Khi mode = 9 thì sẽ được gán về mode = 0. Các kiểu nháy khác nhau là do ta bật tắt các LED trên cổng D theo các cách khác nhau. Lấy ví dụ khi ta muôn các LED nháy xen kẽ nhau ta chỉ việc gửi ra cổng D giá trị AAh (10101010) và 55h (01010101).
 Nháy LED nhiều chế độ dùng Ngắt

Mã nguồn chương trình: 

#include <16F877A.h> 
#include <def_877a.h> 
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, 
NOLVP, NOCPD, NOWRT 
#use delay(clock=20000000) 

int8 mode,i; 
byte temp; 



#INT_EXT
EXT_ISR() {

mode++;
if (mode==9) mode = 0;
}
// End of INT

void program1();
void program2();
void program3();
void program4();
void program5();
void program6();
void program7();
void program8();

void main() {

   trisd = 0x00;
   trisb = 0xFF;
   portd=0xff;
   enable_interrupts(int_EXT);
   ext_int_edge(H_TO_L);  // Chọn ngắt theo sườn âm
   enable_interrupts(GLOBAL);
   mode = 0;
while (1) {
   switch(mode) {
      case 1: program1(); break;
      case 2: program2(); break;
      case 3: program3(); break;
      case 4: program4(); break;
      case 5: program5(); break;
      case 6: program6(); break;
      case 7: program7(); break;
      case 8: program8(); break;
   }
}
}

void program1() {

 PortD = 0x00;
   delay_ms(250);
   Portd = 0xFF;
   delay_ms(250);
}
void program2() { // LED sáng chạy từ trái qua phải
   temp = 0xFF;
   for (i=0;i<=8;i++) {
      portd = temp;
      delay_ms(250);
      temp >>= 1;
   }
}
void program3() { // LED sáng chạy từ phải qua trái
    temp = 0xFF;
   for (i=0;i<=8;i++) {
      portd = temp;
      delay_ms(250);
      temp <<= 1;
   }
}
void program4() {
   portd = 0xAA;
   delay_ms(500);
   portd = 0x55;
   delay_ms(500);
}
void program5() {
   Portd = 0x7E;   delay_ms(150);
   Portd = 0xBD;   delay_ms(250);
   Portd = 0xDB;   delay_ms(150);
   Portd = 0xE7;   delay_ms(150);
   Portd = 0xDB;   delay_ms(150);
   Portd = 0xBD;   delay_ms(150);
   Portd = 0x7E;   delay_ms(150);
}
void program6() {
  temp = 0xFF;
   for (i=0;i<=8;i++) {
      portd = temp;
      delay_ms(250);

 temp = temp >> 1;
   }
}
void program7() {

   Portd = 0xFE;   delay_ms(150);
   Portd = 0xFD;   delay_ms(150);
   Portd = 0xFB;   delay_ms(150);
   Portd = 0xF7;   delay_ms(150);
   Portd = 0xEF;   delay_ms(150);
   PortD = 0xDF;   delay_ms(150);
   Portd = 0xBF;   delay_ms(150);
   Portd = 0x7F;   delay_ms(150);
}

void program8() {
   Portd = 0x7F;   delay_ms(150);
   Portd = 0xBF;   delay_ms(150);
   PortD = 0xDF;   delay_ms(150);
   Portd = 0xEF;   delay_ms(150);
   Portd = 0xF7;   delay_ms(150);
   Portd = 0xFB;   delay_ms(150);
   Portd = 0xFD;   delay_ms(150);
   Portd = 0xFE;   delay_ms(150);
}
Phạm Văn Ngọc Anh- 01644326695

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ý


[success title="Mã nguồn" icon="check-circle"]
#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);
     }
}*/
//=======================================================================[/success]

Giao tiếp SPI song công giữa 2 PIC: PIC Master ở trên truyền dữ liệu từ PortB (công tắc trên) qua PIC Slave ở dưới để hiển thị ra PortD (LED dưới) , PIC Slave cũng lấy dữ liệu từ PortB (công tắc dưới) của mình, truyền qua PIC Master để hiển thị ra PortD (LED trên).

Chương trình chạy mô phỏng trên ISIS - Proteus:

mô phỏng SPI trên Proteus


Mã nguồn:

Code Master:


#include "16f877a.h"
#include "def_877a.h"
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B)
#use fast_io(D)
#use fast_io(A)
#define REG_Write 0x80

#INT_SSP
void spi()
{
      PORTD=spi_read(PORTB);
      delay_ms(10);
}
void main()
{
   port_b_pullups(TRUE);
   setup_spi(spi_master|spi_l_to_h|spi_clk_div_16);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   SET_TRIS_B(0xff);
   SET_TRIS_D(0x00);
   SET_TRIS_A(0x00);
   while(1)
   {
   delay_ms(100);
      output_low(PIN_A5);//Chân C2 dùng Select chip.
      delay_ms(10);//Tao tre de Slave chuan bi.
      spi_write(PORTB);
      output_high(PIN_A5);
   }
}


Code Slave:



#include "16f877a.h"
#include "def_877a.h"
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B)
#use fast_io(D)

#INT_SSP
void spi()
{
      PORTD=spi_read(PORTB);//Vua nhan vua truyen.
      delay_ms(10);
}

void main()
{
   port_b_pullups(TRUE);
   setup_spi(spi_slave|spi_l_to_h|spi_clk_div_16);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   TRISB=0xff;
   TRISD=0x00;
   while(1)
   {
   }
}

Phạm Văn Ngọc Anh- 01644326695

Chương trình mô phỏng trên ISIS - Proteus:
mô phỏng Nháy LED trên ISIS - Proteus
Mã nguồn C:


#include
unsigned char nhayled[20]={0x05,0x0e,0x1d,0x3e,0x7d,0xfe,0x01,0x82,0xc1,0xe2,0xf1,0xfa,0xfd,0x02,0xfd,0x02,0xfd,0x02,0xfd,0x02}; //cac hieu ung
void delay(unsigned int i)
{
    while(i--)
    {
       unsigned char j=121;
      while(j--){}
    }
}
main()
{
   unsigned char k;
   while(1)
   {
      for(k=0;k<20 k="" span="">
      {
         P0=nhayled[k];
         delay(250);
      } 
   }
}

Chương trình quét LED 7 đoạn để hiển thị các số từ 00 đến 99.

Mã nguồn C:


#include<at89x51.h>
#define c P2_0
#define d P2_1
unsigned char so[10]={0xc0,0x79,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(int ms)
{
    while(ms--)
    {}
}
void hienso(unsigned char x)
{
    unsigned char chuc=x/10;
    unsigned char donvi=x%10;
    c=1;d=1;
    if(x>=10)
    {
         c=0;
         d=1;
         P0=so[chuc];
         delay(50);
          c=1;
         d=0;
         P0=so[donvi];
         delay(50);

    }
    if(x<10)                  
    {
          c=0;
         d=1;
         P0=so[x];
         delay(100);
    }
}
main()
{
   P0=0xff;
   while(1)
   {
      unsigned char i;
      for(i=0;i<100;i++)    
      hienso(i);
   }
}
Phạm Văn Ngọc Anh- 01644326695

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);
}
}
Phạm Văn Ngọc Anh- 01644326695

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
#include
#include
#include
//=========================   #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
   {
      for(j=0;j<500 j="" span="">
   }


}
//==========================
void delay_5ms()
{
     int i,j;
     for(i=0;i<250 i="" span="">
     for(j=0;j<4 j="" span="">
}
//===========================
void delay_15ms()
{
     int i,j;
     for(i=0;i<250 i="" span="">
     for(j=0;j<100 j="" span="">
}
//============================================================== 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 span="">
          LCD_DATA(t+48);
     else
    if(t<100 span="">
     {
          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 span="">
     {
         SBUF=a+48;
        while(TI==0){}
         TI=0;         
     }
     if(a>9&&a<100 span="">
     {
          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);
      }
   }
}

Phạm Văn Ngọc Anh- 01644326695

Author Name

{picture https://lh3.googleusercontent.com/-5Ns_H0UG4cU/Vuu5KrqbEnI/AAAAAAAAEZs/XgsHemy00D4eQ3ivA76v6FFEm7jg9reVwCCo/s512-Ic42/pham-van-ngoc-anh.jpg}

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:

{facebook https://www.facebook.com/phamvanngocanh}
{twitter https://twitter.com/nghiphong1993}
{google https://plus.google.com/+dientuchiase/posts}
{youtube https://www.youtube.com/channel/UCeJKhA_goBNFmDw6RKNtmYQ}

Biểu mẫu liên hệ

Tên

Email *

Thông báo *

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