Thứ Sáu, 18 tháng 9, 2015

Lap trinh vi dieu khien - Đo lường đa điểm với DS18b20 dùng AVR

Lap trinh vi dieu khien - Đo lường đa điểm với DS18b20 dùng AVR
XIN CHÀO CÁC BẠN...!
Sau khi test thử nghiệm thành công, hôm nay lap trinh vi dieu khien xin giới thiệu với các bạn CODE sử dụng DS18b20 trong đo lường đa điểm (Version 1.0.0 ^^) cùng vi điều khiển Atmega 8. Cụ thể là mình sẽ đo nhiệt độ tại nhiều nơi sử dụng nhiều cảm biến DS18b20. Các cảm biến này cùng được kết nối trên 1 dây DATA (theo chuẩn 1 Wire):
- Trong code của mình các bạn có thể cấu hình lại số lượng DS18b20 tối đa ở trên Bus (mình đang cho là 8 con). Ở mạch thực tế, mình chỉ mới sử dụng 5 cảm biến DS18b20, giá trị nhiệt độ tại 5 điểm sẽ liên tục được cập nhật và hiển thị lên LCD1602.​
- Mình dùng trình biên dịch CodeVisionAVR, các bạn vào CodeWizardAVR --> 1 Wire, sau đó chọn chân DATA và tích vào EnableMultiple Devices để lấy thư viện sử dụng nhiều DS18b20 trên 1 Bus.​
Code Test V1.0.0 (lap trinh c):
HTML:
#include <main.h>
#include <var.h>
 
void main(void)
{
  unsigned char i,j;
  float Temp;
  char Lcd_Buffer[33];
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
 
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0xff;
DDRC=0x00;
 
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xff;
DDRD=0x00;
 
// KHOI TAO CHUAN 1 WIRE
// 1 Wire Data port: PORTC
// 1 Wire Data bit: 5
// Note: 1 Wire port settings must be specified in the
// Project|Configure|C Compiler|Libraries|1 Wire IDE menu.
w1_init();
 
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("  MINHHAGROUP");
lcd_gotoxy(0,1);
lcd_puts("1 WIRE BUS DEMO");
delay_ms(2000);
lcd_clear();
 
// Xac dinh so IC DS18b20 co tren Bus
ds18b20_devices = w1_search(0xf0,ds18b20_rom_codes);
sprintf(Lcd_Buffer,"SO THIET BI\nDS18B20: %u",ds18b20_devices);
lcd_puts(Lcd_Buffer);
delay_ms(3000);
/*
//Hien thi ROM CODE cua tung IC tren Bus
if (ds18b20_devices)
{
    for (i=0;i<ds18b20_devices;i++)
    {
          sprintf(Lcd_Buffer," IC DS18b20 #%u\nROM CODE:",i+1);
          lcd_clear();
          lcd_puts(Lcd_Buffer);
          delay_ms(2000);
          lcd_clear();
          for (j=0;j<8;j++)
          {
              sprintf(Lcd_Buffer,"%02X ",ds18b20_rom_codes[i][j]);
              lcd_puts(Lcd_Buffer);
              if(j==3)
              lcd_gotoxy(0,1);
          };
          delay_ms(2000);
    };
}
else
while (1); // Khong co IC tren Bus      */
 
// Cau hinh do phan giai 12 Bit cho cac IC DS18b20 tren Bus
for (i=0;i<ds18b20_devices;)
    if (!ds18b20_init(&ds18b20_rom_codes[i++][0],20,30,DS18B20_12BIT_RES))
    {
          sprintf(Lcd_Buffer,"Init error for\ndevice #%u",i);
          lcd_clear();
          lcd_puts(Lcd_Buffer);
          while (1); // Qua trinh khoi tao co loi
    };
/*
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts("NHIET DO TAI:");
*/
while (1)
{
    j=1;   
// Cap nhat nhiet do tai cac diem va hien thi len LCD1602
    for (i=0;i<ds18b20_devices;i++)
    {
          Temp = ds18b20_temperature(&ds18b20_rom_codes[i][0]);
          sprintf(Lcd_Buffer,"t%u=%2.2f\xdfC",j++,Temp);
          lcd_clear();
          lcd_puts(Lcd_Buffer);
          delay_ms(1500);
    }
}
}
// ------------------END OF FILE--------------------
// -------------------------------------------------
Mình sẽ tối ưu hóa code hơn trong các Version sau...^^
 Chúc các bạn tu hoc lap trinh thành công!!!
