Khối bàn phím

Một phần của tài liệu Nghiên cứu thiết kế kit phát triển cho họ AVR ATmega16 (Trang 27)

Việc sử dụng bàn phím dựa trên sự chênh lệch áp khi ấn các phím, điện áp được đưa về chip để sử lý. Như vây dựa vào điện áp đưa vào chân vi sử lý mà ta biết được chúng ta ấn phím nào.

Như chúng ta đã biết phím bấm là một tiếp điểm cơ khí do đó khi bấm thì các tiếp điểm có thể không tiếp xúc với nhau một cách hoàn toàn. Như vậy tín hiệu ra sẽ gián đoạn, vi điều khiển sẽ dễ dàng bị nhận nhầm là phím được bấm nhiều lần.

Hinh 3.2 sơ đồ khối phím bấm 3.3 khối LCD

LCD (Liquist Crystal Display) là một loại màn hình hiển thị thông tin tiêu tốn ít năng lượng. Bình thường một LCD có loại 2,4…dòng, 16 cột, 80 ký tự trên mỗi dòng và kích thước trên mỗi ký tự là 5x7 dots hoặc 5x10 dots.

LCD có cách điều khiển và giao thức điều khiển được tương thích với chuẩn TTL.

Trong hệ thống LCD hoạt độngtheo chuyển đổi Port dung dữ liệu là 7 bit. LCD gồm 16 chân

Hình 3.4 sơ đồ ghép nồi LCD

3.4 Mạch nguồn

Do nhu cầu sử dụng nguồn điện là 5v cho mạch nên ở đây chún em thiết kế mạch như hình vẽ sau. Điện áp xoay chiều qua cầu diode sau đó qua IC ổn áp 7805, sau đó qua đến các khối lọc, chỉnh lưu thì ta thu được điện áp một chiều cung cấp nguồn nuôi cho các khối.

3.5 mạch giao tiếp máy tính RS 232

Hình 3.6 sơ đồ mạch giao tiếp với máy tính RS 232  Đặc tính điện học

 RS-232 sử dụng phương thức truyền không đối xứng, tức là sử dụng tín hiệu điện áp chênh lệch giữa một dây dẫn và đất.

 Mức điện áp logic được định nghĩa -3V¸ -25V mức logic "1" và +3V¸+25V mức logic "0".

 Tốc độ truyền dẫn tối đa phụ thuộc vào chiều dài dây dẫn. Đa số các hệ thống hiện nay chỉ hỗ trợ tới tốc độ 19.2 kbps

 Chiều dài cho phép 15m ( 50 feet).

 Truyền số liệu Full-duplex sử dụng 3 dây: TxD, RxD, GND.

 Các tín hiệu điều khiển dùng để bắt tay (Handshaking) phần cứng là: RTS, CTS, DSR, DTR. Mức logic:+3V¸ +25V -> "1" và <0V -> "0".

 Truyền không đồng bộ, cấu trúc một khung truyền bao gồm: 1 start bit, 7-8 data bit, 1- 0 parity bit, 1-1,5-2 stop bit. (Gần đây, sự tiến bộ trong vi mạch đã góp phần nâng cao tốc độ của cổng RS-232 lên nhiều lần so với tốc độ 19,2kbps. Hiện nay đã có những mạch thu phát đạt tốc độ 460kbd và hơn nữa, tuy nhiên tốc độ truyền dẫn thực tế lớn hơn 1 15.2 kbd theo chuẩn RS-232 trong một hệ thống làm việc dựa vào ngắt là một điều khó có thể

 Giao diện cơ học:

Chuẩn RS-232 qui định ba loại giắc cắm RS-232 là DB-9, DB-25 và ALT-A, trong đó hai loại đầu được sử dụng rộng rãi hơn

Hình 3.7: sơ đồ chân RS-232 Ý nghĩa của các chân quan trọng được mô tả dưới đây:  RXD (receive Data): Đường nhận dữ liệu.

 TXD (Transmit Data): Đường gửi dữ liệu.

 DTR (Data Terminal Ready): Báo DTE sẵn sàng .Chân DTR thường ở trạng thái ON khi thiết bị đầu cuối sẵn sàng thiết lập kênh truyền thông (tự động quay số hay tự động trả lời). DTR ở trạng thái OFF chỉ khi thiết bị đầu cuối không muốn DCE của nó chấp nhận lời gọi từ xa.

 DSR (Data Set Ready): Báo DCE sẵn sàng, ở chế độ trả lời, 1 tone trả lời và DSR ON sau 2 giây khi Modem nhấc máy.

 DCD (Data Carrier Detect): Tín hiệu này tích cực khi Modem nhận được tín hiệu từ trạm từ xa và nó duy trì trong suốt quá trình liên kết.

 RTS (Request To Send): Đường RTS kiểm soát chiều truyền dữ liệu. Khi một trạm cần gửi dữ liệu, nó đóng mạch RTS sang ON để báo hiệu với modem của nó.

 CTS (Clear To Send): Khi CTS chuyển sang ON, Modem xác nhận là DTE có thể truyền số liệu.Quá trình ngược lại nếu đổi chiều truyền số liệu

 RI (Ring Indicator): Khi modem nhận được tín hiệu chuông, RI chuyển ON/OFF một cách tuần tự với chuông điện thoại để báo hiệu cho trạm đầu cuối. Tín hiệu này chỉ thị rằng một modem xa yêu cầu thiết lập liên kết dial-up.

3.6 Mạch giao tiếp cảm biến LM 335

Hình 3.8: sơ đồ chân LM335 Chân 1:+Vcc

Chân 2:Vout Chân 3:GND

Nó có 3 chân chính trong đó 2 chân cấp nguồn và 1 chân out tín hiệu analog. Khi ta cấp điện áp 5v cho LM335 thì nhiệt đo được từ cảm biến sẽ chuyển thành điện áp tương ứng tại chân số 2(out). Điện áp này sẽ tỷ lệ với giải nhiệt độ mà nó đo được. Với giải nhiệt độ là 10mv/k . Hoạt động trong giải điện áp từ 05v.

 hoạt động chính xác ở dòng điện đầu vào từ 0.4 mA đến 0.5 mA. Dòng điện nằm ngoài khoảng này thì kết quả không chính xác.

 điện áp cấp vào ổn định là 5v.  trở kháng đầu ra thấp hơn 1

3.7 Mạch giao tiếp đồng hồ DS 1307

Hình 3.9: sơ đồ nguyên lý DS1307

DS 1307 là chíp thời gian thực đây là IC tích hợp cho thời gian bởi vì tính chính xác cho thời gian thực là tuyệt đối với thời gian: ngày,tháng, năm, giờ, phút, giây.

 X1 và X2 là đầu vào giao động cho DS 1307  Vbat là nguồn nuôi cho chíp

 Vcc là nguồn điện áp cung cấp dùng 5v. Nếu Vcc không có nguồn mà Vbat vẫn có thi DS 1307 vẫn hoạt động bình thường.

 GND là nguồn mass

 SQW/OUT :là ngõ ra phụ tạo xung giao động

 SCL và SDA là 2 bus dữ liệu của DS 1307. Thông tin truyền và ghi đều chuyền qua 2 cổng này.

Chương IV Thiết Kế Phần Mềm Sử dụng phần mềm mô phỏng proteus

code chương trình

/***************************************************** This program was produced by the

CodeWizardAVR V2.05.0 Professional Automatic Program Generator

© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 19/03/2013 Author : NeVaDa Company : Comments:

AVR Core Clock frequency: 8,000000 MHz Memory model : Small

External RAM size : 0 Data Stack size : 256

*****************************************************/ #include <mega16.h>

#include <delay.h>

// Alphanumeric LCD Module functions #include <alcd.h> #ifndef RXB8 #define RXB8 1 #endif #ifndef TXB8 #define TXB8 0 #endif #ifndef UPE #define UPE 2 #endif #ifndef DOR #define DOR 3 #endif #ifndef FE #define FE 4 #endif #ifndef UDRE #define UDRE 5 #endif #ifndef RXC

#endif

#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR)

#define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)

// USART Receiver buffer #define RX_BUFFER_SIZE 8

char rx_buffer[RX_BUFFER_SIZE]; #if RX_BUFFER_SIZE <= 256

unsigned char rx_wr_index,rx_rd_index,rx_counter; #else

unsigned int rx_wr_index,rx_rd_index,rx_counter; #endif

// This flag is set on USART Receiver buffer overflow bit rx_buffer_overflow;

// USART Receiver interrupt service routine interrupt [USART_RXC] void usart_rx_isr(void) {

char status,data; status=UCSRA; data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {

rx_buffer[rx_wr_index++]=data; #if RX_BUFFER_SIZE == 256

// special case for receiver buffer size=256 if (++rx_counter == 0)

#else

if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; #endif rx_buffer_overflow=1; } } } #ifndef _DEBUG_TERMINAL_IO_

// Get a character from the USART Receiver buffer #define _ALTERNATE_GETCHAR_ #pragma used+ char getchar(void) { char data; while (rx_counter==0); data=rx_buffer[rx_rd_index++]; #if RX_BUFFER_SIZE != 256

if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0; #endif #asm("cli") --rx_counter; #asm("sei") return data; }

#endif

// USART Transmitter buffer #define TX_BUFFER_SIZE 8

char tx_buffer[TX_BUFFER_SIZE]; #if TX_BUFFER_SIZE <= 256

unsigned char tx_wr_index,tx_rd_index,tx_counter; #else

unsigned int tx_wr_index,tx_rd_index,tx_counter; #endif

// USART Transmitter interrupt service routine interrupt [USART_TXC] void usart_tx_isr(void) { if (tx_counter) { --tx_counter; UDR=tx_buffer[tx_rd_index++]; #if TX_BUFFER_SIZE != 256

if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; #endif

} }