Posted on 21:10 | Categories:

Sơ lược về khối NVIC trong STM32

     Lap trinh vi dieu khien-Sơ lược về khối NVIC trong STM32

Xin chào các bạn!
Hiện tại trong diễn đàn đang có bạn hỏi về vấn đề này nên mình tranh thủ làm 1 chủ đề nho nhỏ giới thiệu lap trinh co ban sơ lược về khối NVIC trong STM32 cho mọi người cùng tham khảo.

NVIC là cái chi ???
NVIC (Nested Vector Interrupt Controller)
. Đúng như tên gọi, bộ NVIC được phát triển nhằm hỗ trợ các ngắt xảy ra đồng thời, đang xử lý ngắt này thì có tín hiệu ngắt khác... và trong STM32 có 16 cấp độ ưu tiên ngắt.

Ưu điểm của NVIC ???
- Thời gian xử lý 1 ngắt đơn của NVIC rất nhanh. NVIC chỉ cần mất 12 chu kỳ lệnh - là khoảng thời gian để thực thi câu lệnh đầu tiên trong trình phục vụ ngắt từ khi ngắt được sinh ra và kể từ khi thực thi câu lệnh cuối cùng trong trình phục vụ ngắt đến khi quay lại chương trình chính.
- NVIC có sử dụng 1 số phương pháp xử lý nhiều nguồn ngắt để độ trễ giữa các ngắt là tối thiểu và để đảm bảo các ngắt có mức ưu tiên cao nhất được thực hiện trước.