#ifndef _DEBUG_TERMINAL_IO_

// Write a character to the USART Transmitter buffer #define _ALTERNATE_PUTCHAR_

#pragma used+ void putchar(char c) {

if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) {

tx_buffer[tx_wr_index++]=c; #if TX_BUFFER_SIZE != 256

if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; #endif ++tx_counter; } else UDR=c; #asm("sei") } #pragma used- #endif

// Standard Input/Output functions #include <stdio.h>

// Declare your global variables here #define KEYPAD_DDR DDRD #define KEYPAD_PORT PORTD #define KEYPAD_PIN PIND

unsigned char scan_code[4]={0x0E,0X0D,0X0B,0x07}; unsigned char ascii_code[4][4]={'7','4','1','E',

'8','5','2','0', '9','6','3','F', 'A','B','C','D', }; int checkpad() {

for(i=0;i<4;i++) { KEYPAD_PORT=0XFF-(1<<(i+4)); delay_us(10); keyin=KEYPAD_PIN&0x0F; if(keyin!=0x0F) for(j=0;j<4;j++)

if(keyin==scan_code[j]) return ascii_code[j][i]; } return 0; } void main(void) { char key,a;

// Declare your local variables here // Input/Output Ports initialization // Port A 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 PORTA=0x00;

DDRA=0x00;

// 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

PORTC=0x0F; DDRC=0xF0;

// 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=0x00;

DDRD=0x00;

// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x00;

TCNT0=0x00; OCR0=0x00;

// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off

// Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00;

TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00;

TCCR2=0x00; TCNT2=0x00; OCR2=0x00;

// External Interrupt(s) initialization // INT0: Off

// INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;

// USART initialization

// Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On

// USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00;

UCSRB=0xD8; UCSRC=0x86; UBRRH=0x00; UBRRL=0x33;

// Analog Comparator initialization // Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC disabled ADCSRA=0x00; lcd_init(16);

// Global enable interrupts #asm("sei")

lcd_clear(); lcd_gotoxy(0,0);

lcd_putsf(" TEST "); lcd_gotoxy(0,1);

lcd_putsf(" Key 4x4 & UART "); while (1)

{

key = checkpad(); if(key)

lcd_gotoxy(0,0); lcd_putsf(" Key 4x4 "); lcd_gotoxy(0,1); lcd_putsf("Phim da nhan "); lcd_putchar(key); putchar(key); } if(UDR) { a=getchar(); lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Truyen tu PC: "); lcd_putchar(a); } } } /***************************************************** This program was produced by the

CodeWizardAVR V2.05.0 Professional Automatic Program Generator

© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 19/03/2013 Author : NeVaDa Company :

Chip type : ATmega16 Program type : Application

AVR Core Clock frequency: 8,000000 MHz Memory model : Small

External RAM size : 0 Data Stack size : 256

*****************************************************/ #include <mega16.h>

#include <delay.h>

// Alphanumeric LCD Module functions #include <alcd.h>

#define FIRST_ADC_INPUT 0 #define LAST_ADC_INPUT 0

unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; #define ADC_VREF_TYPE 0x20

// ADC interrupt service routine // with auto input scanning

interrupt [ADC_INT] void adc_isr(void) {

static unsigned char input_index=0; // Read the 8 most significant bits // of the AD conversion result adc_data[input_index]=ADCH; // Select next ADC input

if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0;

ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index; // Delay needed for the stabilization of the ADC input voltage

// Start the AD conversion ADCSRA|=0x40;

}

char lcd_buffer[33];

void hienthi(unsigned char so,unsigned char x,unsigned char y) {

unsigned char tram,truc,dv; tram=so/100; truc=(so-100*tram)/10; dv=(so-100*tram-10*truc); lcd_gotoxy(x,y); if(so>=100) { lcd_putchar(tram+48); lcd_putchar(truc+48); lcd_putchar(dv+48); } else if(so < 100) { lcd_putchar(truc+48); lcd_putchar(dv+48); } } void main(void) {

// Declare your local variables here // Input/Output Ports 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 PORTA=0x00;

DDRA=0x00;

// 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

// 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 PORTC=0x00;

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=0x00;

DDRD=0x00;

// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x00;

TCNT0=0x00; OCR0=0x00;

// Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off

// Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00;

TCCR2=0x00; TCNT2=0x00;

// External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off MCUCR=0x00; MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00;

// USART initialization // USART disabled UCSRB=0x00;

// Analog Comparator initialization // Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80;

SFIOR=0x00; // ADC initialization

// ADC Clock frequency: 250,000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped // Only the 8 most significant bits of

// the AD conversion result are used

ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff); ADCSRA=0xCD;

// SPI initialization // SPI disabled SPCR=0x00;

TWCR=0x00; lcd_init(16);

// Global enable interrupts #asm("sei") while (1) { lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("Nhiet Do: "); hienthi((2*adc_data[0]),11,0); lcd_puts(lcd_buffer); lcd_gotoxy(0,12); lcd_putchar(0xDF); lcd_putchar(0x43); lcd_gotoxy(0,1);

lcd_putsf(" Nhiet Do phong "); delay_ms(100);

} }

/***************************************************** This program was produced by the

CodeWizardAVR V2.05.0 Professional Automatic Program Generator

© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com

Project : Version :

Company : Comments:

Chip type : ATmega16 Program type : Application

AVR Core Clock frequency: 8,000000 MHz Memory model : Small

External RAM size : 0 Data Stack size : 256

*****************************************************/ #include <mega16.h>

#include <delay.h>

// Declare your global variables here void main(void)

{ int i;

// Declare your local variables here // Input/Output Ports initialization // Port A 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 PORTA=0x00;

DDRA=0x00;

// Port B initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out

// State7=1 State6=1 State5=1 State4=1 State3=1 State2=1 State1=1 State0=1 PORTB=0xFF;

DDRB=0xFF;

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00;

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=0x00;

DDRD=0x00;

// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x00;

TCNT0=0x00; OCR0=0x00;

// Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off

// Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off

TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2 output: Disconnected ASSR=0x00;

TCCR2=0x00; TCNT2=0x00; OCR2=0x00;

// External Interrupt(s) initialization // INT0: Off

Một phần của tài liệu Nghiên cứu thiết kế kit phát triển cho họ AVR ATmega16 (Trang 27)

Tải bản đầy đủ (DOCX)

(65 trang)
w