Cấu hình và Sử Dụng NVIC ???
Để sử dụng NVIC các bạn cần phải qua 3 bước cấu hình như sau:
- Cấu hình bảng Vector ngắt:
HTML:
NVIC_InitStructure.NVIC_IRQChannel =  TIM2_IRQn;
- Thiết lập mức ưu tiên ngắt:
HTML:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
Như đã nói ở trên, STM32 hỗ trợ 16 mức ưu tiên - vậy cần 4 bit để thiết lập được 16 mức ưu tiên này và để dễ dàng hơn trong quản lý STM32 đã hỗ trợ cho chúng ta chia thanh 2 nhóm ưu tiên ngắt Group và SubGroup. Ngắt thuộc nhóm Group sẽ được ưu tiên thực hiện trước SubGroup.
- Hàm NVIC_PriorityGroupConfig() sử dụng để thiết lập nhóm ưu tiên ngắt và ý nghĩa của các tham số như sau:
+ NVIC_PriorityGroup_0 (dành hết 4 bit để thiết lập mức ưu tiên giữa các ngắt trong SubGroup
+ NVIC_PriorityGroup_1 (dành 1 bit để thiết lập mức ưu tiên giữa các ngắt trong Group - 3 bit cho SubGroup)
+ NVIC_PriorityGroup_2 (dành 2 bit để thiết lập mức ưu tiên giữa các ngắt trong Group - 2 bit choSubGroup
+ NVIC_PriorityGroup_3 (dành 3 bit để thiết lập mức ưu tiên giữa các ngắt trong Group - 1 bit cho SubGroup)
+ NVIC_PriorityGroup_4 (dành hết 4 bit để thiết lập mức ưu tiên giữa các ngắt trong Group
- 2 hàm NVIC_IRQChannelPreemptionPriority và NVIC_IRQChannelSubPriority sử dụng để thiết lập mức ưu tiên giữa các ngắt trong các nhóm Group - SubGroup.
- Cuối cùng là bạn cho phép ngắt ngoại vi xảy ra:
Mã:
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
                Chúc các bạn tu hoc lap trinh thành công!!!
Posted on 03:06 | Categories:

Giao tiếp Module RF CC1101 UART với KIT ATmega 8 V2
Chào các bạn, hôm nay mình chia sẻ với các bạn một project lap trinh vi dieu khien giao tiếp module CC1101 UART với KIT ATmega8 V2. Các bạn về nạp code cho 2 mạch được thiết kế giống hệt nhau để test quá trình truyền nhận dữ liệu qua lại. Nhấn phím Key 1 trên KIT để gửi nội dung đi sang bên nhận. Bên nhận có thể gửi lại một nội dung khác tương tự để trả lời khi nhấn phím Key 1.
Ứng dụng của module này các bạn có thể biến nó thành một máy gửi tin nhắn không dây, truyền nhận dữ liệu cho MCU, máy tính....

- Mình xin giới thiệu qua về Module RF CC1101 UART:
 

+ Điện áp hoạt động: 3.3-5V
+ Khoảng cách hoạt động khoảng 200m tùy vào địa hình
+ Kích thước: 27.8x14.4x4MM
+ Tần số: 433Mhz
+ Tốc độ mặc định: 9600
+ Hỗ trợ 128 kênh truyền và 255 địa chỉ
+ Sử dụng tập lệnh AT qua chuẩn truyền thông UART

--> Để xem chi tiết về Module CC1101 UART: http://banlinhkien.vn/goods-3636-module-rf-433mhz-cc1101-uart.html
--> KIT ATmega 8 V2 NEW: http://banlinhkien.vn/goods-2637-kit-atmega8-v2-new-avr-v2-new-.html

- Mạch mô phỏng trên Proteus 7.10:

- Code viết trên CodeVisionAVR (lap trinh c):
Mã:
/* Code by Vu Thai - Giao tiep ATmega8 voi Module RF CC1101 UART */
#include <mega8.h>
#include <delay.h>
#include <alcd.h>
#define SIZE    20      //Kich thuoc bo dem nhan

/*  Khai bao GPIO */
#define SET PORTD.2    //Chan SET cua module
#define BUT PINC.5    //Chan nut nhan PC5

/*  Khai bao bien*/
unsigned char u_data, k, m;
unsigned char buffer[SIZE];  //Bo dem nhan
unsigned char dem;  //Bien luu gia tri dem

void send_byte(unsigned char udata){//Ham gui 1 ky tu ASCII
    while(!(UCSRA & (1<<UDRE)));//Kiem tra co UDRE
    UDR=udata;//Send 1 byte
}
void send(flash unsigned char *u){//Ham gui mot chuoi ky tu
    while(*u){
        send_byte(*u++);
    }
}
void cc1101_init(){ //Ham khoi tao module CC1101
  lcd_clear();
  lcd_puts("MODE FU1");
  SET=0; //Keo chan 5 cua module xuong 0 de dung lenh AT
  send("AT+FU1\r");  //Cai dat che do cua module
  delay_ms(1000);
  lcd_clear();
  lcd_puts("CHANNEL 102");
  send("AT+C102\r"); //Cai dat kenh truyen
  delay_ms(1000);
  lcd_clear();
  lcd_puts("ADDRESS 123");
  send("AT+A123\r");  //Cai dat dia chi truyen nhan
  SET=1; //Keo chan 5 cua module len 1 de gui DATA
  delay_ms(1000);
  lcd_clear();
  lcd_puts("OK! READY...");
}
void clear(void){  //Ham xoa bo dem buffer
    unsigned char z;
    for(z=0;z<SIZE;z++)buffer[z]='\0';
}
void xuly(){  //Ham xu ly du lieu nhan duoc qua UART
    lcd_clear();
    lcd_puts("Nhan Noi Dung:");       
    lcd_gotoxy(0,1);//Dong 2
    lcd_puts(buffer); //Xuat du lieu trong buffer ra LCD
}
interrupt [USART_RXC] void usart_rx_isr(void){ //Ngat UART nhan du lieu
    u_data=UDR;
    if(u_data==10 && m==0){m=1; clear(); k=0;}  //Bat ky tu dau
    else if(u_data==13 && m>0){xuly(); m=0;}  //Bat ky tu cuoi
    else if(m>0){
        buffer[k]=u_data;        //Luu du lieu vao buffer
        if(++k>SIZE){m=0; clear();} //Xoa bo dem khi tran du lieu
    }
}
void main(){    //Chuong trinh chinh
    UCSRB=0x98;//Ngat RX, cho phep RX va TX
    UCSRC=0x86;//8bit uart, 1bit stop, no parity
    UBRRL=47;//baud 9600bps  (Crytal 7.3728 Mhz)
    DDRC.5=0; //PC5 input
    PORTC.5=1;  //Tro keo Vcc PC5
    DDRD.2=1; //PD2 ouput
    SET=1;
    lcd_init(16); //LCD16x2 init
    delay_ms(200);
    lcd_puts("BanLinhKien.Vn"); 
    delay_ms(1000);
    lcd_gotoxy(0,1);//Dong 2
    lcd_puts("TEST CC1101 UART");//Gui chuoi len LCD
    delay_ms(1000);
    cc1101_init();  //Khoi tao module cc1101
    #asm("sei")    //Cho phep ngat cuc bo
    while(1){
        if(!BUT){    //Kiem tra nut nhan   
            lcd_clear(); //Xoa man hinh
            lcd_puts("Gui Noi Dung:");       
            lcd_gotoxy(0,1);//Dong 2
            lcd_puts("BanLinhKien.Vn_");  //Hien thi noi dung gui di
            lcd_putchar(dem+48);
            send("\nBanLinhKien.Vn_"); //Gui di noi dung
            send_byte(dem+48);  //Gui kem so dem
            send("\r");
            if(++dem>9)dem=0; //Tang bien dem len
            while(!BUT);  //Cho nha phim
            delay_ms(200);  //Tao tre cho lan gui tiep theo
        }//end if BUT
    }//end while
}//end main

Lưu ý khi sử dụng KIT ATmega8 V2 là chân RX tức PD0 bị ảnh hưởng bởi con MAX232 trên KIT lên nó không nhận được dữ liệu từ Module RF CC1101 gửi sang, để khắc phục các bạn có thể làm mạch tương tự mạch nguyên lý để test. Do ở trên test được là do mình đã tháo con MAX232 ra khỏi mạch lên không còn bị ảnh hưởng nữa.
Chúc các bạn tu hoc lap trinh thành công!!!
Posted on 00:22 | Categories:

Lap trinh vi dieu khien - Bắt đầu tiếp cận AVR

Lap trinh vi dieu khien - Bắt đầu tiếp cận AVR
Chào các bạn hôm nay lap trinh vi dieu khien bài viết mình muốn hướng tới các bạn đang chuẩn bị tiếp cận với dòng vi điều khiển AVR và các bạn biết mơ hồ về nó. Mình hướng dẫn các bạn tiếp cận nó như thế nào? sử dụng các công cụ như thế nào? phần cứng và phần mềm cần có?
Nội dung bài viết gồm phần:

  1. Giới thiệu chung.
  2. Các phần mềm.
  3. Bài thực hành đầu tiên.
I.Giới thiệu:
Mình không nói chi tiết từng con 1, các bạn muốn sử dụng con nào thì xem datasheet của con đấy chi tiết hơn. Giới thiệu qua chút:

  • AVR là chip vi điều khiển 8 bits với cấu trúc tập lệnh đơn giản hóa-RISC(Reduced Instruction Set Computer)
  • Có thể sử dụng xung clock lên đến 16MHz, hoặc sử dụng xung clock nội lên đến 8 MHz (sai số 3%)
  • Bộ nhớ chương trình Flash có thể lập trình lại rất nhiều lần và dung lượng lớn, có SRAM (Ram tĩnh) lớn, và đặc biệt có bộ nhớ lưu trữ lập trình được EEPROM.
  • Nhiều cổng vào ra (I/O PORT) 2 hướng (bi-directional).
  • 8 bits, 16 bits timer/counter tích hợp PWM.
  • Các bộ chuyển đổi Analog – Digital phân giải 10 bits, nhiều kênh.
  • Chức năng Analog comparator.
  • Giao diện nối tiếp USART (tương thích chuẩn nối tiếp RS-232).
  • Giao diện nối tiếp Two –Wire –Serial (tương thích chuẩn I2C) Master và Slaver.
  • Giao diện nối tiếp Serial Peripheral Interface (SPI)
  • ...
II. Phần mềm.
1. Phần mềm vẽ mạch, mô phỏng.
Phần mềm mô phỏng rất quan trọng nó sẽ giúp bạn mô phỏng chương trình, gỡ các lỗi trong chương trình.
Phần mềm sử dụng: 
Proteus 7.8 hoặc 8.0
Link dowload:http://mcu.banlinhkien.vn/threads/download-proteus-7-8-sp2-phan-mem-mo-phong-mach-dien.306/
có video hướng dẫn cài đặt luôn nhé.
Phần mềm vẽ mạch: để có thể vẽ làm mạch thường sử dụng Altium và Orcad...

http://mcu.banlinhkien.vn/threads/d...10-0-22084-full-crack-va-huong-dan-crack.303/
 
Người ta thường lập trình theo phần cứng nên cần mô phỏng trước để đảm bảo chạy rồi mới vẽ mạch.

2. Phần mềm lập trình (lap trinh c).Ban đầu các bạn nên sử dụng phần mềm Codevision2.05 hoặc 3.2 để lập trình cho chíp AVR các bạn có thể dowload tại đây:http://mcu.banlinhkien.vn/threads/download-codevision-2-05-0-phan-mem-viet-code-cho-avr.308/Có 1 phần mềm dành cho những người quen sử dụng thấy nó hay hơn quản lý project dễ hơn: AVRStudio4.0http://mcu.banlinhkien.vn/threads/download-avr-studio-lap-trinh-atmel-bang-c-va-asemble.123/Cách tạo Project thì trong các đường link có video hướng dẫn các bạn có thể tham khảo.

3.Phần mềm nạp chíp.
mình sử dụng phần mềm Progisp1.72 bản này có ưu điểm không cần driver cắm vào nạp trực tiếp. 

 
Các bạn tham khảo đường link: http://banlinhkien.vn/goods-493-mach-nap-89-avr-usbasp-usbisp.html#.VS4tJnN82IB
Đấy là phần mềm các bạn có thể sử dụng mạch nạp ISP hoặc mạch, STK200, STK500 đường link trên có cách hướng dẫn nạp chip.
Chú ý: Trong chip AVR có 1 đặc điểm là rất dễ bị FUSEBIT nên mọi người chú ý đặt đúng tần số cho thạch anh nội hay ngoại của chip nhé. Bài sau mình hướng dẫn cách FUSEBIT.

III. Bài thực hành đầu tiên lap trinh co ban.
Bạn đã cài các phần mềm ở trên, làm theo đề bài sau:
Viết chương trình nạp cho ATmega8 thực hiện trên KIT AVRV2 điều khiển làm thay đổi hiệu ứng các led đơn trên KIT .
-Hiệu ứng 1 : LED sáng theo thứ tự từ trái qua phải.
-Hiệu ứng 2 : LED sáng theo thứ tự từ phải qua trái.
-Hiệu ứng 3 : LED sáng theo thứ tự từ giữa ra 2 bên.
-Hiệu ứng 4 : LED sáng theo thứ tự từ 2 bên vào giữa.
với ví dụ này thì các bạn tham khảo bài viết rấtchi tiết sau:http://mcu.banlinhkien.vn/threads/huong-dan-kit-avr-v2-new-dieu-khien-led-don.2083/

Các trang WEB thường xuyên của add để tu hoc lap trinh:
1. http://mcu.banlinhkien.vn/forums/avr.13/
2. http://www.hocavr.com/
3. http://avrprojects.info/
...

IV. Ứng Dụng:
- Ứng dụng của AVR bây giờ như thế nào ? (Được dùng chủ yếu ở lĩnh vực nào ?)
- LCD controller, Motor control, USB controller, advanced PWM, CAN etc.
- Application Notes Atmel (http://www.atmel.com/dyn/products/ap...?family_id=607)
- Motor Control (http://www.atmel.com/products/AVR/mc/?family_id=607)
- USB Connectivity (http://www.atmel.com/products/AVR/usb/?family_id=607)
- Automotive Applications (http://www.atmel.com/products/AVR/usb/?family_id=607)
- Remote Access Control (http://www.atmel.com/products/AVR/rac/?family_id=607)

Chúc các bạn tu hoc lap trinh thành công!!!
Posted on 00:12 | Categories:

Thứ Ba, 15 tháng 9, 2015

Lap trinh vi dieu khien - giao tiếp IC ghi dịch 74HC595​

Lap trinh vi dieu khien - giao tiếp IC ghi dịch 74HC595
1. Sơ lược về IC ghi dịch 74HC595:

Là ic ghi dịch 8bit kết hợp chốt dữ liệu , đầu vào nối tiếp đầu ra song song .
Chức năng: Thường dùng trong các mạch quét led 7 , led matrix …để tiết kiệm số chân VDK tối đa (3 chân) . Có thể mở rộng số chân vi điều khiển bao nhiêu tùy thích mà k ic nào có thể làm dc bằng việc mắc nối tiếp đầu vào dữ liệu các ic với nhau .

Cách mở rộng ta chỉ việc nối Q7' của IC trước với chân DATA (chân 14) của IC sau, với IC đầu tiên nhận dữ liệu từ VĐK

2. Sơ đồ chân IC:


Giải thích ý nghĩa hoạt động của một số chân quan trọng cho các bạn lap trinh co ban:
(input)
Chân 14 : đầu vào dữ liệu nối tiếp . Tại 1 thời điểm xung clock chỉ đưa vào được 1 bit
(output)
Q0=>Q7 : trên các chân (15,1,2,3,4,5,6,7)
Xuất dữ liệu khi chân chân 13 tích cực ở mức thấp và có một xung tích cực ở sườn âm tại chân chốt 12
(output-enable)
Chân 13 : Chân cho phép tích cực ở mức thấp (0) .Khi ở mức cao, tất cả các đầu ra của 74595 trở về trạng thái cao trở, không có đầu ra nào được cho phép.
(SQH)
Chân 9: Chân dữ liệu nối tiếp . Nếu dùng nhiều 74595 mắc nối tiếp nhau thì chân này đưa vào đầu vào của con tiếp theo khi đã dịch đủ 8bit.
(Shift clock)
Chân 11: Chân vào xung clock . Khi có 1 xung clock tích cực ở sườn dương(từ 0 lên 1) thì 1bit được dịch vào ic.
(Latch clock)
Chân 12 : xung clock chốt dữ liệu . Khi có 1 xung clock tích cực ở sườn dương thì cho phép xuất dữ liệu trên các chân output . lưu ý có thể xuất dữ liệu bất kỳ lúc nào bạn muốn ,ví dụ đầu vào chân 14 dc 2 bit khi có xung clock ở chân 12 thì dữ liệu sẽ ra ở chân Q0và Q1 (chú ý chiều dịch dữ liệu từ Q0=>Q7)
(Reset)
Chân 10: khi chân này ở mức thấp(mức 0) thì dữ liệu sẽ bị xóa trên chip)
3. CODE giao tiếp lap trinh c
Mã:
#include <REGX51.H>
#define CLK  P2_0 //Chan 11 clock
#define SDI  P2_1 //Chan 14 data
#define STR  P2_2 //Chan 12 chot
unsigned char i;
unsigned char ma[10]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00}; //Mang LED
void delay(unsigned char time){ //Chuong trinh tao tre 50ms
    unsigned char t;
    for(t=0;t<time;t++){
        TH0=0x3c;
        TL0=0xb0;
        TR0=1;
        while(!TF0);
        TF0=TR0=0;
    }
}
void truyen(unsigned char b1, unsigned char b2, unsigned char b3){
/*Chuong trinh truyen du lieu vao 3 IC 74HC595
Cac ban co the mo rong them bao nhieu IC tuy thich
bang cach them code theo mau cua chuong trinh goc
*/
    unsigned char i,Q;
    Q=b3; for(i=0;i<8;i++){SDI=Q&0x80;CLK=0;CLK=1;Q<<=1;} //ic 3
    Q=b2; for(i=0;i<8;i++){SDI=Q&0x80;CLK=0;CLK=1;Q<<=1;} //ic 2
    Q=b1; for(i=0;i<8;i++){SDI=Q&0x80;CLK=0;CLK=1;Q<<=1;} //ic 1
    STR=0; STR=1; //Chot hien thi du lieu
}

void main(){ //Chuong trinh chinh
TMOD=0x01;    //Khoi tao timer 0 che do 16bit
while(1){
    for(i=0;i<10;i++){      //Truyen 3 du lieu khac nhau vao 3 ic
        truyen(0xff,ma[i],ma[9-i]);    //Truyen du lieu vao 3 IC
        delay(5);
        truyen(0x00,ma[i-1],ma[9-i]);
        delay(5);
    }
}
}
4. Mạch mô phỏng trên Proteus:
 

Chúc các bạn tu hoc lap trinh thành công!!!
Posted on 03:03 | Categories:

Lap trinh vi dieu khien - quét LED 7 đoạn bằng ngắt timer 8051​

Lap trinh vi dieu khien - quét LED 7 đoạn bằng ngắt timer 8051
Chào các bạn, hôm nay chúng ta sẽ tìm hiểu về lap trinh vi dieu khien 8051 - quét led 7 thanh dùng ngắt timer dùng lap trinh c, tại sao lại dùng ngắt timer mà không sử dụng vòng lặp chương trình để quét thì mình cũng xin giải thích như sau:
Do mắt người chỉ có thể quan sát được hình ảnh ở trên 24 hình / giây dưới con số trên thì ta sẽ thấy hiện tượng nhấp nháy do vậy nếu ta muốn tính toán một cách chuẩn xác số khung hình mà led 7 hiển thị thì ta bắt buộc phải dùng ngắt timer để đảm bảo led sáng rõ nét và không có hiện tượng nhấp nháy. Công thức tính toán ta sẽ dựa vào tỉ lệ khung hình mà ta mong muốn sẽ suy được ra giá trị nạp vào timer. VD ở đây là quét 4 led 7 thanh:
4 lần ngắt timer là ta sẽ quét được một khung hình ==> 4*25 (4 led nhân 25 khung hình/ giây) sẽ bằng 100 lần ngắt timer, mà chu kỳ CPU của 8051 là 1us ==> chu kỳ ngắt timer là 10ms tương ứng với giá trị đếm là 10000.
Như vậy ở trên là ta sử dụng 25 khung hình trên giây, còn trong bài này ta sử dụng số khung hình lớn hơn là 100 khung hình / giây suy ra giá trị đếm là 2500 là timer phải tràn. Giá trị nạp vào timer để khởi tạo là giá trị tràn trừ đi giá trị cần đếm: TH0 và TL0 = 65536-2500 = 63036 = 0xF63C , TH0 sẽ mang giá trị byte cao là 0xF6 và TL0 sẽ mang giá trị byte thấp là 0x3C.
Dưới đây là sơ đồ nguyên lý của led 7 đoạn:

OK ta bắt đầu vào viết chương trình, ở mạch này sẽ có chức năng như một mạch đếm sản phẩm và mạch đếm tự động theo giây. Các bạn SET SWICH để chuyển đổi giữa 2 chế độ trên, xem ghi chú code để hiểu rõ hơn.
Code lap trinh c trên keilC:
Mã:
#include <REGX51.H>
#define SET    P1_7    //Chan set che do dem
#define BUT    P1_6    //Chan nut nhan dem tang
unsigned char Quet[4]={1,2,4,8}; //Quet Anot led 7
unsigned char Data[4], q;
unsigned int dem;
unsigned char code led[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//Mang LED 7
void delay(unsigned char t){  //Chuong trinh tao tre 100ms
    unsigned char i;
    unsigned int j;
    for(i=0;i<t;i++){  
        for(j=0;j<12500;j++);
    }
}

/****************** Chuong trinh ngat timer quet led 7 ***********************/
void Ngat_Timer() interrupt 1 {
    TF0=0;        //Xoa co tran
    TH0=0xf6;    //Nap lai gia tri
    TL0=0x3c;    //Tran = 65536-2500 = 63036 = 0xF63C
    P2=0xff;      //Xoa du lieu
    P3=~Quet[q]; //Quet Anot led 7
    P2=Data[q];    //Xuat data cua led 7 ra port
    if(++q>4)q=0;
}
void chuyen_doi(){ //Ham chuyen doi so dem sang led 7
    Data[0]=led[dem/1000]; //Ngan
    Data[1]=led[(dem%1000)/100]; //Tram
    Data[2]=led[(dem%100)/10]; //Chuc
    Data[3]=led[dem%10]; //Don vi
}
void main(){
    TMOD=0x01;//Timer0 mode 16bit
    TH0=0xf6;    //Khoi tao gia tri cho timer 0
    TL0=0x3c;
    delay(5);
    TR0=1;//Khoi dong timer0
    ET0=1;//Ngat timer0
    EA=1;//Cho phep ngat
    while(1){//Vong lap chuong trinh
        if(SET){ //Mode auto
            delay(10);      
            if(++dem>9999)dem=0;  //Tang gia tri dem
        }else{    //Mode count
          if(!BUT){
                  if(++dem>9999)dem=0;  //Tang gia tri dem
                while(!BUT);
          }
        }
        chuyen_doi(); //Goi ham chuyen doi
    }
}

Mạch mô phỏng:
[​IMG]
                                                         Chúc các bạn tu hoc lap trinh tốt!
Nguồn lap trinh vi dieu khien
Posted on 02:02 | Categories: